Subversion Repositories Kolibri OS

Compare Revisions

No changes between revisions

Regard whitespace Rev 8401 → Rev 8402

/contrib/media/updf_newlib/SYSCALL/include/menuet/os.h
0,0 → 1,218
#ifndef __GLIBC__MENUET_OS_H
#define __GLIBC__MENUET_OS_H
 
#ifdef __cplusplus
extern "C" {
#endif
 
typedef unsigned char __u8;
typedef unsigned short __u16;
typedef unsigned long __u32;
 
#pragma pack(push,1)
 
void __menuet__define_window(__u16 x1,__u16 y1,__u16 xsize,__u16 ysize,
__u32 body_color,__u32 grab_color,__u32 frame_color);
void __menuet__window_redraw(int status);
void __menuet__putpixel(__u32 x,__u32 y,__u32 color);
int __menuet__getkey(void);
__u32 __menuet__getsystemclock(void);
void __menuet__write_text(__u16 x,__u16 y,__u32 color,char * text,int len);
void __menuet__delay100(int m);
__u32 __menuet__open(char * name,char * data);
void __menuet__save(char * name,char * data,__u32 count);
void __menuet__putimage(__u16 x1,__u16 y1,__u16 xsize,__u16 ysize,char * image);
void __menuet__make_button(__u16 x1,__u16 y1,__u16 xsize,__u16 ysize,
int id,__u32 color);
int __menuet__get_button_id(void);
int __menuet__wait_for_event(void);
int __menuet__check_for_event(void);
void __menuet__bar(__u16 x1,__u16 y1,__u16 xsize,__u16 ysize,__u32 color);
void __menuet__sys_exit(void);
void * __menuet__exec_thread(void (* func_ptr)(void),__u32 stack_size,int * retp);
void __menuet__idle(void);
 
void __menuet__exec_ramdisk(char * filename,char * args,...);
void __menuet__exec_hd(char * filename,char * args,...);
 
struct process_table_entry
{
__u32 cpu_usage;
__u16 pos_in_windowing_stack;
__u16 win_stack_val_at_ecx;
__u16 reserved1;
char name[12];
__u32 memstart;
__u32 memused;
__u32 pid;
__u32 winx_start,winy_start;
__u32 winx_size,winy_size;
__u16 thread_state;
__u16 reserved2;
__u32 client_left,client_top,client_width,client_height;
__u8 window_state;
__u8 reserved3[1024-71];
};
 
#define PID_WHOAMI (-1)
 
int __menuet__get_process_table(struct process_table_entry * proctab,int pid);
void __menuet__get_screen_max(__u16 * x,__u16 * y);
 
#define BTYPE_TILE 1
#define BTYPE_STRETCH 2
 
void __menuet__set_background_size(__u32 xsz,__u32 ysz);
void __menuet__write_background_mem(__u32 pos,__u32 color);
void __menuet__draw_background(void);
void __menuet__set_background_draw_type(int type);
void __menuet__background_blockmove(char * src_ptr,__u32 bgr_dst,__u32 count);
 
void __menuet__reset_mpu401(void);
void __menuet__write_mpu401(__u8 d);
 
__u32 __menuet__get_date(void);
 
void __menuet__line(__u16 x1,__u16 y1,__u16 x2,__u16 y2,__u32 color);
 
void __menuet__set_bitfield_for_wanted_events(__u32 ev);
 
#define EVENT_REDRAW 0x00000001
#define EVENT_KEY 0x00000002
#define EVENT_BUTTON 0x00000004
#define EVENT_END_REQUEST 0x00000008
#define EVENT_DESKTOP_BACK_DRAW 0x00000010
#define EVENT_MOUSE_CHANGE 0x00000020
#define EVENT_IPC 0x00000040
#define EVENT_MOUSE_CURSOR_MASK 0x40000000 // the window does not receive mouse events if cursor outside window
#define EVENT_MOUSE_WINDOW_MASK 0x80000000 // inactive window does not receive mouse events
 
__u32 __menuet__get_irq_owner(__u32 irq);
int __menuet__get_data_read_by_irq(__u32 irq,__u32 * num_bytes_in_buf,__u8 * data);
int __menuet__send_data_to_device(__u16 port,__u8 val);
void __menuet__program_irq(void * intr_table,__u32 irq_num);
int __menuet__reserve_irq(int irqno);
int __menuet__free_irq(int irqno);
int __menuet__reserve_port_area(__u32 start,__u32 end);
int __menuet__free_port_area(__u32 start,__u32 end);
 
 
#define NAME_LEN 512
 
#define STC_READ 0
#define STC_WRITE 1
#define STC_APPEND 2
 
struct systree_info
{
__u32 command;
__u32 file_offset_low;
__u32 file_offset_high;
__u32 size;
__u32 data_pointer;
char _zero;
const char* nameptr;
};
 
struct systree_info2
{
__u32 command;
__u32 file_offset_low;
__u32 file_offset_high;
__u32 size;
__u32 data_pointer;
char name[NAME_LEN];
};
 
struct bdfe_time
{
__u8 seconds;
__u8 minutes;
__u8 hours;
__u8 reserved;
};
struct bdfe_date
{
__u8 day;
__u8 month;
__u16 year;
};
struct bdfe_item
{
__u32 attr;
__u8 nametype;
__u8 reserved[3];
struct bdfe_time ctime;
struct bdfe_date cdate;
struct bdfe_time atime;
struct bdfe_date adate;
struct bdfe_time mtime;
struct bdfe_date mdate;
__u32 filesize_low;
__u32 filesize_high;
};
 
int __kolibri__system_tree_access(struct systree_info * info);
int __kolibri__system_tree_access2(struct systree_info2 * info);
 
int __fslayer_open(char * name,int flags);
int __fslayer_close(int fd);
int __fslayer_lseek(int fd,int pos,int seek_type);
int __fslayer_tell(int fd);
int __fslayer_read(int fd,void * buffer,__u32 count);
int __fslayer_write(int fd,void * buffer,__u32 count);
 
typedef struct
{
__u8 lock;
__u8 resvd[3];
__u32 ptr_to_fmsg_pos;
/* Below is for message */
__u32 sender_pid;
__u32 msg_length;
} msgrcva_t /*__attribute__((packed))*/;
 
void send_message(int pid,void * msg_ptr,int message_size);
void define_receive_area(msgrcva_t * rcva_ptr,int size);
 
void __menuet__sound_load_block(char * blockptr);
void __menuet__sound_play_block(void);
 
void __menuet__dga_get_caps(int * xres,int * yres,int * bpp,int * bpscan);
 
void get_pci_version(__u8 * major,__u8 * minor);
void pci_get_last_bus(__u8 * last_bus);
void get_pci_access_mechanism(__u8 * mechanism);
 
void pci_write_config_byte(__u8 bus,__u8 dev,__u8 fn,__u8 reg,__u8 val);
void pci_write_config_word(__u8 bus,__u8 dev,__u8 fn,__u8 reg,__u16 val);
void pci_write_config_dword(__u8 bus,__u8 dev,__u8 fn,__u8 reg,__u32 val);
__u8 pci_read_config_byte(__u8 bus,__u8 dev,__u8 fn,__u8 reg);
__u16 pci_read_config_word(__u8 bus,__u8 dev,__u8 fn,__u8 reg);
__u32 pci_read_config_dword(__u8 bus,__u8 dev,__u8 fn,__u8 reg);
 
typedef struct{
char* name;
void* pointer;
} IMP_ENTRY;
typedef const IMP_ENTRY* IMP_TABLE;
IMP_TABLE __kolibri__cofflib_load(const char*);
__u32 __kolibri__cofflib_getproc(IMP_TABLE, const char*);
//int __kolibri__cofflib_link(FUNC*, IMP_TABLE);
 
static __inline__ void __menuet__debug_out_byte(const char ch){
__asm__ __volatile__ ("int $0x40"::"a"(63L),"b"(1L),"c"((__u8)ch));
}
void __menuet__debug_out(const char* str);
 
#define TIME_GETH(x) ((x)&0x000000FF)
#define TIME_GETM(x) ((((x)&0x00FF00)>>8)&0xFF)
#define TIME_GETS(x) ((((x)&0xFF0000)>>16)&0xFF)
 
#pragma pack(pop)
 
#ifdef __cplusplus
}
#endif
 
#endif
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/Makefile
0,0 → 1,22
CC = kos32-gcc
LD = kos32-ld
 
SDK_DIR = $(abspath ../../../../sdk)
 
CFLAGS = -c -fno-ident -O2 -fomit-frame-pointer -fno-ident -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32
 
INCLUDES = -I ../include -I $(SDK_DIR)/sources/newlib/libc/include
 
SYSCALL_SRC := $(notdir $(wildcard *.c))
OBJECTS = $(patsubst %.c, %.o, $(SYSCALL_SRC))
 
default: $(patsubst %.c,%.o,$(SYSCALL_SRC))
ar rcs libsyscall.a *.o
rm *.o
mv libsyscall.a ../../lib
 
%.o : %.c Makefile $(SYSCALL_SRC)
$(CC) $(CFLAGS) $(INCLUDES) -o $@ $<
 
clean:
rm *.o
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/backgr.c
0,0 → 1,26
#include<menuet/os.h>
 
void __menuet__set_background_size(__u32 xsz,__u32 ysz)
{
__asm__ __volatile__("int $0x40"::"a"(15),"b"(1),"c"(xsz),"d"(ysz));
}
 
void __menuet__write_background_mem(__u32 pos,__u32 color)
{
__asm__ __volatile__("int $0x40"::"a"(15),"b"(2),"c"(pos),"d"(color));
}
 
void __menuet__draw_background(void)
{
__asm__ __volatile__("int $0x40"::"a"(15),"b"(3));
}
 
void __menuet__set_background_draw_type(int type)
{
__asm__ __volatile__("int $0x40"::"a"(15),"b"(3),"c"(type));
}
 
void __menuet__background_blockmove(char * src_ptr,__u32 bgr_dst,__u32 count)
{
__asm__ __volatile__("int $0x40"::"a"(15),"b"(3),"c"(src_ptr),"d"(bgr_dst),"S"(count));
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/bar.c
0,0 → 1,9
#include<menuet/os.h>
 
void __menuet__bar(__u16 x1,__u16 y1,__u16 xsize,__u16 ysize,__u32 color)
{
__u32 a,b;
a=(x1<<16)|xsize;
b=(y1<<16)|ysize;
__asm__ __volatile__("int $0x40"::"a"(13),"b"(a),"c"(b),"d"(color));
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/button.c
0,0 → 1,17
#include<menuet/os.h>
 
void __menuet__make_button(__u16 x1,__u16 y1,__u16 xsize,__u16 ysize,
int id,__u32 color)
{
__u32 a,b;
a=(x1<<16)|xsize;
b=(y1<<16)|ysize;
__asm__ __volatile__("int $0x40"::"a"(8),"b"(a),"c"(b),"d"(id),"S"(color));
}
 
int __menuet__get_button_id(void)
{
__u16 __ret;
__asm__ __volatile__("int $0x40":"=a"(__ret):"0"(17));
if((__ret & 0xFF)==0) return (__ret>>8)&0xFF; else return -1;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/clock.c
0,0 → 1,8
#include<menuet/os.h>
 
__u32 __menuet__getsystemclock(void)
{
__u32 __ret;
__asm__ __volatile__("int $0x40":"=a"(__ret):"0"(3));
return __ret;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/cofflib.c
0,0 → 1,15
#include <menuet/os.h>
#include <stdio.h>
#include <string.h>
 
IMP_TABLE __kolibri__cofflib_load(const char* name){
__asm__ __volatile__("int $0x40"::"a"(68L),"b"(19L),"c"((__u32)name));
}
 
__u32 __kolibri__cofflib_getproc(IMP_TABLE lib, const char* name){
if(!name || !name[0]) return 0;
int i;
for(i = 0; lib[i].name && strcmp(name, lib[i].name); i++);
if(lib[i].name) return (__u32)lib[i].pointer;
else return 0;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/date.c
0,0 → 1,8
#include<menuet/os.h>
 
__u32 __menuet__get_date(void)
{
__u32 __ret;
__asm__ __volatile__("int $0x40":"=a"(__ret):"0"(29));
return __ret;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/debug.c
0,0 → 1,5
#include <menuet/os.h>
void __menuet__debug_out(const char* str){
while(*str)
__menuet__debug_out_byte(*str++);
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/delay.c
0,0 → 1,11
#include<menuet/os.h>
 
void __menuet__delay100(int m)
{
__asm__ __volatile__("int $0x40"::"a"(5),"b"(m));
}
 
void __menuet__idle(void)
{
__menuet__delay100(10);
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/dga.c
0,0 → 1,19
#include<menuet/os.h>
 
void __menuet__dga_get_caps(int * xres,int * yres,int * bpp,int * bpscan)
{
int p;
__asm__ __volatile__("int $0x40":"=a"(p):"0"(61),"b"(1));
if(xres) *xres=(p>>16)&0xFFFF;
if(yres) *yres=p & 0xFFFF;
if(bpp)
{
__asm__ __volatile__("int $0x40":"=a"(p):"0"(61),"b"(2));
*bpp=p;
}
if(bpscan)
{
__asm__ __volatile__("int $0x40":"=a"(p):"0"(61),"b"(3));
*bpscan=p;
}
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/event.c
0,0 → 1,20
#include<menuet/os.h>
 
int __menuet__wait_for_event(void)
{
__u32 __ret;
__asm__ __volatile__("int $0x40":"=a"(__ret):"0"(10));
return __ret;
}
 
int __menuet__check_for_event(void)
{
__u32 __ret;
__asm__ __volatile__("int $0x40":"=a"(__ret):"0"(11));
return __ret;
}
 
void __menuet__set_bitfield_for_wanted_events(__u32 ev)
{
__asm__ __volatile__("int $0x40"::"a"(40),"b"(ev));
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/exit.c
0,0 → 1,6
#include<menuet/os.h>
 
void __menuet__sys_exit(void)
{
__asm__ __volatile__("int $0x40"::"a"(0xFFFFFFFF));
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/file.c
0,0 → 1,45
#include<menuet/os.h>
#include<stdio.h>
#include<stdarg.h>
#include<string.h>
 
__u32 __menuet__open(char * name,char * data)
{
__u32 __ret;
__asm__ __volatile__("int $0x40":"=a"(__ret):"0"(6),"b"((__u32)name),"c"(0),"d"(0xFFFFFFFF),"S"((__u32)data));
return __ret;
}
 
void __menuet__save(char * name,char * data,__u32 count)
{
__asm__ __volatile__("int $0x40"::"a"(33),"b"((__u32)name),"c"((__u32)data),"d"(count),"S"(0));
}
 
void __menuet__exec_ramdisk(char * filename,char * args,...)
{
va_list argz;
char buffer[1024];
memset(buffer,0,1024);
if(args)
{
va_start(argz,args);
vsprintf(buffer,args,argz);
}
va_end(argz);
__asm__ __volatile__("int $0x40"::"a"(19),"b"(filename),"c"((args ? buffer : NULL)));
}
 
void __menuet__exec_hd(char * filename,char * args,...)
{
va_list argz;
char buffer[1024];
char work_area[0xFFFF];
memset(buffer,0,1024);
if(args)
{
va_start(argz,args);
vsprintf(buffer,args,argz);
}
va_end(argz);
__asm__ __volatile__("int $0x40"::"a"(19),"b"(filename),"c"(args ? buffer : NULL),"d"(work_area));
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/image.c
0,0 → 1,9
#include<menuet/os.h>
 
void __menuet__putimage(__u16 x1,__u16 y1,__u16 xsize,__u16 ysize,char * image)
{
__u32 a,b;
a=(xsize<<16)|ysize;
b=(x1<<16)|y1;
__asm__ __volatile__("int $0x40"::"a"(7),"b"(image),"c"(a),"d"(b));
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/ipc.c
0,0 → 1,11
#include<menuet/os.h>
 
void send_message(int pid,void * msg_ptr,int message_size)
{
__asm__ __volatile__("int $0x40"::"a"(60),"b"(2),"c"(pid),"d"(msg_ptr),"S"(message_size));
}
 
void define_receive_area(msgrcva_t * rcva_ptr,int size)
{
__asm__ __volatile__("int $0x40"::"a"(60),"b"(1),"c"(rcva_ptr),"d"(size));
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/irq.c
0,0 → 1,62
#include<menuet/os.h>
 
__u32 __menuet__get_irq_owner(__u32 irq)
{
__u32 __ret;
__asm__ __volatile__("int $0x40":"=a"(__ret):"0"(41),"b"(irq));
return __ret;
}
 
int __menuet__get_data_read_by_irq(__u32 irq,__u32 * num_bytes_in_buf,__u8 * data)
{
__u32 a,b,c;
__asm__ __volatile__("int $0x40":"=a"(a),"=b"(b),"=c"(c):"0"(42),"1"(irq));
if(num_bytes_in_buf) *num_bytes_in_buf=a;
if(data) *data=b & 0xFF;
return c;
}
 
int __menuet__send_data_to_device(__u16 port,__u8 val)
{
int __ret;
__asm__ __volatile__("int $0x40":"=a"(__ret):"0"(43),"b"(port),"c"(val));
return __ret;
}
 
void __menuet__program_irq(void * intr_table,__u32 irq_num)
{
__asm__ __volatile__("int $0x40"::"a"(44),"b"(intr_table),"c"(irq_num));
}
 
int __menuet__reserve_irq(int irqno)
{
int __ret;
__asm__ __volatile__("int $0x40":"=a"(__ret):"0"(45),"b"(0),"c"(irqno));
return __ret;
}
 
int __menuet__free_irq(int irqno)
{
int __ret;
__asm__ __volatile__("int $0x40":"=a"(__ret):"0"(45),"b"(1),"c"(irqno));
return __ret;
}
 
int __menuet__reserve_port_area(__u32 start,__u32 end)
{
int __ret;
__asm__("int $0x40":"=a"(__ret):"a"(45),"b"(0),"c"(start),"d"(end));
return __ret;
}
 
int __menuet__free_port_area(__u32 start,__u32 end)
{
int __ret;
__asm__("int $0x40":"=a"(__ret):"a"(45),"b"(1),"c"(start),"d"(end));
return __ret;
}
 
void __menuet__define_app_internal_intrs(void * intr_table)
{
__asm__("int $0x40"::"a"(49),"b"(0),"c"(intr_table));
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/keyb.c
0,0 → 1,8
#include<menuet/os.h>
 
int __menuet__getkey(void)
{
__u16 __ret;
__asm__ __volatile__("int $0x40":"=a"(__ret):"0"(2));
if(!(__ret & 0xFF)) return (__ret>>8)&0xFF; else return 0;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/line.c
0,0 → 1,9
#include<menuet/os.h>
 
void __menuet__line(__u16 x1,__u16 y1,__u16 x2,__u16 y2,__u32 color)
{
__u32 b,c;
b=(x1<<16)|x1;
c=(y1<<16)|y2;
__asm__ __volatile__("int $0x40"::"a"(38),"b"(b),"c"(c),"d"(color));
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/mpu401.c
0,0 → 1,11
#include<menuet/os.h>
 
void __menuet__reset_mpu401(void)
{
__asm__ __volatile__("int $0x40"::"a"(20),"b"(1));
}
 
void __menuet__write_mpu401(__u8 d)
{
__asm__ __volatile__("int $0x40"::"a"(20),"b"(2),"c"(d));
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/param.c
0,0 → 1,7
#include<menuet/os.h>
 
#define APP_PARAM_SZ (1024)
#define APP_PATH_SZ (1024)
 
char __menuet__app_param_area[APP_PARAM_SZ];
char __menuet__app_path_area[APP_PATH_SZ];
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/pci.c
0,0 → 1,50
#include<menuet/os.h>
 
#define PCI_FN 62
 
void get_pci_version(__u8 * major,__u8 * minor)
{
int r;
__asm__ __volatile__("int $0x40":"=a"(r):"0"(PCI_FN),"b"(0));
*minor=r&0xFF;
*major=(r>>8)&0xFF;
}
 
void pci_get_last_bus(__u8 * last_bus)
{
__asm__ __volatile__("int $0x40":"=a"(*last_bus):"0"(PCI_FN),"b"(1));
}
 
void get_pci_access_mechanism(__u8 * mechanism)
{
__asm__ __volatile__("int $0x40":"=a"(*mechanism):"0"(PCI_FN),"b"(2));
}
 
#define read_config(x,c,bits) \
__u##bits pci_read_config_##x (__u8 bus,__u8 dev,__u8 fn,__u8 reg) \
{ \
__u##bits __ret; \
__u16 cx; \
__u16 bx; \
cx=(((fn&7)|(((dev)&~7)<<3))<<8)|reg; \
bx=(bus<<8)|(c); \
__asm__ __volatile__("int $0x40":"=a"(__ret):"0"(PCI_FN),"b"(bx),"c"(cx)); \
return __ret; \
}
 
#define write_config(x,c,bits) \
void pci_write_config_##x (__u8 bus,__u8 dev,__u8 fn,__u8 reg,__u##bits val) \
{ \
__u16 cx,bx; \
cx=(((fn&7)|(((dev)&~7)<<3))<<8)|reg; \
bx=(bus<<8)|(c); \
__asm__ __volatile__("int $0x40"::"a"(PCI_FN),"b"(bx),"c"(cx),"d"(val)); \
}
 
#define rw_config(x,c,bits) \
read_config(x,4+c,bits) \
write_config(x,7+c,bits)
rw_config(byte,0,8)
rw_config(word,1,16)
rw_config(dword,2,32)
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/pixel.c
0,0 → 1,6
#include<menuet/os.h>
 
void __menuet__putpixel(__u32 x,__u32 y,__u32 color)
{
__asm__ __volatile__("int $0x40"::"a"(1),"b"(x),"c"(y),"d"(color));
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/process.c
0,0 → 1,8
#include<menuet/os.h>
 
int __menuet__get_process_table(struct process_table_entry * proctab,int pid)
{
int __ret;
__asm__ __volatile__("int $0x40":"=a"(__ret):"0"(9),"b"((__u32)proctab),"c"(pid));
return __ret;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/screen.c
0,0 → 1,9
#include<menuet/os.h>
 
void __menuet__get_screen_max(__u16 * x,__u16 * y)
{
__u32 v;
__asm__ __volatile__("int $0x40":"=a"(v):"0"(14));
if(x) *x=v>>16;
if(y) *y=v & 0xFFFF;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/sound.c
0,0 → 1,11
#include<menuet/os.h>
 
void __menuet__sound_load_block(char * blockptr)
{
__asm__ __volatile__("int $0x40"::"a"(55),"b"(0),"c"(blockptr));
}
 
void __menuet__sound_play_block(void)
{
__asm__ __volatile__("int $0x40"::"a"(55),"b"(1));
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/systree.c
0,0 → 1,16
#include<menuet/os.h>
 
int __kolibri__system_tree_access(struct systree_info * info)
{
int __ret;
int d0;
__asm__ __volatile__("int $0x40":"=a"(__ret),"=&b"(d0):"0"(70),"1"((__u32)info));
return __ret;
}
int __kolibri__system_tree_access2(struct systree_info2 * info)
{
int __ret;
int d0;
__asm__ __volatile__("int $0x40":"=a"(__ret),"=&b"(d0):"0"(70),"1"((__u32)info));
return __ret;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/text.c
0,0 → 1,6
#include<menuet/os.h>
 
void __menuet__write_text(__u16 x,__u16 y,__u32 color,char * text,int len)
{
__asm__ __volatile__("int $0x40"::"a"(4),"b"((x<<16)|y),"c"(color),"d"((__u32)text),"S"(len));
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/thread.c
0,0 → 1,12
#include<menuet/os.h>
#include<stdio.h>
#include<stdlib.h>
 
void * __menuet__exec_thread(void (* func_ptr)(void),__u32 stack_size,int * retp)
{
void * __stk, * __ret;
__ret=__stk=malloc(stack_size);
__stk+=stack_size-1;
__asm__ __volatile__("int $0x40":"=a"(*retp):"0"(51L),"b"(1L),"c"((__u32)func_ptr),"d"((__u32)__stk));
return __ret;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/SYSCALL/src/window.c
0,0 → 1,16
#include<menuet/os.h>
 
void __menuet__define_window(__u16 x1,__u16 y1,__u16 xsize,__u16 ysize,
__u32 body_color,__u32 grab_color,__u32 frame_color)
{
__u32 a,b;
a=(x1<<16)|xsize;
b=(y1<<16)|ysize;
__asm__ __volatile__("int $0x40"::"a"(0),"b"(a),"c"(b),"d"(body_color),"S"(grab_color),
"D"(frame_color));
}
 
void __menuet__window_redraw(int status)
{
__asm__ __volatile__("int $0x40"::"a"(12),"b"(status));
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/apps/Makefile
0,0 → 1,21
CC = kos32-gcc
LD = kos32-ld
 
SDK_DIR = $(abspath ../../../sdk)
LDFLAGS = -static -nostdlib -T $(SDK_DIR)/sources/newlib/app.lds --image-base 0
 
CFLAGS = -c -fno-ident -O2 -fomit-frame-pointer -fno-ident -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32
 
INCLUDES = -I ../SYSCALL/include -I $(SDK_DIR)/sources/newlib/libc/include -I $(SDK_DIR)/sources/freetype/include -I $(SDK_DIR)/sources/zlib -I ../include -I ../fitz -I ../pdf
LIBPATH = -L $(SDK_DIR)/lib -L /home/autobuild/tools/win32/mingw32/lib -L ../lib
 
APPS_SRC := $(notdir $(wildcard *.c))
OBJECTS = $(patsubst %.c, %.o, $(APPS_SRC))
 
default: $(patsubst %.c,%.o,$(APPS_SRC))
$(LD) $(LDFLAGS) $(LIBPATH) -o mupdf $(OBJECTS) -lmupdf -lfreetype -lfitz -lgcc -lfitz -ldraw -ljpeg -ljbig2dec -lfreetype -lc.dll -lopenjpeg -lz -lc -lsyscall --subsystem native
objcopy mupdf -O binary
 
 
%.o : %.c Makefile $(APPS_SRC)
$(CC) $(CFLAGS) $(INCLUDES) -o $@ $<
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/apps/icons/allbtns.h
0,0 → 1,940
// 26x144
 
unsigned char toolbar_image[14976] = {
0xC2, 0xC2, 0xC2, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xC2, 0xC2, 0xC2, 0xA5, 0xA5,
0xA5, 0xEE, 0xEE, 0xEE, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xEE, 0xEE, 0xEE, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA5, 0xA5, 0xA5, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xB0, 0xB0, 0xB0, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xB0, 0xB0, 0xB0, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xA5, 0xA5,
0xA5, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA5, 0xA5, 0xA5,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xA5, 0xA5, 0xA5, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xE9, 0xE9, 0xE9, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xE9, 0xE9, 0xE9, 0xA5,
0xA5, 0xA5, 0xC2, 0xC2, 0xC2, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xC2, 0xC2, 0xC2,
0xC2, 0xC2, 0xC2, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5,
0xA5, 0xEE, 0xEE, 0xEE, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xEE, 0xEE, 0xEE, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xC2, 0xC2, 0xC2, 0x98, 0x98, 0x98, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x98, 0x98, 0x98, 0xC2, 0xC2, 0xC2, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xEC, 0xEC, 0xEC, 0x87, 0x87,
0x87, 0x6E, 0x6E, 0x6E, 0x87, 0x87, 0x87, 0xB1, 0xB1, 0xB1, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
0xB1, 0xB1, 0xB1, 0x87, 0x87, 0x87, 0x6E, 0x6E, 0x6E, 0x87, 0x87, 0x87, 0xEC, 0xEC, 0xEC, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xEC, 0xEC, 0xEC, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0xC2,
0xC2, 0xC2, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xC2, 0xC2, 0xC2, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0xEC, 0xEC, 0xEC,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0x87, 0x87, 0x87, 0x76, 0x76, 0x76, 0xDB, 0xDB, 0xDB, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xDB, 0xDB, 0xDB, 0x76, 0x76, 0x76, 0x87, 0x87, 0x87, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xC2,
0xC2, 0xC2, 0x6E, 0x6E, 0x6E, 0xC2, 0xC2, 0xC2, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xC2, 0xC2, 0xC2, 0x6E, 0x6E, 0x6E, 0xC2, 0xC2, 0xC2, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x8F, 0x8F, 0x8F,
0x86, 0x86, 0x86, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x86, 0x86, 0x86, 0x8F, 0x8F, 0x8F, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0xB0, 0xB0,
0xB0, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xB0, 0xB0, 0xB0, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0xC9, 0xC9, 0xC9, 0xF3,
0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0xF3, 0xF3, 0xF3, 0xC9, 0xC9, 0xC9, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0xC9, 0xC9, 0xC9, 0xF3, 0xF3, 0xF3,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3,
0xF3, 0xC9, 0xC9, 0xC9, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0xB0, 0xB0, 0xB0, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xB0,
0xB0, 0xB0, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0x8F, 0x8F, 0x8F, 0x86, 0x86, 0x86, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x86, 0x86, 0x86,
0x8F, 0x8F, 0x8F, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xC1, 0xC1, 0xC1, 0x6E, 0x6E, 0x6E, 0xC1, 0xC1, 0xC1, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xC1, 0xC1, 0xC1, 0x6E, 0x6E, 0x6E, 0xC1, 0xC1,
0xC1, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0x86, 0x86, 0x86, 0x75, 0x75, 0x75, 0xD9, 0xD9, 0xD9, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xD9, 0xD9, 0xD9, 0x75, 0x75, 0x75, 0x86, 0x86, 0x86, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xEA, 0xEA, 0xEA, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0xC0, 0xC0, 0xC0, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xC0, 0xC0,
0xC0, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0xEA, 0xEA, 0xEA, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xEA, 0xEA, 0xEA, 0x86, 0x86, 0x86, 0x6D, 0x6D, 0x6D, 0x86, 0x86, 0x86, 0xAF, 0xAF, 0xAF,
0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xAF, 0xAF, 0xAF, 0x86, 0x86, 0x86, 0x6D, 0x6D, 0x6D, 0x86,
0x86, 0x86, 0xEA, 0xEA, 0xEA, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xC0, 0xC0, 0xC0, 0x97, 0x97, 0x97, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D,
0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x97, 0x97, 0x97, 0xC0, 0xC0, 0xC0, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xE9, 0xE9, 0xE9, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xE9, 0xE9, 0xE9, 0xA5,
0xA5, 0xA5, 0xC2, 0xC2, 0xC2, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xC2, 0xC2, 0xC2, 0xA5, 0xA5,
0xA5, 0xEE, 0xEE, 0xEE, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xEE, 0xEE, 0xEE, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xC2, 0xC2, 0xC2, 0x98, 0x98, 0x98, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x98, 0x98, 0x98, 0xC2, 0xC2, 0xC2, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xEC, 0xEC, 0xEC, 0x87, 0x87,
0x87, 0x6E, 0x6E, 0x6E, 0x87, 0x87, 0x87, 0xB1, 0xB1, 0xB1, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
0xB1, 0xB1, 0xB1, 0x87, 0x87, 0x87, 0x6E, 0x6E, 0x6E, 0x87, 0x87, 0x87, 0xEC, 0xEC, 0xEC, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xEC, 0xEC, 0xEC, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0xC2,
0xC2, 0xC2, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xC2, 0xC2, 0xC2, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0xEC, 0xEC, 0xEC,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0x87, 0x87, 0x87, 0x76, 0x76, 0x76, 0xDB, 0xDB, 0xDB, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xDB, 0xDB, 0xDB, 0x76, 0x76, 0x76, 0x87, 0x87, 0x87, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xC2,
0xC2, 0xC2, 0x6E, 0x6E, 0x6E, 0xC2, 0xC2, 0xC2, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xC2, 0xC2, 0xC2, 0x6E, 0x6E, 0x6E, 0xC2, 0xC2, 0xC2, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x8F, 0x8F, 0x8F,
0x86, 0x86, 0x86, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x86, 0x86, 0x86, 0x8F, 0x8F, 0x8F, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0xB0, 0xB0,
0xB0, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xB0, 0xB0, 0xB0, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0xC9, 0xC9, 0xC9, 0xF3,
0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0xF3, 0xF3, 0xF3, 0xC9, 0xC9, 0xC9, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0xC9, 0xC9, 0xC9, 0xF3, 0xF3, 0xF3,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3,
0xF3, 0xC9, 0xC9, 0xC9, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0xB0, 0xB0, 0xB0, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xB0,
0xB0, 0xB0, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0x8F, 0x8F, 0x8F, 0x86, 0x86, 0x86, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x86, 0x86, 0x86,
0x8F, 0x8F, 0x8F, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xC1, 0xC1, 0xC1, 0x6E, 0x6E, 0x6E, 0xC1, 0xC1, 0xC1, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xC1, 0xC1, 0xC1, 0x6E, 0x6E, 0x6E, 0xC1, 0xC1,
0xC1, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0x86, 0x86, 0x86, 0x75, 0x75, 0x75, 0xD9, 0xD9, 0xD9, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xD9, 0xD9, 0xD9, 0x75, 0x75, 0x75, 0x86, 0x86, 0x86, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xEA, 0xEA, 0xEA, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0xC0, 0xC0, 0xC0, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xC0, 0xC0,
0xC0, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0xEA, 0xEA, 0xEA, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xEA, 0xEA, 0xEA, 0x86, 0x86, 0x86, 0x6D, 0x6D, 0x6D, 0x86, 0x86, 0x86, 0xAF, 0xAF, 0xAF,
0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xAF, 0xAF, 0xAF, 0x86, 0x86, 0x86, 0x6D, 0x6D, 0x6D, 0x86,
0x86, 0x86, 0xEA, 0xEA, 0xEA, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xC0, 0xC0, 0xC0, 0x97, 0x97, 0x97, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D,
0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x97, 0x97, 0x97, 0xC0, 0xC0, 0xC0, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xE9, 0xE9, 0xE9, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xE9, 0xE9, 0xE9, 0xA5,
0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xC2, 0xC2, 0xC2,
0xC2, 0xC2, 0xC2, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xC2, 0xC2, 0xC2, 0xA5, 0xA5,
0xA5, 0xEE, 0xEE, 0xEE, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xEE, 0xEE, 0xEE, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xC2, 0xC2, 0xC2, 0x98, 0x98, 0x98, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x98, 0x98, 0x98, 0xC2, 0xC2, 0xC2, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0x87, 0x87,
0x87, 0x6E, 0x6E, 0x6E, 0x87, 0x87, 0x87, 0xB1, 0xB1, 0xB1, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
0xB1, 0xB1, 0xB1, 0x87, 0x87, 0x87, 0x6E, 0x6E, 0x6E, 0x87, 0x87, 0x87, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0xC2,
0xC2, 0xC2, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xC2, 0xC2, 0xC2, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0x87, 0x87, 0x87, 0x76, 0x76, 0x76, 0xDB, 0xDB, 0xDB, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xDB, 0xDB, 0xDB, 0x76, 0x76, 0x76, 0x87, 0x87, 0x87, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xC2,
0xC2, 0xC2, 0x6E, 0x6E, 0x6E, 0xC2, 0xC2, 0xC2, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0x8F, 0x8F, 0x8F, 0x87, 0x87, 0x87, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xC2, 0xC2, 0xC2, 0x6E, 0x6E, 0x6E, 0xC2, 0xC2, 0xC2, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x8F, 0x8F, 0x8F,
0x86, 0x86, 0x86, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x86, 0x86, 0x86, 0x8F, 0x8F, 0x8F, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0xB0, 0xB0,
0xB0, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xB0, 0xB0, 0xB0, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0xC9, 0xC9, 0xC9, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E,
0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xC9, 0xC9, 0xC9, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0xC9, 0xC9, 0xC9, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E,
0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xC9, 0xC9, 0xC9, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0xB0, 0xB0, 0xB0, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xB0,
0xB0, 0xB0, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0x8F, 0x8F, 0x8F, 0x86, 0x86, 0x86, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x86, 0x86, 0x86,
0x8F, 0x8F, 0x8F, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xC1, 0xC1, 0xC1, 0x6E, 0x6E, 0x6E, 0xC1, 0xC1, 0xC1, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xC1, 0xC1, 0xC1, 0x6E, 0x6E, 0x6E, 0xC1, 0xC1,
0xC1, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0x86, 0x86, 0x86, 0x75, 0x75, 0x75, 0xD9, 0xD9, 0xD9, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xD9, 0xD9, 0xD9, 0x75, 0x75, 0x75, 0x86, 0x86, 0x86, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0xC0, 0xC0, 0xC0, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xC0, 0xC0,
0xC0, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0x86, 0x86, 0x86, 0x6D, 0x6D, 0x6D, 0x86, 0x86, 0x86, 0xAF, 0xAF, 0xAF,
0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xAF, 0xAF, 0xAF, 0x86, 0x86, 0x86, 0x6D, 0x6D, 0x6D, 0x86,
0x86, 0x86, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xC0, 0xC0, 0xC0, 0x97, 0x97, 0x97, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D,
0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x97, 0x97, 0x97, 0xC0, 0xC0, 0xC0, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xE9, 0xE9, 0xE9, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xE9, 0xE9, 0xE9, 0xA5,
0xA5, 0xA5, 0xC2, 0xC2, 0xC2, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xC2, 0xC2, 0xC2,
0xC2, 0xC2, 0xC2, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5,
0xA5, 0xEE, 0xEE, 0xEE, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xEE, 0xEE, 0xEE, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA7, 0xA7, 0xA7, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0x94, 0x94, 0x94, 0x67, 0x67, 0x67, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xEF, 0xEF, 0xEF, 0x83, 0x83, 0x83, 0x67, 0x67,
0x67, 0x67, 0x67, 0x67, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xE1, 0xE1, 0xE1, 0x77, 0x77, 0x77, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,
0x67, 0x67, 0x67, 0x67, 0x67, 0x72, 0x72, 0x72, 0x8C, 0x8C, 0x8C, 0xB7, 0xB7, 0xB7, 0xED, 0xED,
0xED, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xD1, 0xD1,
0xD1, 0x6F, 0x6F, 0x6F, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,
0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x6A, 0x6A, 0x6A, 0xAD,
0xAD, 0xAD, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xBD, 0xBD, 0xBD, 0x68, 0x68, 0x68, 0x67,
0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,
0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,
0x8E, 0x8E, 0x8E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xBD, 0xBD, 0xBD, 0x68, 0x68, 0x68, 0x67, 0x67, 0x67,
0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,
0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,
0x67, 0xA2, 0xA2, 0xA2, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xD1, 0xD1, 0xD1, 0x6F, 0x6F, 0x6F, 0x67, 0x67,
0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,
0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,
0x67, 0x67, 0xE3, 0xE3, 0xE3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xE1, 0xE1, 0xE1, 0x77, 0x77, 0x77, 0x67,
0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,
0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,
0xAB, 0xAB, 0xAB, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xEF, 0xEF, 0xEF, 0x83, 0x83, 0x83,
0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xEF, 0xEF, 0xEF, 0xD1, 0xD1, 0xD1, 0x9A, 0x9A, 0x9A, 0x67, 0x67, 0x67, 0x86, 0x86,
0x86, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0x94, 0x94,
0x94, 0x67, 0x67, 0x67, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xB9, 0xB9, 0xB9, 0x71, 0x71, 0x71, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA7,
0xA7, 0xA7, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0x8B, 0x8B, 0x8B, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xE9, 0xE9, 0xE9, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xE9, 0xE9, 0xE9, 0xA5,
0xA5, 0xA5, 0xC2, 0xC2, 0xC2, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xC2, 0xC2, 0xC2, 0xA5, 0xA5,
0xA5, 0xEE, 0xEE, 0xEE, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xEE, 0xEE, 0xEE, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA7, 0xA7,
0xA7, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0x67, 0x67, 0x67, 0x94,
0x94, 0x94, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,
0x83, 0x83, 0x83, 0xEF, 0xEF, 0xEF, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xED, 0xED, 0xED, 0xB7, 0xB7, 0xB7, 0x8C,
0x8C, 0x8C, 0x72, 0x72, 0x72, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,
0x67, 0x77, 0x77, 0x77, 0xE1, 0xE1, 0xE1, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xAD, 0xAD, 0xAD, 0x6A, 0x6A, 0x6A, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,
0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,
0x67, 0x67, 0x6F, 0x6F, 0x6F, 0xD1, 0xD1, 0xD1, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x8E,
0x8E, 0x8E, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,
0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,
0x67, 0x67, 0x67, 0x68, 0x68, 0x68, 0xBD, 0xBD, 0xBD, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA2, 0xA2, 0xA2, 0x67, 0x67, 0x67,
0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,
0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,
0x67, 0x68, 0x68, 0x68, 0xBD, 0xBD, 0xBD, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xE3, 0xE3, 0xE3, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,
0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,
0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x6F, 0x6F, 0x6F, 0xD1,
0xD1, 0xD1, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xAB, 0xAB, 0xAB, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,
0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,
0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x77, 0x77, 0x77, 0xE1, 0xE1, 0xE1, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0x86, 0x86, 0x86, 0x67, 0x67, 0x67, 0x9A, 0x9A, 0x9A, 0xD1, 0xD1, 0xD1, 0xEF, 0xEF, 0xEF,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x67, 0x67, 0x67, 0x67,
0x67, 0x67, 0x83, 0x83, 0x83, 0xEF, 0xEF, 0xEF, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0x71,
0x71, 0x71, 0xB9, 0xB9, 0xB9, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0x67, 0x67, 0x67, 0x94, 0x94, 0x94,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0x8B, 0x8B, 0x8B,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA7, 0xA7, 0xA7, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xE9, 0xE9, 0xE9, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xE9, 0xE9, 0xE9, 0xA5,
0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xC2, 0xC2, 0xC2,
0xC2, 0xC2, 0xC2, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5,
0xA5, 0xEE, 0xEE, 0xEE, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xEE, 0xEE, 0xEE, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xEF, 0xEF,
0xEF, 0xA0, 0xA0, 0xA0, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79,
0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x8E,
0x8E, 0x8E, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xEF, 0xEF, 0xEF, 0x73,
0x73, 0x73, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x83, 0x83, 0x83, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xEF, 0xEF, 0xEF, 0x6C, 0x6C, 0x6C,
0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x83, 0x83, 0x83, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xEF, 0xEF, 0xEF, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
0x83, 0x83, 0x83, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xEF, 0xEF, 0xEF, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0xDC, 0xDC, 0xDC, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xEF, 0xEF, 0xEF, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
0x6C, 0x6C, 0x6C, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xEF, 0xEF, 0xEF, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
0x6C, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xEF, 0xEF, 0xEF, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xDC, 0xDC, 0xDC, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE,
0xBE, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0xBE, 0xBE, 0xBE,
0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xF5, 0xF5, 0xF5, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF5, 0xF5, 0xF5, 0x81, 0x81, 0x81, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
0x6C, 0xB4, 0xB4, 0xB4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF5, 0xF5, 0xF5, 0x77, 0x77, 0x77, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0xA0, 0xA0, 0xA0, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF5, 0xF5, 0xF5, 0x73, 0x73, 0x73, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x97, 0x97, 0x97, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF4, 0xF4, 0xF4, 0x6E, 0x6E, 0x6E, 0x6C, 0x6C, 0x6C, 0x6C,
0x6C, 0x6C, 0x8A, 0x8A, 0x8A, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xEC, 0xEC, 0xEC, 0x6C, 0x6C, 0x6C, 0x81, 0x81, 0x81,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xD8, 0xD8, 0xD8, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xE9, 0xE9, 0xE9, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xE9, 0xE9, 0xE9, 0xA5,
0xA5, 0xA5, 0xC2, 0xC2, 0xC2, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xC2, 0xC2, 0xC2, 0xA5, 0xA5,
0xA5, 0xEE, 0xEE, 0xEE, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xEE, 0xEE, 0xEE, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0x8E, 0x8E, 0x8E, 0x79, 0x79, 0x79, 0x79, 0x79,
0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79,
0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x9C, 0x9C, 0x9C, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0x83, 0x83, 0x83, 0x6C, 0x6C, 0x6C, 0x6C,
0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
0x6C, 0x6C, 0x6C, 0x6C, 0x73, 0x73, 0x73, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0x83, 0x83, 0x83, 0x6C, 0x6C, 0x6C,
0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0x83, 0x83, 0x83, 0x6C, 0x6C,
0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
0x6C, 0x6C, 0x6C, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4,
0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xDA, 0xDA, 0xDA, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
0x6C, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xEF, 0xEF, 0xEF, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xEF, 0xEF,
0xEF, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xEF, 0xEF, 0xEF, 0x6C,
0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xEB, 0xEB, 0xEB, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0x6C, 0x6C, 0x6C,
0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE,
0xBE, 0xBE, 0xF5, 0xF5, 0xF5, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF5,
0xF5, 0xF5, 0x81, 0x81, 0x81, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0xB4, 0xB4, 0xB4,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF5, 0xF5, 0xF5, 0x77, 0x77, 0x77, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0xA0, 0xA0, 0xA0, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF5, 0xF5, 0xF5, 0x73, 0x73, 0x73, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
0x6C, 0x6C, 0x6C, 0x97, 0x97, 0x97, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF4, 0xF4, 0xF4, 0x6E, 0x6E, 0x6E, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x8A, 0x8A,
0x8A, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xEC, 0xEC, 0xEC, 0x6C, 0x6C, 0x6C, 0x81, 0x81, 0x81, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xD8, 0xD8, 0xD8, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2,
0xF2, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xE9, 0xE9, 0xE9, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC,
0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xE9, 0xE9, 0xE9, 0xA5,
0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xC2, 0xC2, 0xC2
};
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/apps/kolibri.c
0,0 → 1,485
#include "kolibri.h"
#include "string.h"
 
 
extern char KOL_PATH[256];
extern char KOL_PARAM[256];
extern char KOL_DIR[256];
 
 
void kol_exit()
{
asm volatile ("int $0x40"::"a"(-1));
}
 
 
void kol_sleep(unsigned d)
{
asm volatile ("int $0x40"::"a"(5), "b"(d));
}
 
 
// define a window
// x, y - position; w, h - size; cs - color and style; c - caption; b - boder
void kol_wnd_define(unsigned x, unsigned y, unsigned w, unsigned h, unsigned cs, unsigned b, char *t)
{
asm volatile ("int $0x40"::"a"(0), "b"(x*65536+w), "c"(y*65536+h), "d"(cs), "D"(t), "S"(b) );
}
 
 
void kol_wnd_move(unsigned x, unsigned y)
{
asm volatile ("int $0x40"::"a"(67), "b"(x), "c"(y), "d"(-1), "S"(-1));
}
 
 
void kol_event_mask(unsigned e)
{
asm volatile ("int $0x40"::"a"(40), "b"(e));
}
 
 
unsigned kol_event_wait()
{
asm volatile ("int $0x40"::"a"(10));
}
 
 
unsigned kol_event_wait_time(unsigned time)
{
asm volatile ("int $0x40"::"a"(23), "b"(time));
}
 
 
unsigned kol_event_check()
{
asm volatile ("int $0x40"::"a"(11));
}
 
 
inline void __attribute__((__always_inline__)) kol_paint_start()
{
asm volatile ("int $0x40"::"a"(12), "b"(1));
}
 
 
inline void __attribute__((__always_inline__)) kol_paint_end()
{
asm volatile ("int $0x40"::"a"(12), "b"(2));
}
 
 
void kol_paint_pixel(unsigned x, unsigned y, unsigned c)
{
asm volatile ("int $0x40"::"a"(1), "b"(x), "c"(y), "d"(c));
}
 
 
void kol_paint_bar(unsigned x, unsigned y, unsigned w, unsigned h, unsigned c)
{
asm volatile ("int $0x40"::"a"(13), "b"(x*65536+w), "c"(y*65536+h), "d"(c));
}
 
 
void kol_paint_line(unsigned x1, unsigned y1, unsigned x2, unsigned y2, unsigned c)
{
asm volatile ("int $0x40"::"a"(38), "b"(x1*65536+x2), "c"(y1*65536+y2), "d"(c));
}
 
 
void kol_paint_string(unsigned x, unsigned y, char *s, unsigned c)
{
asm volatile ("int $0x40"::"a"(4), "b"(x*65536+y), "c"(c), "d"(s));
}
 
 
void kol_paint_image(unsigned x, unsigned y, unsigned w, unsigned h, char *d)
{
asm volatile ("int $0x40"::"a"(7), "c"(w*65536+h), "d"(x*65536+y), "b"(d));
}
 
 
void kol_paint_image_24(unsigned x, unsigned y, unsigned w, unsigned h, char *d)
{
asm volatile ("int $0x40"::"a"(65), "b"(d), "c"(w*65536+h), "d"(x*65536+y), "S"(32));
}
 
 
unsigned kol_key_get()
{
asm volatile ("int $0x40"::"a"(2));
}
 
 
unsigned kol_key_control()
{
asm volatile ("int $0x40"::"a"(66), "b"(3));
}
 
 
void kol_key_lang_set(unsigned lang)
{
asm volatile ("int $0x40"::"a"(21), "b"(2), "c"(9), "d"(lang));
}
 
 
unsigned kol_key_lang_get()
{
asm volatile ("int $0x40"::"a"(26), "b"(2), "c"(9));
}
 
 
void kol_key_mode_set(unsigned mode)
{
asm volatile ("int $0x40"::"a"(66), "b"(1), "c"(mode));
}
 
 
unsigned kol_key_mode_get()
{
asm volatile ("int $0x40"::"a"(66), "b"(2));
}
 
 
unsigned kol_btn_get()
{
asm volatile ("int $0x40"::"a"(17));
}
 
 
void kol_btn_define(unsigned x, unsigned y, unsigned w, unsigned h, unsigned d, unsigned c)
{
asm volatile ("int $0x40"::"a"(8), "b"(x*65536+w), "c"(y*65536+h), "d"(d), "S"(c));
}
 
 
void kol_btn_type(unsigned t)
{
asm volatile ("int $0x40"::"a"(48), "b"(1), "c"(t));
}
 
 
void kol_wnd_caption(char *s)
{
asm volatile ("int $0x40"::"a"(71), "b"(1), "c"(s));
}
 
 
unsigned kol_mouse_pos()
{
asm volatile ("int $0x40"::"a"(37), "b"(0));
}
 
 
unsigned kol_mouse_posw()
{
asm volatile ("int $0x40"::"a"(37), "b"(1));
}
 
 
unsigned kol_mouse_btn()
{
asm volatile ("int $0x40"::"a"(37), "b"(2));
}
 
 
void kol_board_putc(char c)
{
asm volatile ("int $0x40"::"a"(63), "b"(1), "c"(c));
}
 
 
void kol_board_puts(char *s)
{
unsigned i;
i = 0;
while (*(s+i))
{
asm volatile ("int $0x40"::"a"(63), "b"(1), "c"(*(s+i)));
i++;
}
}
 
 
void kol_board_puti(int n)
{
char c;
 
if ( n > 1 )
kol_board_puti(n / 10);
 
c = n % 10 + '0';
asm volatile ("int $0x40"::"a"(63), "b"(1), "c"(c));
 
}
 
 
int kol_file_70(kol_struct70 *k)
{
asm volatile ("int $0x40"::"a"(70), "b"(k));
}
 
 
kol_struct_import* kol_cofflib_load(char *name)
{
asm volatile ("int $0x40"::"a"(68), "b"(19), "c"(name));
}
 
 
void* kol_cofflib_procload (kol_struct_import *imp, char *name)
{
int i;
for (i=0;;i++)
if ( NULL == ((imp+i) -> name))
break;
else
if ( 0 == strcmp(name, (imp+i)->name) )
return (imp+i)->data;
return NULL;
}
 
 
unsigned kol_cofflib_procnum (kol_struct_import *imp)
{
unsigned i, n;
 
for (i=n=0;;i++)
if ( NULL == ((imp+i) -> name))
break;
else
n++;
 
return n;
}
 
 
void kol_cofflib_procname (kol_struct_import *imp, char *name, unsigned n)
{
unsigned i;
*name = 0;
 
for (i=0;;i++)
if ( NULL == ((imp+i) -> name))
break;
else
if ( i == n )
{
strcpy(name, ((imp+i)->name));
break;
}
 
}
 
 
unsigned kol_system_cpufreq()
{
asm volatile ("int $0x40"::"a"(18), "b"(5));
}
 
 
unsigned kol_system_mem()
{
asm volatile ("int $0x40"::"a"(18), "b"(17));
}
 
 
unsigned kol_system_memfree()
{
asm volatile ("int $0x40"::"a"(18), "b"(16));
}
 
 
unsigned kol_system_time_get()
{
asm volatile ("int $0x40"::"a"(3));
}
 
 
unsigned kol_system_date_get()
{
asm volatile ("int $0x40"::"a"(29));
}
 
 
unsigned kol_system_end(unsigned param)
{
asm volatile ("int $0x40"::"a"(18), "b"(9), "c"(param));
}
 
 
void kol_path_file2dir(char *dir, char *fname)
{
unsigned i;
strcpy (dir, fname);
for ( i = strlen(dir);; --i)
if ( '/' == dir[i])
{
dir[i] = '\0';
return;
}
}
 
 
void kol_path_full(char *full, char *fname)
{
char temp[256];
 
switch (*fname)
{
 
case '/':
strncpy(temp, fname+1, 2);
temp[2]=0;
if ( (!strcmp("rd", temp)) || (!strcmp("hd", temp)) || (!strcmp("cd", temp)) )
strcpy (full, fname);
break;
 
case '.':
break;
 
default:
break;
 
};
 
}
 
 
 
inline void __attribute__((__always_inline__)) kol_screen_wait_rr()
{
asm volatile ("int $0x40"::"a"(18), "b"(14));
}
 
 
 
void kol_screen_get_size(unsigned *w, unsigned *h)
{
unsigned size;
asm volatile ("int $0x40":"=a"(size):"a"(14));
*w = size / 65536;
*h = size % 65536;
}
 
 
 
unsigned kol_skin_height()
{
asm volatile ("int $0x40"::"a"(48), "b"(4));
}
 
 
unsigned kol_thread_start(unsigned start, unsigned stack)
{
asm volatile ("int $0x40"::"a"(51), "b"(1), "c"(start), "d"(stack));
}
 
 
unsigned kol_time_tick()
{
asm volatile ("int $0x40"::"a"(26), "b"(9));
}
 
 
unsigned kol_sound_speaker(char data[])
{
asm volatile ("movl %0, %%esi"::"a"(data));
asm volatile ("int $0x40"::"a"(55), "b"(55));
}
 
 
unsigned kol_process_info(unsigned slot, char buf1k[])
{
asm volatile ("int $0x40"::"a"(9), "b"(buf1k), "c"(slot));
}
 
 
int kol_process_kill_pid(unsigned process)
{
asm volatile ("int $0x40"::"a"(18), "b"(18), "c"(process));
}
 
int kol_kill_process(unsigned process)
{
asm volatile ("int $0x40"::"a"(18), "b"(2), "c"(process));
}
 
void kol_get_kernel_ver(char buff16b[])
{
asm volatile ("int $0x40"::"a"(18), "b"(13), "c"(buff16b));
}
 
int kol_buffer_open(char name[], int mode, int size, char **buf)
{
int error;
asm volatile ("int $0x40":"=a"(*buf), "=d"(error):"a"(68), "b"(22), "c"(name), "d"(size), "S"(mode));
return error;
}
 
void kol_buffer_close(char name[])
{
asm volatile ("int $0x40"::"a"(68), "b"(23), "c"(name));
}
 
int kol_clip_num()
{
asm volatile ("int $0x40"::"a"(54), "b"(0));
}
 
char* kol_clip_get(int n)
{
asm volatile ("int $0x40"::"a"(54), "b"(1), "c"(n));
}
 
int kol_clip_set(int n, char buffer[])
{
asm volatile ("int $0x40"::"a"(54), "b"(2), "c"(n), "d"(buffer));
}
 
int kos_random(int num)
{
srand(kol_time_tick());
return rand() % num;
}
 
int kos_get_mouse_wheels(void)
{
int val;
asm ("int $0x40":"=a"(val):"a"(37),"b"(7));
return val;
};
 
 
struct blit_call
{
int dstx;
int dsty;
int w;
int h;
 
int srcx;
int srcy;
int srcw;
int srch;
 
unsigned char *d;
int stride;
};
 
void kos_blit(int dstx, int dsty, int w, int h, int srcx,
int srcy,int srcw, int srch, int stride, char *d)
{
struct blit_call image;
image.dstx=dstx;
image.dsty=dsty;
image.w=w;
image.h=h;
image.srcx=srcx;
image.srcy=srcy;
image.srcw=srcw;
image.srch=srch;
image.stride=stride;
image.d=d;
asm ("int $0x40"::"a"(73),"b"(0),"c"(&image));
}
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/apps/kolibri.h
0,0 → 1,145
 
#define NULL ((void*)0)
 
#define SHM_OPEN 0
#define SHM_OPEN_ALWAYS 0x04
#define SHM_CREATE 0x08
#define SHM_READ 0x00
#define SHM_WRITE 0x01
 
#define E_NOTFOUND 5
#define E_ACCESS 10
#define E_NOMEM 30
#define E_PARAM 33
 
#define FILENAME_MAX 1024
 
#define BT_DEL 0x80000000
#define BT_HIDE 0x40000000
#define BT_NOFRAME 0x20000000
 
#define evReDraw 1
#define evKey 2
#define evButton 3
#define evMouse 6
#define evNetwork 8
 
#define ASCII_KEY_LEFT 176
#define ASCII_KEY_RIGHT 179
#define ASCII_KEY_DOWN 177
#define ASCII_KEY_UP 178
#define ASCII_KEY_HOME 180
#define ASCII_KEY_END 181
#define ASCII_KEY_PGDN 183
#define ASCII_KEY_PGUP 184
 
#define ASCII_KEY_BS 8
#define ASCII_KEY_TAB 9
#define ASCII_KEY_ENTER 13
#define ASCII_KEY_ESC 27
#define ASCII_KEY_DEL 182
#define ASCII_KEY_INS 185
#define ASCII_KEY_SPACE 032
 
#pragma pack(push,1)
typedef struct
{
unsigned p00;
unsigned p04;
unsigned p08;
unsigned p12;
unsigned p16;
char p20;
char *p21;
} kol_struct70;
#pragma pack(pop)
 
 
#pragma pack(push,1)
typedef struct
{
unsigned p00;
char p04;
char p05[3];
unsigned p08;
unsigned p12;
unsigned p16;
unsigned p20;
unsigned p24;
unsigned p28;
unsigned long long p32;
unsigned p40;
} kol_struct_BDVK;
#pragma pack(pop)
 
 
#pragma pack(push,1)
typedef struct
{
char *name;
void *data;
} kol_struct_import;
#pragma pack(pop)
 
 
void kol_exit();
void kol_sleep(unsigned d);
void kol_wnd_define(unsigned x, unsigned y, unsigned w, unsigned h, unsigned cs, unsigned b, char *t);
void kol_wnd_move(unsigned x, unsigned y);
void kol_wnd_caption(char *s);
void kol_event_mask(unsigned e);
unsigned kol_event_wait();
unsigned kol_event_wait_time(unsigned time);
unsigned kol_event_check();
void kol_paint_start();
void kol_paint_end();
void kol_paint_pixel(unsigned x, unsigned y, unsigned c);
void kol_paint_bar(unsigned x, unsigned y, unsigned w, unsigned h, unsigned c);
void kol_paint_line(unsigned x1, unsigned y1, unsigned x2, unsigned y2, unsigned c);
void kol_paint_string(unsigned x, unsigned y, char *s, unsigned c);
void kol_paint_image(unsigned x, unsigned y, unsigned w, unsigned h, char *d);
void kol_paint_image_pal(unsigned x, unsigned y, unsigned w, unsigned h, char *buf, unsigned bits, unsigned palette);
unsigned kol_key_get();
unsigned kol_key_control();
void kol_key_lang_set(unsigned lang);
unsigned kol_key_lang_get();
void kol_key_mode_set(unsigned mode);
unsigned kol_key_mode_get();
void kol_paint_image_24(unsigned x, unsigned y, unsigned w, unsigned h, char *d);
unsigned kol_btn_get();
void kol_btn_type(unsigned t);
unsigned kol_mouse_pos();
unsigned kol_mouse_posw();
unsigned kol_mouse_btn();
void kol_board_putc(char c);
void kol_board_puts(char *s);
void kol_board_puti(int n);
int kol_file_70(kol_struct70 *k);
kol_struct_import* kol_cofflib_load(char *name);
void* kol_cofflib_procload (kol_struct_import *imp, char *name);
unsigned kol_cofflib_procnum (kol_struct_import *imp);
void kol_cofflib_procname (kol_struct_import *imp, char *name, unsigned n);
unsigned kol_system_end(unsigned param);
unsigned kol_system_cpufreq();
unsigned kol_system_mem();
unsigned kol_system_memfree();
unsigned kol_system_time_get();
unsigned kol_system_date_get();
void kol_path_file2dir(char *dir, char *fname);
void kol_path_full(char *full, char *fname);
void kol_screen_wait_rr();
void kol_screen_get_size(unsigned *w, unsigned *h);
unsigned kol_skin_height();
unsigned kol_thread_start(unsigned start, unsigned stack);
unsigned kol_time_tick();
unsigned kol_sound_speaker(char data[]);
unsigned kol_process_info(unsigned slot, char buf1k[]);
int kol_process_kill_pid(unsigned process);
void kol_get_kernel_ver(char buff16b[]);
int kol_kill_process(unsigned process);
int kol_buffer_open(char name[], int mode, int size, char **buf);
void kol_buffer_close(char name[]);
int kol_clip_num();
char* kol_clip_get(int n);
int kol_clip_set(int n, char buffer[]);
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/apps/kos_main.c
0,0 → 1,468
// getrusage
#include "resource.h"
 
#include <menuet/os.h>
#define _WIN32
#include "fitz.h"
#include "mupdf.h"
#include "pdfapp.h"
#include "icons/allbtns.h"
#include "kolibri.h"
 
void run_app()
{
return;
}
 
/*==== DATA ====*/
 
static char Title[1024] = "uPDF";
static pdfapp_t gapp;
char debugstr[256];
char do_not_blit=0;
 
#define TOOLBAR_HEIGHT 34
struct process_table_entry Form;
 
#define DOCUMENT_BORDER 0x979797
#define DOCUMENT_BG 0xABABAB
 
#define SCROLL_H 25
 
short show_area_w = 65;
short show_area_x;
 
char key_mode_enter_page_number;
int new_page_number;
 
static short window_center, draw_h, draw_w;
 
const char *help[] = {
"Keys:",
" ",
"PageUp - go to previous page",
"PageDown - go to next page",
"Home - go to first page",
"End - go to last page",
"Down arrow - scroll current page down",
"Up arrow - scroll current page up",
"+/- - zoom in/out",
"[ or l - rotate page 90 deg to the left",
"] or r - rotate page 90 deg to the right",
"g - grayscale on/off",
" ",
"Press Escape to hide help",
0
};
 
/*==== CODE ====*/
 
 
// not implemented yet
void wincursor(pdfapp_t *app, int curs) { }
void winhelp(pdfapp_t *app) { }
void winresize(pdfapp_t *app, int w, int h) { }
void windocopy(pdfapp_t *app) { }
void winopenuri(pdfapp_t *app, char *buf) { }
void winrepaintsearch(pdfapp_t *app) { }
 
 
void winwarn(pdfapp_t *app, char *msg)
{
fprintf(stderr, "mupdf: %s\n", msg);
}
 
 
void winerror(pdfapp_t *app, fz_error error)
{
fz_catch(error, "aborting");
exit(1);
}
 
 
char *winpassword(pdfapp_t *app, char *filename)
{
char *r = "";
return r;
random();
}
 
 
void wintitle(pdfapp_t *app, char *s)
{
char* param = *(char**)0x1C;
sprintf(Title,"%s - uPDF", strrchr(param, '/') + 1 );
}
 
 
void winreloadfile(pdfapp_t *app)
{
//pdfapp_close(app);
//pdfapp_open(app, filename, 0, 1);
}
 
void winclose(pdfapp_t *app)
{
pdfapp_close(&gapp);
__menuet__sys_exit();
}
 
void RunOpenApp()
{
RunApp("/sys/lod", "*pdf* ./mupdf");
}
 
 
void winrepaint(pdfapp_t *app)
{
winblit(&gapp);
}
 
 
void winblit(pdfapp_t *app)
{
 
if (do_not_blit) return;
 
if (key_mode_enter_page_number==1) HandleNewPageNumber(0); else DrawPagination();
 
if (Form.client_width > gapp.image->w) window_center = (Form.client_width - gapp.image->w) / 2; else window_center = 0;
 
gapp.panx = 0;
if (gapp.image->n == 4) {
kos_blit(window_center + Form.client_left,
Form.client_top + TOOLBAR_HEIGHT,
Form.client_width,
Form.client_height - TOOLBAR_HEIGHT,
gapp.panx,
gapp.pany,
gapp.image->w,
gapp.image->h,
gapp.image->w * gapp.image->n,
gapp.image->samples
);
}
else if (gapp.image->n == 2)
{
int i = gapp.image->w*gapp.image->h;
unsigned char *color = malloc(i*4);
if (color != NULL)
{
unsigned char *s = gapp.image->samples;
unsigned char *d = color;
for (; i > 0 ; i--)
{
d[2] = d[1] = d[0] = *s++;
d[3] = *s++;
d += 4;
}
kos_blit(window_center + Form.client_left,
Form.client_top + TOOLBAR_HEIGHT,
Form.client_width,
Form.client_height - TOOLBAR_HEIGHT,
gapp.panx,
gapp.pany,
gapp.image->w,
gapp.image->h,
gapp.image->w * 4,
color
);
free(color);
}
}
}
 
 
void DrawPageSides(void)
{
if (gapp.image->h < Form.client_height - TOOLBAR_HEIGHT) {
draw_h = gapp.image->h - gapp.pany;
} else {
draw_h = Form.client_height - TOOLBAR_HEIGHT;
}
if (gapp.image->w < Form.client_width) {
window_center = (Form.client_width - gapp.image->w) / 2;
draw_w = gapp.image->w + 2;
kol_paint_bar(0, TOOLBAR_HEIGHT, window_center-1, Form.client_height - TOOLBAR_HEIGHT, DOCUMENT_BG);
kol_paint_bar(window_center-1, TOOLBAR_HEIGHT, 1, draw_h, DOCUMENT_BORDER);
kol_paint_bar(window_center + gapp.image->w, TOOLBAR_HEIGHT, 1, draw_h, DOCUMENT_BORDER);
kol_paint_bar(window_center + gapp.image->w+1, TOOLBAR_HEIGHT, Form.client_width - window_center - gapp.image->w - 1, Form.client_height - TOOLBAR_HEIGHT, DOCUMENT_BG);
} else {
window_center = 1;
draw_w = Form.client_width;
}
kol_paint_bar(window_center - 1, gapp.image->h - gapp.pany + TOOLBAR_HEIGHT, draw_w, 1, DOCUMENT_BORDER);
kol_paint_bar(window_center - 1, gapp.image->h - gapp.pany + TOOLBAR_HEIGHT + 1,
draw_w, Form.client_height - gapp.image->h - TOOLBAR_HEIGHT + gapp.pany - 1, DOCUMENT_BG);
}
 
 
void GetNewPageNumber(void)
{
new_page_number = gapp.pageno;
key_mode_enter_page_number = 1;
HandleNewPageNumber(0);
}
 
void HandleNewPageNumber(unsigned char key)
{
char label_new_page[8];
 
if ((key >= '0') && (key <= '9'))
{
new_page_number = new_page_number * 10 + key - '0';
}
if (key == ASCII_KEY_BS)
{
new_page_number /= 10;
}
if (key == ASCII_KEY_ENTER)
{
ApplyNewPageNumber();
return;
}
if (key==ASCII_KEY_ESC)
{
key_mode_enter_page_number = 0;
DrawWindow();
return;
}
 
itoa(new_page_number, label_new_page, 10);
strcat(label_new_page, "_");
kol_paint_bar(show_area_x, 6, show_area_w, 22, 0xFDF88E);
__menuet__write_text(show_area_x + show_area_w/2 - strlen(label_new_page)*6/2, 14, 0x000000, label_new_page, strlen(label_new_page));
 
if (new_page_number > gapp.pagecount) ApplyNewPageNumber();
}
 
void ApplyNewPageNumber(void)
{
key_mode_enter_page_number = 0;
gapp.pageno = new_page_number -1;
pdfapp_onkey(&gapp, ']');
}
 
void DrawPagination(void)
{
char pages_display[12];
kol_paint_bar(show_area_x, 6, show_area_w, 22, 0xF4F4F4);
sprintf (pages_display, "%d/%d", gapp.pageno, gapp.pagecount);
__menuet__write_text(show_area_x + show_area_w/2 - strlen(pages_display)*6/2, 14, 0x000000, pages_display, strlen(pages_display));
}
 
void DrawToolbarButton(int x, char image_id)
{
__menuet__make_button(x, 5, 26-1, 24-1, 10 + image_id + BT_HIDE, 0);
__menuet__putimage(x, 5, 26, 24, image_id * 24 * 26 * 3 + toolbar_image);
}
 
void DrawWindow(void)
{
kol_paint_bar(0, 0, Form.client_width, TOOLBAR_HEIGHT - 1, 0xe1e1e1); // bar on the top (buttons holder)
kol_paint_bar(0, TOOLBAR_HEIGHT - 1, Form.client_width, 1, 0x7F7F7F);
DrawToolbarButton(8,0); //open_folder
DrawToolbarButton(42,1); //magnify -
DrawToolbarButton(67,2); //magnify +
DrawToolbarButton(101,6); //rotate left
DrawToolbarButton(126,7); //rotate right
DrawToolbarButton(Form.client_width - 160,3); //show help
show_area_x = Form.client_width - show_area_w - 34;
DrawToolbarButton(show_area_x - 26,4); //prev page
DrawToolbarButton(show_area_x + show_area_w,5); //nex page
__menuet__make_button(show_area_x-1, 5, show_area_w+1, 23, 20 + BT_HIDE, 0xA4A4A4);
kol_paint_bar(show_area_x, 5, show_area_w, 1, 0xA4A4A4);
kol_paint_bar(show_area_x, 28, show_area_w, 1, 0xA4A4A4);
winblit(&gapp);
DrawPageSides();
}
 
 
/* Actions */
 
void PageScrollDown(void)
{
//pdfapp_onkey(&gapp, 'k'); //move down
if (gapp.image->h - gapp.pany - SCROLL_H < Form.client_height - TOOLBAR_HEIGHT)
{
pdfapp_onkey(&gapp, '.');
}
else {
gapp.pany += SCROLL_H;
winblit(&gapp);
}
}
 
 
void PageScrollUp(void)
{
//pdfapp_onkey(&gapp, 'j'); //move up
if (gapp.pany >= SCROLL_H) {
gapp.pany -= SCROLL_H;
winblit(&gapp);
}
else {
//not very nice way of using do_not_blit, but it simple
if (gapp.pageno == 1) return;
do_not_blit = 1;
pdfapp_onkey(&gapp, ',');
do_not_blit = 0;
gapp.pany = gapp.image->h - SCROLL_H - Form.client_height + TOOLBAR_HEIGHT;
if (gapp.pany < 0) gapp.pany = 0;
//sprintf (debugstr, "gapp.pany: %d \n", gapp.pany);
//kol_board_puts(debugstr);
winblit(&gapp);
}
}
 
void RunApp(char app[], char param[])
{
kol_struct70 r;
r.p00 = 7;
r.p04 = 0;
r.p08 = param;
r.p12 = 0;
r.p16 = 0;
r.p20 = 0;
r.p21 = app;
kol_file_70(&r);
}
 
 
void PageZoomIn(void)
{
pdfapp_onkey(&gapp, '+');
DrawPageSides();
}
 
 
void PageZoomOut(void)
{
pdfapp_onkey(&gapp, '-');
DrawPageSides();
}
 
void PageRotateLeft(void)
{
pdfapp_onkey(&gapp, 'L');
DrawPageSides();
}
 
void PageRotateRight(void)
{
pdfapp_onkey(&gapp, 'R');
DrawPageSides();
}
 
int main (void)
{
char ii, mouse_wheels_state;
char* original_command_line = *(char**)0x1C;
if (*original_command_line == 0) {
kol_board_puts("uPDF: no param set, showing OpenDialog");
RunOpenApp();
__menuet__sys_exit();
}
 
kol_board_puts(original_command_line);
kol_board_puts("\n");
char buf[128];
int resolution = 72;
int pageno = 1;
fz_accelerate();
kol_board_puts("PDF init\n");
pdfapp_init(&gapp);
gapp.scrw = 600;
gapp.scrh = 400;
gapp.resolution = resolution;
gapp.pageno = pageno;
kol_board_puts("PDF Open\n");
pdfapp_open(&gapp, original_command_line, 0, 0);
kol_board_puts("PDF Opened\n");
wintitle(&gapp, 0);
kol_board_puts("Inital paint\n");
int butt, key, screen_max_x, screen_max_y;
__menuet__get_screen_max(&screen_max_x, &screen_max_y);
__menuet__set_bitfield_for_wanted_events(EVENT_REDRAW+EVENT_KEY+EVENT_BUTTON+EVENT_MOUSE_CHANGE);
 
for(;;)
{
 
switch(__menuet__wait_for_event())
{
case evReDraw:
// gapp.shrinkwrap = 2;
__menuet__window_redraw(1);
__menuet__define_window(screen_max_x / 2 - 350-50+kos_random(50),
screen_max_y / 2 - 300-50+kos_random(50),
700, 600, 0x73000000, 0x800000FF, Title);
__menuet__window_redraw(2);
__menuet__get_process_table(&Form, PID_WHOAMI);
if (Form.window_state > 2) continue; //fix rolled up
Form.client_width++; //fix for Menuet kernel bug
Form.client_height++; //fix for Menuet kernel bug
DrawWindow();
break;
 
case evKey:
key = __menuet__getkey();
if (key_mode_enter_page_number)
{
HandleNewPageNumber(key);
break;
}
if (key==ASCII_KEY_ESC) DrawWindow(); //close help
if (key==ASCII_KEY_PGDN) pdfapp_onkey(&gapp, ']');
if (key==ASCII_KEY_PGUP) pdfapp_onkey(&gapp, '[');
if (key==ASCII_KEY_HOME) pdfapp_onkey(&gapp, 'g');
if (key==ASCII_KEY_END ) pdfapp_onkey(&gapp, 'G');
if (key=='g' ) pdfapp_onkey(&gapp, 'c');
if ((key=='[' ) || (key=='l')) PageRotateLeft();
if ((key==']' ) || (key=='r')) PageRotateRight();
if (key==ASCII_KEY_DOWN ) PageScrollDown();
if (key==ASCII_KEY_UP ) PageScrollUp();
if (key=='-') PageZoomOut();
if ((key=='=') || (key=='+')) PageZoomIn();
break;
 
case evButton:
butt = __menuet__get_button_id();
if(butt==1) __menuet__sys_exit();
if(butt==10) RunOpenApp();
if(butt==11) PageZoomOut(); //magnify -
if(butt==12) PageZoomIn(); //magnify +
if(butt==13) //show help
{
kol_paint_bar(0, TOOLBAR_HEIGHT, Form.client_width, Form.client_height - TOOLBAR_HEIGHT, 0xF2F2F2);
__menuet__write_text(20, TOOLBAR_HEIGHT + 20 , 0x90000000, "uPDF for KolibriOS v1.2", 0);
__menuet__write_text(21, TOOLBAR_HEIGHT + 20 , 0x90000000, "uPDF for KolibriOS v1.2", 0);
for (ii=0; help[ii]!=0; ii++) {
__menuet__write_text(20, TOOLBAR_HEIGHT + 60 + ii * 15, 0x80000000, help[ii], 0);
}
}
if(butt==14) pdfapp_onkey(&gapp, '['); //previous page
if(butt==15) pdfapp_onkey(&gapp, ']'); //next page
if(butt==16) PageRotateLeft();
if(butt==17) PageRotateRight();
if(butt==20) GetNewPageNumber();
break;
 
case evMouse:
if (mouse_wheels_state = kos_get_mouse_wheels())
{
if (mouse_wheels_state==1) { PageScrollDown(); PageScrollDown(); }
if (mouse_wheels_state==-1) { PageScrollUp(); PageScrollUp(); }
}
//sprintf (debugstr, "mouse_wheels_state: %d \n", mouse_wheels_state);
//kol_board_puts(debugstr);
//pdfapp_onmouse(&gapp, int x, int y, int btn, int modifiers, int state)
break;
}
}
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/apps/pdfapp.c
0,0 → 1,1171
#include "fitz.h"
#include "mupdf.h"
#include "pdfapp.h"
 
// #include <ctype.h> /* for tolower() */
 
#define ZOOMSTEP 1.142857
#define BEYOND_THRESHHOLD 40
 
enum panning
{
DONT_PAN = 0,
PAN_TO_TOP,
PAN_TO_BOTTOM
};
 
static void pdfapp_showpage(pdfapp_t *app, int loadpage, int drawpage, int repaint);
 
static void pdfapp_warn(pdfapp_t *app, const char *fmt, ...)
{
char buf[1024];
va_list ap;
va_start(ap, fmt);
vsprintf(buf, fmt, ap);
va_end(ap);
winwarn(app, buf);
}
 
static void pdfapp_error(pdfapp_t *app, fz_error error)
{
winerror(app, error);
}
 
char *pdfapp_version(pdfapp_t *app)
{
return
"MuPDF 0.9\n"
"Copyright 2006-2011 Artifex Sofware, Inc.\n";
}
 
char *pdfapp_usage(pdfapp_t *app)
{
return " ";
/*
"L\t\t-- rotate left\n"
"R\t\t-- rotate right\n"
"h\t\t-- scroll left\n"
"j down\t\t-- scroll down\n"
"k up\t\t-- scroll up\n"
"l\t\t-- scroll right\n"
"+\t\t-- zoom in\n"
"-\t\t-- zoom out\n"
"w\t\t-- shrinkwrap\n"
"r\t\t-- reload file\n"
". pgdn right space\t-- next page\n"
", pgup left b\t-- previous page\n"
">\t\t-- next 10 pages\n"
"<\t\t-- back 10 pages\n"
"m\t\t-- mark page for snap back\n"
"t\t\t-- pop back to latest mark\n"
"1m\t\t-- mark page in register 1\n"
"1t\t\t-- go to page in register 1\n"
"123g\t\t-- go to page 123\n"
"/\t\t-- search for text\n"
"n\t\t-- find next search result\n"
"N\t\t-- find previous search result\n"
"c\t\t-- toggle between color and grayscale\n"
;
*/
}
 
void pdfapp_init(pdfapp_t *app)
{
memset(app, 0, sizeof(pdfapp_t));
app->scrw = 640;
app->scrh = 480;
app->resolution = 72;
}
 
void pdfapp_invert(pdfapp_t *app, fz_bbox rect)
{
unsigned char *p;
int x, y, n;
 
int x0 = CLAMP(rect.x0 - app->image->x, 0, app->image->w - 1);
int x1 = CLAMP(rect.x1 - app->image->x, 0, app->image->w - 1);
int y0 = CLAMP(rect.y0 - app->image->y, 0, app->image->h - 1);
int y1 = CLAMP(rect.y1 - app->image->y, 0, app->image->h - 1);
 
for (y = y0; y < y1; y++)
{
p = app->image->samples + (y * app->image->w + x0) * app->image->n;
for (x = x0; x < x1; x++)
{
for (n = app->image->n; n > 0; n--, p++)
*p = 255 - *p;
}
}
}
 
static void pdfapp_open_pdf(pdfapp_t *app, char *filename, int fd)
{
fz_error error;
fz_stream *file;
char *password = "";
fz_obj *obj;
fz_obj *info;
 
/*
* Open PDF and load xref table
*/
__menuet__debug_out("FZ OPEN\n");
//file = fz_open_fd(fd);
__menuet__debug_out("FZ ready\n");
error = pdf_open_xref(&app->xref, filename, NULL);
if (error){
__menuet__debug_out("FZ can't open\n");
pdfapp_error(app, fz_rethrow(error, "cannot open document '%s'", filename));}
fz_close(file);
 
/*
* Handle encrypted PDF files
*/
/*
if (pdf_needs_password(app->xref))
{
int okay = pdf_authenticate_password(app->xref, password);
while (!okay)
{
password = winpassword(app, filename);
if (!password)
exit(1);
okay = pdf_authenticate_password(app->xref, password);
if (!okay)
pdfapp_warn(app, "Invalid password.");
}
}
* */
 
/*
* Load meta information
*/
 
/*
app->outline = pdf_load_outline(app->xref);
 
app->doctitle = filename;
if (strrchr(app->doctitle, '\\'))
app->doctitle = strrchr(app->doctitle, '\\') + 1;
if (strrchr(app->doctitle, '/'))
app->doctitle = strrchr(app->doctitle, '/') + 1;
info = fz_dict_gets(app->xref->trailer, "Info");
if (info)
{
obj = fz_dict_gets(info, "Title");
if (obj)
app->doctitle = pdf_to_utf8(obj);
} */
 
/*
* Start at first page
*/
__menuet__debug_out("Start at first page\n");
 
error = pdf_load_page_tree(app->xref);
if (error) {
__menuet__debug_out("Can't load tree\n");
pdfapp_error(app, fz_rethrow(error, "cannot load page tree"));}
 
__menuet__debug_out("Page counter\n");
app->pagecount = pdf_count_pages(app->xref);
__menuet__debug_out("All is set!\n");
}
 
void pdfapp_open(pdfapp_t *app, char *filename, int fd, int reload)
{
pdfapp_open_pdf(app, filename, fd);
 
app->cache = fz_new_glyph_cache();
 
if (app->pageno < 1)
app->pageno = 1;
if (app->pageno > app->pagecount)
app->pageno = app->pagecount;
if (app->resolution < MINRES)
app->resolution = MINRES;
if (app->resolution > MAXRES)
app->resolution = MAXRES;
 
if (!reload)
{
app->shrinkwrap = 1;
app->rotate = 0;
app->panx = 0;
app->pany = 0;
}
 
pdfapp_showpage(app, 1, 1, 1);
}
 
void pdfapp_close(pdfapp_t *app)
{
if (app->cache)
fz_free_glyph_cache(app->cache);
app->cache = NULL;
 
if (app->image)
fz_drop_pixmap(app->image);
app->image = NULL;
 
if (app->outline)
pdf_free_outline(app->outline);
app->outline = NULL;
 
if (app->xref)
{
if (app->xref->store)
pdf_free_store(app->xref->store);
app->xref->store = NULL;
 
pdf_free_xref(app->xref);
app->xref = NULL;
}
 
fz_flush_warnings();
}
 
static fz_matrix pdfapp_viewctm(pdfapp_t *app)
{
fz_matrix ctm;
ctm = fz_identity;
ctm = fz_concat(ctm, fz_translate(0, -app->page_bbox.y1));
if (app->xref)
ctm = fz_concat(ctm, fz_scale(app->resolution/72.0f, -app->resolution/72.0f));
else
ctm = fz_concat(ctm, fz_scale(app->resolution/96.0f, app->resolution/96.0f));
ctm = fz_concat(ctm, fz_rotate(app->rotate + app->page_rotate));
return ctm;
}
 
static void pdfapp_panview(pdfapp_t *app, int newx, int newy)
{
if (newx < 0)
newx = 0;
if (newy < 0)
newy = 0;
 
if (newx + app->image->w < app->winw)
newx = app->winw - app->image->w;
if (newy + app->image->h < app->winh)
newy = app->winh - app->image->h;
 
if (app->winw >= app->image->w)
newx = (app->winw - app->image->w) / 2;
if (app->winh >= app->image->h)
newy = (app->winh - app->image->h) / 2;
 
if (newx != app->panx || newy != app->pany)
winrepaint(app);
if (newy > app->image->h) {
 
app->pageno++;
if (app->pageno > app->pagecount)
app->pageno = app->pagecount;
 
 
newy = 0;
app->pany = newy;
pdfapp_showpage(app, 1, 1, 1);
}
 
app->panx = newx;
app->pany = newy;
}
 
static void pdfapp_loadpage_pdf(pdfapp_t *app)
{
pdf_page *page;
fz_error error;
fz_device *mdev;
 
error = pdf_load_page(&page, app->xref, app->pageno - 1);
if (error)
pdfapp_error(app, error);
 
app->page_bbox = page->mediabox;
app->page_rotate = page->rotate;
app->page_links = page->links;
page->links = NULL;
 
/* Create display list */
app->page_list = fz_new_display_list();
mdev = fz_new_list_device(app->page_list);
error = pdf_run_page(app->xref, page, mdev, fz_identity);
if (error)
{
error = fz_rethrow(error, "cannot draw page %d in '%s'", app->pageno, app->doctitle);
pdfapp_error(app, error);
}
fz_free_device(mdev);
 
pdf_free_page(page);
 
pdf_age_store(app->xref->store, 3);
}
 
static void pdfapp_showpage(pdfapp_t *app, int loadpage, int drawpage, int repaint)
{
char buf[256];
fz_device *idev;
fz_device *tdev;
fz_colorspace *colorspace;
fz_matrix ctm;
fz_bbox bbox;
 
wincursor(app, WAIT);
 
if (loadpage)
{
if (app->page_list)
fz_free_display_list(app->page_list);
if (app->page_text)
fz_free_text_span(app->page_text);
if (app->page_links)
pdf_free_link(app->page_links);
 
if (app->xref)
pdfapp_loadpage_pdf(app);
 
/* Zero search hit position */
app->hit = -1;
app->hitlen = 0;
 
/* Extract text */
app->page_text = fz_new_text_span();
tdev = fz_new_text_device(app->page_text);
fz_execute_display_list(app->page_list, tdev, fz_identity, fz_infinite_bbox);
fz_free_device(tdev);
}
 
if (drawpage)
{
sprintf(buf, "%s - %d/%d (%d dpi)", app->doctitle,
app->pageno, app->pagecount, app->resolution);
wintitle(app, buf);
 
ctm = pdfapp_viewctm(app);
bbox = fz_round_rect(fz_transform_rect(ctm, app->page_bbox));
 
/* Draw */
if (app->image)
fz_drop_pixmap(app->image);
if (app->grayscale)
colorspace = fz_device_gray;
else
//#ifdef _WIN32
colorspace = fz_device_bgr;
//#else
// colorspace = fz_device_rgb;
//#endif
app->image = fz_new_pixmap_with_rect(colorspace, bbox);
fz_clear_pixmap_with_color(app->image, 255);
idev = fz_new_draw_device(app->cache, app->image);
fz_execute_display_list(app->page_list, idev, ctm, bbox);
fz_free_device(idev);
}
 
if (repaint)
{
pdfapp_panview(app, app->panx, app->pany);
 
if (app->shrinkwrap)
{
__menuet__debug_out ("SHRINK\n");
int w = app->image->w;
int h = app->image->h;
if (app->winw == w)
app->panx = 0;
if (app->winh == h)
app->pany = 0;
if (w > app->scrw * 90 / 100)
w = app->scrw * 90 / 100;
if (h > app->scrh * 90 / 100)
h = app->scrh * 90 / 100;
if (w != app->winw || h != app->winh)
winresize(app, w, h);
}
 
winrepaint(app);
 
wincursor(app, ARROW);
}
 
fz_flush_warnings();
}
 
static void pdfapp_gotouri(pdfapp_t *app, fz_obj *uri)
{
char *buf;
buf = fz_malloc(fz_to_str_len(uri) + 1);
memcpy(buf, fz_to_str_buf(uri), fz_to_str_len(uri));
buf[fz_to_str_len(uri)] = 0;
winopenuri(app, buf);
fz_free(buf);
}
 
static void pdfapp_gotopage(pdfapp_t *app, fz_obj *obj)
{
int number;
 
number = pdf_find_page_number(app->xref, obj);
if (number < 0)
return;
 
if (app->histlen + 1 == 256)
{
memmove(app->hist, app->hist + 1, sizeof(int) * 255);
app->histlen --;
}
app->hist[app->histlen++] = app->pageno;
app->pageno = number + 1;
pdfapp_showpage(app, 1, 1, 1);
}
 
static inline fz_bbox bboxcharat(fz_text_span *span, int idx)
{
int ofs = 0;
while (span)
{
if (idx < ofs + span->len)
return span->text[idx - ofs].bbox;
if (span->eol)
{
if (idx == ofs + span->len)
return fz_empty_bbox;
ofs ++;
}
ofs += span->len;
span = span->next;
}
return fz_empty_bbox;
}
 
void pdfapp_inverthit(pdfapp_t *app)
{
fz_bbox hitbox, bbox;
fz_matrix ctm;
int i;
 
if (app->hit < 0)
return;
 
hitbox = fz_empty_bbox;
ctm = pdfapp_viewctm(app);
 
for (i = app->hit; i < app->hit + app->hitlen; i++)
{
bbox = bboxcharat(app->page_text, i);
if (fz_is_empty_rect(bbox))
{
if (!fz_is_empty_rect(hitbox))
pdfapp_invert(app, fz_transform_bbox(ctm, hitbox));
hitbox = fz_empty_bbox;
}
else
{
hitbox = fz_union_bbox(hitbox, bbox);
}
}
 
if (!fz_is_empty_rect(hitbox))
pdfapp_invert(app, fz_transform_bbox(ctm, hitbox));
}
 
static inline int charat(fz_text_span *span, int idx)
{
int ofs = 0;
while (span)
{
if (idx < ofs + span->len)
return span->text[idx - ofs].c;
if (span->eol)
{
if (idx == ofs + span->len)
return ' ';
ofs ++;
}
ofs += span->len;
span = span->next;
}
return 0;
}
 
static int textlen(fz_text_span *span)
{
int len = 0;
while (span)
{
len += span->len;
if (span->eol)
len ++;
span = span->next;
}
return len;
}
 
static int match(char *s, fz_text_span *span, int n)
{
int orig = n;
int c;
while ((c = *s++))
{
if (c == ' ' && charat(span, n) == ' ')
{
while (charat(span, n) == ' ')
n++;
}
else
{
if (tolower(c) != tolower(charat(span, n)))
return 0;
n++;
}
}
return n - orig;
}
 
static void pdfapp_searchforward(pdfapp_t *app, enum panning *panto)
{
int matchlen;
int test;
int len;
int startpage;
 
wincursor(app, WAIT);
 
startpage = app->pageno;
 
do
{
len = textlen(app->page_text);
 
if (app->hit >= 0)
test = app->hit + strlen(app->search);
else
test = 0;
 
while (test < len)
{
matchlen = match(app->search, app->page_text, test);
if (matchlen)
{
app->hit = test;
app->hitlen = matchlen;
wincursor(app, HAND);
winrepaint(app);
return;
}
test++;
}
 
app->pageno++;
if (app->pageno > app->pagecount)
app->pageno = 1;
 
pdfapp_showpage(app, 1, 0, 0);
*panto = PAN_TO_TOP;
 
} while (app->pageno != startpage);
 
if (app->pageno == startpage)
{
pdfapp_warn(app, "String '%s' not found.", app->search);
winrepaintsearch(app);
}
else
winrepaint(app);
 
wincursor(app, HAND);
}
 
static void pdfapp_searchbackward(pdfapp_t *app, enum panning *panto)
{
int matchlen;
int test;
int len;
int startpage;
 
wincursor(app, WAIT);
 
startpage = app->pageno;
 
do
{
len = textlen(app->page_text);
 
if (app->hit >= 0)
test = app->hit - 1;
else
test = len;
 
while (test >= 0)
{
matchlen = match(app->search, app->page_text, test);
if (matchlen)
{
app->hit = test;
app->hitlen = matchlen;
wincursor(app, HAND);
winrepaint(app);
return;
}
test--;
}
 
app->pageno--;
if (app->pageno < 1)
app->pageno = app->pagecount;
 
pdfapp_showpage(app, 1, 0, 0);
*panto = PAN_TO_BOTTOM;
 
} while (app->pageno != startpage);
 
if (app->pageno == startpage)
{
pdfapp_warn(app, "String '%s' not found.", app->search);
winrepaintsearch(app);
}
else
winrepaint(app);
 
wincursor(app, HAND);
}
 
void pdfapp_onresize(pdfapp_t *app, int w, int h)
{
if (app->winw != w || app->winh != h)
{
app->winw = w;
app->winh = h;
pdfapp_panview(app, app->panx, app->pany);
winrepaint(app);
}
}
 
void pdfapp_onkey(pdfapp_t *app, int c)
{
int oldpage = app->pageno;
enum panning panto = PAN_TO_TOP;
int loadpage = 1;
 
if (app->isediting)
{
int n = strlen(app->search);
if (c < ' ')
{
if (c == '\b' && n > 0)
{
app->search[n - 1] = 0;
winrepaintsearch(app);
}
if (c == '\n' || c == '\r')
{
app->isediting = 0;
if (n > 0)
{
winrepaintsearch(app);
pdfapp_onkey(app, 'n');
}
else
winrepaint(app);
}
if (c == '\033')
{
app->isediting = 0;
winrepaint(app);
}
}
else
{
if (n + 2 < sizeof app->search)
{
app->search[n] = c;
app->search[n + 1] = 0;
winrepaintsearch(app);
}
}
return;
}
 
/*
* Save numbers typed for later
*/
 
if (c >= '0' && c <= '9')
{
app->number[app->numberlen++] = c;
app->number[app->numberlen] = '\0';
}
 
switch (c)
{
 
case '?':
winhelp(app);
break;
 
case 'q':
winclose(app);
break;
 
/*
* Zoom and rotate
*/
 
case '+':
case '=':
app->resolution *= ZOOMSTEP;
if (app->resolution > MAXRES)
app->resolution = MAXRES;
pdfapp_showpage(app, 0, 1, 1);
break;
case '-':
app->resolution /= ZOOMSTEP;
if (app->resolution < MINRES)
app->resolution = MINRES;
pdfapp_showpage(app, 0, 1, 1);
break;
 
case 'L':
app->rotate -= 90;
pdfapp_showpage(app, 0, 1, 1);
break;
case 'R':
app->rotate += 90;
pdfapp_showpage(app, 0, 1, 1);
break;
 
case 'c':
app->grayscale ^= 1;
pdfapp_showpage(app, 0, 1, 1);
break;
 
#ifndef NDEBUG
case 'a':
app->rotate -= 15;
pdfapp_showpage(app, 0, 1, 1);
break;
case 's':
app->rotate += 15;
pdfapp_showpage(app, 0, 1, 1);
break;
#endif
 
/*
* Pan view, but dont need to repaint image
*/
 
case 'w':
app->shrinkwrap = 1;
app->panx = app->pany = 0;
pdfapp_showpage(app, 0, 0, 1);
break;
 
case 'h':
app->panx += app->image->w / 10;
pdfapp_showpage(app, 0, 0, 1);
break;
 
case 'j':
app->pany -= app->image->h / 10;
pdfapp_showpage(app, 0, 0, 1);
break;
 
case 'k':
app->pany += app->image->h / 10;
pdfapp_showpage(app, 0, 0, 1);
break;
 
case 'l':
app->panx -= app->image->w / 10;
pdfapp_showpage(app, 0, 0, 1);
break;
 
/*
* Page navigation
*/
 
case 'g':
case '\n':
case '\r':
if (app->numberlen > 0)
app->pageno = atoi(app->number);
else
app->pageno = 1;
break;
 
case 'G':
app->pageno = app->pagecount;
break;
 
case 'm':
if (app->numberlen > 0)
{
int idx = atoi(app->number);
 
if (idx >= 0 && idx < nelem(app->marks))
app->marks[idx] = app->pageno;
}
else
{
if (app->histlen + 1 == 256)
{
memmove(app->hist, app->hist + 1, sizeof(int) * 255);
app->histlen --;
}
app->hist[app->histlen++] = app->pageno;
}
break;
 
case 't':
if (app->numberlen > 0)
{
int idx = atoi(app->number);
 
if (idx >= 0 && idx < nelem(app->marks))
if (app->marks[idx] > 0)
app->pageno = app->marks[idx];
}
else if (app->histlen > 0)
app->pageno = app->hist[--app->histlen];
break;
 
/*
* Back and forth ...
*/
 
case ',':
panto = PAN_TO_BOTTOM;
if (app->numberlen > 0)
app->pageno -= atoi(app->number);
else
app->pageno--;
break;
 
case '.':
panto = PAN_TO_TOP;
if (app->numberlen > 0)
app->pageno += atoi(app->number);
else
app->pageno++;
break;
 
case 'b':
panto = DONT_PAN;
if (app->numberlen > 0)
app->pageno -= atoi(app->number);
else
app->pageno--;
break;
 
case ' ':
panto = DONT_PAN;
if (app->numberlen > 0)
app->pageno += atoi(app->number);
else
app->pageno++;
break;
 
case ']':
panto = PAN_TO_TOP;
app->pageno++;
break;
case '[':
panto = PAN_TO_TOP;
app->pageno--;
break;
 
 
case '<':
panto = PAN_TO_TOP;
app->pageno -= 10;
break;
case '>':
panto = PAN_TO_TOP;
app->pageno += 10;
break;
 
/*
* Reloading the file...
*/
 
case 'r':
panto = DONT_PAN;
oldpage = -1;
winreloadfile(app);
break;
 
/*
* Searching
*/
 
case '/':
app->isediting = 1;
app->search[0] = 0;
app->hit = -1;
app->hitlen = 0;
winrepaintsearch(app);
break;
 
case 'n':
pdfapp_searchforward(app, &panto);
loadpage = 0;
break;
 
case 'N':
pdfapp_searchbackward(app, &panto);
loadpage = 0;
break;
 
}
 
if (c < '0' || c > '9')
app->numberlen = 0;
 
if (app->pageno < 1)
app->pageno = 1;
if (app->pageno > app->pagecount)
app->pageno = app->pagecount;
 
if (app->pageno != oldpage)
{
switch (panto)
{
case PAN_TO_TOP:
app->pany = 0;
break;
case PAN_TO_BOTTOM:
app->pany = -2000;
break;
case DONT_PAN:
break;
}
pdfapp_showpage(app, loadpage, 1, 1);
}
}
 
void pdfapp_onmouse(pdfapp_t *app, int x, int y, int btn, int modifiers, int state)
{
pdf_link *link;
fz_matrix ctm;
fz_point p;
 
p.x = x - app->panx + app->image->x;
p.y = y - app->pany + app->image->y;
 
ctm = pdfapp_viewctm(app);
ctm = fz_invert_matrix(ctm);
 
p = fz_transform_point(ctm, p);
 
for (link = app->page_links; link; link = link->next)
{
if (p.x >= link->rect.x0 && p.x <= link->rect.x1)
if (p.y >= link->rect.y0 && p.y <= link->rect.y1)
break;
}
 
if (link)
{
wincursor(app, HAND);
if (btn == 1 && state == 1)
{
if (link->kind == PDF_LINK_URI)
pdfapp_gotouri(app, link->dest);
else if (link->kind == PDF_LINK_GOTO)
pdfapp_gotopage(app, fz_array_get(link->dest, 0)); /* [ pageobj ... ] */
return;
}
}
else
{
wincursor(app, ARROW);
}
 
if (state == 1)
{
if (btn == 1 && !app->iscopying)
{
app->ispanning = 1;
app->selx = x;
app->sely = y;
app->beyondy = 0;
}
if (btn == 3 && !app->ispanning)
{
app->iscopying = 1;
app->selx = x;
app->sely = y;
app->selr.x0 = x;
app->selr.x1 = x;
app->selr.y0 = y;
app->selr.y1 = y;
}
if (btn == 4 || btn == 5) /* scroll wheel */
{
int dir = btn == 4 ? 1 : -1;
app->ispanning = app->iscopying = 0;
if (modifiers & (1<<2))
{
/* zoom in/out if ctrl is pressed */
if (dir > 0)
app->resolution *= ZOOMSTEP;
else
app->resolution /= ZOOMSTEP;
if (app->resolution > MAXRES)
app->resolution = MAXRES;
if (app->resolution < MINRES)
app->resolution = MINRES;
pdfapp_showpage(app, 0, 1, 1);
}
else
{
/* scroll up/down, or left/right if
shift is pressed */
int isx = (modifiers & (1<<0));
int xstep = isx ? 20 * dir : 0;
int ystep = !isx ? 20 * dir : 0;
pdfapp_panview(app, app->panx + xstep, app->pany + ystep);
}
}
}
 
else if (state == -1)
{
if (app->iscopying)
{
app->iscopying = 0;
app->selr.x0 = MIN(app->selx, x) - app->panx + app->image->x;
app->selr.x1 = MAX(app->selx, x) - app->panx + app->image->x;
app->selr.y0 = MIN(app->sely, y) - app->pany + app->image->y;
app->selr.y1 = MAX(app->sely, y) - app->pany + app->image->y;
winrepaint(app);
if (app->selr.x0 < app->selr.x1 && app->selr.y0 < app->selr.y1)
windocopy(app);
}
if (app->ispanning)
app->ispanning = 0;
}
 
else if (app->ispanning)
{
int newx = app->panx + x - app->selx;
int newy = app->pany + y - app->sely;
/* Scrolling beyond limits implies flipping pages */
/* Are we requested to scroll beyond limits? */
if (newy + app->image->h < app->winh || newy > 0)
{
/* Yes. We can assume that deltay != 0 */
int deltay = y - app->sely;
/* Check whether the panning has occured in the
* direction that we are already crossing the
* limit it. If not, we can conclude that we
* have switched ends of the page and will thus
* start over counting.
*/
if( app->beyondy == 0 || (app->beyondy ^ deltay) >= 0 )
{
/* Updating how far we are beyond and
* flipping pages if beyond threshhold
*/
app->beyondy += deltay;
if (app->beyondy > BEYOND_THRESHHOLD)
{
if( app->pageno > 1 )
{
app->pageno--;
pdfapp_showpage(app, 1, 1, 1);
newy = -app->image->h;
}
app->beyondy = 0;
}
else if (app->beyondy < -BEYOND_THRESHHOLD)
{
if( app->pageno < app->pagecount )
{
app->pageno++;
pdfapp_showpage(app, 1, 1, 1);
newy = 0;
}
app->beyondy = 0;
}
}
else
app->beyondy = 0;
}
/* Although at this point we've already determined that
* or that no scrolling will be performed in
* y-direction, the x-direction has not yet been taken
* care off. Therefore
*/
pdfapp_panview(app, newx, newy);
 
app->selx = x;
app->sely = y;
}
 
else if (app->iscopying)
{
app->selr.x0 = MIN(app->selx, x) - app->panx + app->image->x;
app->selr.x1 = MAX(app->selx, x) - app->panx + app->image->x;
app->selr.y0 = MIN(app->sely, y) - app->pany + app->image->y;
app->selr.y1 = MAX(app->sely, y) - app->pany + app->image->y;
winrepaint(app);
}
 
}
 
void pdfapp_oncopy(pdfapp_t *app, unsigned short *ucsbuf, int ucslen)
{
fz_bbox hitbox;
fz_matrix ctm;
fz_text_span *span;
int c, i, p;
int seen;
 
int x0 = app->selr.x0;
int x1 = app->selr.x1;
int y0 = app->selr.y0;
int y1 = app->selr.y1;
 
ctm = pdfapp_viewctm(app);
 
p = 0;
for (span = app->page_text; span; span = span->next)
{
seen = 0;
 
for (i = 0; i < span->len; i++)
{
hitbox = fz_transform_bbox(ctm, span->text[i].bbox);
c = span->text[i].c;
if (c < 32)
c = '?';
if (hitbox.x1 >= x0 && hitbox.x0 <= x1 && hitbox.y1 >= y0 && hitbox.y0 <= y1)
{
if (p < ucslen - 1)
ucsbuf[p++] = c;
seen = 1;
}
}
 
if (seen && span->eol)
{
#ifdef _WIN32
if (p < ucslen - 1)
ucsbuf[p++] = '\r';
#endif
if (p < ucslen - 1)
ucsbuf[p++] = '\n';
}
}
 
ucsbuf[p] = 0;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/apps/pdfapp.h
0,0 → 1,104
/*
* Utility object for handling a pdf application / view
* Takes care of PDF loading and displaying and navigation,
* uses a number of callbacks to the GUI app.
*/
 
#define MINRES 54
#define MAXRES 300
 
typedef struct pdfapp_s pdfapp_t;
 
enum { ARROW, HAND, WAIT };
 
extern void winwarn(pdfapp_t*, char *s);
extern void winerror(pdfapp_t*, fz_error error);
extern void wintitle(pdfapp_t*, char *title);
extern void winresize(pdfapp_t*, int w, int h);
extern void winrepaint(pdfapp_t*);
extern void winrepaintsearch(pdfapp_t*);
extern char *winpassword(pdfapp_t*, char *filename);
extern void winopenuri(pdfapp_t*, char *s);
extern void wincursor(pdfapp_t*, int curs);
extern void windocopy(pdfapp_t*);
extern void winreloadfile(pdfapp_t*);
extern void windrawstring(pdfapp_t*, int x, int y, char *s);
extern void winclose(pdfapp_t*);
extern void winhelp(pdfapp_t*);
 
struct pdfapp_s
{
/* current document params */
char *doctitle;
pdf_xref *xref;
pdf_outline *outline;
 
int pagecount;
fz_glyph_cache *cache;
 
/* current view params */
int resolution;
int rotate;
fz_pixmap *image;
int grayscale;
 
/* current page params */
int pageno;
fz_rect page_bbox;
float page_rotate;
fz_display_list *page_list;
fz_text_span *page_text;
pdf_link *page_links;
 
/* snapback history */
int hist[256];
int histlen;
int marks[10];
 
/* window system sizes */
int winw, winh;
int scrw, scrh;
int shrinkwrap;
 
/* event handling state */
char number[256];
int numberlen;
 
int ispanning;
int panx, pany;
 
int iscopying;
int selx, sely;
/* TODO - While sely keeps track of the relative change in
* cursor position between two ticks/events, beyondy shall keep
* track of the relative change in cursor position from the
* point where the user hits a scrolling limit. This is ugly.
* Used in pdfapp.c:pdfapp_onmouse.
*/
int beyondy;
fz_bbox selr;
 
/* search state */
int isediting;
char search[512];
int hit;
int hitlen;
 
/* client context storage */
void *userdata;
};
 
void pdfapp_init(pdfapp_t *app);
void pdfapp_open(pdfapp_t *app, char *filename, int fd, int reload);
void pdfapp_close(pdfapp_t *app);
 
char *pdfapp_version(pdfapp_t *app);
char *pdfapp_usage(pdfapp_t *app);
 
void pdfapp_onkey(pdfapp_t *app, int c);
void pdfapp_onmouse(pdfapp_t *app, int x, int y, int btn, int modifiers, int state);
void pdfapp_oncopy(pdfapp_t *app, unsigned short *ucsbuf, int ucslen);
void pdfapp_onresize(pdfapp_t *app, int w, int h);
 
void pdfapp_invert(pdfapp_t *app, fz_bbox rect);
void pdfapp_inverthit(pdfapp_t *app);
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/apps/resource.h
0,0 → 1,70
#ifndef __dj_include_sys_resource_h_
#define __dj_include_sys_resource_h_
 
#ifdef __cplusplus
extern "C" {
#endif
 
#ifndef __dj_ENFORCE_ANSI_FREESTANDING
 
#ifndef __STRICT_ANSI__
 
#ifndef _POSIX_SOURCE
 
#include <time.h>
 
#define RUSAGE_SELF 0 /* calling process */
#define RUSAGE_CHILDREN -1 /* terminated child processes */
 
struct rusage {
struct timeval ru_utime; /* user time used */
struct timeval ru_stime; /* system time used */
long ru_maxrss; /* integral max resident set size */
long ru_ixrss; /* integral shared text memory size */
long ru_idrss; /* integral unshared data size */
long ru_isrss; /* integral unshared stack size */
long ru_minflt; /* page reclaims */
long ru_majflt; /* page faults */
long ru_nswap; /* swaps */
long ru_inblock; /* block input operations */
long ru_oublock; /* block output operations */
long ru_msgsnd; /* messages sent */
long ru_msgrcv; /* messages received */
long ru_nsignals; /* signals received */
long ru_nvcsw; /* voluntary context switches */
long ru_nivcsw; /* involuntary context switches */
};
 
#define RLIMIT_CPU 0 /* cpu time in milliseconds */
#define RLIMIT_FSIZE 1 /* maximum file size */
#define RLIMIT_DATA 2 /* data size */
#define RLIMIT_STACK 3 /* stack size */
#define RLIMIT_CORE 4 /* core file size */
#define RLIMIT_RSS 5 /* resident set size */
#define RLIMIT_MEMLOCK 6 /* locked-in-memory address space */
#define RLIMIT_NPROC 7 /* number of processes */
#define RLIMIT_NOFILE 8 /* number of open files */
 
#define RLIM_NLIMITS 9 /* number of resource limits */
#define RLIM_INFINITY ((long) ((1UL << 31) - 1UL))
 
struct rlimit {
long rlim_cur; /* current (soft) limit */
long rlim_max; /* maximum value for rlim_cur */
};
 
/// ZAGLUSHKA ///
int getrusage(int _who, struct rusage *_rusage) {};
 
#endif /* !_POSIX_SOURCE */
#endif /* !__STRICT_ANSI__ */
#endif /* !__dj_ENFORCE_ANSI_FREESTANDING */
 
#ifndef __dj_ENFORCE_FUNCTION_CALLS
#endif /* !__dj_ENFORCE_FUNCTION_CALLS */
 
#ifdef __cplusplus
}
#endif
 
#endif /* !__dj_include_sys_resource_h_ */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/draw/Makefile
0,0 → 1,21
CC = kos32-gcc
LD = kos32-ld
 
SDK_DIR = $(abspath ../../../sdk)
LDFLAGS = -call_shared -nostdlib -T $(SDK_DIR)/sources/newlib/app-dynamic.lds --image-base 0
 
CFLAGS = -c -fno-ident -O2 -fomit-frame-pointer -fno-ident -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32
 
INCLUDES = -I $(SDK_DIR)/sources/newlib/libc/include -I ../fitz
LIBPATH = -L $(SDK_DIR)/lib -L /home/autobuild/tools/win32/mingw32/lib
 
DRAW_SRC := $(notdir $(wildcard *.c))
OBJECTS = $(patsubst %.c, %.o, $(DRAW_SRC))
 
default: $(patsubst %.c,%.o,$(DRAW_SRC))
ar rcs libdraw.a $(OBJECTS)
rm *.o
mv libdraw.a ../lib
 
%.o : %.c Makefile $(DRAW_SRC)
$(CC) $(CFLAGS) $(INCLUDES) -o $@ $<
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/draw/arch_arm.c
0,0 → 1,232
/*
* ARM specific render optims live here
*/
 
#include "fitz.h"
 
typedef unsigned char byte;
 
/* always surround cpu specific code with HAVE_XXX */
#ifdef ARCH_ARM
 
/* from imagescalearm.s */
extern void fz_srow4_arm(byte *src, byte *dst, int w, int denom);
extern void fz_scol4_arm(byte *src, byte *dst, int w, int denom);
 
static void
path_w4i1o4_arm(byte * restrict rgba, byte * restrict src, byte cov, int len, byte * restrict dst)
{
/* The ARM code here is a hand coded implementation of the optimized C version. */
 
if (len <= 0)
return;
 
asm volatile(
"ldr %0, [%0] @ %0 = rgba \n"
"mov r11,#0 \n"
"mov r8, #0xFF00 \n"
"mov r14,%0,lsr #24 @ r14= alpha \n"
"orr %0, %0, #0xFF000000 @ %0 = rgba |= 0xFF000000 \n"
"orr r8, r8, r8, LSL #16 @ r8 = 0xFF00FF00 \n"
"adds r14,r14,r14,LSR #7 @ r14 = alpha += alpha>>7 \n"
"beq 9f @ if (alpha == 0) bale \n"
"and r6, %0, r8 @ r6 = ga<<8 \n"
"bic %0, %0, r8 @ %0 = rb \n"
"mov r6, r6, LSR #8 @ r6 = ga \n"
"cmp r14,#256 @ if (alpha == 256) \n"
"beq 4f @ no-alpha loop \n"
"B 2f @ enter the loop \n"
"1: @ Loop used for when coverage*alpha == 0 \n"
"subs %3, %3, #1 @ len-- \n"
"ble 9f \n"
"2: \n"
"ldrb r12,[%1] @ r12= *src \n"
"ldr r9, [%4], #4 @ r9 = drb = *dst32++ \n"
"strb r11,[%1], #1 @ r11= *src++ = 0 \n"
"add %2, r12, %2 @ %2 = cov += r12 \n"
"ands %2, %2, #255 @ %2 = cov &= 255 \n"
"beq 1b @ if coverage == 0 loop back \n"
"add r10,%2, %2, LSR #7 @ r10= ca = cov+(cov>>7) \n"
"mul r10,r14,r10 @ r10= ca *= alpha \n"
"and r7, r8, r9 @ r7 = dga = drb & MASK \n"
"mov r10,r10,LSR #8 @ r10= ca >>= 8 \n"
"and r9, r8, r9, LSL #8 @ r9 = drb = (drb<<8) & MASK \n"
"sub r12,r6, r7, LSR #8 @ r12= cga = ga - (dga>>8) \n"
"sub r5, %0, r9, LSR #8 @ r5 = crb = rb - (drb>>8) \n"
"mla r7, r12,r10,r7 @ r7 = dga += cga * ca \n"
"subs %3, %3, #1 @ len-- \n"
"mla r9, r5, r10,r9 @ r9 = drb += crb * ca \n"
"and r7, r8, r7 @ r7 = dga &= MASK \n"
"and r9, r8, r9 @ r9 = drb &= MASK \n"
"orr r9, r7, r9, LSR #8 @ r9 = drb = dga | (drb>>8) \n"
"str r9, [%4, #-4] @ dst32[-1] = r9 \n"
"bgt 2b \n"
"b 9f \n"
"@ --- Solid alpha loop --------------------------------------- \n"
"3: @ Loop used when coverage == 256 \n"
"orr r9, %0, r6, LSL #8 @ r9 = rgba \n"
"str r9, [%4, #-4] @ dst32[-1] = r9 \n"
"4: @ Loop used for when coverage*alpha == 0 \n"
"subs %3, %3, #1 @ len-- \n"
"ble 9f \n"
"5: \n"
"ldrb r12,[%1] @ r12= *src \n"
"ldr r9, [%4], #4 @ r9 = drb = *dst32++ \n"
"strb r11,[%1], #1 @ r11= *src++ = 0 \n"
"add %2, r12, %2 @ %2 = cov += r12 \n"
"ands %2, %2, #255 @ %2 = cov &= 255 \n"
"beq 4b @ if coverage == 0 loop back \n"
"cmp %2, #255 @ if coverage == solid \n"
"beq 3b @ loop back \n"
"add r10,%2, %2, LSR #7 @ r10= ca = cov+(cov>>7) \n"
"and r7, r8, r9 @ r7 = dga = drb & MASK \n"
"and r9, r8, r9, LSL #8 @ r9 = dga = (drb<<8) & MASK \n"
"sub r12,r6, r7, LSR #8 @ r12= cga = ga - (dga>>8) \n"
"sub r5, %0, r9, LSR #8 @ r5 = crb = rb - (drb>>8) \n"
"mla r7, r12,r10,r7 @ r7 = dga += cga * ca \n"
"subs %3, %3, #1 @ len-- \n"
"mla r9, r5, r10,r9 @ r9 = drb += crb * ca \n"
"and r7, r8, r7 @ r7 = dga &= MASK \n"
"and r9, r8, r9 @ r9 = drb &= MASK \n"
"orr r9, r7, r9, LSR #8 @ r9 = drb = dga | (drb>>8) \n"
"str r9, [%4, #-4] @ dst32[-1] = r9 \n"
"bgt 5b \n"
"9: @ End \n"
:
"+r" (rgba),
"+r" (src),
"+r" (cov),
"+r" (len),
"+r" (dst)
:
:
"r5","r6","r7","r8","r9","r10","r11","r12","r14","memory","cc"
);
}
 
static void load_tile8_arm(byte * restrict src, int sw, byte * restrict dst, int dw, int w, int h, int pad)
{
if ((h == 0) || (w == 0))
return;
 
switch (pad)
{
case 0:
while (h--)
{
memcpy(dst, src, w);
src += sw;
dst += dw;
}
break;
 
case 1:
sw -= w;
dw -= w<<1;
asm volatile(
"MOV r11,#255 \n"
"1: \n"
"MOV r5, %[w] @ r5 = x = w \n"
"2: \n"
"LDRB r4, [%[src]], #1 @ r4 = *src++ \n"
"SUBS r5, r5, #1 \n"
"STRB r4, [%[dst]], #1 @ *dst++ = r4 \n"
"STRB r11,[%[dst]], #1 @ *dst++ = 255 \n"
"BGT 2b \n"
"ADD %[src],%[src],%[sw] @ src += sw \n"
"ADD %[dst],%[dst],%[dw] @ dst += dw \n"
"SUBS %[h],%[h],#1 \n"
"BGT 1b \n"
:
[src] "+r" (src),
[sw] "+r" (sw),
[dst] "+r" (dst),
[dw] "+r" (dw),
[h] "+r" (h),
[w] "+r" (w)
:
:
"r4","r5","r11","memory","cc"
);
break;
 
case 3:
sw -= w;
asm volatile(
"MOV r11,#255 \n"
"1: \n"
"MOV r5, %[w] @ r5 = x = w \n"
"MOV r8, %[dst] @ r8 = dp = dst \n"
"2: \n"
"LDRB r4, [%[src]], #1 @ r4 = *src++ \n"
"LDRB r6, [%[src]], #1 @ r6 = *src++ \n"
"LDRB r7, [%[src]], #1 @ r7 = *src++ \n"
"SUBS r5, r5, #3 \n"
"STRB r4, [r8], #1 @ *dp++ = r4 \n"
"STRB r6, [r8], #1 @ *dp++ = r6 \n"
"STRB r7, [r8], #1 @ *dp++ = r7 \n"
"STRB r11,[r8], #1 @ *dp++ = 255 \n"
"BGT 2b \n"
"ADD %[src],%[src],%[sw] @ src += sw \n"
"ADD %[dst],%[dst],%[dw] @ dst += dw \n"
"SUBS %[h],%[h],#1 \n"
"BGT 1b \n"
:
[src] "+r" (src),
[sw] "+r" (sw),
[dst] "+r" (dst),
[dw] "+r" (dw),
[h] "+r" (h),
[w] "+r" (w)
:
:
"r4","r5","r6","r7","r8","r11","memory","cc"
);
break;
 
default:
sw -= w;
asm volatile(
"mov r9,#255 \n"
"1: \n"
"mov r7, %[dst] @ r7 = dp = dst \n"
"mov r8, #1 @ r8 = tpad = 1 \n"
"mov r14,%[w] @ r11= x = w \n"
"2: \n"
"ldrb r10,[%[src]],#1 \n"
"subs r8, r8, #1 \n"
"moveq r8, %[pad] \n"
"streqb r9, [r7], #1 \n"
"strb r10,[r7], #1 \n"
"subs r14,r14, #1 \n"
"bgt 2b \n"
"add %[src],%[src],%[sw] \n"
"add %[dst],%[dst],%[dw] \n"
"subs %[h], %[h], #1 \n"
"bgt 1b \n"
:
[src] "+r" (src),
[sw] "+r" (sw),
[dst] "+r" (dst),
[dw] "+r" (dw),
[h] "+r" (h),
[w] "+r" (w),
[pad] "+r" (pad)
:
:
"r7","r8","r9","r10","r14","memory","cc"
);
break;
}
}
 
void
fz_accelerate_arch(void)
{
fz_path_w4i1o4 = path_w4i1o4_arm;
fz_loadtile8 = load_tile8_arm;
fz_srow4 = fz_srow4_arm;
fz_scol4 = fz_scol4_arm;
}
 
#endif
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/draw/arch_port.c
0,0 → 1,486
#include "fitz.h"
 
typedef unsigned char byte;
 
/* These C implementations use SWAR (SIMD-within-a-register) techniques. */
 
#if 0 /* TODO: move into porterduff.c functions */
 
#define MASK 0xFF00FF00;
 
static void
path_w4i1o4_32bit(byte *rgba,
byte * restrict src, byte cov, int len, byte * restrict dst)
{
/* COLOR * coverage + DST * (256-coverage) = (COLOR - DST)*coverage + DST*256 */
unsigned int *dst32 = (unsigned int *)(void *)dst;
int alpha = rgba[3];
unsigned int rb = rgba[0] | (rgba[2] << 16);
unsigned int ga = rgba[1] | 0xFF0000;
 
if (alpha == 0)
return;
 
if (alpha != 255)
{
alpha += alpha>>7; /* alpha is now in the 0...256 range */
while (len--)
{
unsigned int ca, drb, dga, crb, cga;
cov += *src; *src++ = 0;
ca = cov + (cov>>7); /* ca is in 0...256 range */
ca = (ca*alpha)>>8; /* ca is is in 0...256 range */
drb = *dst32++;
if (ca != 0)
{
dga = drb & MASK;
drb = (drb<<8) & MASK;
cga = ga - (dga>>8);
crb = rb - (drb>>8);
dga += cga * ca;
drb += crb * ca;
dga &= MASK;
drb &= MASK;
drb = dga | (drb>>8);
dst32[-1] = drb;
}
}
}
else
{
while (len--)
{
unsigned int ca, drb, dga, crb, cga;
cov += *src; *src++ = 0;
ca = cov + (cov>>7); /* ca is in 0...256 range */
drb = *dst32++;
if (ca == 0)
continue;
if (ca == 255)
{
drb = (ga<<8) | rb;
}
else
{
dga = drb & MASK;
drb = (drb<<8) & MASK;
cga = ga - (dga>>8);
crb = rb - (drb>>8);
dga += cga * ca;
drb += crb * ca;
dga &= MASK;
drb &= MASK;
drb = dga |(drb>>8);
}
dst32[-1] = drb;
}
}
}
 
static void
text_w4i1o4_32bit(byte *rgba,
byte * restrict src, int srcw,
byte * restrict dst, int dstw, int w0, int h)
{
unsigned int *dst32 = (unsigned int *)(void *)dst;
unsigned int alpha = rgba[3];
unsigned int rb = rgba[0] | (rgba[2] << 16);
unsigned int ga = rgba[1] | 0xFF0000;
 
if (alpha == 0)
return;
 
srcw -= w0;
dstw = (dstw>>2)-w0;
 
if (alpha != 255)
{
alpha += alpha>>7; /* alpha is now in the 0...256 range */
while (h--)
{
int w = w0;
while (w--)
{
unsigned int ca, drb, dga, crb, cga;
ca = *src++;
drb = *dst32++;
ca += ca>>7;
ca = (ca*alpha)>>8;
if (ca == 0)
continue;
dga = drb & MASK;
drb = (drb<<8) & MASK;
cga = ga - (dga>>8);
crb = rb - (drb>>8);
dga += cga * ca;
drb += crb * ca;
dga &= MASK;
drb &= MASK;
drb = dga | (drb>>8);
dst32[-1] = drb;
}
src += srcw;
dst32 += dstw;
}
}
else
{
while (h--)
{
int w = w0;
while (w--)
{
unsigned int ca, drb, dga, crb, cga;
ca = *src++;
drb = *dst32++;
ca += ca>>7;
if (ca == 0)
continue;
dga = drb & MASK;
drb = (drb<<8) & MASK;
cga = ga - (dga>>8);
crb = rb - (drb>>8);
dga += cga * ca;
drb += crb * ca;
dga &= MASK;
drb &= MASK;
drb = dga | (drb>>8);
dst32[-1] = drb;
}
src += srcw;
dst32 += dstw;
}
}
}
 
static void
img_4o4_32bit(byte * restrict src, byte cov, int len, byte * restrict dst,
fz_pixmap *image, int u, int v, int fa, int fb)
{
unsigned int *dst32 = (unsigned int *)(void *)dst;
unsigned int *samples = (unsigned int *)(void *)image->samples;
int w = image->w;
int h = image->h-1;
 
while (len--)
{
unsigned int a, a1, d, d1;
int sa;
cov += *src; *src = 0; src++;
/* (a,a1) = sampleargb(samples, w, h, u, v, argb); */
{
int ui, ui1, vi, vi1, ud, vd;
unsigned int b, b1, c, c1;
ui1 = 1;
ui = u >> 16;
if (ui < 0)
{
ui = 0;
ui1 = 0;
}
else if (ui >= w-1)
{
ui = w-1;
ui1 = 0;
}
vi1 = w;
vi = v >> 16;
if (vi < 0)
{
vi = 0;
vi1 = 0;
}
else if (vi >= h)
{
vi = h;
vi1 = 0;
}
ui += vi*w;
a = samples[ui];
b = samples[ui + ui1];
c = samples[ui + vi1];
d = samples[ui + ui1 + vi1];
ud = (u>>8) & 0xFF;
vd = (v>>8) & 0xFF;
ud = FZ_EXPAND(ud);
vd = FZ_EXPAND(vd);
/* (a,a1) = blend(a,b,ud) */
a1 = a & MASK;
a = (a<<8) & MASK;
b1 = (b>>8) & ~MASK;
b = b & ~MASK;
a = ((b -(a >>8)) * ud + a ) & MASK;
a1 = ((b1-(a1>>8)) * ud + a1) & MASK;
/* (c,c1) = blend(c,d,ud) */
c1 = c & MASK;
c = (c<<8) & MASK;
d1 = (d>>8) & ~MASK;
d = d & ~MASK;
c = ((d -(c >>8)) * ud + c ) & MASK;
c1 = ((d1-(c1>>8)) * ud + c1) & MASK;
/* (a,a1) = blend((a,a1),(c,c1),vd) */
a = (((c >>8)-(a >>8)) * vd + a ) & MASK;
a1 = (((c1>>8)-(a1>>8)) * vd + a1) & MASK;
}
sa = (a1>>24);
sa = FZ_COMBINE(FZ_EXPAND(sa), FZ_EXPAND(cov));
a1 |= 0xFF000000;
d = *dst32++;
d1 = d & MASK;
d = (d<<8) & MASK;
a = (((a >>8)-(d >>8)) * sa + d ) & MASK;
a1 = (((a1>>8)-(d1>>8)) * sa + d1) & MASK;
dst32[-1] = (a>>8) | a1;
u += fa;
v += fb;
}
}
 
static void
img_w4i1o4_32bit(byte *rgba, byte * restrict src, byte cov, int len,
byte * restrict dst, fz_pixmap *image, int u, int v, int fa, int fb)
{
byte *samples = image->samples;
int w = image->w;
int h = image->h-1;
int alpha = FZ_EXPAND(rgba[3]);
unsigned int rb = rgba[0] | (rgba[2] << 16);
unsigned int ga = rgba[1] | 0xFF0000;
unsigned int *dst32 = (unsigned int *)(void *)dst;
 
if (alpha == 0)
return;
if (alpha != 256)
{
while (len--)
{
unsigned int ca, drb, dga, crb, cga;
unsigned int a, b;
cov += *src; *src = 0; src++;
drb = *dst32++;
ca = FZ_COMBINE(FZ_EXPAND(cov), alpha);
if (ca != 0)
{
int ui, ui1, vi, vi1, ud, vd;
/* a = samplemask(samples, w, h, u, v); */
ui1 = 1;
ui = u >> 16;
if (ui < 0)
{
ui = 0;
ui1 = 0;
}
else if (ui >= w-1)
{
ui = w-1;
ui1 = 0;
}
vi1 = w;
vi = v >> 16;
if (vi < 0)
{
vi = 0;
vi1 = 0;
}
else if (vi >= h)
{
vi = h;
vi1 = 0;
}
ui += vi*w;
a = samples[ui];
b = samples[ui + ui1];
a |= samples[ui + vi1]<<16;
b |= samples[ui + ui1 + vi1]<<16;
ud = (u>>8) & 0xFF;
vd = (v>>8) & 0xFF;
ud = FZ_EXPAND(ud);
vd = FZ_EXPAND(vd);
/* a = blend(a,b,ud) */
a = ((b-a) * ud + (a<<8)) & MASK;
/* a = blend(a,a>>16,vd) */
a = (((a>>24)-(a>>8)) * vd + a);
a = (a>>8) & 0xFF;
ca = FZ_COMBINE(ca, FZ_EXPAND(a));
}
if (ca != 0)
{
dga = drb & MASK;
drb = (drb<<8) & MASK;
cga = ga - (dga>>8);
crb = rb - (drb>>8);
dga += cga * ca;
drb += crb * ca;
dga &= MASK;
drb &= MASK;
drb = dga | (drb>>8);
dst32[-1] = drb;
}
u += fa;
v += fb;
}
}
else
{
while (len--)
{
unsigned int ca, drb, dga, crb, cga;
unsigned int a, b;
cov += *src; *src = 0; src++;
drb = *dst32++;
if (cov != 0)
{
int ui, ui1, vi, vi1, ud, vd;
/* a = samplemask(samples, w, h, u, v); */
ui1 = 1;
ui = u >> 16;
if (ui < 0)
{
ui = 0;
ui1 = 0;
}
else if (ui >= w-1)
{
ui = w-1;
ui1 = 0;
}
vi1 = w;
vi = v >> 16;
if (vi < 0)
{
vi = 0;
vi1 = 0;
}
else if (vi >= h)
{
vi = h;
vi1 = 0;
}
ui += vi*w;
a = samples[ui];
b = samples[ui + ui1];
a |= samples[ui + vi1]<<16;
b |= samples[ui + ui1 + vi1]<<16;
ud = (u>>8) & 0xFF;
vd = (v>>8) & 0xFF;
ud = FZ_EXPAND(ud);
vd = FZ_EXPAND(vd);
/* a = blend(a,b,ud) */
a = ((b-a) * ud + (a<<8)) & MASK;
/* a = blend(a,a>>16,vd) */
a = (((a>>24)-(a>>8)) * vd + a);
a = (a>>8) & 0xFF;
ca = FZ_COMBINE(FZ_EXPAND(cov),FZ_EXPAND(a));
if (ca != 0)
{
if (ca == 256)
{
drb = (ga<<8) | rb;
}
else
{
dga = drb & MASK;
drb = (drb<<8) & MASK;
cga = ga - (dga>>8);
crb = rb - (drb>>8);
dga += cga * ca;
drb += crb * ca;
dga &= MASK;
drb &= MASK;
drb = dga | (drb>>8);
}
dst32[-1] = drb;
}
}
u += fa;
v += fb;
}
}
}
 
static void
img_1o1_32bit(byte * restrict src, byte cov, int len, byte * restrict dst,
fz_pixmap *image, int u, int v, int fa, int fb)
{
byte *samples = image->samples;
int w = image->w;
int h = image->h-1;
 
while (len--)
{
unsigned int a, b;
cov += *src; *src = 0; src++;
if (cov != 0)
{
int ui, ui1, vi, vi1, ud, vd;
/* sa = samplemask(samples, w, h, u, v); */
ui1 = 1;
ui = u >> 16;
if (ui < 0)
{
ui = 0;
ui1 = 0;
}
else if (ui >= w-1)
{
ui = w-1;
ui1 = 0;
}
vi1 = w;
vi = v >> 16;
if (vi < 0)
{
vi = 0;
vi1 = 0;
}
else if (vi >= h)
{
vi = h;
vi1 = 0;
}
ui += vi*w;
a = samples[ui];
b = samples[ui + ui1];
a |= samples[ui + vi1]<<16;
b |= samples[ui + ui1 + vi1]<<16;
ud = (u>>8) & 0xFF;
vd = (v>>8) & 0xFF;
ud = FZ_EXPAND(ud);
vd = FZ_EXPAND(vd);
/* a = blend(a,b,ud) */
a = ((b-a) * ud + (a<<8)) & MASK;
/* a = blend(a,a>>16,vd) */
a = (((a>>24)-(a>>8)) * vd + a);
a = (a>>8) & 0xFF;
a = FZ_COMBINE(FZ_EXPAND(a), FZ_EXPAND(cov));
if (a != 0)
{
if (a == 256)
dst[0] = 255;
else
dst[0] = FZ_BLEND(255, dst[0], a);
}
}
dst++;
u += fa;
v += fb;
}
}
 
#endif
 
void fz_accelerate(void)
{
if (sizeof(int) == 4 && sizeof(unsigned int) == 4 && !fz_is_big_endian())
{
// fz_path_w4i1o4 = path_w4i1o4_32bit;
// fz_text_w4i1o4 = text_w4i1o4_32bit;
// fz_img_4o4 = img_4o4_32bit;
// fz_img_w4i1o4 = img_w4i1o4_32bit;
// fz_img_1o1 = img_1o1_32bit;
}
 
#ifdef HAVE_CPUDEP
fz_accelerate_arch();
#endif
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/draw/draw_affine.c
0,0 → 1,588
#include "fitz.h"
 
typedef unsigned char byte;
 
static inline float roundup(float x)
{
return (x < 0) ? floorf(x) : ceilf(x);
}
 
static inline int lerp(int a, int b, int t)
{
return a + (((b - a) * t) >> 16);
}
 
static inline int bilerp(int a, int b, int c, int d, int u, int v)
{
return lerp(lerp(a, b, u), lerp(c, d, u), v);
}
 
static inline byte *sample_nearest(byte *s, int w, int h, int n, int u, int v)
{
if (u < 0) u = 0;
if (v < 0) v = 0;
if (u >= w) u = w - 1;
if (v >= h) v = h - 1;
return s + (v * w + u) * n;
}
 
/* Blend premultiplied source image in constant alpha over destination */
 
static inline void
fz_paint_affine_alpha_N_lerp(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, int alpha, byte *hp)
{
int k;
int n1 = n-1;
 
while (w--)
{
int ui = u >> 16;
int vi = v >> 16;
if (ui >= 0 && ui < sw && vi >= 0 && vi < sh)
{
int uf = u & 0xffff;
int vf = v & 0xffff;
byte *a = sample_nearest(sp, sw, sh, n, ui, vi);
byte *b = sample_nearest(sp, sw, sh, n, ui+1, vi);
byte *c = sample_nearest(sp, sw, sh, n, ui, vi+1);
byte *d = sample_nearest(sp, sw, sh, n, ui+1, vi+1);
int xa = bilerp(a[n1], b[n1], c[n1], d[n1], uf, vf);
int t;
xa = fz_mul255(xa, alpha);
t = 255 - xa;
for (k = 0; k < n1; k++)
{
int x = bilerp(a[k], b[k], c[k], d[k], uf, vf);
dp[k] = fz_mul255(x, alpha) + fz_mul255(dp[k], t);
}
dp[n1] = xa + fz_mul255(dp[n1], t);
if (hp)
hp[0] = xa + fz_mul255(hp[n1], t);
}
dp += n;
if (hp)
hp++;
u += fa;
v += fb;
}
}
 
/* Special case code for gray -> rgb */
static inline void
fz_paint_affine_alpha_g2rgb_lerp(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int alpha, byte *hp)
{
while (w--)
{
int ui = u >> 16;
int vi = v >> 16;
if (ui >= 0 && ui < sw && vi >= 0 && vi < sh)
{
int uf = u & 0xffff;
int vf = v & 0xffff;
byte *a = sample_nearest(sp, sw, sh, 2, ui, vi);
byte *b = sample_nearest(sp, sw, sh, 2, ui+1, vi);
byte *c = sample_nearest(sp, sw, sh, 2, ui, vi+1);
byte *d = sample_nearest(sp, sw, sh, 2, ui+1, vi+1);
int y = bilerp(a[1], b[1], c[1], d[1], uf, vf);
int x = bilerp(a[0], b[0], c[0], d[0], uf, vf);
int t;
x = fz_mul255(x, alpha);
y = fz_mul255(y, alpha);
t = 255 - y;
dp[0] = x + fz_mul255(dp[0], t);
dp[1] = x + fz_mul255(dp[1], t);
dp[2] = x + fz_mul255(dp[2], t);
dp[3] = y + fz_mul255(dp[3], t);
if (hp)
hp[0] = y + fz_mul255(hp[0], t);
}
dp += 4;
if (hp)
hp++;
u += fa;
v += fb;
}
}
 
static inline void
fz_paint_affine_alpha_N_near(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, int alpha, byte *hp)
{
int k;
int n1 = n-1;
 
while (w--)
{
int ui = u >> 16;
int vi = v >> 16;
if (ui >= 0 && ui < sw && vi >= 0 && vi < sh)
{
byte *sample = sp + ((vi * sw + ui) * n);
int a = fz_mul255(sample[n-1], alpha);
int t = 255 - a;
for (k = 0; k < n1; k++)
dp[k] = fz_mul255(sample[k], alpha) + fz_mul255(dp[k], t);
dp[n1] = a + fz_mul255(dp[n1], t);
if (hp)
hp[0] = a + fz_mul255(hp[n1], t);
}
dp += n;
if (hp)
hp++;
u += fa;
v += fb;
}
}
 
static inline void
fz_paint_affine_alpha_g2rgb_near(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int alpha, byte *hp)
{
while (w--)
{
int ui = u >> 16;
int vi = v >> 16;
if (ui >= 0 && ui < sw && vi >= 0 && vi < sh)
{
byte *sample = sp + ((vi * sw + ui) * 2);
int x = fz_mul255(sample[0], alpha);
int a = fz_mul255(sample[1], alpha);
int t = 255 - a;
dp[0] = x + fz_mul255(dp[0], t);
dp[1] = x + fz_mul255(dp[1], t);
dp[2] = x + fz_mul255(dp[2], t);
dp[3] = a + fz_mul255(dp[3], t);
if (hp)
hp[0] = a + fz_mul255(hp[0], t);
}
dp += 4;
if (hp)
hp++;
u += fa;
v += fb;
}
}
 
/* Blend premultiplied source image over destination */
 
static inline void
fz_paint_affine_N_lerp(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, byte *hp)
{
int k;
int n1 = n-1;
 
while (w--)
{
int ui = u >> 16;
int vi = v >> 16;
if (ui >= 0 && ui < sw && vi >= 0 && vi < sh)
{
int uf = u & 0xffff;
int vf = v & 0xffff;
byte *a = sample_nearest(sp, sw, sh, n, ui, vi);
byte *b = sample_nearest(sp, sw, sh, n, ui+1, vi);
byte *c = sample_nearest(sp, sw, sh, n, ui, vi+1);
byte *d = sample_nearest(sp, sw, sh, n, ui+1, vi+1);
int y = bilerp(a[n1], b[n1], c[n1], d[n1], uf, vf);
int t = 255 - y;
for (k = 0; k < n1; k++)
{
int x = bilerp(a[k], b[k], c[k], d[k], uf, vf);
dp[k] = x + fz_mul255(dp[k], t);
}
dp[n1] = y + fz_mul255(dp[n1], t);
if (hp)
hp[0] = y + fz_mul255(hp[0], t);
}
dp += n;
if (hp)
hp++;
u += fa;
v += fb;
}
}
 
static inline void
fz_paint_affine_solid_g2rgb_lerp(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, byte *hp)
{
while (w--)
{
int ui = u >> 16;
int vi = v >> 16;
if (ui >= 0 && ui < sw && vi >= 0 && vi < sh)
{
int uf = u & 0xffff;
int vf = v & 0xffff;
byte *a = sample_nearest(sp, sw, sh, 2, ui, vi);
byte *b = sample_nearest(sp, sw, sh, 2, ui+1, vi);
byte *c = sample_nearest(sp, sw, sh, 2, ui, vi+1);
byte *d = sample_nearest(sp, sw, sh, 2, ui+1, vi+1);
int y = bilerp(a[1], b[1], c[1], d[1], uf, vf);
int t = 255 - y;
int x = bilerp(a[0], b[0], c[0], d[0], uf, vf);
dp[0] = x + fz_mul255(dp[0], t);
dp[1] = x + fz_mul255(dp[1], t);
dp[2] = x + fz_mul255(dp[2], t);
dp[3] = y + fz_mul255(dp[3], t);
if (hp)
hp[0] = y + fz_mul255(hp[0], t);
}
dp += 4;
if (hp)
hp++;
u += fa;
v += fb;
}
}
 
static inline void
fz_paint_affine_N_near(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, byte *hp)
{
int k;
int n1 = n-1;
 
while (w--)
{
int ui = u >> 16;
int vi = v >> 16;
if (ui >= 0 && ui < sw && vi >= 0 && vi < sh)
{
byte *sample = sp + ((vi * sw + ui) * n);
int a = sample[n1];
int t = 255 - a;
for (k = 0; k < n1; k++)
dp[k] = sample[k] + fz_mul255(dp[k], t);
dp[n1] = a + fz_mul255(dp[n1], t);
if (hp)
hp[0] = a + fz_mul255(hp[0], t);
}
dp += n;
if (hp)
hp++;
u += fa;
v += fb;
}
}
 
static inline void
fz_paint_affine_solid_g2rgb_near(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, byte *hp)
{
while (w--)
{
int ui = u >> 16;
int vi = v >> 16;
if (ui >= 0 && ui < sw && vi >= 0 && vi < sh)
{
byte *sample = sp + ((vi * sw + ui) * 2);
int x = sample[0];
int a = sample[1];
int t = 255 - a;
dp[0] = x + fz_mul255(dp[0], t);
dp[1] = x + fz_mul255(dp[1], t);
dp[2] = x + fz_mul255(dp[2], t);
dp[3] = a + fz_mul255(dp[3], t);
if (hp)
hp[0] = a + fz_mul255(hp[0], t);
}
dp += 4;
if (hp)
hp++;
u += fa;
v += fb;
}
}
 
/* Blend non-premultiplied color in source image mask over destination */
 
static inline void
fz_paint_affine_color_N_lerp(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, byte *color, byte *hp)
{
int n1 = n - 1;
int sa = color[n1];
int k;
 
while (w--)
{
int ui = u >> 16;
int vi = v >> 16;
if (ui >= 0 && ui < sw && vi >= 0 && vi < sh)
{
int uf = u & 0xffff;
int vf = v & 0xffff;
byte *a = sample_nearest(sp, sw, sh, 1, ui, vi);
byte *b = sample_nearest(sp, sw, sh, 1, ui+1, vi);
byte *c = sample_nearest(sp, sw, sh, 1, ui, vi+1);
byte *d = sample_nearest(sp, sw, sh, 1, ui+1, vi+1);
int ma = bilerp(a[0], b[0], c[0], d[0], uf, vf);
int masa = FZ_COMBINE(FZ_EXPAND(ma), sa);
for (k = 0; k < n1; k++)
dp[k] = FZ_BLEND(color[k], dp[k], masa);
dp[n1] = FZ_BLEND(255, dp[n1], masa);
if (hp)
hp[0] = FZ_BLEND(255, hp[0], masa);
}
dp += n;
if (hp)
hp++;
u += fa;
v += fb;
}
}
 
static inline void
fz_paint_affine_color_N_near(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, byte *color, byte *hp)
{
int n1 = n-1;
int sa = color[n1];
int k;
 
while (w--)
{
int ui = u >> 16;
int vi = v >> 16;
if (ui >= 0 && ui < sw && vi >= 0 && vi < sh)
{
int ma = sp[vi * sw + ui];
int masa = FZ_COMBINE(FZ_EXPAND(ma), sa);
for (k = 0; k < n1; k++)
dp[k] = FZ_BLEND(color[k], dp[k], masa);
dp[n1] = FZ_BLEND(255, dp[n1], masa);
if (hp)
hp[n1] = FZ_BLEND(255, hp[n1], masa);
}
dp += n;
if (hp)
hp++;
u += fa;
v += fb;
}
}
 
static void
fz_paint_affine_lerp(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, int alpha, byte *color/*unused*/, byte *hp)
{
if (alpha == 255)
{
switch (n)
{
case 1: fz_paint_affine_N_lerp(dp, sp, sw, sh, u, v, fa, fb, w, 1, hp); break;
case 2: fz_paint_affine_N_lerp(dp, sp, sw, sh, u, v, fa, fb, w, 2, hp); break;
case 4: fz_paint_affine_N_lerp(dp, sp, sw, sh, u, v, fa, fb, w, 4, hp); break;
default: fz_paint_affine_N_lerp(dp, sp, sw, sh, u, v, fa, fb, w, n, hp); break;
}
}
else if (alpha > 0)
{
switch (n)
{
case 1: fz_paint_affine_alpha_N_lerp(dp, sp, sw, sh, u, v, fa, fb, w, 1, alpha, hp); break;
case 2: fz_paint_affine_alpha_N_lerp(dp, sp, sw, sh, u, v, fa, fb, w, 2, alpha, hp); break;
case 4: fz_paint_affine_alpha_N_lerp(dp, sp, sw, sh, u, v, fa, fb, w, 4, alpha, hp); break;
default: fz_paint_affine_alpha_N_lerp(dp, sp, sw, sh, u, v, fa, fb, w, n, alpha, hp); break;
}
}
}
 
static void
fz_paint_affine_g2rgb_lerp(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, int alpha, byte *color/*unused*/, byte *hp)
{
if (alpha == 255)
{
fz_paint_affine_solid_g2rgb_lerp(dp, sp, sw, sh, u, v, fa, fb, w, hp);
}
else if (alpha > 0)
{
fz_paint_affine_alpha_g2rgb_lerp(dp, sp, sw, sh, u, v, fa, fb, w, alpha, hp);
}
}
 
static void
fz_paint_affine_near(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, int alpha, byte *color/*unused */, byte *hp)
{
if (alpha == 255)
{
switch (n)
{
case 1: fz_paint_affine_N_near(dp, sp, sw, sh, u, v, fa, fb, w, 1, hp); break;
case 2: fz_paint_affine_N_near(dp, sp, sw, sh, u, v, fa, fb, w, 2, hp); break;
case 4: fz_paint_affine_N_near(dp, sp, sw, sh, u, v, fa, fb, w, 4, hp); break;
default: fz_paint_affine_N_near(dp, sp, sw, sh, u, v, fa, fb, w, n, hp); break;
}
}
else if (alpha > 0)
{
switch (n)
{
case 1: fz_paint_affine_alpha_N_near(dp, sp, sw, sh, u, v, fa, fb, w, 1, alpha, hp); break;
case 2: fz_paint_affine_alpha_N_near(dp, sp, sw, sh, u, v, fa, fb, w, 2, alpha, hp); break;
case 4: fz_paint_affine_alpha_N_near(dp, sp, sw, sh, u, v, fa, fb, w, 4, alpha, hp); break;
default: fz_paint_affine_alpha_N_near(dp, sp, sw, sh, u, v, fa, fb, w, n, alpha, hp); break;
}
}
}
 
static void
fz_paint_affine_g2rgb_near(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, int alpha, byte *color/*unused*/, byte *hp)
{
if (alpha == 255)
{
fz_paint_affine_solid_g2rgb_near(dp, sp, sw, sh, u, v, fa, fb, w, hp);
}
else if (alpha > 0)
{
fz_paint_affine_alpha_g2rgb_near(dp, sp, sw, sh, u, v, fa, fb, w, alpha, hp);
}
}
 
static void
fz_paint_affine_color_lerp(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, int alpha/*unused*/, byte *color, byte *hp)
{
switch (n)
{
case 2: fz_paint_affine_color_N_lerp(dp, sp, sw, sh, u, v, fa, fb, w, 2, color, hp); break;
case 4: fz_paint_affine_color_N_lerp(dp, sp, sw, sh, u, v, fa, fb, w, 4, color, hp); break;
default: fz_paint_affine_color_N_lerp(dp, sp, sw, sh, u, v, fa, fb, w, n, color, hp); break;
}
}
 
static void
fz_paint_affine_color_near(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, int alpha/*unused*/, byte *color, byte *hp)
{
switch (n)
{
case 2: fz_paint_affine_color_N_near(dp, sp, sw, sh, u, v, fa, fb, w, 2, color, hp); break;
case 4: fz_paint_affine_color_N_near(dp, sp, sw, sh, u, v, fa, fb, w, 4, color, hp); break;
default: fz_paint_affine_color_N_near(dp, sp, sw, sh, u, v, fa, fb, w, n, color, hp); break;
}
}
 
/* Draw an image with an affine transform on destination */
 
static void
fz_paint_image_imp(fz_pixmap *dst, fz_bbox scissor, fz_pixmap *shape, fz_pixmap *img, fz_matrix ctm, byte *color, int alpha)
{
byte *dp, *sp, *hp;
int u, v, fa, fb, fc, fd;
int x, y, w, h;
int sw, sh, n, hw;
fz_matrix inv;
fz_bbox bbox;
int dolerp;
void (*paintfn)(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, int alpha, byte *color, byte *hp);
 
/* grid fit the image */
if (fz_is_rectilinear(ctm))
{
ctm.a = roundup(ctm.a);
ctm.b = roundup(ctm.b);
ctm.c = roundup(ctm.c);
ctm.d = roundup(ctm.d);
ctm.e = floorf(ctm.e);
ctm.f = floorf(ctm.f);
}
 
/* turn on interpolation for upscaled and non-rectilinear transforms */
dolerp = 0;
if (!fz_is_rectilinear(ctm))
dolerp = 1;
if (sqrtf(ctm.a * ctm.a + ctm.b * ctm.b) > img->w)
dolerp = 1;
if (sqrtf(ctm.c * ctm.c + ctm.d * ctm.d) > img->h)
dolerp = 1;
 
/* except when we shouldn't, at large magnifications */
if (!img->interpolate)
{
if (sqrtf(ctm.a * ctm.a + ctm.b * ctm.b) > img->w * 2)
dolerp = 0;
if (sqrtf(ctm.c * ctm.c + ctm.d * ctm.d) > img->h * 2)
dolerp = 0;
}
 
bbox = fz_round_rect(fz_transform_rect(ctm, fz_unit_rect));
bbox = fz_intersect_bbox(bbox, scissor);
x = bbox.x0;
y = bbox.y0;
w = bbox.x1 - bbox.x0;
h = bbox.y1 - bbox.y0;
 
/* map from screen space (x,y) to image space (u,v) */
inv = fz_scale(1.0f / img->w, -1.0f / img->h);
inv = fz_concat(inv, fz_translate(0, 1));
inv = fz_concat(inv, ctm);
inv = fz_invert_matrix(inv);
 
fa = inv.a * 65536;
fb = inv.b * 65536;
fc = inv.c * 65536;
fd = inv.d * 65536;
 
/* Calculate initial texture positions. Do a half step to start. */
u = (fa * x) + (fc * y) + inv.e * 65536 + ((fa + fc) >> 1);
v = (fb * x) + (fd * y) + inv.f * 65536 + ((fb + fd) >> 1);
 
dp = dst->samples + ((y - dst->y) * dst->w + (x - dst->x)) * dst->n;
n = dst->n;
sp = img->samples;
sw = img->w;
sh = img->h;
if (shape)
{
hw = shape->w;
hp = shape->samples + ((y - shape->y) * hw) + x - dst->x;
}
else
{
hw = 0;
hp = NULL;
}
 
/* TODO: if (fb == 0 && fa == 1) call fz_paint_span */
 
if (dst->n == 4 && img->n == 2)
{
assert(color == NULL);
if (dolerp)
paintfn = fz_paint_affine_g2rgb_lerp;
else
paintfn = fz_paint_affine_g2rgb_near;
}
else
{
if (dolerp)
{
if (color)
paintfn = fz_paint_affine_color_lerp;
else
paintfn = fz_paint_affine_lerp;
}
else
{
if (color)
paintfn = fz_paint_affine_color_near;
else
paintfn = fz_paint_affine_near;
}
}
 
while (h--)
{
paintfn(dp, sp, sw, sh, u, v, fa, fb, w, n, alpha, color, hp);
dp += dst->w * n;
hp += hw;
u += fc;
v += fd;
}
}
 
void
fz_paint_image_with_color(fz_pixmap *dst, fz_bbox scissor, fz_pixmap *shape, fz_pixmap *img, fz_matrix ctm, byte *color)
{
assert(img->n == 1);
fz_paint_image_imp(dst, scissor, shape, img, ctm, color, 255);
}
 
void
fz_paint_image(fz_pixmap *dst, fz_bbox scissor, fz_pixmap *shape, fz_pixmap *img, fz_matrix ctm, int alpha)
{
assert(dst->n == img->n || (dst->n == 4 && img->n == 2));
fz_paint_image_imp(dst, scissor, shape, img, ctm, NULL, alpha);
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/draw/draw_blend.c
0,0 → 1,567
#include "fitz.h"
 
/* PDF 1.4 blend modes. These are slow. */
 
typedef unsigned char byte;
 
static const char *fz_blendmode_names[] =
{
"Normal",
"Multiply",
"Screen",
"Overlay",
"Darken",
"Lighten",
"ColorDodge",
"ColorBurn",
"HardLight",
"SoftLight",
"Difference",
"Exclusion",
"Hue",
"Saturation",
"Color",
"Luminosity",
};
 
int fz_find_blendmode(char *name)
{
int i;
for (i = 0; i < nelem(fz_blendmode_names); i++)
if (!strcmp(name, fz_blendmode_names[i]))
return i;
return FZ_BLEND_NORMAL;
}
 
char *fz_blendmode_name(int blendmode)
{
if (blendmode >= 0 && blendmode < nelem(fz_blendmode_names))
return (char*)fz_blendmode_names[blendmode];
return "Normal";
}
 
/* Separable blend modes */
 
static inline int fz_screen_byte(int b, int s)
{
return b + s - fz_mul255(b, s);
}
 
static inline int fz_hard_light_byte(int b, int s)
{
int s2 = s << 1;
if (s <= 127)
return fz_mul255(b, s2);
else
return fz_screen_byte(b, s2 - 255);
}
 
static inline int fz_overlay_byte(int b, int s)
{
return fz_hard_light_byte(s, b); /* note swapped order */
}
 
static inline int fz_darken_byte(int b, int s)
{
return MIN(b, s);
}
 
static inline int fz_lighten_byte(int b, int s)
{
return MAX(b, s);
}
 
static inline int fz_color_dodge_byte(int b, int s)
{
s = 255 - s;
if (b == 0)
return 0;
else if (b >= s)
return 255;
else
return (0x1fe * b + s) / (s << 1);
}
 
static inline int fz_color_burn_byte(int b, int s)
{
b = 255 - b;
if (b == 0)
return 255;
else if (b >= s)
return 0;
else
return 0xff - (0x1fe * b + s) / (s << 1);
}
 
static inline int fz_soft_light_byte(int b, int s)
{
/* review this */
if (s < 128) {
return b - fz_mul255(fz_mul255((255 - (s<<1)), b), 255 - b);
}
else {
int dbd;
if (b < 64)
dbd = fz_mul255(fz_mul255((b << 4) - 12, b) + 4, b);
else
dbd = (int)sqrtf(255.0f * b);
return b + fz_mul255(((s<<1) - 255), (dbd - b));
}
}
 
static inline int fz_difference_byte(int b, int s)
{
return ABS(b - s);
}
 
static inline int fz_exclusion_byte(int b, int s)
{
return b + s - (fz_mul255(b, s)<<1);
}
 
/* Non-separable blend modes */
 
static void
fz_luminosity_rgb(int *rd, int *gd, int *bd, int rb, int gb, int bb, int rs, int gs, int bs)
{
int delta, scale;
int r, g, b, y;
 
/* 0.3, 0.59, 0.11 in fixed point */
delta = ((rs - rb) * 77 + (gs - gb) * 151 + (bs - bb) * 28 + 0x80) >> 8;
r = rb + delta;
g = gb + delta;
b = bb + delta;
 
if ((r | g | b) & 0x100)
{
y = (rs * 77 + gs * 151 + bs * 28 + 0x80) >> 8;
if (delta > 0)
{
int max;
max = MAX(r, MAX(g, b));
scale = ((255 - y) << 16) / (max - y);
}
else
{
int min;
min = MIN(r, MIN(g, b));
scale = (y << 16) / (y - min);
}
r = y + (((r - y) * scale + 0x8000) >> 16);
g = y + (((g - y) * scale + 0x8000) >> 16);
b = y + (((b - y) * scale + 0x8000) >> 16);
}
 
*rd = r;
*gd = g;
*bd = b;
}
 
static void
fz_saturation_rgb(int *rd, int *gd, int *bd, int rb, int gb, int bb, int rs, int gs, int bs)
{
int minb, maxb;
int mins, maxs;
int y;
int scale;
int r, g, b;
 
minb = MIN(rb, MIN(gb, bb));
maxb = MAX(rb, MAX(gb, bb));
if (minb == maxb)
{
/* backdrop has zero saturation, avoid divide by 0 */
*rd = gb;
*gd = gb;
*bd = gb;
return;
}
 
mins = MIN(rs, MIN(gs, bs));
maxs = MAX(rs, MAX(gs, bs));
 
scale = ((maxs - mins) << 16) / (maxb - minb);
y = (rb * 77 + gb * 151 + bb * 28 + 0x80) >> 8;
r = y + ((((rb - y) * scale) + 0x8000) >> 16);
g = y + ((((gb - y) * scale) + 0x8000) >> 16);
b = y + ((((bb - y) * scale) + 0x8000) >> 16);
 
if ((r | g | b) & 0x100)
{
int scalemin, scalemax;
int min, max;
 
min = MIN(r, MIN(g, b));
max = MAX(r, MAX(g, b));
 
if (min < 0)
scalemin = (y << 16) / (y - min);
else
scalemin = 0x10000;
 
if (max > 255)
scalemax = ((255 - y) << 16) / (max - y);
else
scalemax = 0x10000;
 
scale = MIN(scalemin, scalemax);
r = y + (((r - y) * scale + 0x8000) >> 16);
g = y + (((g - y) * scale + 0x8000) >> 16);
b = y + (((b - y) * scale + 0x8000) >> 16);
}
 
*rd = r;
*gd = g;
*bd = b;
}
 
static void
fz_color_rgb(int *rr, int *rg, int *rb, int br, int bg, int bb, int sr, int sg, int sb)
{
fz_luminosity_rgb(rr, rg, rb, sr, sg, sb, br, bg, bb);
}
 
static void
fz_hue_rgb(int *rr, int *rg, int *rb, int br, int bg, int bb, int sr, int sg, int sb)
{
int tr, tg, tb;
fz_luminosity_rgb(&tr, &tg, &tb, sr, sg, sb, br, bg, bb);
fz_saturation_rgb(rr, rg, rb, tr, tg, tb, br, bg, bb);
}
 
/* Blending loops */
 
void
fz_blend_separable(byte * restrict bp, byte * restrict sp, int n, int w, int blendmode)
{
int k;
int n1 = n - 1;
while (w--)
{
int sa = sp[n1];
int ba = bp[n1];
int saba = fz_mul255(sa, ba);
 
/* ugh, division to get non-premul components */
int invsa = sa ? 255 * 256 / sa : 0;
int invba = ba ? 255 * 256 / ba : 0;
 
for (k = 0; k < n1; k++)
{
int sc = (sp[k] * invsa) >> 8;
int bc = (bp[k] * invba) >> 8;
int rc;
 
switch (blendmode)
{
default:
case FZ_BLEND_NORMAL: rc = sc; break;
case FZ_BLEND_MULTIPLY: rc = fz_mul255(bc, sc); break;
case FZ_BLEND_SCREEN: rc = fz_screen_byte(bc, sc); break;
case FZ_BLEND_OVERLAY: rc = fz_overlay_byte(bc, sc); break;
case FZ_BLEND_DARKEN: rc = fz_darken_byte(bc, sc); break;
case FZ_BLEND_LIGHTEN: rc = fz_lighten_byte(bc, sc); break;
case FZ_BLEND_COLOR_DODGE: rc = fz_color_dodge_byte(bc, sc); break;
case FZ_BLEND_COLOR_BURN: rc = fz_color_burn_byte(bc, sc); break;
case FZ_BLEND_HARD_LIGHT: rc = fz_hard_light_byte(bc, sc); break;
case FZ_BLEND_SOFT_LIGHT: rc = fz_soft_light_byte(bc, sc); break;
case FZ_BLEND_DIFFERENCE: rc = fz_difference_byte(bc, sc); break;
case FZ_BLEND_EXCLUSION: rc = fz_exclusion_byte(bc, sc); break;
}
 
bp[k] = fz_mul255(255 - sa, bp[k]) + fz_mul255(255 - ba, sp[k]) + fz_mul255(saba, rc);
}
 
bp[k] = ba + sa - saba;
 
sp += n;
bp += n;
}
}
 
void
fz_blend_nonseparable(byte * restrict bp, byte * restrict sp, int w, int blendmode)
{
while (w--)
{
int rr, rg, rb;
 
int sa = sp[3];
int ba = bp[3];
int saba = fz_mul255(sa, ba);
 
/* ugh, division to get non-premul components */
int invsa = sa ? 255 * 256 / sa : 0;
int invba = ba ? 255 * 256 / ba : 0;
 
int sr = (sp[0] * invsa) >> 8;
int sg = (sp[1] * invsa) >> 8;
int sb = (sp[2] * invsa) >> 8;
 
int br = (bp[0] * invba) >> 8;
int bg = (bp[1] * invba) >> 8;
int bb = (bp[2] * invba) >> 8;
 
switch (blendmode)
{
default:
case FZ_BLEND_HUE:
fz_hue_rgb(&rr, &rg, &rb, br, bg, bb, sr, sg, sb);
break;
case FZ_BLEND_SATURATION:
fz_saturation_rgb(&rr, &rg, &rb, br, bg, bb, sr, sg, sb);
break;
case FZ_BLEND_COLOR:
fz_color_rgb(&rr, &rg, &rb, br, bg, bb, sr, sg, sb);
break;
case FZ_BLEND_LUMINOSITY:
fz_luminosity_rgb(&rr, &rg, &rb, br, bg, bb, sr, sg, sb);
break;
}
 
bp[0] = fz_mul255(255 - sa, bp[0]) + fz_mul255(255 - ba, sp[0]) + fz_mul255(saba, rr);
bp[1] = fz_mul255(255 - sa, bp[1]) + fz_mul255(255 - ba, sp[1]) + fz_mul255(saba, rg);
bp[2] = fz_mul255(255 - sa, bp[2]) + fz_mul255(255 - ba, sp[2]) + fz_mul255(saba, rb);
bp[3] = ba + sa - saba;
 
sp += 4;
bp += 4;
}
}
 
static void
fz_blend_separable_nonisolated(byte * restrict bp, byte * restrict sp, int n, int w, int blendmode, byte * restrict hp, int alpha)
{
int k;
int n1 = n - 1;
 
if (alpha == 255 && blendmode == 0)
{
/* In this case, the uncompositing and the recompositing
* cancel one another out, and it's just a simple copy. */
/* FIXME: Maybe we can avoid using the shape plane entirely
* and just copy? */
while (w--)
{
int ha = fz_mul255(*hp++, alpha); /* ha = shape_alpha */
/* If ha == 0 then leave everything unchanged */
if (ha != 0)
{
for (k = 0; k < n; k++)
{
bp[k] = sp[k];
}
}
 
sp += n;
bp += n;
}
return;
}
while (w--)
{
int ha = *hp++;
int haa = fz_mul255(ha, alpha); /* ha = shape_alpha */
/* If haa == 0 then leave everything unchanged */
if (haa != 0)
{
int sa = sp[n1];
int ba = bp[n1];
int baha = fz_mul255(ba, haa);
 
/* ugh, division to get non-premul components */
int invsa = sa ? 255 * 256 / sa : 0;
int invba = ba ? 255 * 256 / ba : 0;
 
/* Calculate result_alpha */
int ra = bp[n1] = ba - baha + haa;
 
/* Because we are a non-isolated group, we need to
* 'uncomposite' before we blend (recomposite).
* We assume that normal blending has been done inside
* the group, so: ra.rc = (1-ha).bc + ha.sc
* A bit of rearrangement, and that gives us that:
* sc = (ra.rc - bc)/ha + bc
* Now, the result of the blend was stored in src, so:
*/
int invha = ha ? 255 * 256 / ha : 0;
 
if (ra != 0) for (k = 0; k < n1; k++)
{
int sc = (sp[k] * invsa) >> 8;
int bc = (bp[k] * invba) >> 8;
int rc;
 
/* Uncomposite */
sc = (((sc-bc)*invha)>>8) + bc;
if (sc < 0) sc = 0;
if (sc > 255) sc = 255;
 
switch (blendmode)
{
default:
case FZ_BLEND_NORMAL: rc = sc; break;
case FZ_BLEND_MULTIPLY: rc = fz_mul255(bc, sc); break;
case FZ_BLEND_SCREEN: rc = fz_screen_byte(bc, sc); break;
case FZ_BLEND_OVERLAY: rc = fz_overlay_byte(bc, sc); break;
case FZ_BLEND_DARKEN: rc = fz_darken_byte(bc, sc); break;
case FZ_BLEND_LIGHTEN: rc = fz_lighten_byte(bc, sc); break;
case FZ_BLEND_COLOR_DODGE: rc = fz_color_dodge_byte(bc, sc); break;
case FZ_BLEND_COLOR_BURN: rc = fz_color_burn_byte(bc, sc); break;
case FZ_BLEND_HARD_LIGHT: rc = fz_hard_light_byte(bc, sc); break;
case FZ_BLEND_SOFT_LIGHT: rc = fz_soft_light_byte(bc, sc); break;
case FZ_BLEND_DIFFERENCE: rc = fz_difference_byte(bc, sc); break;
case FZ_BLEND_EXCLUSION: rc = fz_exclusion_byte(bc, sc); break;
}
rc = fz_mul255(255 - haa, bc) + fz_mul255(fz_mul255(255 - ba, sc), haa) + fz_mul255(baha, rc);
if (rc < 0) rc = 0;
if (rc > 255) rc = 255;
bp[k] = fz_mul255(rc, ra);
}
}
 
sp += n;
bp += n;
}
}
 
static void
fz_blend_nonseparable_nonisolated(byte * restrict bp, byte * restrict sp, int w, int blendmode, byte * restrict hp, int alpha)
{
while (w--)
{
int ha = *hp++;
int haa = fz_mul255(ha, alpha);
if (haa != 0)
{
int sa = sp[3];
int ba = bp[3];
int baha = fz_mul255(ba, haa);
 
/* Calculate result_alpha */
int ra = bp[3] = ba - baha + haa;
if (ra != 0)
{
/* Because we are a non-isolated group, we
* need to 'uncomposite' before we blend
* (recomposite). We assume that normal
* blending has been done inside the group,
* so: ra.rc = (1-ha).bc + ha.sc
* A bit of rearrangement, and that gives us
* that: sc = (ra.rc - bc)/ha + bc
* Now, the result of the blend was stored in
* src, so: */
int invha = ha ? 255 * 256 / ha : 0;
 
int rr, rg, rb;
 
/* ugh, division to get non-premul components */
int invsa = sa ? 255 * 256 / sa : 0;
int invba = ba ? 255 * 256 / ba : 0;
 
int sr = (sp[0] * invsa) >> 8;
int sg = (sp[1] * invsa) >> 8;
int sb = (sp[2] * invsa) >> 8;
 
int br = (bp[0] * invba) >> 8;
int bg = (bp[1] * invba) >> 8;
int bb = (bp[2] * invba) >> 8;
 
/* Uncomposite */
sr = (((sr-br)*invha)>>8) + br;
sg = (((sg-bg)*invha)>>8) + bg;
sb = (((sb-bb)*invha)>>8) + bb;
 
switch (blendmode)
{
default:
case FZ_BLEND_HUE:
fz_hue_rgb(&rr, &rg, &rb, br, bg, bb, sr, sg, sb);
break;
case FZ_BLEND_SATURATION:
fz_saturation_rgb(&rr, &rg, &rb, br, bg, bb, sr, sg, sb);
break;
case FZ_BLEND_COLOR:
fz_color_rgb(&rr, &rg, &rb, br, bg, bb, sr, sg, sb);
break;
case FZ_BLEND_LUMINOSITY:
fz_luminosity_rgb(&rr, &rg, &rb, br, bg, bb, sr, sg, sb);
break;
}
 
rr = fz_mul255(255 - haa, bp[0]) + fz_mul255(fz_mul255(255 - ba, sr), haa) + fz_mul255(baha, rr);
rg = fz_mul255(255 - haa, bp[1]) + fz_mul255(fz_mul255(255 - ba, sg), haa) + fz_mul255(baha, rg);
rb = fz_mul255(255 - haa, bp[2]) + fz_mul255(fz_mul255(255 - ba, sb), haa) + fz_mul255(baha, rb);
bp[0] = fz_mul255(ra, rr);
bp[1] = fz_mul255(ra, rg);
bp[2] = fz_mul255(ra, rb);
}
}
 
sp += 4;
bp += 4;
}
}
 
void
fz_blend_pixmap(fz_pixmap *dst, fz_pixmap *src, int alpha, int blendmode, int isolated, fz_pixmap *shape)
{
unsigned char *sp, *dp;
fz_bbox bbox;
int x, y, w, h, n;
 
/* TODO: fix this hack! */
if (isolated && alpha < 255)
{
sp = src->samples;
n = src->w * src->h * src->n;
while (n--)
{
*sp = fz_mul255(*sp, alpha);
sp++;
}
}
 
bbox = fz_bound_pixmap(dst);
bbox = fz_intersect_bbox(bbox, fz_bound_pixmap(src));
 
x = bbox.x0;
y = bbox.y0;
w = bbox.x1 - bbox.x0;
h = bbox.y1 - bbox.y0;
 
n = src->n;
sp = src->samples + ((y - src->y) * src->w + (x - src->x)) * n;
dp = dst->samples + ((y - dst->y) * dst->w + (x - dst->x)) * n;
 
assert(src->n == dst->n);
 
if (!isolated)
{
unsigned char *hp = shape->samples + (y - shape->y) * shape->w + (x - shape->x);
 
while (h--)
{
if (n == 4 && blendmode >= FZ_BLEND_HUE)
fz_blend_nonseparable_nonisolated(dp, sp, w, blendmode, hp, alpha);
else
fz_blend_separable_nonisolated(dp, sp, n, w, blendmode, hp, alpha);
sp += src->w * n;
dp += dst->w * n;
hp += shape->w;
}
}
else
{
while (h--)
{
if (n == 4 && blendmode >= FZ_BLEND_HUE)
fz_blend_nonseparable(dp, sp, w, blendmode);
else
fz_blend_separable(dp, sp, n, w, blendmode);
sp += src->w * n;
dp += dst->w * n;
}
}
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/draw/draw_device.c
0,0 → 1,1582
#include "fitz.h"
 
#define QUANT(x,a) (((int)((x) * (a))) / (a))
#define HSUBPIX 5.0
#define VSUBPIX 5.0
 
#define STACK_SIZE 96
 
/* Enable the following to attempt to support knockout and/or isolated
* blending groups. This code is known to give incorrect results currently
* so disabled by default. See bug 692377. */
#undef ATTEMPT_KNOCKOUT_AND_ISOLATED
 
/* Enable the following to help debug group blending. */
#undef DUMP_GROUP_BLENDS
 
/* Note #1: At various points in this code (notably when clipping with non
* rectangular masks), we create a new (empty) destination pixmap. We then
* render this pixmap, then plot it back into the original destination
* through a mask. This works well for normal blending, but falls down for
* non-zero blending modes; effectively we are forcing ourselves to use an
* isolated group.
*
* The fix for this would be to copy the contents from the underlying dest
* into the newly created dest. This would enable us to use a non
* FZ_BLEND_ISOLATED blendmode. Unfortunately, tt would break tiling, as
* we could no longer render once and blend back multiple times.
*/
 
 
typedef struct fz_draw_device_s fz_draw_device;
 
enum {
FZ_DRAWDEV_FLAGS_TYPE3 = 1,
};
 
struct fz_draw_device_s
{
fz_glyph_cache *cache;
fz_gel *gel;
 
fz_pixmap *dest;
fz_pixmap *shape;
fz_bbox scissor;
 
int flags;
int top;
int blendmode;
struct {
fz_bbox scissor;
fz_pixmap *dest;
fz_pixmap *mask;
fz_pixmap *shape;
int blendmode;
int luminosity;
float alpha;
fz_matrix ctm;
float xstep, ystep;
fz_rect area;
} stack[STACK_SIZE];
};
 
#ifdef DUMP_GROUP_BLENDS
static int group_dump_count = 0;
 
static void fz_dump_blend(fz_pixmap *pix, const char *s)
{
char name[80];
 
if (pix == NULL)
return;
 
sprintf(name, "dump%02d.png", group_dump_count);
if (s)
printf("%s%02d", s, group_dump_count);
group_dump_count++;
 
fz_write_png(pix, name, (pix->n > 1));
}
 
static void dump_spaces(int x, const char *s)
{
int i;
for (i = 0; i < x; i++)
printf(" ");
printf("%s", s);
}
 
#endif
 
static void fz_knockout_begin(void *user)
{
fz_draw_device *dev = user;
fz_bbox bbox;
fz_pixmap *dest, *shape;
int isolated = dev->blendmode & FZ_BLEND_ISOLATED;
 
if ((dev->blendmode & FZ_BLEND_KNOCKOUT) == 0)
return;
 
if (dev->top == STACK_SIZE)
{
fz_warn("assert: too many buffers on stack");
return;
}
 
bbox = fz_bound_pixmap(dev->dest);
bbox = fz_intersect_bbox(bbox, dev->scissor);
dest = fz_new_pixmap_with_rect(dev->dest->colorspace, bbox);
 
if (isolated)
{
fz_clear_pixmap(dest);
}
else
{
fz_pixmap *prev;
int i = dev->top;
do
prev = dev->stack[--i].dest;
while (prev == NULL);
fz_copy_pixmap_rect(dest, prev, bbox);
}
 
if (dev->blendmode == 0 && isolated)
{
/* We can render direct to any existing shape plane. If there
* isn't one, we don't need to make one. */
shape = dev->shape;
}
else
{
shape = fz_new_pixmap_with_rect(NULL, bbox);
fz_clear_pixmap(shape);
}
dev->stack[dev->top].blendmode = dev->blendmode;
dev->stack[dev->top].scissor = dev->scissor;
dev->stack[dev->top].dest = dev->dest;
dev->stack[dev->top].shape = dev->shape;
#ifdef DUMP_GROUP_BLENDS
dump_spaces(dev->top, "Knockout begin\n");
#endif
dev->top++;
 
dev->scissor = bbox;
dev->dest = dest;
dev->shape = shape;
dev->blendmode &= ~FZ_BLEND_MODEMASK;
}
 
static void fz_knockout_end(void *user)
{
fz_draw_device *dev = user;
fz_pixmap *group = dev->dest;
fz_pixmap *shape = dev->shape;
int blendmode;
int isolated;
 
if ((dev->blendmode & FZ_BLEND_KNOCKOUT) == 0)
return;
 
if (dev->top == STACK_SIZE)
{
fz_warn("assert: too many buffers on stack");
return;
}
 
if (dev->top > 0)
{
dev->top--;
blendmode = dev->blendmode & FZ_BLEND_MODEMASK;
isolated = dev->blendmode & FZ_BLEND_ISOLATED;
dev->blendmode = dev->stack[dev->top].blendmode;
dev->shape = dev->stack[dev->top].shape;
dev->dest = dev->stack[dev->top].dest;
dev->scissor = dev->stack[dev->top].scissor;
 
#ifdef DUMP_GROUP_BLENDS
dump_spaces(dev->top, "");
fz_dump_blend(group, "Blending ");
if (shape)
fz_dump_blend(shape, "/");
fz_dump_blend(dev->dest, " onto ");
if (dev->shape)
fz_dump_blend(dev->shape, "/");
if (blendmode != 0)
printf(" (blend %d)", blendmode);
if (isolated != 0)
printf(" (isolated)");
printf(" (knockout)");
#endif
if ((blendmode == 0) && (shape == NULL))
fz_paint_pixmap(dev->dest, group, 255);
else
fz_blend_pixmap(dev->dest, group, 255, blendmode, isolated, shape);
 
fz_drop_pixmap(group);
if (shape != dev->shape)
{
if (dev->shape)
{
fz_paint_pixmap(dev->shape, shape, 255);
}
fz_drop_pixmap(shape);
}
#ifdef DUMP_GROUP_BLENDS
fz_dump_blend(dev->dest, " to get ");
if (dev->shape)
fz_dump_blend(dev->shape, "/");
printf("\n");
#endif
}
}
 
static void
fz_draw_fill_path(void *user, fz_path *path, int even_odd, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
fz_draw_device *dev = user;
fz_colorspace *model = dev->dest->colorspace;
float expansion = fz_matrix_expansion(ctm);
float flatness = 0.3f / expansion;
unsigned char colorbv[FZ_MAX_COLORS + 1];
float colorfv[FZ_MAX_COLORS];
fz_bbox bbox;
int i;
 
fz_reset_gel(dev->gel, dev->scissor);
fz_flatten_fill_path(dev->gel, path, ctm, flatness);
fz_sort_gel(dev->gel);
 
bbox = fz_bound_gel(dev->gel);
bbox = fz_intersect_bbox(bbox, dev->scissor);
 
if (fz_is_empty_rect(bbox))
return;
 
if (dev->blendmode & FZ_BLEND_KNOCKOUT)
fz_knockout_begin(dev);
 
fz_convert_color(colorspace, color, model, colorfv);
for (i = 0; i < model->n; i++)
colorbv[i] = colorfv[i] * 255;
colorbv[i] = alpha * 255;
 
fz_scan_convert(dev->gel, even_odd, bbox, dev->dest, colorbv);
if (dev->shape)
{
fz_reset_gel(dev->gel, dev->scissor);
fz_flatten_fill_path(dev->gel, path, ctm, flatness);
fz_sort_gel(dev->gel);
 
colorbv[0] = alpha * 255;
fz_scan_convert(dev->gel, even_odd, bbox, dev->shape, colorbv);
}
 
if (dev->blendmode & FZ_BLEND_KNOCKOUT)
fz_knockout_end(dev);
}
 
static void
fz_draw_stroke_path(void *user, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
fz_draw_device *dev = user;
fz_colorspace *model = dev->dest->colorspace;
float expansion = fz_matrix_expansion(ctm);
float flatness = 0.3f / expansion;
float linewidth = stroke->linewidth;
unsigned char colorbv[FZ_MAX_COLORS + 1];
float colorfv[FZ_MAX_COLORS];
fz_bbox bbox;
int i;
 
if (linewidth * expansion < 0.1f)
linewidth = 1 / expansion;
 
fz_reset_gel(dev->gel, dev->scissor);
if (stroke->dash_len > 0)
fz_flatten_dash_path(dev->gel, path, stroke, ctm, flatness, linewidth);
else
fz_flatten_stroke_path(dev->gel, path, stroke, ctm, flatness, linewidth);
fz_sort_gel(dev->gel);
 
bbox = fz_bound_gel(dev->gel);
bbox = fz_intersect_bbox(bbox, dev->scissor);
 
if (fz_is_empty_rect(bbox))
return;
 
if (dev->blendmode & FZ_BLEND_KNOCKOUT)
fz_knockout_begin(dev);
 
fz_convert_color(colorspace, color, model, colorfv);
for (i = 0; i < model->n; i++)
colorbv[i] = colorfv[i] * 255;
colorbv[i] = alpha * 255;
 
fz_scan_convert(dev->gel, 0, bbox, dev->dest, colorbv);
if (dev->shape)
{
fz_reset_gel(dev->gel, dev->scissor);
if (stroke->dash_len > 0)
fz_flatten_dash_path(dev->gel, path, stroke, ctm, flatness, linewidth);
else
fz_flatten_stroke_path(dev->gel, path, stroke, ctm, flatness, linewidth);
fz_sort_gel(dev->gel);
 
colorbv[0] = 255;
fz_scan_convert(dev->gel, 0, bbox, dev->shape, colorbv);
}
 
if (dev->blendmode & FZ_BLEND_KNOCKOUT)
fz_knockout_end(dev);
}
 
static void
fz_draw_clip_path(void *user, fz_path *path, fz_rect *rect, int even_odd, fz_matrix ctm)
{
fz_draw_device *dev = user;
fz_colorspace *model = dev->dest->colorspace;
float expansion = fz_matrix_expansion(ctm);
float flatness = 0.3f / expansion;
fz_pixmap *mask, *dest, *shape;
fz_bbox bbox;
 
if (dev->top == STACK_SIZE)
{
fz_warn("assert: too many buffers on stack");
return;
}
 
fz_reset_gel(dev->gel, dev->scissor);
fz_flatten_fill_path(dev->gel, path, ctm, flatness);
fz_sort_gel(dev->gel);
 
bbox = fz_bound_gel(dev->gel);
bbox = fz_intersect_bbox(bbox, dev->scissor);
if (rect)
bbox = fz_intersect_bbox(bbox, fz_round_rect(*rect));
 
if (fz_is_empty_rect(bbox) || fz_is_rect_gel(dev->gel))
{
dev->stack[dev->top].scissor = dev->scissor;
dev->stack[dev->top].mask = NULL;
dev->stack[dev->top].dest = NULL;
dev->stack[dev->top].shape = dev->shape;
dev->stack[dev->top].blendmode = dev->blendmode;
dev->scissor = bbox;
#ifdef DUMP_GROUP_BLENDS
dump_spaces(dev->top, "Clip (rectangular) begin\n");
#endif
dev->top++;
return;
}
 
mask = fz_new_pixmap_with_rect(NULL, bbox);
fz_clear_pixmap(mask);
dest = fz_new_pixmap_with_rect(model, bbox);
/* FIXME: See note #1 */
fz_clear_pixmap(dest);
if (dev->shape)
{
shape = fz_new_pixmap_with_rect(NULL, bbox);
fz_clear_pixmap(shape);
}
else
shape = NULL;
 
fz_scan_convert(dev->gel, even_odd, bbox, mask, NULL);
 
dev->stack[dev->top].scissor = dev->scissor;
dev->stack[dev->top].mask = mask;
dev->stack[dev->top].dest = dev->dest;
dev->stack[dev->top].shape = dev->shape;
/* FIXME: See note #1 */
dev->stack[dev->top].blendmode = dev->blendmode | FZ_BLEND_ISOLATED;
dev->scissor = bbox;
dev->dest = dest;
dev->shape = shape;
#ifdef DUMP_GROUP_BLENDS
dump_spaces(dev->top, "Clip (non-rectangular) begin\n");
#endif
dev->top++;
}
 
static void
fz_draw_clip_stroke_path(void *user, fz_path *path, fz_rect *rect, fz_stroke_state *stroke, fz_matrix ctm)
{
fz_draw_device *dev = user;
fz_colorspace *model = dev->dest->colorspace;
float expansion = fz_matrix_expansion(ctm);
float flatness = 0.3f / expansion;
float linewidth = stroke->linewidth;
fz_pixmap *mask, *dest, *shape;
fz_bbox bbox;
 
if (dev->top == STACK_SIZE)
{
fz_warn("assert: too many buffers on stack");
return;
}
 
if (linewidth * expansion < 0.1f)
linewidth = 1 / expansion;
 
fz_reset_gel(dev->gel, dev->scissor);
if (stroke->dash_len > 0)
fz_flatten_dash_path(dev->gel, path, stroke, ctm, flatness, linewidth);
else
fz_flatten_stroke_path(dev->gel, path, stroke, ctm, flatness, linewidth);
fz_sort_gel(dev->gel);
 
bbox = fz_bound_gel(dev->gel);
bbox = fz_intersect_bbox(bbox, dev->scissor);
if (rect)
bbox = fz_intersect_bbox(bbox, fz_round_rect(*rect));
 
mask = fz_new_pixmap_with_rect(NULL, bbox);
fz_clear_pixmap(mask);
dest = fz_new_pixmap_with_rect(model, bbox);
/* FIXME: See note #1 */
fz_clear_pixmap(dest);
if (dev->shape)
{
shape = fz_new_pixmap_with_rect(NULL, bbox);
fz_clear_pixmap(shape);
}
else
shape = NULL;
 
if (!fz_is_empty_rect(bbox))
fz_scan_convert(dev->gel, 0, bbox, mask, NULL);
 
dev->stack[dev->top].scissor = dev->scissor;
dev->stack[dev->top].mask = mask;
dev->stack[dev->top].dest = dev->dest;
dev->stack[dev->top].shape = dev->shape;
/* FIXME: See note #1 */
dev->stack[dev->top].blendmode = dev->blendmode | FZ_BLEND_ISOLATED;
dev->scissor = bbox;
dev->dest = dest;
dev->shape = shape;
#ifdef DUMP_GROUP_BLENDS
dump_spaces(dev->top, "Clip (stroke) begin\n");
#endif
dev->top++;
}
 
static void
draw_glyph(unsigned char *colorbv, fz_pixmap *dst, fz_pixmap *msk,
int xorig, int yorig, fz_bbox scissor)
{
unsigned char *dp, *mp;
fz_bbox bbox;
int x, y, w, h;
 
bbox = fz_bound_pixmap(msk);
bbox.x0 += xorig;
bbox.y0 += yorig;
bbox.x1 += xorig;
bbox.y1 += yorig;
 
bbox = fz_intersect_bbox(bbox, scissor); /* scissor < dst */
x = bbox.x0;
y = bbox.y0;
w = bbox.x1 - bbox.x0;
h = bbox.y1 - bbox.y0;
 
mp = msk->samples + ((y - msk->y - yorig) * msk->w + (x - msk->x - xorig));
dp = dst->samples + ((y - dst->y) * dst->w + (x - dst->x)) * dst->n;
 
assert(msk->n == 1);
 
while (h--)
{
if (dst->colorspace)
fz_paint_span_with_color(dp, mp, dst->n, w, colorbv);
else
fz_paint_span(dp, mp, 1, w, 255);
dp += dst->w * dst->n;
mp += msk->w;
}
}
 
static void
fz_draw_fill_text(void *user, fz_text *text, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
fz_draw_device *dev = user;
fz_colorspace *model = dev->dest->colorspace;
unsigned char colorbv[FZ_MAX_COLORS + 1];
unsigned char shapebv;
float colorfv[FZ_MAX_COLORS];
fz_matrix tm, trm;
fz_pixmap *glyph;
int i, x, y, gid;
 
if (dev->blendmode & FZ_BLEND_KNOCKOUT)
fz_knockout_begin(dev);
 
fz_convert_color(colorspace, color, model, colorfv);
for (i = 0; i < model->n; i++)
colorbv[i] = colorfv[i] * 255;
colorbv[i] = alpha * 255;
shapebv = 255;
 
tm = text->trm;
 
for (i = 0; i < text->len; i++)
{
gid = text->items[i].gid;
if (gid < 0)
continue;
 
tm.e = text->items[i].x;
tm.f = text->items[i].y;
trm = fz_concat(tm, ctm);
x = floorf(trm.e);
y = floorf(trm.f);
trm.e = QUANT(trm.e - floorf(trm.e), HSUBPIX);
trm.f = QUANT(trm.f - floorf(trm.f), VSUBPIX);
 
glyph = fz_render_glyph(dev->cache, text->font, gid, trm, model);
if (glyph)
{
if (glyph->n == 1)
{
draw_glyph(colorbv, dev->dest, glyph, x, y, dev->scissor);
if (dev->shape)
draw_glyph(&shapebv, dev->shape, glyph, x, y, dev->scissor);
}
else
{
fz_matrix ctm = {glyph->w, 0.0, 0.0, -glyph->h, x + glyph->x, y + glyph->y + glyph->h};
fz_paint_image(dev->dest, dev->scissor, dev->shape, glyph, ctm, alpha * 255);
}
fz_drop_pixmap(glyph);
}
}
 
if (dev->blendmode & FZ_BLEND_KNOCKOUT)
fz_knockout_end(dev);
}
 
static void
fz_draw_stroke_text(void *user, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
fz_draw_device *dev = user;
fz_colorspace *model = dev->dest->colorspace;
unsigned char colorbv[FZ_MAX_COLORS + 1];
float colorfv[FZ_MAX_COLORS];
fz_matrix tm, trm;
fz_pixmap *glyph;
int i, x, y, gid;
 
if (dev->blendmode & FZ_BLEND_KNOCKOUT)
fz_knockout_begin(dev);
 
fz_convert_color(colorspace, color, model, colorfv);
for (i = 0; i < model->n; i++)
colorbv[i] = colorfv[i] * 255;
colorbv[i] = alpha * 255;
 
tm = text->trm;
 
for (i = 0; i < text->len; i++)
{
gid = text->items[i].gid;
if (gid < 0)
continue;
 
tm.e = text->items[i].x;
tm.f = text->items[i].y;
trm = fz_concat(tm, ctm);
x = floorf(trm.e);
y = floorf(trm.f);
trm.e = QUANT(trm.e - floorf(trm.e), HSUBPIX);
trm.f = QUANT(trm.f - floorf(trm.f), VSUBPIX);
 
glyph = fz_render_stroked_glyph(dev->cache, text->font, gid, trm, ctm, stroke);
if (glyph)
{
draw_glyph(colorbv, dev->dest, glyph, x, y, dev->scissor);
if (dev->shape)
draw_glyph(colorbv, dev->shape, glyph, x, y, dev->scissor);
fz_drop_pixmap(glyph);
}
}
 
if (dev->blendmode & FZ_BLEND_KNOCKOUT)
fz_knockout_end(dev);
}
 
static void
fz_draw_clip_text(void *user, fz_text *text, fz_matrix ctm, int accumulate)
{
fz_draw_device *dev = user;
fz_colorspace *model = dev->dest->colorspace;
fz_bbox bbox;
fz_pixmap *mask, *dest, *shape;
fz_matrix tm, trm;
fz_pixmap *glyph;
int i, x, y, gid;
 
/* If accumulate == 0 then this text object is guaranteed complete */
/* If accumulate == 1 then this text object is the first (or only) in a sequence */
/* If accumulate == 2 then this text object is a continuation */
 
if (dev->top == STACK_SIZE)
{
fz_warn("assert: too many buffers on stack");
return;
}
 
if (accumulate == 0)
{
/* make the mask the exact size needed */
bbox = fz_round_rect(fz_bound_text(text, ctm));
bbox = fz_intersect_bbox(bbox, dev->scissor);
}
else
{
/* be conservative about the size of the mask needed */
bbox = dev->scissor;
}
 
if (accumulate == 0 || accumulate == 1)
{
mask = fz_new_pixmap_with_rect(NULL, bbox);
fz_clear_pixmap(mask);
dest = fz_new_pixmap_with_rect(model, bbox);
/* FIXME: See note #1 */
fz_clear_pixmap(dest);
if (dev->shape)
{
shape = fz_new_pixmap_with_rect(NULL, bbox);
fz_clear_pixmap(shape);
}
else
shape = NULL;
 
dev->stack[dev->top].scissor = dev->scissor;
dev->stack[dev->top].mask = mask;
dev->stack[dev->top].dest = dev->dest;
dev->stack[dev->top].shape = dev->shape;
/* FIXME: See note #1 */
dev->stack[dev->top].blendmode = dev->blendmode | FZ_BLEND_ISOLATED;
dev->scissor = bbox;
dev->dest = dest;
dev->shape = shape;
#ifdef DUMP_GROUP_BLENDS
dump_spaces(dev->top, "Clip (text) begin\n");
#endif
dev->top++;
}
else
{
mask = dev->stack[dev->top-1].mask;
}
 
if (!fz_is_empty_rect(bbox))
{
tm = text->trm;
 
for (i = 0; i < text->len; i++)
{
gid = text->items[i].gid;
if (gid < 0)
continue;
 
tm.e = text->items[i].x;
tm.f = text->items[i].y;
trm = fz_concat(tm, ctm);
x = floorf(trm.e);
y = floorf(trm.f);
trm.e = QUANT(trm.e - floorf(trm.e), HSUBPIX);
trm.f = QUANT(trm.f - floorf(trm.f), VSUBPIX);
 
glyph = fz_render_glyph(dev->cache, text->font, gid, trm, model);
if (glyph)
{
draw_glyph(NULL, mask, glyph, x, y, bbox);
if (dev->shape)
draw_glyph(NULL, dev->shape, glyph, x, y, bbox);
fz_drop_pixmap(glyph);
}
}
}
}
 
static void
fz_draw_clip_stroke_text(void *user, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm)
{
fz_draw_device *dev = user;
fz_colorspace *model = dev->dest->colorspace;
fz_bbox bbox;
fz_pixmap *mask, *dest, *shape;
fz_matrix tm, trm;
fz_pixmap *glyph;
int i, x, y, gid;
 
if (dev->top == STACK_SIZE)
{
fz_warn("assert: too many buffers on stack");
return;
}
 
/* make the mask the exact size needed */
bbox = fz_round_rect(fz_bound_text(text, ctm));
bbox = fz_intersect_bbox(bbox, dev->scissor);
 
mask = fz_new_pixmap_with_rect(NULL, bbox);
fz_clear_pixmap(mask);
dest = fz_new_pixmap_with_rect(model, bbox);
/* FIXME: See note #1 */
fz_clear_pixmap(dest);
if (dev->shape)
{
shape = fz_new_pixmap_with_rect(NULL, bbox);
fz_clear_pixmap(shape);
}
else
shape = dev->shape;
 
dev->stack[dev->top].scissor = dev->scissor;
dev->stack[dev->top].mask = mask;
dev->stack[dev->top].dest = dev->dest;
dev->stack[dev->top].shape = dev->shape;
/* FIXME: See note #1 */
dev->stack[dev->top].blendmode = dev->blendmode | FZ_BLEND_ISOLATED;
dev->scissor = bbox;
dev->dest = dest;
dev->shape = shape;
#ifdef DUMP_GROUP_BLENDS
dump_spaces(dev->top, "Clip (stroke text) begin\n");
#endif
dev->top++;
 
if (!fz_is_empty_rect(bbox))
{
tm = text->trm;
 
for (i = 0; i < text->len; i++)
{
gid = text->items[i].gid;
if (gid < 0)
continue;
 
tm.e = text->items[i].x;
tm.f = text->items[i].y;
trm = fz_concat(tm, ctm);
x = floorf(trm.e);
y = floorf(trm.f);
trm.e = QUANT(trm.e - floorf(trm.e), HSUBPIX);
trm.f = QUANT(trm.f - floorf(trm.f), VSUBPIX);
 
glyph = fz_render_stroked_glyph(dev->cache, text->font, gid, trm, ctm, stroke);
if (glyph)
{
draw_glyph(NULL, mask, glyph, x, y, bbox);
if (dev->shape)
draw_glyph(NULL, dev->shape, glyph, x, y, bbox);
fz_drop_pixmap(glyph);
}
}
}
}
 
static void
fz_draw_ignore_text(void *user, fz_text *text, fz_matrix ctm)
{
}
 
static void
fz_draw_fill_shade(void *user, fz_shade *shade, fz_matrix ctm, float alpha)
{
fz_draw_device *dev = user;
fz_colorspace *model = dev->dest->colorspace;
fz_pixmap *dest = dev->dest;
fz_rect bounds;
fz_bbox bbox, scissor;
float colorfv[FZ_MAX_COLORS];
unsigned char colorbv[FZ_MAX_COLORS + 1];
 
bounds = fz_bound_shade(shade, ctm);
bbox = fz_intersect_bbox(fz_round_rect(bounds), dev->scissor);
scissor = dev->scissor;
 
// TODO: proper clip by shade->bbox
 
if (fz_is_empty_rect(bbox))
return;
 
if (!model)
{
fz_warn("cannot render shading directly to an alpha mask");
return;
}
 
if (alpha < 1)
{
dest = fz_new_pixmap_with_rect(dev->dest->colorspace, bbox);
fz_clear_pixmap(dest);
}
 
if (dev->blendmode & FZ_BLEND_KNOCKOUT)
fz_knockout_begin(dev);
 
if (shade->use_background)
{
unsigned char *s;
int x, y, n, i;
fz_convert_color(shade->colorspace, shade->background, model, colorfv);
for (i = 0; i < model->n; i++)
colorbv[i] = colorfv[i] * 255;
colorbv[i] = 255;
 
n = dest->n;
for (y = scissor.y0; y < scissor.y1; y++)
{
s = dest->samples + ((scissor.x0 - dest->x) + (y - dest->y) * dest->w) * dest->n;
for (x = scissor.x0; x < scissor.x1; x++)
{
for (i = 0; i < n; i++)
*s++ = colorbv[i];
}
}
if (dev->shape)
{
for (y = scissor.y0; y < scissor.y1; y++)
{
s = dev->shape->samples + (scissor.x0 - dev->shape->x) + (y - dev->shape->y) * dev->shape->w;
for (x = scissor.x0; x < scissor.x1; x++)
{
*s++ = 255;
}
}
}
}
 
fz_paint_shade(shade, ctm, dest, bbox);
if (dev->shape)
fz_clear_pixmap_rect_with_color(dev->shape, 255, bbox);
 
if (alpha < 1)
{
fz_paint_pixmap(dev->dest, dest, alpha * 255);
fz_drop_pixmap(dest);
}
 
if (dev->blendmode & FZ_BLEND_KNOCKOUT)
fz_knockout_end(dev);
}
 
static fz_pixmap *
fz_transform_pixmap(fz_pixmap *image, fz_matrix *ctm, int x, int y, int dx, int dy, int gridfit)
{
fz_pixmap *scaled;
 
if (ctm->a != 0 && ctm->b == 0 && ctm->c == 0 && ctm->d != 0)
{
/* Unrotated or X-flip or Y-flip or XY-flip */
scaled = fz_scale_pixmap_gridfit(image, ctm->e, ctm->f, ctm->a, ctm->d, gridfit);
if (scaled == NULL)
return NULL;
ctm->a = scaled->w;
ctm->d = scaled->h;
ctm->e = scaled->x;
ctm->f = scaled->y;
return scaled;
}
 
if (ctm->a == 0 && ctm->b != 0 && ctm->c != 0 && ctm->d == 0)
{
/* Other orthogonal flip/rotation cases */
scaled = fz_scale_pixmap_gridfit(image, ctm->f, ctm->e, ctm->b, ctm->c, gridfit);
if (scaled == NULL)
return NULL;
ctm->b = scaled->w;
ctm->c = scaled->h;
ctm->f = scaled->x;
ctm->e = scaled->y;
return scaled;
}
 
/* Downscale, non rectilinear case */
if (dx > 0 && dy > 0)
{
scaled = fz_scale_pixmap(image, 0, 0, (float)dx, (float)dy);
return scaled;
}
 
return NULL;
}
 
static void
fz_draw_fill_image(void *user, fz_pixmap *image, fz_matrix ctm, float alpha)
{
fz_draw_device *dev = user;
fz_colorspace *model = dev->dest->colorspace;
fz_pixmap *converted = NULL;
fz_pixmap *scaled = NULL;
int after;
int dx, dy;
 
if (!model)
{
fz_warn("cannot render image directly to an alpha mask");
return;
}
 
if (image->w == 0 || image->h == 0)
return;
 
/* convert images with more components (cmyk->rgb) before scaling */
/* convert images with fewer components (gray->rgb after scaling */
/* convert images with expensive colorspace transforms after scaling */
 
if (dev->blendmode & FZ_BLEND_KNOCKOUT)
fz_knockout_begin(dev);
 
after = 0;
if (image->colorspace == fz_device_gray)
after = 1;
 
if (image->colorspace != model && !after)
{
converted = fz_new_pixmap_with_rect(model, fz_bound_pixmap(image));
fz_convert_pixmap(image, converted);
image = converted;
}
 
dx = sqrtf(ctm.a * ctm.a + ctm.b * ctm.b);
dy = sqrtf(ctm.c * ctm.c + ctm.d * ctm.d);
if (dx < image->w && dy < image->h)
{
int gridfit = alpha == 1.0f && !(dev->flags & FZ_DRAWDEV_FLAGS_TYPE3);
scaled = fz_transform_pixmap(image, &ctm, dev->dest->x, dev->dest->y, dx, dy, gridfit);
if (scaled == NULL)
{
if (dx < 1)
dx = 1;
if (dy < 1)
dy = 1;
scaled = fz_scale_pixmap(image, image->x, image->y, dx, dy);
}
if (scaled != NULL)
image = scaled;
}
 
if (image->colorspace != model)
{
if ((image->colorspace == fz_device_gray && model == fz_device_rgb) ||
(image->colorspace == fz_device_gray && model == fz_device_bgr))
{
/* We have special case rendering code for gray -> rgb/bgr */
}
else
{
converted = fz_new_pixmap_with_rect(model, fz_bound_pixmap(image));
fz_convert_pixmap(image, converted);
image = converted;
}
}
 
fz_paint_image(dev->dest, dev->scissor, dev->shape, image, ctm, alpha * 255);
 
if (scaled)
fz_drop_pixmap(scaled);
if (converted)
fz_drop_pixmap(converted);
 
if (dev->blendmode & FZ_BLEND_KNOCKOUT)
fz_knockout_end(dev);
}
 
static void
fz_draw_fill_image_mask(void *user, fz_pixmap *image, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
fz_draw_device *dev = user;
fz_colorspace *model = dev->dest->colorspace;
unsigned char colorbv[FZ_MAX_COLORS + 1];
float colorfv[FZ_MAX_COLORS];
fz_pixmap *scaled = NULL;
int dx, dy;
int i;
 
if (image->w == 0 || image->h == 0)
return;
 
if (dev->blendmode & FZ_BLEND_KNOCKOUT)
fz_knockout_begin(dev);
 
dx = sqrtf(ctm.a * ctm.a + ctm.b * ctm.b);
dy = sqrtf(ctm.c * ctm.c + ctm.d * ctm.d);
if (dx < image->w && dy < image->h)
{
int gridfit = alpha == 1.0f && !(dev->flags & FZ_DRAWDEV_FLAGS_TYPE3);
scaled = fz_transform_pixmap(image, &ctm, dev->dest->x, dev->dest->y, dx, dy, gridfit);
if (scaled == NULL)
{
if (dx < 1)
dx = 1;
if (dy < 1)
dy = 1;
scaled = fz_scale_pixmap(image, image->x, image->y, dx, dy);
}
if (scaled != NULL)
image = scaled;
}
 
fz_convert_color(colorspace, color, model, colorfv);
for (i = 0; i < model->n; i++)
colorbv[i] = colorfv[i] * 255;
colorbv[i] = alpha * 255;
 
fz_paint_image_with_color(dev->dest, dev->scissor, dev->shape, image, ctm, colorbv);
 
if (scaled)
fz_drop_pixmap(scaled);
 
if (dev->blendmode & FZ_BLEND_KNOCKOUT)
fz_knockout_begin(dev);
}
 
static void
fz_draw_clip_image_mask(void *user, fz_pixmap *image, fz_rect *rect, fz_matrix ctm)
{
fz_draw_device *dev = user;
fz_colorspace *model = dev->dest->colorspace;
fz_bbox bbox;
fz_pixmap *mask, *dest, *shape;
fz_pixmap *scaled = NULL;
int dx, dy;
 
if (dev->top == STACK_SIZE)
{
fz_warn("assert: too many buffers on stack");
return;
}
 
#ifdef DUMP_GROUP_BLENDS
dump_spaces(dev->top, "Clip (image mask) begin\n");
#endif
 
if (image->w == 0 || image->h == 0)
{
dev->stack[dev->top].scissor = dev->scissor;
dev->stack[dev->top].mask = NULL;
dev->stack[dev->top].dest = NULL;
dev->stack[dev->top].blendmode = dev->blendmode;
dev->scissor = fz_empty_bbox;
dev->top++;
return;
}
 
bbox = fz_round_rect(fz_transform_rect(ctm, fz_unit_rect));
bbox = fz_intersect_bbox(bbox, dev->scissor);
if (rect)
bbox = fz_intersect_bbox(bbox, fz_round_rect(*rect));
 
mask = fz_new_pixmap_with_rect(NULL, bbox);
fz_clear_pixmap(mask);
dest = fz_new_pixmap_with_rect(model, bbox);
/* FIXME: See note #1 */
fz_clear_pixmap(dest);
if (dev->shape)
{
shape = fz_new_pixmap_with_rect(NULL, bbox);
fz_clear_pixmap(shape);
}
else
shape = NULL;
 
dx = sqrtf(ctm.a * ctm.a + ctm.b * ctm.b);
dy = sqrtf(ctm.c * ctm.c + ctm.d * ctm.d);
if (dx < image->w && dy < image->h)
{
int gridfit = !(dev->flags & FZ_DRAWDEV_FLAGS_TYPE3);
scaled = fz_transform_pixmap(image, &ctm, dev->dest->x, dev->dest->y, dx, dy, gridfit);
if (scaled == NULL)
{
if (dx < 1)
dx = 1;
if (dy < 1)
dy = 1;
scaled = fz_scale_pixmap(image, image->x, image->y, dx, dy);
}
if (scaled != NULL)
image = scaled;
}
 
fz_paint_image(mask, bbox, dev->shape, image, ctm, 255);
 
if (scaled)
fz_drop_pixmap(scaled);
 
dev->stack[dev->top].scissor = dev->scissor;
dev->stack[dev->top].mask = mask;
dev->stack[dev->top].dest = dev->dest;
dev->stack[dev->top].shape = dev->shape;
/* FIXME: See note #1 */
dev->stack[dev->top].blendmode = dev->blendmode | FZ_BLEND_ISOLATED;
dev->scissor = bbox;
dev->dest = dest;
dev->shape = shape;
dev->top++;
}
 
static void
fz_draw_pop_clip(void *user)
{
fz_draw_device *dev = user;
fz_pixmap *mask, *dest, *shape;
if (dev->top > 0)
{
dev->top--;
dev->scissor = dev->stack[dev->top].scissor;
mask = dev->stack[dev->top].mask;
dest = dev->stack[dev->top].dest;
shape = dev->stack[dev->top].shape;
dev->blendmode = dev->stack[dev->top].blendmode;
 
/* We can get here with mask == NULL if the clipping actually
* resolved to a rectangle earlier. In this case, we will
* have a dest, and the shape will be unchanged.
*/
if (mask)
{
assert(dest);
 
#ifdef DUMP_GROUP_BLENDS
dump_spaces(dev->top, "");
fz_dump_blend(dev->dest, "Clipping ");
if (dev->shape)
fz_dump_blend(dev->shape, "/");
fz_dump_blend(dest, " onto ");
if (shape)
fz_dump_blend(shape, "/");
fz_dump_blend(mask, " with ");
#endif
fz_paint_pixmap_with_mask(dest, dev->dest, mask);
if (shape != NULL)
{
assert(shape != dev->shape);
fz_paint_pixmap_with_mask(shape, dev->shape, mask);
fz_drop_pixmap(dev->shape);
dev->shape = shape;
}
fz_drop_pixmap(mask);
fz_drop_pixmap(dev->dest);
dev->dest = dest;
#ifdef DUMP_GROUP_BLENDS
fz_dump_blend(dev->dest, " to get ");
if (dev->shape)
fz_dump_blend(dev->shape, "/");
printf("\n");
#endif
}
else
{
#ifdef DUMP_GROUP_BLENDS
dump_spaces(dev->top, "Clip End\n");
#endif
assert(dest == NULL);
assert(shape == dev->shape);
}
}
}
 
static void
fz_draw_begin_mask(void *user, fz_rect rect, int luminosity, fz_colorspace *colorspace, float *colorfv)
{
fz_draw_device *dev = user;
fz_pixmap *dest;
fz_pixmap *shape = dev->shape;
fz_bbox bbox;
 
if (dev->top == STACK_SIZE)
{
fz_warn("assert: too many buffers on stack");
return;
}
 
bbox = fz_round_rect(rect);
bbox = fz_intersect_bbox(bbox, dev->scissor);
dest = fz_new_pixmap_with_rect(fz_device_gray, bbox);
if (dev->shape)
{
/* FIXME: If we ever want to support AIS true, then we
* probably want to create a shape pixmap here, using:
* shape = fz_new_pixmap_with_rect(NULL, bbox);
* then, in the end_mask code, we create the mask from this
* rather than dest.
*/
shape = NULL;
}
 
if (luminosity)
{
float bc;
if (!colorspace)
colorspace = fz_device_gray;
fz_convert_color(colorspace, colorfv, fz_device_gray, &bc);
fz_clear_pixmap_with_color(dest, bc * 255);
if (shape)
fz_clear_pixmap_with_color(shape, 255);
}
else
{
fz_clear_pixmap(dest);
if (shape)
fz_clear_pixmap(shape);
}
 
dev->stack[dev->top].scissor = dev->scissor;
dev->stack[dev->top].dest = dev->dest;
dev->stack[dev->top].luminosity = luminosity;
dev->stack[dev->top].shape = dev->shape;
dev->stack[dev->top].blendmode = dev->blendmode;
#ifdef DUMP_GROUP_BLENDS
dump_spaces(dev->top, "Mask begin\n");
#endif
dev->top++;
 
dev->scissor = bbox;
dev->dest = dest;
dev->shape = shape;
}
 
static void
fz_draw_end_mask(void *user)
{
fz_draw_device *dev = user;
fz_pixmap *mask = dev->dest;
fz_pixmap *maskshape = dev->shape;
fz_pixmap *temp, *dest;
fz_bbox bbox;
int luminosity;
 
if (dev->top == STACK_SIZE)
{
fz_warn("assert: too many buffers on stack");
return;
}
 
if (dev->top > 0)
{
/* pop soft mask buffer */
dev->top--;
luminosity = dev->stack[dev->top].luminosity;
dev->scissor = dev->stack[dev->top].scissor;
dev->dest = dev->stack[dev->top].dest;
dev->shape = dev->stack[dev->top].shape;
 
/* convert to alpha mask */
temp = fz_alpha_from_gray(mask, luminosity);
fz_drop_pixmap(mask);
fz_drop_pixmap(maskshape);
 
/* create new dest scratch buffer */
bbox = fz_bound_pixmap(temp);
dest = fz_new_pixmap_with_rect(dev->dest->colorspace, bbox);
/* FIXME: See note #1 */
fz_clear_pixmap(dest);
 
/* push soft mask as clip mask */
dev->stack[dev->top].scissor = dev->scissor;
dev->stack[dev->top].mask = temp;
dev->stack[dev->top].dest = dev->dest;
/* FIXME: See note #1 */
dev->stack[dev->top].blendmode = dev->blendmode | FZ_BLEND_ISOLATED;
/* If we have a shape, then it'll need to be masked with the
* clip mask when we pop. So create a new shape now. */
if (dev->shape)
{
dev->stack[dev->top].shape = dev->shape;
dev->shape = fz_new_pixmap_with_rect(NULL, bbox);
fz_clear_pixmap(dev->shape);
}
dev->scissor = bbox;
dev->dest = dest;
#ifdef DUMP_GROUP_BLENDS
dump_spaces(dev->top, "Mask -> Clip\n");
#endif
dev->top++;
}
}
 
static void
fz_draw_begin_group(void *user, fz_rect rect, int isolated, int knockout, int blendmode, float alpha)
{
fz_draw_device *dev = user;
fz_colorspace *model = dev->dest->colorspace;
fz_bbox bbox;
fz_pixmap *dest, *shape;
 
if (dev->top == STACK_SIZE)
{
fz_warn("assert: too many buffers on stack");
return;
}
 
if (dev->blendmode & FZ_BLEND_KNOCKOUT)
fz_knockout_begin(dev);
 
bbox = fz_round_rect(rect);
bbox = fz_intersect_bbox(bbox, dev->scissor);
dest = fz_new_pixmap_with_rect(model, bbox);
 
#ifndef ATTEMPT_KNOCKOUT_AND_ISOLATED
knockout = 0;
isolated = 1;
#endif
 
if (isolated)
{
fz_clear_pixmap(dest);
}
else
{
fz_copy_pixmap_rect(dest, dev->dest, bbox);
}
 
if (blendmode == 0 && alpha == 1.0 && isolated)
{
/* We can render direct to any existing shape plane. If there
* isn't one, we don't need to make one. */
shape = dev->shape;
}
else
{
shape = fz_new_pixmap_with_rect(NULL, bbox);
fz_clear_pixmap(shape);
}
 
dev->stack[dev->top].alpha = alpha;
dev->stack[dev->top].blendmode = dev->blendmode;
dev->stack[dev->top].scissor = dev->scissor;
dev->stack[dev->top].dest = dev->dest;
dev->stack[dev->top].shape = dev->shape;
#ifdef DUMP_GROUP_BLENDS
dump_spaces(dev->top, "Group Begin\n");
#endif
dev->top++;
 
dev->scissor = bbox;
dev->dest = dest;
dev->shape = shape;
dev->blendmode = blendmode | (isolated ? FZ_BLEND_ISOLATED : 0) | (knockout ? FZ_BLEND_KNOCKOUT : 0);
}
 
static void
fz_draw_end_group(void *user)
{
fz_draw_device *dev = user;
fz_pixmap *group = dev->dest;
fz_pixmap *shape = dev->shape;
int blendmode;
int isolated;
float alpha;
 
if (dev->top > 0)
{
dev->top--;
alpha = dev->stack[dev->top].alpha;
blendmode = dev->blendmode & FZ_BLEND_MODEMASK;
isolated = dev->blendmode & FZ_BLEND_ISOLATED;
dev->blendmode = dev->stack[dev->top].blendmode;
dev->shape = dev->stack[dev->top].shape;
dev->dest = dev->stack[dev->top].dest;
dev->scissor = dev->stack[dev->top].scissor;
 
#ifdef DUMP_GROUP_BLENDS
dump_spaces(dev->top, "");
fz_dump_blend(group, "Blending ");
if (shape)
fz_dump_blend(shape, "/");
fz_dump_blend(dev->dest, " onto ");
if (dev->shape)
fz_dump_blend(dev->shape, "/");
if (alpha != 1.0f)
printf(" (alpha %g)", alpha);
if (blendmode != 0)
printf(" (blend %d)", blendmode);
if (isolated != 0)
printf(" (isolated)");
if (blendmode & FZ_BLEND_KNOCKOUT)
printf(" (knockout)");
#endif
if ((blendmode == 0) && (shape == NULL))
fz_paint_pixmap(dev->dest, group, alpha * 255);
else
fz_blend_pixmap(dev->dest, group, alpha * 255, blendmode, isolated, shape);
 
fz_drop_pixmap(group);
if (shape != dev->shape)
{
if (dev->shape)
{
fz_paint_pixmap(dev->shape, shape, alpha * 255);
}
fz_drop_pixmap(shape);
}
#ifdef DUMP_GROUP_BLENDS
fz_dump_blend(dev->dest, " to get ");
if (dev->shape)
fz_dump_blend(dev->shape, "/");
printf("\n");
#endif
}
 
if (dev->blendmode & FZ_BLEND_KNOCKOUT)
fz_knockout_end(dev);
}
 
static void
fz_draw_begin_tile(void *user, fz_rect area, fz_rect view, float xstep, float ystep, fz_matrix ctm)
{
fz_draw_device *dev = user;
fz_colorspace *model = dev->dest->colorspace;
fz_pixmap *dest;
fz_bbox bbox;
 
/* area, view, xstep, ystep are in pattern space */
/* ctm maps from pattern space to device space */
 
if (dev->top == STACK_SIZE)
{
fz_warn("assert: too many buffers on stack");
return;
}
 
if (dev->blendmode & FZ_BLEND_KNOCKOUT)
fz_knockout_begin(dev);
 
bbox = fz_round_rect(fz_transform_rect(ctm, view));
dest = fz_new_pixmap_with_rect(model, bbox);
/* FIXME: See note #1 */
fz_clear_pixmap(dest);
 
dev->stack[dev->top].scissor = dev->scissor;
dev->stack[dev->top].dest = dev->dest;
dev->stack[dev->top].shape = dev->shape;
/* FIXME: See note #1 */
dev->stack[dev->top].blendmode = dev->blendmode | FZ_BLEND_ISOLATED;
dev->stack[dev->top].xstep = xstep;
dev->stack[dev->top].ystep = ystep;
dev->stack[dev->top].area = area;
dev->stack[dev->top].ctm = ctm;
#ifdef DUMP_GROUP_BLENDS
dump_spaces(dev->top, "Tile begin\n");
#endif
dev->top++;
 
dev->scissor = bbox;
dev->dest = dest;
}
 
static void
fz_draw_end_tile(void *user)
{
fz_draw_device *dev = user;
fz_pixmap *tile = dev->dest;
float xstep, ystep;
fz_matrix ctm, ttm;
fz_rect area;
int x0, y0, x1, y1, x, y;
 
if (dev->top > 0)
{
dev->top--;
#ifdef DUMP_GROUP_BLENDS
dump_spaces(dev->top, "Tile end\n");
#endif
xstep = dev->stack[dev->top].xstep;
ystep = dev->stack[dev->top].ystep;
area = dev->stack[dev->top].area;
ctm = dev->stack[dev->top].ctm;
dev->scissor = dev->stack[dev->top].scissor;
dev->dest = dev->stack[dev->top].dest;
dev->blendmode = dev->stack[dev->top].blendmode;
 
 
x0 = floorf(area.x0 / xstep);
y0 = floorf(area.y0 / ystep);
x1 = ceilf(area.x1 / xstep);
y1 = ceilf(area.y1 / ystep);
 
ctm.e = tile->x;
ctm.f = tile->y;
 
for (y = y0; y < y1; y++)
{
for (x = x0; x < x1; x++)
{
ttm = fz_concat(fz_translate(x * xstep, y * ystep), ctm);
tile->x = ttm.e;
tile->y = ttm.f;
fz_paint_pixmap_with_rect(dev->dest, tile, 255, dev->scissor);
}
}
 
fz_drop_pixmap(tile);
}
 
if (dev->blendmode & FZ_BLEND_KNOCKOUT)
fz_knockout_begin(dev);
}
 
static void
fz_draw_free_user(void *user)
{
fz_draw_device *dev = user;
/* TODO: pop and free the stacks */
if (dev->top > 0)
fz_warn("items left on stack in draw device: %d", dev->top);
fz_free_gel(dev->gel);
fz_free(dev);
}
 
fz_device *
fz_new_draw_device(fz_glyph_cache *cache, fz_pixmap *dest)
{
fz_device *dev;
fz_draw_device *ddev = fz_malloc(sizeof(fz_draw_device));
ddev->cache = cache;
ddev->gel = fz_new_gel();
ddev->dest = dest;
ddev->shape = NULL;
ddev->top = 0;
ddev->blendmode = 0;
ddev->flags = 0;
 
ddev->scissor.x0 = dest->x;
ddev->scissor.y0 = dest->y;
ddev->scissor.x1 = dest->x + dest->w;
ddev->scissor.y1 = dest->y + dest->h;
 
dev = fz_new_device(ddev);
dev->free_user = fz_draw_free_user;
 
dev->fill_path = fz_draw_fill_path;
dev->stroke_path = fz_draw_stroke_path;
dev->clip_path = fz_draw_clip_path;
dev->clip_stroke_path = fz_draw_clip_stroke_path;
 
dev->fill_text = fz_draw_fill_text;
dev->stroke_text = fz_draw_stroke_text;
dev->clip_text = fz_draw_clip_text;
dev->clip_stroke_text = fz_draw_clip_stroke_text;
dev->ignore_text = fz_draw_ignore_text;
 
dev->fill_image_mask = fz_draw_fill_image_mask;
dev->clip_image_mask = fz_draw_clip_image_mask;
dev->fill_image = fz_draw_fill_image;
dev->fill_shade = fz_draw_fill_shade;
 
dev->pop_clip = fz_draw_pop_clip;
 
dev->begin_mask = fz_draw_begin_mask;
dev->end_mask = fz_draw_end_mask;
dev->begin_group = fz_draw_begin_group;
dev->end_group = fz_draw_end_group;
 
dev->begin_tile = fz_draw_begin_tile;
dev->end_tile = fz_draw_end_tile;
 
return dev;
}
 
fz_device *
fz_new_draw_device_type3(fz_glyph_cache *cache, fz_pixmap *dest)
{
fz_device *dev = fz_new_draw_device(cache, dest);
fz_draw_device *ddev = dev->user;
ddev->flags |= FZ_DRAWDEV_FLAGS_TYPE3;
return dev;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/draw/draw_edge.c
0,0 → 1,735
#include "fitz.h"
 
#define BBOX_MIN -(1<<20)
#define BBOX_MAX (1<<20)
 
/* divide and floor towards -inf */
static inline int fz_idiv(int a, int b)
{
return a < 0 ? (a - b + 1) / b : a / b;
}
 
/* If AA_BITS is defined, then we assume constant N bits of antialiasing. We
* will attempt to provide at least that number of bits of accuracy in the
* antialiasing (to a maximum of 8). If it is defined to be 0 then no
* antialiasing is done. If it is undefined to we will leave the antialiasing
* accuracy as a run time choice.
*/
 
#ifndef AA_BITS
#define AA_SCALE(x) ((x * fz_aa_scale) >> 8)
static int fz_aa_hscale = 17;
static int fz_aa_vscale = 15;
static int fz_aa_scale = 256;
static int fz_aa_level = 8;
 
#elif AA_BITS > 6
#define AA_SCALE(x) (x)
#define fz_aa_hscale 17
#define fz_aa_vscale 15
#define fz_aa_level 8
 
#elif AA_BITS > 4
#define AA_SCALE(x) ((x * 255) >> 6)
#define fz_aa_hscale 8
#define fz_aa_vscale 8
#define fz_aa_level 6
 
#elif AA_BITS > 2
#define AA_SCALE(x) (x * 17)
#define fz_aa_hscale 5
#define fz_aa_vscale 3
#define fz_aa_level 4
 
#elif AA_BITS > 0
#define AA_SCALE(x) ((x * 255) >> 2)
#define fz_aa_hscale 2
#define fz_aa_vscale 2
#define fz_aa_level 2
 
#else
#define AA_SCALE(x) (x * 255)
#define fz_aa_hscale 1
#define fz_aa_vscale 1
#define fz_aa_level 0
 
#endif
 
int
fz_get_aa_level(void)
{
return fz_aa_level;
}
 
void
fz_set_aa_level(int level)
{
#ifdef AA_BITS
fz_warn("anti-aliasing was compiled with a fixed precision of %d bits", fz_aa_level);
#else
if (level > 6)
{
fz_aa_hscale = 17;
fz_aa_vscale = 15;
fz_aa_level = 8;
}
else if (level > 4)
{
fz_aa_hscale = 8;
fz_aa_vscale = 8;
fz_aa_level = 6;
}
else if (level > 2)
{
fz_aa_hscale = 5;
fz_aa_vscale = 3;
fz_aa_level = 4;
}
else if (level > 0)
{
fz_aa_hscale = 2;
fz_aa_vscale = 2;
fz_aa_level = 2;
}
else
{
fz_aa_hscale = 1;
fz_aa_vscale = 1;
fz_aa_level = 0;
}
fz_aa_scale = 0xFF00 / (fz_aa_hscale * fz_aa_vscale);
#endif
}
 
/*
* Global Edge List -- list of straight path segments for scan conversion
*
* Stepping along the edges is with bresenham's line algorithm.
*
* See Mike Abrash -- Graphics Programming Black Book (notably chapter 40)
*/
 
typedef struct fz_edge_s fz_edge;
 
struct fz_edge_s
{
int x, e, h, y;
int adj_up, adj_down;
int xmove;
int xdir, ydir; /* -1 or +1 */
};
 
struct fz_gel_s
{
fz_bbox clip;
fz_bbox bbox;
int cap, len;
fz_edge *edges;
int acap, alen;
fz_edge **active;
};
 
fz_gel *
fz_new_gel(void)
{
fz_gel *gel;
 
gel = fz_malloc(sizeof(fz_gel));
gel->cap = 512;
gel->len = 0;
gel->edges = fz_calloc(gel->cap, sizeof(fz_edge));
 
gel->clip.x0 = gel->clip.y0 = BBOX_MAX;
gel->clip.x1 = gel->clip.y1 = BBOX_MIN;
 
gel->bbox.x0 = gel->bbox.y0 = BBOX_MAX;
gel->bbox.x1 = gel->bbox.y1 = BBOX_MIN;
 
gel->acap = 64;
gel->alen = 0;
gel->active = fz_calloc(gel->acap, sizeof(fz_edge*));
 
return gel;
}
 
void
fz_reset_gel(fz_gel *gel, fz_bbox clip)
{
if (fz_is_infinite_rect(clip))
{
gel->clip.x0 = gel->clip.y0 = BBOX_MAX;
gel->clip.x1 = gel->clip.y1 = BBOX_MIN;
}
else {
gel->clip.x0 = clip.x0 * fz_aa_hscale;
gel->clip.x1 = clip.x1 * fz_aa_hscale;
gel->clip.y0 = clip.y0 * fz_aa_vscale;
gel->clip.y1 = clip.y1 * fz_aa_vscale;
}
 
gel->bbox.x0 = gel->bbox.y0 = BBOX_MAX;
gel->bbox.x1 = gel->bbox.y1 = BBOX_MIN;
 
gel->len = 0;
}
 
void
fz_free_gel(fz_gel *gel)
{
fz_free(gel->active);
fz_free(gel->edges);
fz_free(gel);
}
 
fz_bbox
fz_bound_gel(fz_gel *gel)
{
fz_bbox bbox;
if (gel->len == 0)
return fz_empty_bbox;
bbox.x0 = fz_idiv(gel->bbox.x0, fz_aa_hscale);
bbox.y0 = fz_idiv(gel->bbox.y0, fz_aa_vscale);
bbox.x1 = fz_idiv(gel->bbox.x1, fz_aa_hscale) + 1;
bbox.y1 = fz_idiv(gel->bbox.y1, fz_aa_vscale) + 1;
return bbox;
}
 
enum { INSIDE, OUTSIDE, LEAVE, ENTER };
 
#define clip_lerp_y(v,m,x0,y0,x1,y1,t) clip_lerp_x(v,m,y0,x0,y1,x1,t)
 
static int
clip_lerp_x(int val, int m, int x0, int y0, int x1, int y1, int *out)
{
int v0out = m ? x0 > val : x0 < val;
int v1out = m ? x1 > val : x1 < val;
 
if (v0out + v1out == 0)
return INSIDE;
 
if (v0out + v1out == 2)
return OUTSIDE;
 
if (v1out)
{
*out = y0 + (y1 - y0) * (val - x0) / (x1 - x0);
return LEAVE;
}
 
else
{
*out = y1 + (y0 - y1) * (val - x1) / (x0 - x1);
return ENTER;
}
}
 
static void
fz_insert_gel_raw(fz_gel *gel, int x0, int y0, int x1, int y1)
{
fz_edge *edge;
int dx, dy;
int winding;
int width;
int tmp;
 
if (y0 == y1)
return;
 
if (y0 > y1) {
winding = -1;
tmp = x0; x0 = x1; x1 = tmp;
tmp = y0; y0 = y1; y1 = tmp;
}
else
winding = 1;
 
if (x0 < gel->bbox.x0) gel->bbox.x0 = x0;
if (x0 > gel->bbox.x1) gel->bbox.x1 = x0;
if (x1 < gel->bbox.x0) gel->bbox.x0 = x1;
if (x1 > gel->bbox.x1) gel->bbox.x1 = x1;
 
if (y0 < gel->bbox.y0) gel->bbox.y0 = y0;
if (y1 > gel->bbox.y1) gel->bbox.y1 = y1;
 
if (gel->len + 1 == gel->cap) {
gel->cap = gel->cap + 512;
gel->edges = fz_realloc(gel->edges, gel->cap, sizeof(fz_edge));
}
 
edge = &gel->edges[gel->len++];
 
dy = y1 - y0;
dx = x1 - x0;
width = ABS(dx);
 
edge->xdir = dx > 0 ? 1 : -1;
edge->ydir = winding;
edge->x = x0;
edge->y = y0;
edge->h = dy;
edge->adj_down = dy;
 
/* initial error term going l->r and r->l */
if (dx >= 0)
edge->e = 0;
else
edge->e = -dy + 1;
 
/* y-major edge */
if (dy >= width) {
edge->xmove = 0;
edge->adj_up = width;
}
 
/* x-major edge */
else {
edge->xmove = (width / dy) * edge->xdir;
edge->adj_up = width % dy;
}
}
 
void
fz_insert_gel(fz_gel *gel, float fx0, float fy0, float fx1, float fy1)
{
int x0, y0, x1, y1;
int d, v;
 
fx0 = floorf(fx0 * fz_aa_hscale);
fx1 = floorf(fx1 * fz_aa_hscale);
fy0 = floorf(fy0 * fz_aa_vscale);
fy1 = floorf(fy1 * fz_aa_vscale);
 
x0 = CLAMP(fx0, BBOX_MIN, BBOX_MAX);
y0 = CLAMP(fy0, BBOX_MIN, BBOX_MAX);
x1 = CLAMP(fx1, BBOX_MIN, BBOX_MAX);
y1 = CLAMP(fy1, BBOX_MIN, BBOX_MAX);
 
d = clip_lerp_y(gel->clip.y0, 0, x0, y0, x1, y1, &v);
if (d == OUTSIDE) return;
if (d == LEAVE) { y1 = gel->clip.y0; x1 = v; }
if (d == ENTER) { y0 = gel->clip.y0; x0 = v; }
 
d = clip_lerp_y(gel->clip.y1, 1, x0, y0, x1, y1, &v);
if (d == OUTSIDE) return;
if (d == LEAVE) { y1 = gel->clip.y1; x1 = v; }
if (d == ENTER) { y0 = gel->clip.y1; x0 = v; }
 
d = clip_lerp_x(gel->clip.x0, 0, x0, y0, x1, y1, &v);
if (d == OUTSIDE) {
x0 = x1 = gel->clip.x0;
}
if (d == LEAVE) {
fz_insert_gel_raw(gel, gel->clip.x0, v, gel->clip.x0, y1);
x1 = gel->clip.x0;
y1 = v;
}
if (d == ENTER) {
fz_insert_gel_raw(gel, gel->clip.x0, y0, gel->clip.x0, v);
x0 = gel->clip.x0;
y0 = v;
}
 
d = clip_lerp_x(gel->clip.x1, 1, x0, y0, x1, y1, &v);
if (d == OUTSIDE) {
x0 = x1 = gel->clip.x1;
}
if (d == LEAVE) {
fz_insert_gel_raw(gel, gel->clip.x1, v, gel->clip.x1, y1);
x1 = gel->clip.x1;
y1 = v;
}
if (d == ENTER) {
fz_insert_gel_raw(gel, gel->clip.x1, y0, gel->clip.x1, v);
x0 = gel->clip.x1;
y0 = v;
}
 
fz_insert_gel_raw(gel, x0, y0, x1, y1);
}
 
void
fz_sort_gel(fz_gel *gel)
{
fz_edge *a = gel->edges;
int n = gel->len;
 
int h, i, k;
fz_edge t;
 
h = 1;
if (n < 14) {
h = 1;
}
else {
while (h < n)
h = 3 * h + 1;
h /= 3;
h /= 3;
}
 
while (h > 0)
{
for (i = 0; i < n; i++) {
t = a[i];
k = i - h;
/* TODO: sort on y major, x minor */
while (k >= 0 && a[k].y > t.y) {
a[k + h] = a[k];
k -= h;
}
a[k + h] = t;
}
 
h /= 3;
}
}
 
int
fz_is_rect_gel(fz_gel *gel)
{
/* a rectangular path is converted into two vertical edges of identical height */
if (gel->len == 2)
{
fz_edge *a = gel->edges + 0;
fz_edge *b = gel->edges + 1;
return a->y == b->y && a->h == b->h &&
a->xmove == 0 && a->adj_up == 0 &&
b->xmove == 0 && b->adj_up == 0;
}
return 0;
}
 
/*
* Active Edge List -- keep track of active edges while sweeping
*/
 
static void
sort_active(fz_edge **a, int n)
{
int h, i, k;
fz_edge *t;
 
h = 1;
if (n < 14) {
h = 1;
}
else {
while (h < n)
h = 3 * h + 1;
h /= 3;
h /= 3;
}
 
while (h > 0)
{
for (i = 0; i < n; i++) {
t = a[i];
k = i - h;
while (k >= 0 && a[k]->x > t->x) {
a[k + h] = a[k];
k -= h;
}
a[k + h] = t;
}
 
h /= 3;
}
}
 
static void
insert_active(fz_gel *gel, int y, int *e)
{
/* insert edges that start here */
while (*e < gel->len && gel->edges[*e].y == y) {
if (gel->alen + 1 == gel->acap) {
int newcap = gel->acap + 64;
fz_edge **newactive = fz_realloc(gel->active, newcap, sizeof(fz_edge*));
gel->active = newactive;
gel->acap = newcap;
}
gel->active[gel->alen++] = &gel->edges[(*e)++];
}
 
/* shell-sort the edges by increasing x */
sort_active(gel->active, gel->alen);
}
 
static void
advance_active(fz_gel *gel)
{
fz_edge *edge;
int i = 0;
 
while (i < gel->alen)
{
edge = gel->active[i];
 
edge->h --;
 
/* terminator! */
if (edge->h == 0) {
gel->active[i] = gel->active[--gel->alen];
}
 
else {
edge->x += edge->xmove;
edge->e += edge->adj_up;
if (edge->e > 0) {
edge->x += edge->xdir;
edge->e -= edge->adj_down;
}
i ++;
}
}
}
 
/*
* Anti-aliased scan conversion.
*/
 
static inline void add_span_aa(int *list, int x0, int x1, int xofs)
{
int x0pix, x0sub;
int x1pix, x1sub;
 
if (x0 == x1)
return;
 
/* x between 0 and width of bbox */
x0 -= xofs;
x1 -= xofs;
 
x0pix = x0 / fz_aa_hscale;
x0sub = x0 % fz_aa_hscale;
x1pix = x1 / fz_aa_hscale;
x1sub = x1 % fz_aa_hscale;
 
if (x0pix == x1pix)
{
list[x0pix] += x1sub - x0sub;
list[x0pix+1] += x0sub - x1sub;
}
 
else
{
list[x0pix] += fz_aa_hscale - x0sub;
list[x0pix+1] += x0sub;
list[x1pix] += x1sub - fz_aa_hscale;
list[x1pix+1] += -x1sub;
}
}
 
static inline void non_zero_winding_aa(fz_gel *gel, int *list, int xofs)
{
int winding = 0;
int x = 0;
int i;
for (i = 0; i < gel->alen; i++)
{
if (!winding && (winding + gel->active[i]->ydir))
x = gel->active[i]->x;
if (winding && !(winding + gel->active[i]->ydir))
add_span_aa(list, x, gel->active[i]->x, xofs);
winding += gel->active[i]->ydir;
}
}
 
static inline void even_odd_aa(fz_gel *gel, int *list, int xofs)
{
int even = 0;
int x = 0;
int i;
for (i = 0; i < gel->alen; i++)
{
if (!even)
x = gel->active[i]->x;
else
add_span_aa(list, x, gel->active[i]->x, xofs);
even = !even;
}
}
 
static inline void undelta_aa(unsigned char * restrict out, int * restrict in, int n)
{
int d = 0;
while (n--)
{
d += *in++;
*out++ = AA_SCALE(d);
}
}
 
static inline void blit_aa(fz_pixmap *dst, int x, int y,
unsigned char *mp, int w, unsigned char *color)
{
unsigned char *dp;
dp = dst->samples + ( (y - dst->y) * dst->w + (x - dst->x) ) * dst->n;
if (color)
fz_paint_span_with_color(dp, mp, dst->n, w, color);
else
fz_paint_span(dp, mp, 1, w, 255);
}
 
static void
fz_scan_convert_aa(fz_gel *gel, int eofill, fz_bbox clip,
fz_pixmap *dst, unsigned char *color)
{
unsigned char *alphas;
int *deltas;
int y, e;
int yd, yc;
 
int xmin = fz_idiv(gel->bbox.x0, fz_aa_hscale);
int xmax = fz_idiv(gel->bbox.x1, fz_aa_hscale) + 1;
 
int xofs = xmin * fz_aa_hscale;
 
int skipx = clip.x0 - xmin;
int clipn = clip.x1 - clip.x0;
 
if (gel->len == 0)
return;
 
assert(clip.x0 >= xmin);
assert(clip.x1 <= xmax);
 
alphas = fz_malloc(xmax - xmin + 1);
deltas = fz_malloc((xmax - xmin + 1) * sizeof(int));
memset(deltas, 0, (xmax - xmin + 1) * sizeof(int));
 
e = 0;
y = gel->edges[0].y;
yc = fz_idiv(y, fz_aa_vscale);
yd = yc;
 
while (gel->alen > 0 || e < gel->len)
{
yc = fz_idiv(y, fz_aa_vscale);
if (yc != yd)
{
if (yd >= clip.y0 && yd < clip.y1)
{
undelta_aa(alphas, deltas, skipx + clipn);
blit_aa(dst, xmin + skipx, yd, alphas + skipx, clipn, color);
memset(deltas, 0, (skipx + clipn) * sizeof(int));
}
}
yd = yc;
 
insert_active(gel, y, &e);
 
if (yd >= clip.y0 && yd < clip.y1)
{
if (eofill)
even_odd_aa(gel, deltas, xofs);
else
non_zero_winding_aa(gel, deltas, xofs);
}
 
advance_active(gel);
 
if (gel->alen > 0)
y ++;
else if (e < gel->len)
y = gel->edges[e].y;
}
 
if (yd >= clip.y0 && yd < clip.y1)
{
undelta_aa(alphas, deltas, skipx + clipn);
blit_aa(dst, xmin + skipx, yd, alphas + skipx, clipn, color);
}
 
fz_free(deltas);
fz_free(alphas);
}
 
/*
* Sharp (not anti-aliased) scan conversion
*/
 
static inline void blit_sharp(int x0, int x1, int y,
fz_bbox clip, fz_pixmap *dst, unsigned char *color)
{
unsigned char *dp;
x0 = CLAMP(x0, dst->x, dst->x + dst->w);
x1 = CLAMP(x1, dst->x, dst->x + dst->w);
if (x0 < x1)
{
dp = dst->samples + ( (y - dst->y) * dst->w + (x0 - dst->x) ) * dst->n;
if (color)
fz_paint_solid_color(dp, dst->n, x1 - x0, color);
else
fz_paint_solid_alpha(dp, x1 - x0, 255);
}
}
 
static inline void non_zero_winding_sharp(fz_gel *gel, int y,
fz_bbox clip, fz_pixmap *dst, unsigned char *color)
{
int winding = 0;
int x = 0;
int i;
for (i = 0; i < gel->alen; i++)
{
if (!winding && (winding + gel->active[i]->ydir))
x = gel->active[i]->x;
if (winding && !(winding + gel->active[i]->ydir))
blit_sharp(x, gel->active[i]->x, y, clip, dst, color);
winding += gel->active[i]->ydir;
}
}
 
static inline void even_odd_sharp(fz_gel *gel, int y,
fz_bbox clip, fz_pixmap *dst, unsigned char *color)
{
int even = 0;
int x = 0;
int i;
for (i = 0; i < gel->alen; i++)
{
if (!even)
x = gel->active[i]->x;
else
blit_sharp(x, gel->active[i]->x, y, clip, dst, color);
even = !even;
}
}
 
static void
fz_scan_convert_sharp(fz_gel *gel, int eofill, fz_bbox clip,
fz_pixmap *dst, unsigned char *color)
{
int e = 0;
int y = gel->edges[0].y;
 
while (gel->alen > 0 || e < gel->len)
{
insert_active(gel, y, &e);
 
if (y >= clip.y0 && y < clip.y1)
{
if (eofill)
even_odd_sharp(gel, y, clip, dst, color);
else
non_zero_winding_sharp(gel, y, clip, dst, color);
}
 
advance_active(gel);
 
if (gel->alen > 0)
y ++;
else if (e < gel->len)
y = gel->edges[e].y;
}
}
 
void
fz_scan_convert(fz_gel *gel, int eofill, fz_bbox clip,
fz_pixmap *dst, unsigned char *color)
{
if (fz_aa_level > 0)
fz_scan_convert_aa(gel, eofill, clip, dst, color);
else
fz_scan_convert_sharp(gel, eofill, clip, dst, color);
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/draw/draw_glyph.c
0,0 → 1,134
#include "fitz.h"
 
#define MAX_FONT_SIZE 1000
#define MAX_GLYPH_SIZE 256
#define MAX_CACHE_SIZE (1024*1024)
 
typedef struct fz_glyph_key_s fz_glyph_key;
 
struct fz_glyph_cache_s
{
fz_hash_table *hash;
int total;
};
 
struct fz_glyph_key_s
{
fz_font *font;
int a, b;
int c, d;
unsigned short gid;
unsigned char e, f;
};
 
fz_glyph_cache *
fz_new_glyph_cache(void)
{
fz_glyph_cache *cache;
 
cache = fz_malloc(sizeof(fz_glyph_cache));
cache->hash = fz_new_hash_table(509, sizeof(fz_glyph_key));
cache->total = 0;
 
return cache;
}
 
static void
fz_evict_glyph_cache(fz_glyph_cache *cache)
{
fz_glyph_key *key;
fz_pixmap *pixmap;
int i;
 
for (i = 0; i < fz_hash_len(cache->hash); i++)
{
key = fz_hash_get_key(cache->hash, i);
if (key->font)
fz_drop_font(key->font);
pixmap = fz_hash_get_val(cache->hash, i);
if (pixmap)
fz_drop_pixmap(pixmap);
}
 
cache->total = 0;
 
fz_empty_hash(cache->hash);
}
 
void
fz_free_glyph_cache(fz_glyph_cache *cache)
{
fz_evict_glyph_cache(cache);
fz_free_hash(cache->hash);
fz_free(cache);
}
 
fz_pixmap *
fz_render_stroked_glyph(fz_glyph_cache *cache, fz_font *font, int gid, fz_matrix trm, fz_matrix ctm, fz_stroke_state *stroke)
{
if (font->ft_face)
return fz_render_ft_stroked_glyph(font, gid, trm, ctm, stroke);
return fz_render_glyph(cache, font, gid, trm, NULL);
}
 
fz_pixmap *
fz_render_glyph(fz_glyph_cache *cache, fz_font *font, int gid, fz_matrix ctm, fz_colorspace *model)
{
fz_glyph_key key;
fz_pixmap *val;
float size = fz_matrix_expansion(ctm);
 
if (size > MAX_FONT_SIZE)
{
/* TODO: this case should be handled by rendering glyph as a path fill */
fz_warn("font size too large (%g), not rendering glyph", size);
return NULL;
}
 
memset(&key, 0, sizeof key);
key.font = font;
key.gid = gid;
key.a = ctm.a * 65536;
key.b = ctm.b * 65536;
key.c = ctm.c * 65536;
key.d = ctm.d * 65536;
key.e = (ctm.e - floorf(ctm.e)) * 256;
key.f = (ctm.f - floorf(ctm.f)) * 256;
 
val = fz_hash_find(cache->hash, &key);
if (val)
return fz_keep_pixmap(val);
 
ctm.e = floorf(ctm.e) + key.e / 256.0f;
ctm.f = floorf(ctm.f) + key.f / 256.0f;
 
if (font->ft_face)
{
val = fz_render_ft_glyph(font, gid, ctm);
}
else if (font->t3procs)
{
val = fz_render_t3_glyph(font, gid, ctm, model);
}
else
{
fz_warn("assert: uninitialized font structure");
return NULL;
}
 
if (val)
{
if (val->w < MAX_GLYPH_SIZE && val->h < MAX_GLYPH_SIZE)
{
if (cache->total + val->w * val->h > MAX_CACHE_SIZE)
fz_evict_glyph_cache(cache);
fz_keep_font(key.font);
fz_hash_insert(cache->hash, &key, val);
cache->total += val->w * val->h;
return fz_keep_pixmap(val);
}
return val;
}
 
return NULL;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/draw/draw_mesh.c
0,0 → 1,574
#include "fitz.h"
 
/*
* polygon clipping
*/
 
enum { IN, OUT, ENTER, LEAVE };
enum { MAXV = 3 + 4 };
enum { MAXN = 2 + FZ_MAX_COLORS };
 
static int clipx(float val, int ismax, float *v1, float *v2, int n)
{
float t;
int i;
int v1o = ismax ? v1[0] > val : v1[0] < val;
int v2o = ismax ? v2[0] > val : v2[0] < val;
if (v1o + v2o == 0)
return IN;
if (v1o + v2o == 2)
return OUT;
if (v2o)
{
t = (val - v1[0]) / (v2[0] - v1[0]);
v2[0] = val;
v2[1] = v1[1] + t * (v2[1] - v1[1]);
for (i = 2; i < n; i++)
v2[i] = v1[i] + t * (v2[i] - v1[i]);
return LEAVE;
}
else
{
t = (val - v2[0]) / (v1[0] - v2[0]);
v1[0] = val;
v1[1] = v2[1] + t * (v1[1] - v2[1]);
for (i = 2; i < n; i++)
v1[i] = v2[i] + t * (v1[i] - v2[i]);
return ENTER;
}
}
 
static int clipy(float val, int ismax, float *v1, float *v2, int n)
{
float t;
int i;
int v1o = ismax ? v1[1] > val : v1[1] < val;
int v2o = ismax ? v2[1] > val : v2[1] < val;
if (v1o + v2o == 0)
return IN;
if (v1o + v2o == 2)
return OUT;
if (v2o)
{
t = (val - v1[1]) / (v2[1] - v1[1]);
v2[0] = v1[0] + t * (v2[0] - v1[0]);
v2[1] = val;
for (i = 2; i < n; i++)
v2[i] = v1[i] + t * (v2[i] - v1[i]);
return LEAVE;
}
else
{
t = (val - v2[1]) / (v1[1] - v2[1]);
v1[0] = v2[0] + t * (v1[0] - v2[0]);
v1[1] = val;
for (i = 2; i < n; i++)
v1[i] = v2[i] + t * (v1[i] - v2[i]);
return ENTER;
}
}
 
static inline void copy_vert(float *dst, float *src, int n)
{
while (n--)
*dst++ = *src++;
}
 
static int clip_poly(float src[MAXV][MAXN],
float dst[MAXV][MAXN], int len, int n,
float val, int isy, int ismax)
{
float cv1[MAXN];
float cv2[MAXN];
int v1, v2, cp;
int r;
 
v1 = len - 1;
cp = 0;
 
for (v2 = 0; v2 < len; v2++)
{
copy_vert(cv1, src[v1], n);
copy_vert(cv2, src[v2], n);
 
if (isy)
r = clipy(val, ismax, cv1, cv2, n);
else
r = clipx(val, ismax, cv1, cv2, n);
 
switch (r)
{
case IN:
copy_vert(dst[cp++], cv2, n);
break;
case OUT:
break;
case LEAVE:
copy_vert(dst[cp++], cv2, n);
break;
case ENTER:
copy_vert(dst[cp++], cv1, n);
copy_vert(dst[cp++], cv2, n);
break;
}
v1 = v2;
}
 
return cp;
}
 
/*
* gouraud shaded polygon scan conversion
*/
 
static void paint_scan(fz_pixmap *pix, int y, int x1, int x2, int *v1, int *v2, int n)
{
unsigned char *p = pix->samples + ((y - pix->y) * pix->w + (x1 - pix->x)) * pix->n;
int v[FZ_MAX_COLORS];
int dv[FZ_MAX_COLORS];
int w = x2 - x1;
int k;
 
assert(w >= 0);
assert(y >= pix->y);
assert(y < pix->y + pix->h);
assert(x1 >= pix->x);
assert(x2 <= pix->x + pix->w);
 
if (w == 0)
return;
 
for (k = 0; k < n; k++)
{
v[k] = v1[k];
dv[k] = (v2[k] - v1[k]) / w;
}
 
while (w--)
{
for (k = 0; k < n; k++)
{
*p++ = v[k] >> 16;
v[k] += dv[k];
}
*p++ = 255;
}
}
 
static int find_next(int gel[MAXV][MAXN], int len, int a, int *s, int *e, int d)
{
int b;
 
while (1)
{
b = a + d;
if (b == len)
b = 0;
if (b == -1)
b = len - 1;
 
if (gel[b][1] == gel[a][1])
{
a = b;
continue;
}
 
if (gel[b][1] > gel[a][1])
{
*s = a;
*e = b;
return 0;
}
 
return 1;
}
}
 
static void load_edge(int gel[MAXV][MAXN], int s, int e, int *ael, int *del, int n)
{
int swp, k, dy;
 
if (gel[s][1] > gel[e][1])
{
swp = s; s = e; e = swp;
}
 
dy = gel[e][1] - gel[s][1];
 
ael[0] = gel[s][0];
del[0] = (gel[e][0] - gel[s][0]) / dy;
for (k = 2; k < n; k++)
{
ael[k] = gel[s][k];
del[k] = (gel[e][k] - gel[s][k]) / dy;
}
}
 
static inline void step_edge(int *ael, int *del, int n)
{
int k;
ael[0] += del[0];
for (k = 2; k < n; k++)
ael[k] += del[k];
}
 
static void
fz_paint_triangle(fz_pixmap *pix, float *av, float *bv, float *cv, int n, fz_bbox bbox)
{
float poly[MAXV][MAXN];
float temp[MAXV][MAXN];
float cx0 = bbox.x0;
float cy0 = bbox.y0;
float cx1 = bbox.x1;
float cy1 = bbox.y1;
 
int gel[MAXV][MAXN];
int ael[2][MAXN];
int del[2][MAXN];
int y, s0, s1, e0, e1;
int top, bot, len;
 
int i, k;
 
copy_vert(poly[0], av, n);
copy_vert(poly[1], bv, n);
copy_vert(poly[2], cv, n);
 
len = clip_poly(poly, temp, 3, n, cx0, 0, 0);
len = clip_poly(temp, poly, len, n, cx1, 0, 1);
len = clip_poly(poly, temp, len, n, cy0, 1, 0);
len = clip_poly(temp, poly, len, n, cy1, 1, 1);
 
if (len < 3)
return;
 
for (i = 0; i < len; i++)
{
gel[i][0] = floorf(poly[i][0] + 0.5f) * 65536; /* trunc and fix */
gel[i][1] = floorf(poly[i][1] + 0.5f); /* y is not fixpoint */
for (k = 2; k < n; k++)
gel[i][k] = poly[i][k] * 65536; /* fix with precision */
}
 
top = bot = 0;
for (i = 0; i < len; i++)
{
if (gel[i][1] < gel[top][1])
top = i;
if (gel[i][1] > gel[bot][1])
bot = i;
}
 
if (gel[bot][1] - gel[top][1] == 0)
return;
 
y = gel[top][1];
 
if (find_next(gel, len, top, &s0, &e0, 1))
return;
if (find_next(gel, len, top, &s1, &e1, -1))
return;
 
load_edge(gel, s0, e0, ael[0], del[0], n);
load_edge(gel, s1, e1, ael[1], del[1], n);
 
while (1)
{
int x0 = ael[0][0] >> 16;
int x1 = ael[1][0] >> 16;
 
if (ael[0][0] < ael[1][0])
paint_scan(pix, y, x0, x1, ael[0]+2, ael[1]+2, n-2);
else
paint_scan(pix, y, x1, x0, ael[1]+2, ael[0]+2, n-2);
 
step_edge(ael[0], del[0], n);
step_edge(ael[1], del[1], n);
y ++;
 
if (y >= gel[e0][1])
{
if (find_next(gel, len, e0, &s0, &e0, 1))
return;
load_edge(gel, s0, e0, ael[0], del[0], n);
}
 
if (y >= gel[e1][1])
{
if (find_next(gel, len, e1, &s1, &e1, -1))
return;
load_edge(gel, s1, e1, ael[1], del[1], n);
}
}
}
 
static void
fz_paint_quad(fz_pixmap *pix,
fz_point p0, fz_point p1, fz_point p2, fz_point p3,
float c0, float c1, float c2, float c3,
int n, fz_bbox bbox)
{
float v[4][3];
 
v[0][0] = p0.x;
v[0][1] = p0.y;
v[0][2] = c0;
 
v[1][0] = p1.x;
v[1][1] = p1.y;
v[1][2] = c1;
 
v[2][0] = p2.x;
v[2][1] = p2.y;
v[2][2] = c2;
 
v[3][0] = p3.x;
v[3][1] = p3.y;
v[3][2] = c3;
 
fz_paint_triangle(pix, v[0], v[2], v[3], n, bbox);
fz_paint_triangle(pix, v[0], v[3], v[1], n, bbox);
}
 
/*
* linear, radial and mesh painting
*/
 
#define HUGENUM 32000 /* how far to extend axial/radial shadings */
#define RADSEGS 32 /* how many segments to generate for radial meshes */
 
static fz_point
fz_point_on_circle(fz_point p, float r, float theta)
{
p.x = p.x + cosf(theta) * r;
p.y = p.y + sinf(theta) * r;
 
return p;
}
 
static void
fz_paint_linear(fz_shade *shade, fz_matrix ctm, fz_pixmap *dest, fz_bbox bbox)
{
fz_point p0, p1;
fz_point v0, v1, v2, v3;
fz_point e0, e1;
float theta;
 
p0.x = shade->mesh[0];
p0.y = shade->mesh[1];
p0 = fz_transform_point(ctm, p0);
 
p1.x = shade->mesh[3];
p1.y = shade->mesh[4];
p1 = fz_transform_point(ctm, p1);
 
theta = atan2f(p1.y - p0.y, p1.x - p0.x);
theta += (float)M_PI * 0.5f;
 
v0 = fz_point_on_circle(p0, HUGENUM, theta);
v1 = fz_point_on_circle(p1, HUGENUM, theta);
v2 = fz_point_on_circle(p0, -HUGENUM, theta);
v3 = fz_point_on_circle(p1, -HUGENUM, theta);
 
fz_paint_quad(dest, v0, v1, v2, v3, 0, 255, 0, 255, 3, bbox);
 
if (shade->extend[0])
{
e0.x = v0.x - (p1.x - p0.x) * HUGENUM;
e0.y = v0.y - (p1.y - p0.y) * HUGENUM;
 
e1.x = v2.x - (p1.x - p0.x) * HUGENUM;
e1.y = v2.y - (p1.y - p0.y) * HUGENUM;
 
fz_paint_quad(dest, e0, e1, v0, v2, 0, 0, 0, 0, 3, bbox);
}
 
if (shade->extend[1])
{
e0.x = v1.x + (p1.x - p0.x) * HUGENUM;
e0.y = v1.y + (p1.y - p0.y) * HUGENUM;
 
e1.x = v3.x + (p1.x - p0.x) * HUGENUM;
e1.y = v3.y + (p1.y - p0.y) * HUGENUM;
 
fz_paint_quad(dest, e0, e1, v1, v3, 255, 255, 255, 255, 3, bbox);
}
}
 
static void
fz_paint_annulus(fz_matrix ctm,
fz_point p0, float r0, float c0,
fz_point p1, float r1, float c1,
fz_pixmap *dest, fz_bbox bbox)
{
fz_point t0, t1, t2, t3, b0, b1, b2, b3;
float theta, step;
int i;
 
theta = atan2f(p1.y - p0.y, p1.x - p0.x);
step = (float)M_PI * 2 / RADSEGS;
 
for (i = 0; i < RADSEGS / 2; i++)
{
t0 = fz_point_on_circle(p0, r0, theta + i * step);
t1 = fz_point_on_circle(p0, r0, theta + i * step + step);
t2 = fz_point_on_circle(p1, r1, theta + i * step);
t3 = fz_point_on_circle(p1, r1, theta + i * step + step);
b0 = fz_point_on_circle(p0, r0, theta - i * step);
b1 = fz_point_on_circle(p0, r0, theta - i * step - step);
b2 = fz_point_on_circle(p1, r1, theta - i * step);
b3 = fz_point_on_circle(p1, r1, theta - i * step - step);
 
t0 = fz_transform_point(ctm, t0);
t1 = fz_transform_point(ctm, t1);
t2 = fz_transform_point(ctm, t2);
t3 = fz_transform_point(ctm, t3);
b0 = fz_transform_point(ctm, b0);
b1 = fz_transform_point(ctm, b1);
b2 = fz_transform_point(ctm, b2);
b3 = fz_transform_point(ctm, b3);
 
fz_paint_quad(dest, t0, t1, t2, t3, c0, c0, c1, c1, 3, bbox);
fz_paint_quad(dest, b0, b1, b2, b3, c0, c0, c1, c1, 3, bbox);
}
}
 
static void
fz_paint_radial(fz_shade *shade, fz_matrix ctm, fz_pixmap *dest, fz_bbox bbox)
{
fz_point p0, p1;
float r0, r1;
fz_point e;
float er, rs;
 
p0.x = shade->mesh[0];
p0.y = shade->mesh[1];
r0 = shade->mesh[2];
 
p1.x = shade->mesh[3];
p1.y = shade->mesh[4];
r1 = shade->mesh[5];
 
if (shade->extend[0])
{
if (r0 < r1)
rs = r0 / (r0 - r1);
else
rs = -HUGENUM;
 
e.x = p0.x + (p1.x - p0.x) * rs;
e.y = p0.y + (p1.y - p0.y) * rs;
er = r0 + (r1 - r0) * rs;
 
fz_paint_annulus(ctm, e, er, 0, p0, r0, 0, dest, bbox);
}
 
fz_paint_annulus(ctm, p0, r0, 0, p1, r1, 255, dest, bbox);
 
if (shade->extend[1])
{
if (r0 > r1)
rs = r1 / (r1 - r0);
else
rs = -HUGENUM;
 
e.x = p1.x + (p0.x - p1.x) * rs;
e.y = p1.y + (p0.y - p1.y) * rs;
er = r1 + (r0 - r1) * rs;
 
fz_paint_annulus(ctm, p1, r1, 255, e, er, 255, dest, bbox);
}
}
 
static void
fz_paint_mesh(fz_shade *shade, fz_matrix ctm, fz_pixmap *dest, fz_bbox bbox)
{
float tri[3][MAXN];
fz_point p;
float *mesh;
int ntris;
int i, k;
 
mesh = shade->mesh;
 
if (shade->use_function)
ntris = shade->mesh_len / 9;
else
ntris = shade->mesh_len / ((2 + shade->colorspace->n) * 3);
 
while (ntris--)
{
for (k = 0; k < 3; k++)
{
p.x = *mesh++;
p.y = *mesh++;
p = fz_transform_point(ctm, p);
tri[k][0] = p.x;
tri[k][1] = p.y;
if (shade->use_function)
tri[k][2] = *mesh++ * 255;
else
{
fz_convert_color(shade->colorspace, mesh, dest->colorspace, tri[k] + 2);
for (i = 0; i < dest->colorspace->n; i++)
tri[k][i + 2] *= 255;
mesh += shade->colorspace->n;
}
}
fz_paint_triangle(dest, tri[0], tri[1], tri[2], 2 + dest->colorspace->n, bbox);
}
}
 
void
fz_paint_shade(fz_shade *shade, fz_matrix ctm, fz_pixmap *dest, fz_bbox bbox)
{
unsigned char clut[256][FZ_MAX_COLORS];
fz_pixmap *temp, *conv;
float color[FZ_MAX_COLORS];
int i, k;
 
ctm = fz_concat(shade->matrix, ctm);
 
if (shade->use_function)
{
for (i = 0; i < 256; i++)
{
fz_convert_color(shade->colorspace, shade->function[i], dest->colorspace, color);
for (k = 0; k < dest->colorspace->n; k++)
clut[i][k] = color[k] * 255;
clut[i][k] = shade->function[i][shade->colorspace->n] * 255;
}
conv = fz_new_pixmap_with_rect(dest->colorspace, bbox);
temp = fz_new_pixmap_with_rect(fz_device_gray, bbox);
fz_clear_pixmap(temp);
}
else
{
temp = dest;
}
 
switch (shade->type)
{
case FZ_LINEAR: fz_paint_linear(shade, ctm, temp, bbox); break;
case FZ_RADIAL: fz_paint_radial(shade, ctm, temp, bbox); break;
case FZ_MESH: fz_paint_mesh(shade, ctm, temp, bbox); break;
}
 
if (shade->use_function)
{
unsigned char *s = temp->samples;
unsigned char *d = conv->samples;
int len = temp->w * temp->h;
while (len--)
{
int v = *s++;
int a = fz_mul255(*s++, clut[v][conv->n - 1]);
for (k = 0; k < conv->n - 1; k++)
*d++ = fz_mul255(clut[v][k], a);
*d++ = a;
}
fz_paint_pixmap(dest, conv, 255);
fz_drop_pixmap(conv);
fz_drop_pixmap(temp);
}
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/draw/draw_paint.c
0,0 → 1,471
#include "fitz.h"
 
/*
 
The functions in this file implement various flavours of Porter-Duff blending.
 
We take the following as definitions:
 
Cx = Color (from plane x)
ax = Alpha (from plane x)
cx = Cx.ax = Premultiplied color (from plane x)
 
The general PorterDuff blending equation is:
 
Blend Z = X op Y cz = Fx.cx + Fy. cy where Fx and Fy depend on op
 
The two operations we use in this file are: '(X in Y) over Z' and
'S over Z'. The definitions of the 'over' and 'in' operations are as
follows:
 
For S over Z, Fs = 1, Fz = 1-as
For X in Y, Fx = ay, Fy = 0
 
We have 2 choices; we can either work with premultiplied data, or non
premultiplied data. Our
 
First the premultiplied case:
 
Let S = (X in Y)
Let R = (X in Y) over Z = S over Z
 
cs = cx.Fx + cy.Fy (where Fx = ay, Fy = 0)
= cx.ay
as = ax.Fx + ay.Fy
= ax.ay
 
cr = cs.Fs + cz.Fz (where Fs = 1, Fz = 1-as)
= cs + cz.(1-as)
= cx.ay + cz.(1-ax.ay)
ar = as.Fs + az.Fz
= as + az.(1-as)
= ax.ay + az.(1-ax.ay)
 
This has various nice properties, like not needing any divisions, and
being symmetric in color and alpha, so this is what we use. Because we
went through the pain of deriving the non premultiplied forms, we list
them here too, though they are not used.
 
Non Pre-multiplied case:
 
Cs.as = Fx.Cx.ax + Fy.Cy.ay (where Fx = ay, Fy = 0)
= Cx.ay.ax
Cs = (Cx.ay.ax)/(ay.ax)
= Cx
Cr.ar = Fs.Cs.as + Fz.Cz.az (where Fs = 1, Fz = 1-as)
= Cs.as + (1-as).Cz.az
= Cx.ax.ay + Cz.az.(1-ax.ay)
Cr = (Cx.ax.ay + Cz.az.(1-ax.ay))/(ax.ay + az.(1-ax-ay))
 
Much more complex, it seems. However, if we could restrict ourselves to
the case where we were always plotting onto an opaque background (i.e.
az = 1), then:
 
Cr = Cx.(ax.ay) + Cz.(1-ax.ay)
= (Cx-Cz)*(1-ax.ay) + Cz (a single MLA operation)
ar = 1
 
Sadly, this is not true in the general case, so we abandon this effort
and stick to using the premultiplied form.
 
*/
 
typedef unsigned char byte;
 
/* These are used by the non-aa scan converter */
 
void
fz_paint_solid_alpha(byte * restrict dp, int w, int alpha)
{
int t = FZ_EXPAND(255 - alpha);
while (w--)
{
*dp = alpha + FZ_COMBINE(*dp, t);
dp ++;
}
}
 
void
fz_paint_solid_color(byte * restrict dp, int n, int w, byte *color)
{
int n1 = n - 1;
int sa = FZ_EXPAND(color[n1]);
int k;
while (w--)
{
int ma = FZ_COMBINE(FZ_EXPAND(255), sa);
for (k = 0; k < n1; k++)
dp[k] = FZ_BLEND(color[k], dp[k], ma);
dp[k] = FZ_BLEND(255, dp[k], ma);
dp += n;
}
}
 
/* Blend a non-premultiplied color in mask over destination */
 
static inline void
fz_paint_span_with_color_2(byte * restrict dp, byte * restrict mp, int w, byte *color)
{
int sa = FZ_EXPAND(color[1]);
int g = color[0];
while (w--)
{
int ma = *mp++;
ma = FZ_COMBINE(FZ_EXPAND(ma), sa);
dp[0] = FZ_BLEND(g, dp[0], ma);
dp[1] = FZ_BLEND(255, dp[1], ma);
dp += 2;
}
}
 
static inline void
fz_paint_span_with_color_4(byte * restrict dp, byte * restrict mp, int w, byte *color)
{
int sa = FZ_EXPAND(color[3]);
int r = color[0];
int g = color[1];
int b = color[2];
while (w--)
{
int ma = *mp++;
ma = FZ_COMBINE(FZ_EXPAND(ma), sa);
dp[0] = FZ_BLEND(r, dp[0], ma);
dp[1] = FZ_BLEND(g, dp[1], ma);
dp[2] = FZ_BLEND(b, dp[2], ma);
dp[3] = FZ_BLEND(255, dp[3], ma);
dp += 4;
}
}
 
static inline void
fz_paint_span_with_color_N(byte * restrict dp, byte * restrict mp, int n, int w, byte *color)
{
int n1 = n - 1;
int sa = FZ_EXPAND(color[n1]);
int k;
while (w--)
{
int ma = *mp++;
ma = FZ_COMBINE(FZ_EXPAND(ma), sa);
for (k = 0; k < n1; k++)
dp[k] = FZ_BLEND(color[k], dp[k], ma);
dp[k] = FZ_BLEND(255, dp[k], ma);
dp += n;
}
}
 
void
fz_paint_span_with_color(byte * restrict dp, byte * restrict mp, int n, int w, byte *color)
{
switch (n)
{
case 2: fz_paint_span_with_color_2(dp, mp, w, color); break;
case 4: fz_paint_span_with_color_4(dp, mp, w, color); break;
default: fz_paint_span_with_color_N(dp, mp, n, w, color); break;
}
}
 
/* Blend source in mask over destination */
 
static inline void
fz_paint_span_with_mask_2(byte * restrict dp, byte * restrict sp, byte * restrict mp, int w)
{
while (w--)
{
int masa;
int ma = *mp++;
ma = FZ_EXPAND(ma);
masa = FZ_COMBINE(sp[1], ma);
masa = 255 - masa;
masa = FZ_EXPAND(masa);
*dp = FZ_COMBINE2(*sp, ma, *dp, masa);
sp++; dp++;
*dp = FZ_COMBINE2(*sp, ma, *dp, masa);
sp++; dp++;
}
}
 
static inline void
fz_paint_span_with_mask_4(byte * restrict dp, byte * restrict sp, byte * restrict mp, int w)
{
while (w--)
{
int masa;
int ma = *mp++;
ma = FZ_EXPAND(ma);
masa = FZ_COMBINE(sp[3], ma);
masa = 255 - masa;
masa = FZ_EXPAND(masa);
*dp = FZ_COMBINE2(*sp, ma, *dp, masa);
sp++; dp++;
*dp = FZ_COMBINE2(*sp, ma, *dp, masa);
sp++; dp++;
*dp = FZ_COMBINE2(*sp, ma, *dp, masa);
sp++; dp++;
*dp = FZ_COMBINE2(*sp, ma, *dp, masa);
sp++; dp++;
}
}
 
static inline void
fz_paint_span_with_mask_N(byte * restrict dp, byte * restrict sp, byte * restrict mp, int n, int w)
{
while (w--)
{
int k = n;
int masa;
int ma = *mp++;
ma = FZ_EXPAND(ma);
masa = FZ_COMBINE(sp[n-1], ma);
masa = 255-masa;
masa = FZ_EXPAND(masa);
while (k--)
{
*dp = FZ_COMBINE2(*sp, ma, *dp, masa);
sp++; dp++;
}
}
}
 
static void
fz_paint_span_with_mask(byte * restrict dp, byte * restrict sp, byte * restrict mp, int n, int w)
{
switch (n)
{
case 2: fz_paint_span_with_mask_2(dp, sp, mp, w); break;
case 4: fz_paint_span_with_mask_4(dp, sp, mp, w); break;
default: fz_paint_span_with_mask_N(dp, sp, mp, n, w); break;
}
}
 
/* Blend source in constant alpha over destination */
 
static inline void
fz_paint_span_2_with_alpha(byte * restrict dp, byte * restrict sp, int w, int alpha)
{
alpha = FZ_EXPAND(alpha);
while (w--)
{
int masa = FZ_COMBINE(sp[1], alpha);
*dp = FZ_BLEND(*sp, *dp, masa);
dp++; sp++;
*dp = FZ_BLEND(*sp, *dp, masa);
dp++; sp++;
}
}
 
static inline void
fz_paint_span_4_with_alpha(byte * restrict dp, byte * restrict sp, int w, int alpha)
{
alpha = FZ_EXPAND(alpha);
while (w--)
{
int masa = FZ_COMBINE(sp[3], alpha);
*dp = FZ_BLEND(*sp, *dp, masa);
sp++; dp++;
*dp = FZ_BLEND(*sp, *dp, masa);
sp++; dp++;
*dp = FZ_BLEND(*sp, *dp, masa);
sp++; dp++;
*dp = FZ_BLEND(*sp, *dp, masa);
sp++; dp++;
}
}
 
static inline void
fz_paint_span_N_with_alpha(byte * restrict dp, byte * restrict sp, int n, int w, int alpha)
{
alpha = FZ_EXPAND(alpha);
while (w--)
{
int masa = FZ_COMBINE(sp[n-1], alpha);
int k = n;
while (k--)
{
*dp = FZ_BLEND(*sp++, *dp, masa);
dp++;
}
}
}
 
/* Blend source over destination */
 
static inline void
fz_paint_span_1(byte * restrict dp, byte * restrict sp, int w)
{
while (w--)
{
int t = FZ_EXPAND(255 - sp[0]);
*dp = *sp++ + FZ_COMBINE(*dp, t);
dp ++;
}
}
 
static inline void
fz_paint_span_2(byte * restrict dp, byte * restrict sp, int w)
{
while (w--)
{
int t = FZ_EXPAND(255 - sp[1]);
*dp = *sp++ + FZ_COMBINE(*dp, t);
dp++;
*dp = *sp++ + FZ_COMBINE(*dp, t);
dp++;
}
}
 
static inline void
fz_paint_span_4(byte * restrict dp, byte * restrict sp, int w)
{
while (w--)
{
int t = FZ_EXPAND(255 - sp[3]);
*dp = *sp++ + FZ_COMBINE(*dp, t);
dp++;
*dp = *sp++ + FZ_COMBINE(*dp, t);
dp++;
*dp = *sp++ + FZ_COMBINE(*dp, t);
dp++;
*dp = *sp++ + FZ_COMBINE(*dp, t);
dp++;
}
}
 
static inline void
fz_paint_span_N(byte * restrict dp, byte * restrict sp, int n, int w)
{
while (w--)
{
int k = n;
int t = FZ_EXPAND(255 - sp[n-1]);
while (k--)
{
*dp = *sp++ + FZ_COMBINE(*dp, t);
dp++;
}
}
}
 
void
fz_paint_span(byte * restrict dp, byte * restrict sp, int n, int w, int alpha)
{
if (alpha == 255)
{
switch (n)
{
case 1: fz_paint_span_1(dp, sp, w); break;
case 2: fz_paint_span_2(dp, sp, w); break;
case 4: fz_paint_span_4(dp, sp, w); break;
default: fz_paint_span_N(dp, sp, n, w); break;
}
}
else if (alpha > 0)
{
switch (n)
{
case 2: fz_paint_span_2_with_alpha(dp, sp, w, alpha); break;
case 4: fz_paint_span_4_with_alpha(dp, sp, w, alpha); break;
default: fz_paint_span_N_with_alpha(dp, sp, n, w, alpha); break;
}
}
}
 
/*
* Pixmap blending functions
*/
 
void
fz_paint_pixmap_with_rect(fz_pixmap *dst, fz_pixmap *src, int alpha, fz_bbox bbox)
{
unsigned char *sp, *dp;
int x, y, w, h, n;
 
assert(dst->n == src->n);
 
bbox = fz_intersect_bbox(bbox, fz_bound_pixmap(dst));
bbox = fz_intersect_bbox(bbox, fz_bound_pixmap(src));
 
x = bbox.x0;
y = bbox.y0;
w = bbox.x1 - bbox.x0;
h = bbox.y1 - bbox.y0;
if ((w | h) == 0)
return;
 
n = src->n;
sp = src->samples + ((y - src->y) * src->w + (x - src->x)) * src->n;
dp = dst->samples + ((y - dst->y) * dst->w + (x - dst->x)) * dst->n;
 
while (h--)
{
fz_paint_span(dp, sp, n, w, alpha);
sp += src->w * n;
dp += dst->w * n;
}
}
 
void
fz_paint_pixmap(fz_pixmap *dst, fz_pixmap *src, int alpha)
{
unsigned char *sp, *dp;
fz_bbox bbox;
int x, y, w, h, n;
 
assert(dst->n == src->n);
 
bbox = fz_bound_pixmap(dst);
bbox = fz_intersect_bbox(bbox, fz_bound_pixmap(src));
 
x = bbox.x0;
y = bbox.y0;
w = bbox.x1 - bbox.x0;
h = bbox.y1 - bbox.y0;
if ((w | h) == 0)
return;
 
n = src->n;
sp = src->samples + ((y - src->y) * src->w + (x - src->x)) * src->n;
dp = dst->samples + ((y - dst->y) * dst->w + (x - dst->x)) * dst->n;
 
while (h--)
{
fz_paint_span(dp, sp, n, w, alpha);
sp += src->w * n;
dp += dst->w * n;
}
}
 
void
fz_paint_pixmap_with_mask(fz_pixmap *dst, fz_pixmap *src, fz_pixmap *msk)
{
unsigned char *sp, *dp, *mp;
fz_bbox bbox;
int x, y, w, h, n;
 
assert(dst->n == src->n);
assert(msk->n == 1);
 
bbox = fz_bound_pixmap(dst);
bbox = fz_intersect_bbox(bbox, fz_bound_pixmap(src));
bbox = fz_intersect_bbox(bbox, fz_bound_pixmap(msk));
 
x = bbox.x0;
y = bbox.y0;
w = bbox.x1 - bbox.x0;
h = bbox.y1 - bbox.y0;
if ((w | h) == 0)
return;
 
n = src->n;
sp = src->samples + ((y - src->y) * src->w + (x - src->x)) * src->n;
mp = msk->samples + ((y - msk->y) * msk->w + (x - msk->x)) * msk->n;
dp = dst->samples + ((y - dst->y) * dst->w + (x - dst->x)) * dst->n;
 
while (h--)
{
fz_paint_span_with_mask(dp, sp, mp, n, w);
sp += src->w * n;
dp += dst->w * n;
mp += msk->w;
}
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/draw/draw_path.c
0,0 → 1,807
#include "fitz.h"
 
#define MAX_DEPTH 8
 
enum { BUTT = 0, ROUND = 1, SQUARE = 2, TRIANGLE = 3, MITER = 0, BEVEL = 2 };
 
static void
line(fz_gel *gel, fz_matrix *ctm, float x0, float y0, float x1, float y1)
{
float tx0 = ctm->a * x0 + ctm->c * y0 + ctm->e;
float ty0 = ctm->b * x0 + ctm->d * y0 + ctm->f;
float tx1 = ctm->a * x1 + ctm->c * y1 + ctm->e;
float ty1 = ctm->b * x1 + ctm->d * y1 + ctm->f;
fz_insert_gel(gel, tx0, ty0, tx1, ty1);
}
 
static void
bezier(fz_gel *gel, fz_matrix *ctm, float flatness,
float xa, float ya,
float xb, float yb,
float xc, float yc,
float xd, float yd, int depth)
{
float dmax;
float xab, yab;
float xbc, ybc;
float xcd, ycd;
float xabc, yabc;
float xbcd, ybcd;
float xabcd, yabcd;
 
/* termination check */
dmax = ABS(xa - xb);
dmax = MAX(dmax, ABS(ya - yb));
dmax = MAX(dmax, ABS(xd - xc));
dmax = MAX(dmax, ABS(yd - yc));
if (dmax < flatness || depth >= MAX_DEPTH)
{
line(gel, ctm, xa, ya, xd, yd);
return;
}
 
xab = xa + xb;
yab = ya + yb;
xbc = xb + xc;
ybc = yb + yc;
xcd = xc + xd;
ycd = yc + yd;
 
xabc = xab + xbc;
yabc = yab + ybc;
xbcd = xbc + xcd;
ybcd = ybc + ycd;
 
xabcd = xabc + xbcd;
yabcd = yabc + ybcd;
 
xab *= 0.5f; yab *= 0.5f;
xbc *= 0.5f; ybc *= 0.5f;
xcd *= 0.5f; ycd *= 0.5f;
 
xabc *= 0.25f; yabc *= 0.25f;
xbcd *= 0.25f; ybcd *= 0.25f;
 
xabcd *= 0.125f; yabcd *= 0.125f;
 
bezier(gel, ctm, flatness, xa, ya, xab, yab, xabc, yabc, xabcd, yabcd, depth + 1);
bezier(gel, ctm, flatness, xabcd, yabcd, xbcd, ybcd, xcd, ycd, xd, yd, depth + 1);
}
 
void
fz_flatten_fill_path(fz_gel *gel, fz_path *path, fz_matrix ctm, float flatness)
{
float x1, y1, x2, y2, x3, y3;
float cx = 0;
float cy = 0;
float bx = 0;
float by = 0;
int i = 0;
 
while (i < path->len)
{
switch (path->items[i++].k)
{
case FZ_MOVETO:
/* implicit closepath before moveto */
if (i && (cx != bx || cy != by))
line(gel, &ctm, cx, cy, bx, by);
x1 = path->items[i++].v;
y1 = path->items[i++].v;
cx = bx = x1;
cy = by = y1;
break;
 
case FZ_LINETO:
x1 = path->items[i++].v;
y1 = path->items[i++].v;
line(gel, &ctm, cx, cy, x1, y1);
cx = x1;
cy = y1;
break;
 
case FZ_CURVETO:
x1 = path->items[i++].v;
y1 = path->items[i++].v;
x2 = path->items[i++].v;
y2 = path->items[i++].v;
x3 = path->items[i++].v;
y3 = path->items[i++].v;
bezier(gel, &ctm, flatness, cx, cy, x1, y1, x2, y2, x3, y3, 0);
cx = x3;
cy = y3;
break;
 
case FZ_CLOSE_PATH:
line(gel, &ctm, cx, cy, bx, by);
cx = bx;
cy = by;
break;
}
}
 
if (i && (cx != bx || cy != by))
line(gel, &ctm, cx, cy, bx, by);
}
 
struct sctx
{
fz_gel *gel;
fz_matrix *ctm;
float flatness;
 
int linejoin;
float linewidth;
float miterlimit;
fz_point beg[2];
fz_point seg[2];
int sn, bn;
int dot;
 
float *dash_list;
float dash_phase;
int dash_len;
int toggle, cap;
int offset;
float phase;
fz_point cur;
};
 
static void
fz_add_line(struct sctx *s, float x0, float y0, float x1, float y1)
{
float tx0 = s->ctm->a * x0 + s->ctm->c * y0 + s->ctm->e;
float ty0 = s->ctm->b * x0 + s->ctm->d * y0 + s->ctm->f;
float tx1 = s->ctm->a * x1 + s->ctm->c * y1 + s->ctm->e;
float ty1 = s->ctm->b * x1 + s->ctm->d * y1 + s->ctm->f;
fz_insert_gel(s->gel, tx0, ty0, tx1, ty1);
}
 
static void
fz_add_arc(struct sctx *s,
float xc, float yc,
float x0, float y0,
float x1, float y1)
{
float th0, th1, r;
float theta;
float ox, oy, nx, ny;
int n, i;
 
r = fabsf(s->linewidth);
theta = 2 * (float)M_SQRT2 * sqrtf(s->flatness / r);
th0 = atan2f(y0, x0);
th1 = atan2f(y1, x1);
 
if (r > 0)
{
if (th0 < th1)
th0 += (float)M_PI * 2;
n = ceilf((th0 - th1) / theta);
}
else
{
if (th1 < th0)
th1 += (float)M_PI * 2;
n = ceilf((th1 - th0) / theta);
}
 
ox = x0;
oy = y0;
for (i = 1; i < n; i++)
{
theta = th0 + (th1 - th0) * i / n;
nx = cosf(theta) * r;
ny = sinf(theta) * r;
fz_add_line(s, xc + ox, yc + oy, xc + nx, yc + ny);
ox = nx;
oy = ny;
}
 
fz_add_line(s, xc + ox, yc + oy, xc + x1, yc + y1);
}
 
static void
fz_add_line_stroke(struct sctx *s, fz_point a, fz_point b)
{
float dx = b.x - a.x;
float dy = b.y - a.y;
float scale = s->linewidth / sqrtf(dx * dx + dy * dy);
float dlx = dy * scale;
float dly = -dx * scale;
fz_add_line(s, a.x - dlx, a.y - dly, b.x - dlx, b.y - dly);
fz_add_line(s, b.x + dlx, b.y + dly, a.x + dlx, a.y + dly);
}
 
static void
fz_add_line_join(struct sctx *s, fz_point a, fz_point b, fz_point c)
{
float miterlimit = s->miterlimit;
float linewidth = s->linewidth;
int linejoin = s->linejoin;
float dx0, dy0;
float dx1, dy1;
float dlx0, dly0;
float dlx1, dly1;
float dmx, dmy;
float dmr2;
float scale;
float cross;
 
dx0 = b.x - a.x;
dy0 = b.y - a.y;
 
dx1 = c.x - b.x;
dy1 = c.y - b.y;
 
if (dx0 * dx0 + dy0 * dy0 < FLT_EPSILON)
linejoin = BEVEL;
if (dx1 * dx1 + dy1 * dy1 < FLT_EPSILON)
linejoin = BEVEL;
 
scale = linewidth / sqrtf(dx0 * dx0 + dy0 * dy0);
dlx0 = dy0 * scale;
dly0 = -dx0 * scale;
 
scale = linewidth / sqrtf(dx1 * dx1 + dy1 * dy1);
dlx1 = dy1 * scale;
dly1 = -dx1 * scale;
 
cross = dx1 * dy0 - dx0 * dy1;
 
dmx = (dlx0 + dlx1) * 0.5f;
dmy = (dly0 + dly1) * 0.5f;
dmr2 = dmx * dmx + dmy * dmy;
 
if (cross * cross < FLT_EPSILON && dx0 * dx1 + dy0 * dy1 >= 0)
linejoin = BEVEL;
 
if (linejoin == MITER)
if (dmr2 * miterlimit * miterlimit < linewidth * linewidth)
linejoin = BEVEL;
 
if (linejoin == BEVEL)
{
fz_add_line(s, b.x - dlx0, b.y - dly0, b.x - dlx1, b.y - dly1);
fz_add_line(s, b.x + dlx1, b.y + dly1, b.x + dlx0, b.y + dly0);
}
 
if (linejoin == MITER)
{
scale = linewidth * linewidth / dmr2;
dmx *= scale;
dmy *= scale;
 
if (cross < 0)
{
fz_add_line(s, b.x - dlx0, b.y - dly0, b.x - dlx1, b.y - dly1);
fz_add_line(s, b.x + dlx1, b.y + dly1, b.x + dmx, b.y + dmy);
fz_add_line(s, b.x + dmx, b.y + dmy, b.x + dlx0, b.y + dly0);
}
else
{
fz_add_line(s, b.x + dlx1, b.y + dly1, b.x + dlx0, b.y + dly0);
fz_add_line(s, b.x - dlx0, b.y - dly0, b.x - dmx, b.y - dmy);
fz_add_line(s, b.x - dmx, b.y - dmy, b.x - dlx1, b.y - dly1);
}
}
 
if (linejoin == ROUND)
{
if (cross < 0)
{
fz_add_line(s, b.x - dlx0, b.y - dly0, b.x - dlx1, b.y - dly1);
fz_add_arc(s, b.x, b.y, dlx1, dly1, dlx0, dly0);
}
else
{
fz_add_line(s, b.x + dlx1, b.y + dly1, b.x + dlx0, b.y + dly0);
fz_add_arc(s, b.x, b.y, -dlx0, -dly0, -dlx1, -dly1);
}
}
}
 
static void
fz_add_line_cap(struct sctx *s, fz_point a, fz_point b, int linecap)
{
float flatness = s->flatness;
float linewidth = s->linewidth;
 
float dx = b.x - a.x;
float dy = b.y - a.y;
 
float scale = linewidth / sqrtf(dx * dx + dy * dy);
float dlx = dy * scale;
float dly = -dx * scale;
 
if (linecap == BUTT)
fz_add_line(s, b.x - dlx, b.y - dly, b.x + dlx, b.y + dly);
 
if (linecap == ROUND)
{
int i;
int n = ceilf((float)M_PI / (2.0f * (float)M_SQRT2 * sqrtf(flatness / linewidth)));
float ox = b.x - dlx;
float oy = b.y - dly;
for (i = 1; i < n; i++)
{
float theta = (float)M_PI * i / n;
float cth = cosf(theta);
float sth = sinf(theta);
float nx = b.x - dlx * cth - dly * sth;
float ny = b.y - dly * cth + dlx * sth;
fz_add_line(s, ox, oy, nx, ny);
ox = nx;
oy = ny;
}
fz_add_line(s, ox, oy, b.x + dlx, b.y + dly);
}
 
if (linecap == SQUARE)
{
fz_add_line(s, b.x - dlx, b.y - dly,
b.x - dlx - dly, b.y - dly + dlx);
fz_add_line(s, b.x - dlx - dly, b.y - dly + dlx,
b.x + dlx - dly, b.y + dly + dlx);
fz_add_line(s, b.x + dlx - dly, b.y + dly + dlx,
b.x + dlx, b.y + dly);
}
 
if (linecap == TRIANGLE)
{
float mx = -dly;
float my = dlx;
fz_add_line(s, b.x - dlx, b.y - dly, b.x + mx, b.y + my);
fz_add_line(s, b.x + mx, b.y + my, b.x + dlx, b.y + dly);
}
}
 
static void
fz_add_line_dot(struct sctx *s, fz_point a)
{
float flatness = s->flatness;
float linewidth = s->linewidth;
int n = ceilf((float)M_PI / ((float)M_SQRT2 * sqrtf(flatness / linewidth)));
float ox = a.x - linewidth;
float oy = a.y;
int i;
 
for (i = 1; i < n; i++)
{
float theta = (float)M_PI * 2 * i / n;
float cth = cosf(theta);
float sth = sinf(theta);
float nx = a.x - cth * linewidth;
float ny = a.y + sth * linewidth;
fz_add_line(s, ox, oy, nx, ny);
ox = nx;
oy = ny;
}
 
fz_add_line(s, ox, oy, a.x - linewidth, a.y);
}
 
static void
fz_stroke_flush(struct sctx *s, int start_cap, int end_cap)
{
if (s->sn == 2)
{
fz_add_line_cap(s, s->beg[1], s->beg[0], start_cap);
fz_add_line_cap(s, s->seg[0], s->seg[1], end_cap);
}
else if (s->dot)
{
fz_add_line_dot(s, s->beg[0]);
}
}
 
static void
fz_stroke_moveto(struct sctx *s, fz_point cur)
{
s->seg[0] = cur;
s->beg[0] = cur;
s->sn = 1;
s->bn = 1;
s->dot = 0;
}
 
static void
fz_stroke_lineto(struct sctx *s, fz_point cur)
{
float dx = cur.x - s->seg[s->sn-1].x;
float dy = cur.y - s->seg[s->sn-1].y;
 
if (dx * dx + dy * dy < FLT_EPSILON)
{
if (s->cap == ROUND || s->dash_list)
s->dot = 1;
return;
}
 
fz_add_line_stroke(s, s->seg[s->sn-1], cur);
 
if (s->sn == 2)
{
fz_add_line_join(s, s->seg[0], s->seg[1], cur);
s->seg[0] = s->seg[1];
s->seg[1] = cur;
}
 
if (s->sn == 1)
s->seg[s->sn++] = cur;
if (s->bn == 1)
s->beg[s->bn++] = cur;
}
 
static void
fz_stroke_closepath(struct sctx *s)
{
if (s->sn == 2)
{
fz_stroke_lineto(s, s->beg[0]);
if (s->seg[1].x == s->beg[0].x && s->seg[1].y == s->beg[0].y)
fz_add_line_join(s, s->seg[0], s->beg[0], s->beg[1]);
else
fz_add_line_join(s, s->seg[1], s->beg[0], s->beg[1]);
}
else if (s->dot)
{
fz_add_line_dot(s, s->beg[0]);
}
 
s->seg[0] = s->beg[0];
s->bn = 1;
s->sn = 1;
s->dot = 0;
}
 
static void
fz_stroke_bezier(struct sctx *s,
float xa, float ya,
float xb, float yb,
float xc, float yc,
float xd, float yd, int depth)
{
float dmax;
float xab, yab;
float xbc, ybc;
float xcd, ycd;
float xabc, yabc;
float xbcd, ybcd;
float xabcd, yabcd;
 
/* termination check */
dmax = ABS(xa - xb);
dmax = MAX(dmax, ABS(ya - yb));
dmax = MAX(dmax, ABS(xd - xc));
dmax = MAX(dmax, ABS(yd - yc));
if (dmax < s->flatness || depth >= MAX_DEPTH)
{
fz_point p;
p.x = xd;
p.y = yd;
fz_stroke_lineto(s, p);
return;
}
 
xab = xa + xb;
yab = ya + yb;
xbc = xb + xc;
ybc = yb + yc;
xcd = xc + xd;
ycd = yc + yd;
 
xabc = xab + xbc;
yabc = yab + ybc;
xbcd = xbc + xcd;
ybcd = ybc + ycd;
 
xabcd = xabc + xbcd;
yabcd = yabc + ybcd;
 
xab *= 0.5f; yab *= 0.5f;
xbc *= 0.5f; ybc *= 0.5f;
xcd *= 0.5f; ycd *= 0.5f;
 
xabc *= 0.25f; yabc *= 0.25f;
xbcd *= 0.25f; ybcd *= 0.25f;
 
xabcd *= 0.125f; yabcd *= 0.125f;
 
fz_stroke_bezier(s, xa, ya, xab, yab, xabc, yabc, xabcd, yabcd, depth + 1);
fz_stroke_bezier(s, xabcd, yabcd, xbcd, ybcd, xcd, ycd, xd, yd, depth + 1);
}
 
void
fz_flatten_stroke_path(fz_gel *gel, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm, float flatness, float linewidth)
{
struct sctx s;
fz_point p0, p1, p2, p3;
int i;
 
s.gel = gel;
s.ctm = &ctm;
s.flatness = flatness;
 
s.linejoin = stroke->linejoin;
s.linewidth = linewidth * 0.5f; /* hairlines use a different value from the path value */
s.miterlimit = stroke->miterlimit;
s.sn = 0;
s.bn = 0;
s.dot = 0;
 
s.dash_list = NULL;
s.dash_phase = 0;
s.dash_len = 0;
s.toggle = 0;
s.offset = 0;
s.phase = 0;
 
s.cap = stroke->start_cap;
 
i = 0;
 
if (path->len > 0 && path->items[0].k != FZ_MOVETO)
{
fz_warn("assert: path must begin with moveto");
return;
}
 
p0.x = p0.y = 0;
 
while (i < path->len)
{
switch (path->items[i++].k)
{
case FZ_MOVETO:
p1.x = path->items[i++].v;
p1.y = path->items[i++].v;
fz_stroke_flush(&s, stroke->start_cap, stroke->end_cap);
fz_stroke_moveto(&s, p1);
p0 = p1;
break;
 
case FZ_LINETO:
p1.x = path->items[i++].v;
p1.y = path->items[i++].v;
fz_stroke_lineto(&s, p1);
p0 = p1;
break;
 
case FZ_CURVETO:
p1.x = path->items[i++].v;
p1.y = path->items[i++].v;
p2.x = path->items[i++].v;
p2.y = path->items[i++].v;
p3.x = path->items[i++].v;
p3.y = path->items[i++].v;
fz_stroke_bezier(&s, p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, 0);
p0 = p3;
break;
 
case FZ_CLOSE_PATH:
fz_stroke_closepath(&s);
break;
}
}
 
fz_stroke_flush(&s, stroke->start_cap, stroke->end_cap);
}
 
static void
fz_dash_moveto(struct sctx *s, fz_point a, int start_cap, int end_cap)
{
s->toggle = 1;
s->offset = 0;
s->phase = s->dash_phase;
 
while (s->phase >= s->dash_list[s->offset])
{
s->toggle = !s->toggle;
s->phase -= s->dash_list[s->offset];
s->offset ++;
if (s->offset == s->dash_len)
s->offset = 0;
}
 
s->cur = a;
 
if (s->toggle)
{
fz_stroke_flush(s, s->cap, end_cap);
s->cap = start_cap;
fz_stroke_moveto(s, a);
}
}
 
static void
fz_dash_lineto(struct sctx *s, fz_point b, int dash_cap)
{
float dx, dy;
float total, used, ratio;
fz_point a;
fz_point m;
 
a = s->cur;
dx = b.x - a.x;
dy = b.y - a.y;
total = sqrtf(dx * dx + dy * dy);
used = 0;
 
while (total - used > s->dash_list[s->offset] - s->phase)
{
used += s->dash_list[s->offset] - s->phase;
ratio = used / total;
m.x = a.x + ratio * dx;
m.y = a.y + ratio * dy;
 
if (s->toggle)
{
fz_stroke_lineto(s, m);
}
else
{
fz_stroke_flush(s, s->cap, dash_cap);
s->cap = dash_cap;
fz_stroke_moveto(s, m);
}
 
s->toggle = !s->toggle;
s->phase = 0;
s->offset ++;
if (s->offset == s->dash_len)
s->offset = 0;
}
 
s->phase += total - used;
 
s->cur = b;
 
if (s->toggle)
{
fz_stroke_lineto(s, b);
}
}
 
static void
fz_dash_bezier(struct sctx *s,
float xa, float ya,
float xb, float yb,
float xc, float yc,
float xd, float yd, int depth,
int dash_cap)
{
float dmax;
float xab, yab;
float xbc, ybc;
float xcd, ycd;
float xabc, yabc;
float xbcd, ybcd;
float xabcd, yabcd;
 
/* termination check */
dmax = ABS(xa - xb);
dmax = MAX(dmax, ABS(ya - yb));
dmax = MAX(dmax, ABS(xd - xc));
dmax = MAX(dmax, ABS(yd - yc));
if (dmax < s->flatness || depth >= MAX_DEPTH)
{
fz_point p;
p.x = xd;
p.y = yd;
fz_dash_lineto(s, p, dash_cap);
return;
}
 
xab = xa + xb;
yab = ya + yb;
xbc = xb + xc;
ybc = yb + yc;
xcd = xc + xd;
ycd = yc + yd;
 
xabc = xab + xbc;
yabc = yab + ybc;
xbcd = xbc + xcd;
ybcd = ybc + ycd;
 
xabcd = xabc + xbcd;
yabcd = yabc + ybcd;
 
xab *= 0.5f; yab *= 0.5f;
xbc *= 0.5f; ybc *= 0.5f;
xcd *= 0.5f; ycd *= 0.5f;
 
xabc *= 0.25f; yabc *= 0.25f;
xbcd *= 0.25f; ybcd *= 0.25f;
 
xabcd *= 0.125f; yabcd *= 0.125f;
 
fz_dash_bezier(s, xa, ya, xab, yab, xabc, yabc, xabcd, yabcd, depth + 1, dash_cap);
fz_dash_bezier(s, xabcd, yabcd, xbcd, ybcd, xcd, ycd, xd, yd, depth + 1, dash_cap);
}
 
void
fz_flatten_dash_path(fz_gel *gel, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm, float flatness, float linewidth)
{
struct sctx s;
fz_point p0, p1, p2, p3, beg;
float phase_len;
int i;
 
s.gel = gel;
s.ctm = &ctm;
s.flatness = flatness;
 
s.linejoin = stroke->linejoin;
s.linewidth = linewidth * 0.5f;
s.miterlimit = stroke->miterlimit;
s.sn = 0;
s.bn = 0;
s.dot = 0;
 
s.dash_list = stroke->dash_list;
s.dash_phase = stroke->dash_phase;
s.dash_len = stroke->dash_len;
s.toggle = 0;
s.offset = 0;
s.phase = 0;
 
s.cap = stroke->start_cap;
 
if (path->len > 0 && path->items[0].k != FZ_MOVETO)
{
fz_warn("assert: path must begin with moveto");
return;
}
 
phase_len = 0;
for (i = 0; i < stroke->dash_len; i++)
phase_len += stroke->dash_list[i];
if (phase_len < 0.01f || phase_len < stroke->linewidth * 0.5f)
{
fz_flatten_stroke_path(gel, path, stroke, ctm, flatness, linewidth);
return;
}
 
p0.x = p0.y = 0;
i = 0;
 
while (i < path->len)
{
switch (path->items[i++].k)
{
case FZ_MOVETO:
p1.x = path->items[i++].v;
p1.y = path->items[i++].v;
fz_dash_moveto(&s, p1, stroke->start_cap, stroke->end_cap);
beg = p0 = p1;
break;
 
case FZ_LINETO:
p1.x = path->items[i++].v;
p1.y = path->items[i++].v;
fz_dash_lineto(&s, p1, stroke->dash_cap);
p0 = p1;
break;
 
case FZ_CURVETO:
p1.x = path->items[i++].v;
p1.y = path->items[i++].v;
p2.x = path->items[i++].v;
p2.y = path->items[i++].v;
p3.x = path->items[i++].v;
p3.y = path->items[i++].v;
fz_dash_bezier(&s, p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, 0, stroke->dash_cap);
p0 = p3;
break;
 
case FZ_CLOSE_PATH:
fz_dash_lineto(&s, beg, stroke->dash_cap);
p0 = p1 = beg;
break;
}
}
 
fz_stroke_flush(&s, s.cap, stroke->end_cap);
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/draw/draw_scale.c
0,0 → 1,1250
/*
This code does smooth scaling of a pixmap.
 
This function returns a new pixmap representing the area starting at (0,0)
given by taking the source pixmap src, scaling it to width w, and height h,
and then positioning it at (frac(x),frac(y)).
*/
 
#include "fitz.h"
 
/* Do we special case handling of single pixel high/wide images? The
* 'purest' handling is given by not special casing them, but certain
* files that use such images 'stack' them to give full images. Not
* special casing them results in then being fainter and giving noticable
* rounding errors.
*/
#define SINGLE_PIXEL_SPECIALS
 
#ifdef DEBUG_SCALING
#ifdef WIN32
#include <windows.h>
static void debug_print(const char *fmt, ...)
{
va_list args;
char text[256];
va_start(args, fmt);
vsprintf(text, fmt, args);
va_end(args);
OutputDebugStringA(text);
printf(text);
}
#else
static void debug_print(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vfprintf(stderr, fmt, args);
va_end(args);
}
#endif
#endif
#ifdef DEBUG_SCALING
#define DBUG(A) debug_print A
#else
#define DBUG(A) do {} while(0==1)
#endif
 
/*
Consider a row of source samples, src, of width src_w, positioned at x,
scaled to width dst_w.
 
src[i] is centred at: x + (i + 0.5)*dst_w/src_w
 
Therefore the distance between the centre of the jth output pixel and
the centre of the ith source sample is:
 
dist[j,i] = j + 0.5 - (x + (i + 0.5)*dst_w/src_w)
 
When scaling up, therefore:
 
dst[j] = SUM(filter(dist[j,i]) * src[i])
(for all ints i)
 
This can be simplified by noticing that filters are only non zero within
a given filter width (henceforth called W). So:
 
dst[j] = SUM(filter(dist[j,i]) * src[i])
(for ints i, s.t. (j*src_w/dst_w)-W < i < (j*src_w/dst_w)+W)
 
When scaling down, each filtered source sample is stretched to be wider
to avoid aliasing issues. This effectively reduces the distance between
centres.
 
dst[j] = SUM(filter(dist[j,i] * F) * F * src[i])
(where F = dst_w/src_w)
(for ints i, s.t. (j-W)/F < i < (j+W)/F)
 
*/
 
typedef struct fz_scale_filter_s fz_scale_filter;
 
struct fz_scale_filter_s
{
int width;
float (*fn)(fz_scale_filter *, float);
};
 
/* Image scale filters */
 
static float
triangle(fz_scale_filter *filter, float f)
{
if (f >= 1)
return 0;
return 1-f;
}
 
static float
box(fz_scale_filter *filter, float f)
{
if (f >= 0.5f)
return 0;
return 1;
}
 
static float
simple(fz_scale_filter *filter, float x)
{
if (x >= 1)
return 0;
return 1 + (2*x - 3)*x*x;
}
 
static float
lanczos2(fz_scale_filter *filter, float x)
{
if (x >= 2)
return 0;
return sinf(M_PI*x) * sinf(M_PI*x/2) / (M_PI*x) / (M_PI*x/2);
}
 
static float
lanczos3(fz_scale_filter *filter, float f)
{
if (f >= 3)
return 0;
return sinf(M_PI*f) * sinf(M_PI*f/3) / (M_PI*f) / (M_PI*f/3);
}
 
/*
The Mitchell family of filters is defined:
 
f(x) = 1 { (12-9B-6C)x^3 + (-18+12B+6C)x^2 + (6-2B) for x < 1
- {
6 { (-B-6C)x^3+(6B+30C)x^2+(-12B-48C)x+(8B+24C) for 1<=x<=2
 
The 'best' ones lie along the line B+2C = 1.
The literature suggests that B=1/3, C=1/3 is best.
 
f(x) = 1 { (12-3-2)x^3 - (-18+4+2)x^2 + (16/3) for x < 1
- {
6 { (-7/3)x^3 + 12x^2 - 20x + (32/3) for 1<=x<=2
 
f(x) = 1 { 21x^3 - 36x^2 + 16 for x < 1
- {
18{ -7x^3 + 36x^2 - 60x + 32 for 1<=x<=2
*/
 
static float
mitchell(fz_scale_filter *filter, float x)
{
if (x >= 2)
return 0;
if (x >= 1)
return (32 + x*(-60 + x*(36 - 7*x)))/18;
return (16 + x*x*(-36 + 21*x))/18;
}
 
fz_scale_filter fz_scale_filter_box = { 1, box };
fz_scale_filter fz_scale_filter_triangle = { 1, triangle };
fz_scale_filter fz_scale_filter_simple = { 1, simple };
fz_scale_filter fz_scale_filter_lanczos2 = { 2, lanczos2 };
fz_scale_filter fz_scale_filter_lanczos3 = { 3, lanczos3 };
fz_scale_filter fz_scale_filter_mitchell = { 2, mitchell };
 
/*
We build ourselves a set of tables to contain the precalculated weights
for a given set of scale settings.
 
The first dst_w entries in index are the index into index of the
sets of weight for each destination pixel.
 
Each of the sets of weights is a set of values consisting of:
the minimum source pixel index used for this destination pixel
the number of weights used for this destination pixel
the weights themselves
 
So to calculate dst[i] we do the following:
 
weights = &index[index[i]];
min = *weights++;
len = *weights++;
dst[i] = 0;
while (--len > 0)
dst[i] += src[min++] * *weights++
 
in addition, we guarantee that at the end of this process weights will now
point to the weights value for dst pixel i+1.
 
In the simplest version of this algorithm, we would scale the whole image
horizontally first into a temporary buffer, then scale that temporary
buffer again vertically to give us our result. Using such a simple
algorithm would mean that could use the same style of weights for both
horizontal and vertical scaling.
 
Unfortunately, this would also require a large temporary buffer,
particularly in the case where we are scaling up.
 
We therefore modify the algorithm as follows; we scale scanlines from the
source image horizontally into a temporary buffer, until we have all the
contributors for a given output scanline. We then produce that output
scanline from the temporary buffer. In this way we restrict the height
of the temporary buffer to a small fraction of the final size.
 
Unfortunately, this means that the pseudo code for recombining a
scanline of fully scaled pixels is as follows:
 
weights = &index[index[y]];
min = *weights++;
len = *weights++;
for (x=0 to dst_w)
min2 = min
len2 = len
weights2 = weights
dst[x] = 0;
while (--len2 > 0)
dst[x] += temp[x][(min2++) % tmp_buf_height] * *weights2++
 
i.e. it requires a % operation for every source pixel - this is typically
expensive.
 
To avoid this, we alter the order in which vertical weights are stored,
so that they are ordered in the same order as the temporary buffer lines
would appear. This simplifies the algorithm to:
 
weights = &index[index[y]];
min = *weights++;
len = *weights++;
for (x=0 to dst_w)
min2 = 0
len2 = len
weights2 = weights
dst[x] = 0;
while (--len2 > 0)
dst[x] += temp[i][min2++] * *weights2++
 
This means that len may be larger than it needs to be (due to the
possible inclusion of a zero weight row or two), but in practise this
is only an increase of 1 or 2 at worst.
 
We implement this by generating the weights as normal (but ensuring we
leave enough space) and then reordering afterwards.
 
*/
 
typedef struct fz_weights_s fz_weights;
 
struct fz_weights_s
{
int count;
int max_len;
int n;
int flip;
int new_line;
int index[1];
};
 
static fz_weights *
new_weights(fz_scale_filter *filter, int src_w, float dst_w, int dst_w_i, int n, int flip)
{
int max_len;
fz_weights *weights;
 
if (src_w > dst_w)
{
/* Scaling down, so there will be a maximum of
* 2*filterwidth*src_w/dst_w src pixels
* contributing to each dst pixel. */
max_len = (int)ceilf((2 * filter->width * src_w)/dst_w);
if (max_len > src_w)
max_len = src_w;
}
else
{
/* Scaling up, so there will be a maximum of
* 2*filterwidth src pixels contributing to each dst pixel.
*/
max_len = 2 * filter->width;
}
/* We need the size of the struct,
* plus dst_w*sizeof(int) for the index
* plus (2+max_len)*sizeof(int) for the weights
* plus room for an extra set of weights for reordering.
*/
weights = fz_malloc(sizeof(*weights)+(max_len+3)*(dst_w_i+1)*sizeof(int));
if (weights == NULL)
return NULL;
weights->count = -1;
weights->max_len = max_len;
weights->index[0] = dst_w_i;
weights->n = n;
weights->flip = flip;
return weights;
}
 
static void
init_weights(fz_weights *weights, int j)
{
int index;
 
assert(weights->count == j-1);
weights->count++;
weights->new_line = 1;
if (j == 0)
index = weights->index[0];
else
{
index = weights->index[j-1];
index += 2 + weights->index[index+1];
}
weights->index[j] = index; /* row pointer */
weights->index[index] = 0; /* min */
weights->index[index+1] = 0; /* len */
}
 
static void
add_weight(fz_weights *weights, int j, int i, fz_scale_filter *filter,
float x, float F, float G, int src_w, float dst_w)
{
float dist = j - x + 0.5f - ((i + 0.5f)*dst_w/src_w);
float f;
int min, len, index, weight;
 
dist *= G;
if (dist < 0)
dist = -dist;
f = filter->fn(filter, dist)*F;
weight = (int)(256*f+0.5f);
if (weight == 0)
return;
 
/* wrap i back into range */
#ifdef MIRROR_WRAP
do
{
if (i < 0)
i = -1-i;
else if (i >= src_w)
i = 2*src_w-1-i;
else
break;
}
while (1);
#elif defined(WRAP)
if (i < 0)
i = 0;
else if (i >= src_w)
i = src_w-1;
#else
if (i < 0)
{
i = 0;
weight = 0;
}
else if (i >= src_w)
{
i = src_w-1;
weight = 0;
}
if (weight == 0)
return;
#endif
 
DBUG(("add_weight[%d][%d] = %d(%g) dist=%g\n",j,i,weight,f,dist));
 
if (weights->new_line)
{
/* New line */
weights->new_line = 0;
index = weights->index[j]; /* row pointer */
weights->index[index] = i; /* min */
weights->index[index+1] = 0; /* len */
}
index = weights->index[j];
min = weights->index[index++];
len = weights->index[index++];
while (i < min)
{
/* This only happens in rare cases, but we need to insert
* one earlier. In exceedingly rare cases we may need to
* insert more than one earlier. */
int k;
 
for (k = len; k > 0; k--)
{
weights->index[index+k] = weights->index[index+k-1];
}
weights->index[index] = 0;
min--;
len++;
weights->index[index-2] = min;
weights->index[index-1] = len;
}
if (i-min >= len)
{
/* The usual case */
while (i-min >= ++len)
{
weights->index[index+len-1] = 0;
}
assert(len-1 == i-min);
weights->index[index+i-min] = weight;
weights->index[index-1] = len;
assert(len <= weights->max_len);
}
else
{
/* Infrequent case */
weights->index[index+i-min] += weight;
}
}
 
static void
reorder_weights(fz_weights *weights, int j, int src_w)
{
int idx = weights->index[j];
int min = weights->index[idx++];
int len = weights->index[idx++];
int max = weights->max_len;
int tmp = idx+max;
int i, off;
 
/* Copy into the temporary area */
memcpy(&weights->index[tmp], &weights->index[idx], sizeof(int)*len);
 
/* Pad out if required */
assert(len <= max);
assert(min+len <= src_w);
off = 0;
if (len < max)
{
memset(&weights->index[tmp+len], 0, sizeof(int)*(max-len));
len = max;
if (min + len > src_w)
{
off = min + len - src_w;
min = src_w - len;
weights->index[idx-2] = min;
}
weights->index[idx-1] = len;
}
 
/* Copy back into the proper places */
for (i = 0; i < len; i++)
{
weights->index[idx+((min+i+off) % max)] = weights->index[tmp+i];
}
}
 
/* Due to rounding and edge effects, the sums for the weights sometimes don't
* add up to 256. This causes visible rendering effects. Therefore, we take
* pains to ensure that they 1) never exceed 256, and 2) add up to exactly
* 256 for all pixels that are completely covered. See bug #691629. */
static void
check_weights(fz_weights *weights, int j, int w, float x, float wf)
{
int idx, len;
int sum = 0;
int max = -256;
int maxidx = 0;
int i;
 
idx = weights->index[j];
idx++; /* min */
len = weights->index[idx++];
 
for(i=0; i < len; i++)
{
int v = weights->index[idx++];
sum += v;
if (v > max)
{
max = v;
maxidx = idx;
}
}
/* If we aren't the first or last pixel, OR if the sum is too big
* then adjust it. */
if (((j != 0) && (j != w-1)) || (sum > 256))
weights->index[maxidx-1] += 256-sum;
/* Otherwise, if we are the first pixel, and it's fully covered, then
* adjust it. */
else if ((j == 0) && (x < 0.0001F) && (sum != 256))
weights->index[maxidx-1] += 256-sum;
/* Finally, if we are the last pixel, and it's fully covered, then
* adjust it. */
else if ((j == w-1) && ((float)w-wf < 0.0001F) && (sum != 256))
weights->index[maxidx-1] += 256-sum;
DBUG(("total weight %d = %d\n", j, sum));
}
 
static fz_weights *
make_weights(int src_w, float x, float dst_w, fz_scale_filter *filter, int vertical, int dst_w_int, int n, int flip)
{
fz_weights *weights;
float F, G;
float window;
int j;
 
if (dst_w < src_w)
{
/* Scaling down */
F = dst_w / src_w;
G = 1;
}
else
{
/* Scaling up */
F = 1;
G = src_w / dst_w;
}
window = filter->width / F;
DBUG(("make_weights src_w=%d x=%g dst_w=%g dst_w_int=%d F=%g window=%g\n", src_w, x, dst_w, dst_w_int, F, window));
weights = new_weights(filter, src_w, dst_w, dst_w_int, n, flip);
if (weights == NULL)
return NULL;
for (j = 0; j < dst_w_int; j++)
{
/* find the position of the centre of dst[j] in src space */
float centre = (j - x + 0.5f)*src_w/dst_w - 0.5f;
int l, r;
l = ceilf(centre - window);
r = floorf(centre + window);
DBUG(("%d: centre=%g l=%d r=%d\n", j, centre, l, r));
init_weights(weights, j);
for (; l <= r; l++)
{
add_weight(weights, j, l, filter, x, F, G, src_w, dst_w);
}
check_weights(weights, j, dst_w_int, x, dst_w);
if (vertical)
{
reorder_weights(weights, j, src_w);
}
}
weights->count++; /* weights->count = dst_w_int now */
return weights;
}
 
static void
scale_row_to_temp(int *dst, unsigned char *src, fz_weights *weights)
{
int *contrib = &weights->index[weights->index[0]];
int len, i, j, n;
unsigned char *min;
 
n = weights->n;
if (weights->flip)
{
dst += (weights->count-1)*n;
for (i=weights->count; i > 0; i--)
{
min = &src[n * *contrib++];
len = *contrib++;
for (j = 0; j < n; j++)
dst[j] = 0;
while (len-- > 0)
{
for (j = n; j > 0; j--)
*dst++ += *min++ * *contrib;
dst -= n;
contrib++;
}
dst -= n;
}
}
else
{
for (i=weights->count; i > 0; i--)
{
min = &src[n * *contrib++];
len = *contrib++;
for (j = 0; j < n; j++)
dst[j] = 0;
while (len-- > 0)
{
for (j = n; j > 0; j--)
*dst++ += *min++ * *contrib;
dst -= n;
contrib++;
}
dst += n;
}
}
}
 
static void
scale_row_to_temp1(int *dst, unsigned char *src, fz_weights *weights)
{
int *contrib = &weights->index[weights->index[0]];
int len, i;
unsigned char *min;
 
assert(weights->n == 1);
if (weights->flip)
{
dst += weights->count;
for (i=weights->count; i > 0; i--)
{
int val = 0;
min = &src[*contrib++];
len = *contrib++;
while (len-- > 0)
{
val += *min++ * *contrib++;
}
*--dst = val;
}
}
else
{
for (i=weights->count; i > 0; i--)
{
int val = 0;
min = &src[*contrib++];
len = *contrib++;
while (len-- > 0)
{
val += *min++ * *contrib++;
}
*dst++ = val;
}
}
}
 
static void
scale_row_to_temp2(int *dst, unsigned char *src, fz_weights *weights)
{
int *contrib = &weights->index[weights->index[0]];
int len, i;
unsigned char *min;
 
assert(weights->n == 2);
if (weights->flip)
{
dst += 2*weights->count;
for (i=weights->count; i > 0; i--)
{
int c1 = 0;
int c2 = 0;
min = &src[2 * *contrib++];
len = *contrib++;
while (len-- > 0)
{
c1 += *min++ * *contrib;
c2 += *min++ * *contrib++;
}
*--dst = c2;
*--dst = c1;
}
}
else
{
for (i=weights->count; i > 0; i--)
{
int c1 = 0;
int c2 = 0;
min = &src[2 * *contrib++];
len = *contrib++;
while (len-- > 0)
{
c1 += *min++ * *contrib;
c2 += *min++ * *contrib++;
}
*dst++ = c1;
*dst++ = c2;
}
}
}
 
static void
scale_row_to_temp4(int *dst, unsigned char *src, fz_weights *weights)
{
int *contrib = &weights->index[weights->index[0]];
#ifndef ARCH_ARM
int len, i;
unsigned char *min;
#endif
 
assert(weights->n == 4);
if (weights->flip)
{
dst += 4*weights->count;
#ifdef ARCH_ARM
asm volatile(
"1:"
"ldr r4, [%2], #4 @ r4 = *contrib++ \n"
"ldr r9, [%2], #4 @ r9 = len = *contrib++ \n"
"mov r5, #0 @ r5 = r = 0 \n"
"mov r6, #0 @ r6 = g = 0 \n"
"mov r7, #0 @ r7 = b = 0 \n"
"mov r8, #0 @ r8 = a = 0 \n"
"add r4, %1, r4, LSL #2 @ r4 = min = &src[4*r4] \n"
"cmp r9, #0 @ while (len-- > 0) \n"
"beq 3f @ { \n"
"2: \n"
"ldr r10,[%2], #4 @ r10 = *contrib++ \n"
"ldrb r11,[r4], #1 @ r11 = *min++ \n"
"ldrb r12,[r4], #1 @ r12 = *min++ \n"
"ldrb r14,[r4], #1 @ r14 = *min++ \n"
"mla r5, r10,r11,r5 @ r += r11 * r10 \n"
"ldrb r11,[r4], #1 @ r11 = *min++ \n"
"mla r6, r10,r12,r6 @ g += r12 * r10 \n"
"mla r7, r10,r14,r7 @ b += r14 * r10 \n"
"mla r8, r10,r11,r8 @ a += r11 * r10 \n"
"subs r9, r9, #1 @ r9 = len-- \n"
"bgt 2b @ } \n"
"stmdb %0!,{r5,r6,r7,r8} @ *--dst=a;*--dst=b; \n"
"3: @ *--dst=g;*--dst=r; \n"
"subs %3, %3, #1 @ i-- \n"
"bgt 1b @ \n"
:
:
"r" (dst),
"r" (src),
"r" (contrib),
"r" (weights->count)
:
"r4","r5","r6","r7","r8","r9","r10","r11","r12","r14",
"memory","cc"
);
#else
for (i=weights->count; i > 0; i--)
{
int r = 0;
int g = 0;
int b = 0;
int a = 0;
min = &src[4 * *contrib++];
len = *contrib++;
while (len-- > 0)
{
r += *min++ * *contrib;
g += *min++ * *contrib;
b += *min++ * *contrib;
a += *min++ * *contrib++;
}
*--dst = a;
*--dst = b;
*--dst = g;
*--dst = r;
}
#endif
}
else
{
#ifdef ARCH_ARM
asm volatile(
"1:"
"ldr r4, [%2], #4 @ r4 = *contrib++ \n"
"ldr r9, [%2], #4 @ r9 = len = *contrib++ \n"
"mov r5, #0 @ r5 = r = 0 \n"
"mov r6, #0 @ r6 = g = 0 \n"
"mov r7, #0 @ r7 = b = 0 \n"
"mov r8, #0 @ r8 = a = 0 \n"
"add r4, %1, r4, LSL #2 @ r4 = min = &src[4*r4] \n"
"cmp r9, #0 @ while (len-- > 0) \n"
"beq 3f @ { \n"
"2: \n"
"ldr r10,[%2], #4 @ r10 = *contrib++ \n"
"ldrb r11,[r4], #1 @ r11 = *min++ \n"
"ldrb r12,[r4], #1 @ r12 = *min++ \n"
"ldrb r14,[r4], #1 @ r14 = *min++ \n"
"mla r5, r10,r11,r5 @ r += r11 * r10 \n"
"ldrb r11,[r4], #1 @ r11 = *min++ \n"
"mla r6, r10,r12,r6 @ g += r12 * r10 \n"
"mla r7, r10,r14,r7 @ b += r14 * r10 \n"
"mla r8, r10,r11,r8 @ a += r11 * r10 \n"
"subs r9, r9, #1 @ r9 = len-- \n"
"bgt 2b @ } \n"
"stmia %0!,{r5,r6,r7,r8} @ *dst++=r;*dst++=g; \n"
"3: @ *dst++=b;*dst++=a; \n"
"subs %3, %3, #1 @ i-- \n"
"bgt 1b @ \n"
:
:
"r" (dst),
"r" (src),
"r" (contrib),
"r" (weights->count)
:
"r4","r5","r6","r7","r8","r9","r10","r11","r12","r14",
"memory","cc"
);
#else
for (i=weights->count; i > 0; i--)
{
int r = 0;
int g = 0;
int b = 0;
int a = 0;
min = &src[4 * *contrib++];
len = *contrib++;
while (len-- > 0)
{
r += *min++ * *contrib;
g += *min++ * *contrib;
b += *min++ * *contrib;
a += *min++ * *contrib++;
}
*dst++ = r;
*dst++ = g;
*dst++ = b;
*dst++ = a;
}
#endif
}
}
 
static void
scale_row_from_temp(unsigned char *dst, int *src, fz_weights *weights, int width, int row)
{
int *contrib = &weights->index[weights->index[row]];
int len, x;
 
contrib++; /* Skip min */
len = *contrib++;
for (x=width; x > 0; x--)
{
int *min = src;
int val = 0;
int len2 = len;
int *contrib2 = contrib;
 
while (len2-- > 0)
{
val += *min * *contrib2++;
min += width;
}
val = (val+(1<<15))>>16;
if (val < 0)
val = 0;
else if (val > 255)
val = 255;
*dst++ = val;
src++;
}
}
 
#ifdef SINGLE_PIXEL_SPECIALS
static void
duplicate_single_pixel(unsigned char *dst, unsigned char *src, int n, int w, int h)
{
int i;
 
for (i = n; i > 0; i--)
*dst++ = *src++;
for (i = (w*h-1)*n; i > 0; i--)
{
*dst = dst[-n];
dst++;
}
}
 
static void
scale_single_row(unsigned char *dst, unsigned char *src, fz_weights *weights, int src_w, int h)
{
int *contrib = &weights->index[weights->index[0]];
int min, len, i, j, val, n;
int tmp[FZ_MAX_COLORS];
 
n = weights->n;
/* Scale a single row */
if (weights->flip)
{
dst += (weights->count-1)*n;
for (i=weights->count; i > 0; i--)
{
min = *contrib++;
len = *contrib++;
min *= n;
for (j = 0; j < n; j++)
tmp[j] = 0;
while (len-- > 0)
{
for (j = 0; j < n; j++)
tmp[j] += src[min++] * *contrib;
contrib++;
}
for (j = 0; j < n; j++)
{
val = (tmp[j]+(1<<7))>>8;
if (val < 0)
val = 0;
else if (val > 255)
val = 255;
*dst++ = val;
}
dst -= 2*n;
}
dst += n * (weights->count+1);
}
else
{
for (i=weights->count; i > 0; i--)
{
min = *contrib++;
len = *contrib++;
min *= n;
for (j = 0; j < n; j++)
tmp[j] = 0;
while (len-- > 0)
{
for (j = 0; j < n; j++)
tmp[j] += src[min++] * *contrib;
contrib++;
}
for (j = 0; j < n; j++)
{
val = (tmp[j]+(1<<7))>>8;
if (val < 0)
val = 0;
else if (val > 255)
val = 255;
*dst++ = val;
}
}
}
/* And then duplicate it h times */
n *= weights->count;
while (--h > 0)
{
memcpy(dst, dst-n, n);
dst += n;
}
}
 
static void
scale_single_col(unsigned char *dst, unsigned char *src, fz_weights *weights, int src_w, int n, int w, int flip_y)
{
int *contrib = &weights->index[weights->index[0]];
int min, len, i, j, val;
int tmp[FZ_MAX_COLORS];
 
if (flip_y)
{
src_w = (src_w-1)*n;
w = (w-1)*n;
for (i=weights->count; i > 0; i--)
{
/* Scale the next pixel in the column */
min = *contrib++;
len = *contrib++;
min = src_w-min*n;
for (j = 0; j < n; j++)
tmp[j] = 0;
while (len-- > 0)
{
for (j = 0; j < n; j++)
tmp[j] += src[src_w-min+j] * *contrib;
contrib++;
}
for (j = 0; j < n; j++)
{
val = (tmp[j]+(1<<7))>>8;
if (val < 0)
val = 0;
else if (val > 255)
val = 255;
*dst++ = val;
}
/* And then duplicate it across the row */
for (j = w; j > 0; j--)
{
*dst = dst[-n];
dst++;
}
}
}
else
{
w = (w-1)*n;
for (i=weights->count; i > 0; i--)
{
/* Scale the next pixel in the column */
min = *contrib++;
len = *contrib++;
min *= n;
for (j = 0; j < n; j++)
tmp[j] = 0;
while (len-- > 0)
{
for (j = 0; j < n; j++)
tmp[j] += src[min++] * *contrib;
contrib++;
}
for (j = 0; j < n; j++)
{
val = (tmp[j]+(1<<7))>>8;
if (val < 0)
val = 0;
else if (val > 255)
val = 255;
*dst++ = val;
}
/* And then duplicate it across the row */
for (j = w; j > 0; j--)
{
*dst = dst[-n];
dst++;
}
}
}
}
#endif /* SINGLE_PIXEL_SPECIALS */
 
fz_pixmap *
fz_scale_pixmap_gridfit(fz_pixmap *src, float x, float y, float w, float h, int gridfit)
{
if (gridfit) {
float n;
if (w > 0) {
/* Adjust the left hand edge, leftwards to a pixel boundary */
n = (float)(int)x; /* n is now on a pixel boundary */
if (n > x) /* Ensure it's the pixel boundary BELOW x */
n -= 1.0f;
w += x-n; /* width gets wider as x >= n */
x = n;
/* Adjust the right hand edge rightwards to a pixel boundary */
n = (float)(int)w; /* n is now the integer width <= w */
if (n != w) /* If w isn't an integer already, bump it */
w = 1.0f + n;/* up to the next integer. */
} else {
/* Adjust the right hand edge, rightwards to a pixel boundary */
n = (float)(int)x; /* n is now on a pixel boundary */
if (n > x) /* Ensure it's the pixel boundary <= x */
n -= 1.0f;
if (n != x) /* If x isn't on a pixel boundary already, */
n += 1.0f; /* make n be the pixel boundary above x. */
w -= n-x; /* Expand width (more negative!) as n >= x */
x = n;
/* Adjust the left hand edge leftwards to a pixel boundary */
n = (float)(int)w;
if (n != w)
w = n - 1.0f;
}
if (h > 0) {
/* Adjust the bottom edge, downwards to a pixel boundary */
n = (float)(int)y; /* n is now on a pixel boundary */
if (n > y) /* Ensure it's the pixel boundary BELOW y */
n -= 1.0f;
h += y-n; /* height gets larger as y >= n */
y = n;
/* Adjust the top edge upwards to a pixel boundary */
n = (float)(int)h; /* n is now the integer height <= h */
if (n != h) /* If h isn't an integer already, bump it */
h = 1.0f + n;/* up to the next integer. */
} else {
/* Adjust the top edge, upwards to a pixel boundary */
n = (float)(int)y; /* n is now on a pixel boundary */
if (n > y) /* Ensure it's the pixel boundary <= y */
n -= 1.0f;
if (n != y) /* If y isn't on a pixel boundary already, */
n += 1.0f; /* make n be the pixel boundary above y. */
h -= n-y; /* Expand height (more negative!) as n >= y */
y = n;
/* Adjust the bottom edge downwards to a pixel boundary */
n = (float)(int)h;
if (n != h)
h = n - 1.0f;
}
}
return fz_scale_pixmap(src, x, y, w, h);
}
 
fz_pixmap *
fz_scale_pixmap(fz_pixmap *src, float x, float y, float w, float h)
{
fz_scale_filter *filter = &fz_scale_filter_simple;
fz_weights *contrib_rows = NULL;
fz_weights *contrib_cols = NULL;
fz_pixmap *output = NULL;
int *temp = NULL;
int max_row, temp_span, temp_rows, row;
int dst_w_int, dst_h_int, dst_x_int, dst_y_int;
int flip_x, flip_y;
 
DBUG(("Scale: (%d,%d) to (%g,%g) at (%g,%g)\n",src->w,src->h,w,h,x,y));
 
/* Find the destination bbox, width/height, and sub pixel offset,
* allowing for whether we're flipping or not. */
/* Note that the x and y sub pixel offsets here are different.
* The (x,y) position given describes where the bottom left corner
* of the source image should be mapped to (i.e. where (0,h) in image
* space ends up, not the more logical and sane (0,0)). Also there
* are differences in the way we scale horizontally and vertically.
* When scaling rows horizontally, we always read forwards through
* the source, and store either forwards or in reverse as required.
* When scaling vertically, we always store out forwards, but may
* feed source rows in in a different order.
*
* Consider the image rectange 'r' to which the image is mapped,
* and the (possibly) larger rectangle 'R', given by expanding 'r' to
* complete pixels.
*
* x can either be r.xmin-R.xmin or R.xmax-r.xmax depending on whether
* the image is x flipped or not. Whatever happens 0 <= x < 1.
* y is always R.ymax - r.ymax.
*/
/* dst_x_int is calculated to be the left of the scaled image, and
* x (the sub_pixel_offset) is the distance in from either the left
* or right pixel expanded edge. */
flip_x = (w < 0);
if (flip_x)
{
float tmp;
w = -w;
dst_x_int = floor(x-w);
tmp = ceilf(x);
dst_w_int = (int)tmp;
x = tmp - x;
dst_w_int -= dst_x_int;
}
else
{
dst_x_int = floor(x);
x -= (float)dst_x_int;
dst_w_int = (int)ceilf(x + w);
}
flip_y = (h < 0);
/* dst_y_int is calculated to be the bottom of the scaled image, but
* y (the sub pixel offset) has to end up being the value at the top.
*/
if (flip_y)
{
h = -h;
dst_y_int = floor(y-h);
dst_h_int = (int)ceilf(y) - dst_y_int;
} else {
dst_y_int = floor(y);
y += h;
dst_h_int = (int)ceilf(y) - dst_y_int;
}
/* y is the top edge position in floats. We want it to be the
* distance down from the next pixel boundary. */
y = ceilf(y) - y;
 
DBUG(("Result image: (%d,%d) at (%d,%d) (subpix=%g,%g)\n", dst_w_int, dst_h_int, dst_x_int, dst_y_int, x, y));
 
/* Step 1: Calculate the weights for columns and rows */
#ifdef SINGLE_PIXEL_SPECIALS
if (src->w == 1)
{
contrib_cols = NULL;
}
else
#endif /* SINGLE_PIXEL_SPECIALS */
{
contrib_cols = make_weights(src->w, x, w, filter, 0, dst_w_int, src->n, flip_x);
if (contrib_cols == NULL)
goto cleanup;
}
#ifdef SINGLE_PIXEL_SPECIALS
if (src->h == 1)
{
contrib_rows = NULL;
}
else
#endif /* SINGLE_PIXEL_SPECIALS */
{
contrib_rows = make_weights(src->h, y, h, filter, 1, dst_h_int, src->n, flip_y);
if (contrib_rows == NULL)
goto cleanup;
}
 
assert(contrib_cols == NULL || contrib_cols->count == dst_w_int);
assert(contrib_rows == NULL || contrib_rows->count == dst_h_int);
output = fz_new_pixmap(src->colorspace, dst_w_int, dst_h_int);
output->x = dst_x_int;
output->y = dst_y_int;
 
/* Step 2: Apply the weights */
#ifdef SINGLE_PIXEL_SPECIALS
if (contrib_rows == NULL)
{
/* Only 1 source pixel high. */
if (contrib_cols == NULL)
{
/* Only 1 pixel in the entire image! */
duplicate_single_pixel(output->samples, src->samples, src->n, dst_w_int, dst_h_int);
}
else
{
/* Scale the row once, then copy it. */
scale_single_row(output->samples, src->samples, contrib_cols, src->w, dst_h_int);
}
}
else if (contrib_cols == NULL)
{
/* Only 1 source pixel wide. Scale the col and duplicate. */
scale_single_col(output->samples, src->samples, contrib_rows, src->h, src->n, dst_w_int, flip_y);
}
else
#endif /* SINGLE_PIXEL_SPECIALS */
{
void (*row_scale)(int *dst, unsigned char *src, fz_weights *weights);
 
temp_span = contrib_cols->count * src->n;
temp_rows = contrib_rows->max_len;
if (temp_span <= 0 || temp_rows > INT_MAX / temp_span)
goto cleanup;
temp = fz_calloc(temp_span*temp_rows, sizeof(int));
if (temp == NULL)
goto cleanup;
switch (src->n)
{
default:
row_scale = scale_row_to_temp;
break;
case 1: /* Image mask case */
row_scale = scale_row_to_temp1;
break;
case 2: /* Greyscale with alpha case */
row_scale = scale_row_to_temp2;
break;
case 4: /* RGBA */
row_scale = scale_row_to_temp4;
break;
}
max_row = 0;
for (row = 0; row < contrib_rows->count; row++)
{
/*
Which source rows do we need to have scaled into the
temporary buffer in order to be able to do the final
scale?
*/
int row_index = contrib_rows->index[row];
int row_min = contrib_rows->index[row_index++];
int row_len = contrib_rows->index[row_index++];
while (max_row < row_min+row_len)
{
/* Scale another row */
assert(max_row < src->h);
DBUG(("scaling row %d to temp\n", max_row));
(*row_scale)(&temp[temp_span*(max_row % temp_rows)], &src->samples[(flip_y ? (src->h-1-max_row): max_row)*src->w*src->n], contrib_cols);
max_row++;
}
 
DBUG(("scaling row %d from temp\n", row));
scale_row_from_temp(&output->samples[row*output->w*output->n], temp, contrib_rows, temp_span, row);
}
fz_free(temp);
}
 
cleanup:
fz_free(contrib_rows);
fz_free(contrib_cols);
return output;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/draw/draw_unpack.c
0,0 → 1,235
#include "fitz.h"
 
/* Unpack image samples and optionally pad pixels with opaque alpha */
 
#define get1(buf,x) ((buf[x >> 3] >> ( 7 - (x & 7) ) ) & 1 )
#define get2(buf,x) ((buf[x >> 2] >> ( ( 3 - (x & 3) ) << 1 ) ) & 3 )
#define get4(buf,x) ((buf[x >> 1] >> ( ( 1 - (x & 1) ) << 2 ) ) & 15 )
#define get8(buf,x) (buf[x])
#define get16(buf,x) (buf[x << 1])
 
static unsigned char get1_tab_1[256][8];
static unsigned char get1_tab_1p[256][16];
static unsigned char get1_tab_255[256][8];
static unsigned char get1_tab_255p[256][16];
 
static void
init_get1_tables(void)
{
static int once = 0;
unsigned char bits[1];
int i, k, x;
 
/* TODO: mutex lock here */
 
if (once)
return;
 
for (i = 0; i < 256; i++)
{
bits[0] = i;
for (k = 0; k < 8; k++)
{
x = get1(bits, k);
 
get1_tab_1[i][k] = x;
get1_tab_1p[i][k * 2] = x;
get1_tab_1p[i][k * 2 + 1] = 255;
 
get1_tab_255[i][k] = x * 255;
get1_tab_255p[i][k * 2] = x * 255;
get1_tab_255p[i][k * 2 + 1] = 255;
}
}
 
once = 1;
}
 
void
fz_unpack_tile(fz_pixmap *dst, unsigned char * restrict src, int n, int depth, int stride, int scale)
{
int pad, x, y, k;
int w = dst->w;
 
pad = 0;
if (dst->n > n)
pad = 255;
 
if (depth == 1)
init_get1_tables();
 
if (scale == 0)
{
switch (depth)
{
case 1: scale = 255; break;
case 2: scale = 85; break;
case 4: scale = 17; break;
}
}
 
for (y = 0; y < dst->h; y++)
{
unsigned char *sp = src + y * stride;
unsigned char *dp = dst->samples + y * (dst->w * dst->n);
 
/* Specialized loops */
 
if (n == 1 && depth == 1 && scale == 1 && !pad)
{
int w3 = w >> 3;
for (x = 0; x < w3; x++)
{
memcpy(dp, get1_tab_1[*sp++], 8);
dp += 8;
}
x = x << 3;
if (x < w)
memcpy(dp, get1_tab_1[*sp], w - x);
}
 
else if (n == 1 && depth == 1 && scale == 255 && !pad)
{
int w3 = w >> 3;
for (x = 0; x < w3; x++)
{
memcpy(dp, get1_tab_255[*sp++], 8);
dp += 8;
}
x = x << 3;
if (x < w)
memcpy(dp, get1_tab_255[*sp], w - x);
}
 
else if (n == 1 && depth == 1 && scale == 1 && pad)
{
int w3 = w >> 3;
for (x = 0; x < w3; x++)
{
memcpy(dp, get1_tab_1p[*sp++], 16);
dp += 16;
}
x = x << 3;
if (x < w)
memcpy(dp, get1_tab_1p[*sp], (w - x) << 1);
}
 
else if (n == 1 && depth == 1 && scale == 255 && pad)
{
int w3 = w >> 3;
for (x = 0; x < w3; x++)
{
memcpy(dp, get1_tab_255p[*sp++], 16);
dp += 16;
}
x = x << 3;
if (x < w)
memcpy(dp, get1_tab_255p[*sp], (w - x) << 1);
}
 
else if (depth == 8 && !pad)
{
int len = w * n;
while (len--)
*dp++ = *sp++;
}
 
else if (depth == 8 && pad)
{
for (x = 0; x < w; x++)
{
for (k = 0; k < n; k++)
*dp++ = *sp++;
*dp++ = 255;
}
}
 
else
{
int b = 0;
for (x = 0; x < w; x++)
{
for (k = 0; k < n; k++)
{
switch (depth)
{
case 1: *dp++ = get1(sp, b) * scale; break;
case 2: *dp++ = get2(sp, b) * scale; break;
case 4: *dp++ = get4(sp, b) * scale; break;
case 8: *dp++ = get8(sp, b); break;
case 16: *dp++ = get16(sp, b); break;
}
b++;
}
if (pad)
*dp++ = 255;
}
}
}
}
 
/* Apply decode array */
 
void
fz_decode_indexed_tile(fz_pixmap *pix, float *decode, int maxval)
{
int add[FZ_MAX_COLORS];
int mul[FZ_MAX_COLORS];
unsigned char *p = pix->samples;
int len = pix->w * pix->h;
int n = pix->n - 1;
int needed;
int k;
 
needed = 0;
for (k = 0; k < n; k++)
{
int min = decode[k * 2] * 256;
int max = decode[k * 2 + 1] * 256;
add[k] = min;
mul[k] = (max - min) / maxval;
needed |= min != 0 || max != maxval * 256;
}
 
if (!needed)
return;
 
while (len--)
{
for (k = 0; k < n; k++)
p[k] = (add[k] + (((p[k] << 8) * mul[k]) >> 8)) >> 8;
p += n + 1;
}
}
 
void
fz_decode_tile(fz_pixmap *pix, float *decode)
{
int add[FZ_MAX_COLORS];
int mul[FZ_MAX_COLORS];
unsigned char *p = pix->samples;
int len = pix->w * pix->h;
int n = MAX(1, pix->n - 1);
int needed;
int k;
 
needed = 0;
for (k = 0; k < n; k++)
{
int min = decode[k * 2] * 255;
int max = decode[k * 2 + 1] * 255;
add[k] = min;
mul[k] = max - min;
needed |= min != 0 || max != 255;
}
 
if (!needed)
return;
 
while (len--)
{
for (k = 0; k < n; k++)
p[k] = add[k] + fz_mul255(p[k], mul[k]);
p += pix->n;
}
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/Makefile
0,0 → 1,19
CC = kos32-gcc
LD = kos32-ld
 
SDK_DIR = $(abspath ../../../sdk)
 
CFLAGS = -c -fno-ident -O2 -fomit-frame-pointer -fno-ident -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32
 
INCLUDES = -I $(SDK_DIR)/sources/newlib/libc/include -I $(SDK_DIR)/sources/freetype/include -I /media/maxim/E22406D62406AE1B/SVNKOS/contrib/sdk/sources/zlib -I ../libopenjpeg -I ../include
 
FITZ_SRC := $(notdir $(wildcard *.c))
OBJECTS = $(patsubst %.c, %.o, $(FITZ_SRC))
 
default: $(patsubst %.c,%.o,$(FITZ_SRC))
ar rcs libfitz.a *.o
rm *.o
mv libfitz.a ../lib
 
%.o : %.c Makefile $(FITZ_SRC)
$(CC) $(CFLAGS) $(INCLUDES) -o $@ $<
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/base_error.c
0,0 → 1,159
#include "fitz.h"
 
enum { LINE_LEN = 160, LINE_COUNT = 25 };
 
static char warn_message[LINE_LEN] = "";
static int warn_count = 0;
 
void fz_flush_warnings(void)
{
if (warn_count > 1)
fprintf(stderr, "warning: ... repeated %d times ...\n", warn_count);
warn_message[0] = 0;
warn_count = 0;
}
 
void fz_warn(char *fmt, ...)
{
va_list ap;
char buf[LINE_LEN];
 
va_start(ap, fmt);
vsnprintf(buf, sizeof buf, fmt, ap);
va_end(ap);
 
if (!strcmp(buf, warn_message))
{
warn_count++;
}
else
{
fz_flush_warnings();
fprintf(stderr, "warning: %s\n", buf);
fz_strlcpy(warn_message, buf, sizeof warn_message);
warn_count = 1;
}
}
 
static char error_message[LINE_COUNT][LINE_LEN];
static int error_count = 0;
 
static void
fz_emit_error(char what, char *location, char *message)
{
fz_flush_warnings();
 
fprintf(stderr, "%c %s%s\n", what, location, message);
 
if (error_count < LINE_COUNT)
{
fz_strlcpy(error_message[error_count], location, LINE_LEN);
fz_strlcat(error_message[error_count], message, LINE_LEN);
error_count++;
}
}
 
int
fz_get_error_count(void)
{
return error_count;
}
 
char *
fz_get_error_line(int n)
{
return error_message[n];
}
 
fz_error
fz_throw_imp(const char *file, int line, const char *func, char *fmt, ...)
{
va_list ap;
char one[LINE_LEN], two[LINE_LEN];
 
error_count = 0;
 
snprintf(one, sizeof one, "%s:%d: %s(): ", file, line, func);
va_start(ap, fmt);
vsnprintf(two, sizeof two, fmt, ap);
va_end(ap);
 
fz_emit_error('+', one, two);
 
return -1;
}
 
fz_error
fz_rethrow_imp(const char *file, int line, const char *func, fz_error cause, char *fmt, ...)
{
va_list ap;
char one[LINE_LEN], two[LINE_LEN];
 
snprintf(one, sizeof one, "%s:%d: %s(): ", file, line, func);
va_start(ap, fmt);
vsnprintf(two, sizeof two, fmt, ap);
va_end(ap);
 
fz_emit_error('|', one, two);
 
return cause;
}
 
void
fz_catch_imp(const char *file, int line, const char *func, fz_error cause, char *fmt, ...)
{
va_list ap;
char one[LINE_LEN], two[LINE_LEN];
 
snprintf(one, sizeof one, "%s:%d: %s(): ", file, line, func);
va_start(ap, fmt);
vsnprintf(two, sizeof two, fmt, ap);
va_end(ap);
 
fz_emit_error('\\', one, two);
}
 
fz_error
fz_throw_impx(char *fmt, ...)
{
va_list ap;
char buf[LINE_LEN];
 
error_count = 0;
 
va_start(ap, fmt);
vsnprintf(buf, sizeof buf, fmt, ap);
va_end(ap);
 
fz_emit_error('+', "", buf);
 
return -1;
}
 
fz_error
fz_rethrow_impx(fz_error cause, char *fmt, ...)
{
va_list ap;
char buf[LINE_LEN];
 
va_start(ap, fmt);
vsnprintf(buf, sizeof buf, fmt, ap);
va_end(ap);
 
fz_emit_error('|', "", buf);
 
return cause;
}
 
void
fz_catch_impx(fz_error cause, char *fmt, ...)
{
va_list ap;
char buf[LINE_LEN];
 
va_start(ap, fmt);
vsnprintf(buf, sizeof buf, fmt, ap);
va_end(ap);
 
fz_emit_error('\\', "", buf);
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/base_geometry.c
0,0 → 1,268
#include "fitz.h"
 
#define MAX4(a,b,c,d) MAX(MAX(a,b), MAX(c,d))
#define MIN4(a,b,c,d) MIN(MIN(a,b), MIN(c,d))
 
/* Matrices, points and affine transformations */
 
const fz_matrix fz_identity = { 1, 0, 0, 1, 0, 0 };
 
fz_matrix
fz_concat(fz_matrix one, fz_matrix two)
{
fz_matrix dst;
dst.a = one.a * two.a + one.b * two.c;
dst.b = one.a * two.b + one.b * two.d;
dst.c = one.c * two.a + one.d * two.c;
dst.d = one.c * two.b + one.d * two.d;
dst.e = one.e * two.a + one.f * two.c + two.e;
dst.f = one.e * two.b + one.f * two.d + two.f;
return dst;
}
 
fz_matrix
fz_scale(float sx, float sy)
{
fz_matrix m;
m.a = sx; m.b = 0;
m.c = 0; m.d = sy;
m.e = 0; m.f = 0;
return m;
}
 
fz_matrix
fz_shear(float h, float v)
{
fz_matrix m;
m.a = 1; m.b = v;
m.c = h; m.d = 1;
m.e = 0; m.f = 0;
return m;
}
 
fz_matrix
fz_rotate(float theta)
{
fz_matrix m;
float s;
float c;
 
while (theta < 0)
theta += 360;
while (theta >= 360)
theta -= 360;
 
if (fabsf(0 - theta) < FLT_EPSILON)
{
s = 0;
c = 1;
}
else if (fabsf(90.0f - theta) < FLT_EPSILON)
{
s = 1;
c = 0;
}
else if (fabsf(180.0f - theta) < FLT_EPSILON)
{
s = 0;
c = -1;
}
else if (fabsf(270.0f - theta) < FLT_EPSILON)
{
s = -1;
c = 0;
}
else
{
s = sinf(theta * (float)M_PI / 180);
c = cosf(theta * (float)M_PI / 180);
}
 
m.a = c; m.b = s;
m.c = -s; m.d = c;
m.e = 0; m.f = 0;
return m;
}
 
fz_matrix
fz_translate(float tx, float ty)
{
fz_matrix m;
m.a = 1; m.b = 0;
m.c = 0; m.d = 1;
m.e = tx; m.f = ty;
return m;
}
 
fz_matrix
fz_invert_matrix(fz_matrix src)
{
fz_matrix dst;
float rdet = 1 / (src.a * src.d - src.b * src.c);
dst.a = src.d * rdet;
dst.b = -src.b * rdet;
dst.c = -src.c * rdet;
dst.d = src.a * rdet;
dst.e = -src.e * dst.a - src.f * dst.c;
dst.f = -src.e * dst.b - src.f * dst.d;
return dst;
}
 
int
fz_is_rectilinear(fz_matrix m)
{
return (fabsf(m.b) < FLT_EPSILON && fabsf(m.c) < FLT_EPSILON) ||
(fabsf(m.a) < FLT_EPSILON && fabsf(m.d) < FLT_EPSILON);
}
 
float
fz_matrix_expansion(fz_matrix m)
{
return sqrtf(fabsf(m.a * m.d - m.b * m.c));
}
 
fz_point
fz_transform_point(fz_matrix m, fz_point p)
{
fz_point t;
t.x = p.x * m.a + p.y * m.c + m.e;
t.y = p.x * m.b + p.y * m.d + m.f;
return t;
}
 
fz_point
fz_transform_vector(fz_matrix m, fz_point p)
{
fz_point t;
t.x = p.x * m.a + p.y * m.c;
t.y = p.x * m.b + p.y * m.d;
return t;
}
 
/* Rectangles and bounding boxes */
 
const fz_rect fz_infinite_rect = { 1, 1, -1, -1 };
const fz_rect fz_empty_rect = { 0, 0, 0, 0 };
const fz_rect fz_unit_rect = { 0, 0, 1, 1 };
 
const fz_bbox fz_infinite_bbox = { 1, 1, -1, -1 };
const fz_bbox fz_empty_bbox = { 0, 0, 0, 0 };
const fz_bbox fz_unit_bbox = { 0, 0, 1, 1 };
 
fz_bbox
fz_round_rect(fz_rect f)
{
fz_bbox i;
i.x0 = floorf(f.x0 + 0.001f); /* adjust by 0.001 to compensate for precision errors */
i.y0 = floorf(f.y0 + 0.001f);
i.x1 = ceilf(f.x1 - 0.001f);
i.y1 = ceilf(f.y1 - 0.001f);
return i;
}
 
fz_rect
fz_intersect_rect(fz_rect a, fz_rect b)
{
fz_rect r;
if (fz_is_infinite_rect(a)) return b;
if (fz_is_infinite_rect(b)) return a;
if (fz_is_empty_rect(a)) return fz_empty_rect;
if (fz_is_empty_rect(b)) return fz_empty_rect;
r.x0 = MAX(a.x0, b.x0);
r.y0 = MAX(a.y0, b.y0);
r.x1 = MIN(a.x1, b.x1);
r.y1 = MIN(a.y1, b.y1);
return (r.x1 < r.x0 || r.y1 < r.y0) ? fz_empty_rect : r;
}
 
fz_rect
fz_union_rect(fz_rect a, fz_rect b)
{
fz_rect r;
if (fz_is_infinite_rect(a)) return a;
if (fz_is_infinite_rect(b)) return b;
if (fz_is_empty_rect(a)) return b;
if (fz_is_empty_rect(b)) return a;
r.x0 = MIN(a.x0, b.x0);
r.y0 = MIN(a.y0, b.y0);
r.x1 = MAX(a.x1, b.x1);
r.y1 = MAX(a.y1, b.y1);
return r;
}
 
fz_bbox
fz_intersect_bbox(fz_bbox a, fz_bbox b)
{
fz_bbox r;
if (fz_is_infinite_rect(a)) return b;
if (fz_is_infinite_rect(b)) return a;
if (fz_is_empty_rect(a)) return fz_empty_bbox;
if (fz_is_empty_rect(b)) return fz_empty_bbox;
r.x0 = MAX(a.x0, b.x0);
r.y0 = MAX(a.y0, b.y0);
r.x1 = MIN(a.x1, b.x1);
r.y1 = MIN(a.y1, b.y1);
return (r.x1 < r.x0 || r.y1 < r.y0) ? fz_empty_bbox : r;
}
 
fz_bbox
fz_union_bbox(fz_bbox a, fz_bbox b)
{
fz_bbox r;
if (fz_is_infinite_rect(a)) return a;
if (fz_is_infinite_rect(b)) return b;
if (fz_is_empty_rect(a)) return b;
if (fz_is_empty_rect(b)) return a;
r.x0 = MIN(a.x0, b.x0);
r.y0 = MIN(a.y0, b.y0);
r.x1 = MAX(a.x1, b.x1);
r.y1 = MAX(a.y1, b.y1);
return r;
}
 
fz_rect
fz_transform_rect(fz_matrix m, fz_rect r)
{
fz_point s, t, u, v;
 
if (fz_is_infinite_rect(r))
return r;
 
s.x = r.x0; s.y = r.y0;
t.x = r.x0; t.y = r.y1;
u.x = r.x1; u.y = r.y1;
v.x = r.x1; v.y = r.y0;
s = fz_transform_point(m, s);
t = fz_transform_point(m, t);
u = fz_transform_point(m, u);
v = fz_transform_point(m, v);
r.x0 = MIN4(s.x, t.x, u.x, v.x);
r.y0 = MIN4(s.y, t.y, u.y, v.y);
r.x1 = MAX4(s.x, t.x, u.x, v.x);
r.y1 = MAX4(s.y, t.y, u.y, v.y);
return r;
}
 
fz_bbox
fz_transform_bbox(fz_matrix m, fz_bbox b)
{
fz_point s, t, u, v;
 
if (fz_is_infinite_bbox(b))
return b;
 
s.x = b.x0; s.y = b.y0;
t.x = b.x0; t.y = b.y1;
u.x = b.x1; u.y = b.y1;
v.x = b.x1; v.y = b.y0;
s = fz_transform_point(m, s);
t = fz_transform_point(m, t);
u = fz_transform_point(m, u);
v = fz_transform_point(m, v);
b.x0 = MIN4(s.x, t.x, u.x, v.x);
b.y0 = MIN4(s.y, t.y, u.y, v.y);
b.x1 = MAX4(s.x, t.x, u.x, v.x);
b.y1 = MAX4(s.y, t.y, u.y, v.y);
return b;
 
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/base_getopt.c
0,0 → 1,66
/*
* This is a version of the public domain getopt implementation by
* Henry Spencer originally posted to net.sources.
*
* This file is in the public domain.
*/
 
#include <stdio.h>
#include <string.h>
 
#define getopt fz_getopt
#define optarg fz_optarg
#define optind fz_optind
 
char *optarg; /* Global argument pointer. */
int optind = 0; /* Global argv index. */
 
static char *scan = NULL; /* Private scan pointer. */
 
int
getopt(int argc, char *argv[], char *optstring)
{
char c;
char *place;
 
optarg = NULL;
 
if (scan == NULL || *scan == '\0') {
if (optind == 0)
optind++;
 
if (optind >= argc || argv[optind][0] != '-' || argv[optind][1] == '\0')
return EOF;
if (argv[optind][1] == '-' && argv[optind][2] == '\0') {
optind++;
return EOF;
}
 
scan = argv[optind]+1;
optind++;
}
 
c = *scan++;
place = strchr(optstring, c);
 
if (place == NULL || c == ':') {
fprintf(stderr, "%s: unknown option -%c\n", argv[0], c);
return '?';
}
 
place++;
if (*place == ':') {
if (*scan != '\0') {
optarg = scan;
scan = NULL;
} else if( optind < argc ) {
optarg = argv[optind];
optind++;
} else {
fprintf(stderr, "%s: option requires argument -%c\n", argv[0], c);
return ':';
}
}
 
return c;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/base_hash.c
0,0 → 1,241
#include "fitz.h"
 
/*
Simple hashtable with open adressing linear probe.
Unlike text book examples, removing entries works
correctly in this implementation, so it wont start
exhibiting bad behaviour if entries are inserted
and removed frequently.
*/
 
enum { MAX_KEY_LEN = 48 };
typedef struct fz_hash_entry_s fz_hash_entry;
 
struct fz_hash_entry_s
{
unsigned char key[MAX_KEY_LEN];
void *val;
};
 
struct fz_hash_table_s
{
int keylen;
int size;
int load;
fz_hash_entry *ents;
};
 
static unsigned hash(unsigned char *s, int len)
{
unsigned val = 0;
int i;
for (i = 0; i < len; i++)
{
val += s[i];
val += (val << 10);
val ^= (val >> 6);
}
val += (val << 3);
val ^= (val >> 11);
val += (val << 15);
return val;
}
 
fz_hash_table *
fz_new_hash_table(int initialsize, int keylen)
{
fz_hash_table *table;
 
assert(keylen <= MAX_KEY_LEN);
 
table = fz_malloc(sizeof(fz_hash_table));
table->keylen = keylen;
table->size = initialsize;
table->load = 0;
table->ents = fz_calloc(table->size, sizeof(fz_hash_entry));
memset(table->ents, 0, sizeof(fz_hash_entry) * table->size);
 
return table;
}
 
void
fz_empty_hash(fz_hash_table *table)
{
table->load = 0;
memset(table->ents, 0, sizeof(fz_hash_entry) * table->size);
}
 
int
fz_hash_len(fz_hash_table *table)
{
return table->size;
}
 
void *
fz_hash_get_key(fz_hash_table *table, int idx)
{
return table->ents[idx].key;
}
 
void *
fz_hash_get_val(fz_hash_table *table, int idx)
{
return table->ents[idx].val;
}
 
void
fz_free_hash(fz_hash_table *table)
{
fz_free(table->ents);
fz_free(table);
}
 
static void
fz_resize_hash(fz_hash_table *table, int newsize)
{
fz_hash_entry *oldents = table->ents;
int oldsize = table->size;
int oldload = table->load;
int i;
 
if (newsize < oldload * 8 / 10)
{
fz_throw("assert: resize hash too small");
return;
}
 
table->ents = fz_calloc(newsize, sizeof(fz_hash_entry));
memset(table->ents, 0, sizeof(fz_hash_entry) * newsize);
table->size = newsize;
table->load = 0;
 
for (i = 0; i < oldsize; i++)
{
if (oldents[i].val)
{
fz_hash_insert(table, oldents[i].key, oldents[i].val);
}
}
 
fz_free(oldents);
}
 
void *
fz_hash_find(fz_hash_table *table, void *key)
{
fz_hash_entry *ents = table->ents;
unsigned size = table->size;
unsigned pos = hash(key, table->keylen) % size;
 
while (1)
{
if (!ents[pos].val)
return NULL;
 
if (memcmp(key, ents[pos].key, table->keylen) == 0)
return ents[pos].val;
 
pos = (pos + 1) % size;
}
}
 
void
fz_hash_insert(fz_hash_table *table, void *key, void *val)
{
fz_hash_entry *ents;
unsigned size;
unsigned pos;
 
if (table->load > table->size * 8 / 10)
{
fz_resize_hash(table, table->size * 2);
}
 
ents = table->ents;
size = table->size;
pos = hash(key, table->keylen) % size;
 
while (1)
{
if (!ents[pos].val)
{
memcpy(ents[pos].key, key, table->keylen);
ents[pos].val = val;
table->load ++;
return;
}
 
if (memcmp(key, ents[pos].key, table->keylen) == 0)
fz_warn("assert: overwrite hash slot");
 
pos = (pos + 1) % size;
}
}
 
void
fz_hash_remove(fz_hash_table *table, void *key)
{
fz_hash_entry *ents = table->ents;
unsigned size = table->size;
unsigned pos = hash(key, table->keylen) % size;
unsigned hole, look, code;
 
while (1)
{
if (!ents[pos].val)
{
fz_warn("assert: remove inexistant hash entry");
return;
}
 
if (memcmp(key, ents[pos].key, table->keylen) == 0)
{
ents[pos].val = NULL;
 
hole = pos;
look = (hole + 1) % size;
 
while (ents[look].val)
{
code = hash(ents[look].key, table->keylen) % size;
if ((code <= hole && hole < look) ||
(look < code && code <= hole) ||
(hole < look && look < code))
{
ents[hole] = ents[look];
ents[look].val = NULL;
hole = look;
}
 
look = (look + 1) % size;
}
 
table->load --;
 
return;
}
 
pos = (pos + 1) % size;
}
}
 
void
fz_debug_hash(fz_hash_table *table)
{
int i, k;
 
printf("cache load %d / %d\n", table->load, table->size);
 
for (i = 0; i < table->size; i++)
{
if (!table->ents[i].val)
printf("table % 4d: empty\n", i);
else
{
printf("table % 4d: key=", i);
for (k = 0; k < MAX_KEY_LEN; k++)
printf("%02x", ((char*)table->ents[i].key)[k]);
printf(" val=$%p\n", table->ents[i].val);
}
}
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/base_memory.c
0,0 → 1,77
#include "fitz.h"
 
void *
fz_malloc(int size)
{
void *p = malloc(size);
if (!p)
{
fprintf(stderr, "fatal error: out of memory\n");
abort();
}
return p;
}
 
void *
fz_calloc(int count, int size)
{
void *p;
 
if (count == 0 || size == 0)
return 0;
 
if (count < 0 || size < 0 || count > INT_MAX / size)
{
fprintf(stderr, "fatal error: out of memory (integer overflow)\n");
abort();
}
 
p = malloc(count * size);
if (!p)
{
fprintf(stderr, "fatal error: out of memory\n");
abort();
}
return p;
}
 
void *
fz_realloc(void *p, int count, int size)
{
void *np;
 
if (count == 0 || size == 0)
{
fz_free(p);
return 0;
}
 
if (count < 0 || size < 0 || count > INT_MAX / size)
{
fprintf(stderr, "fatal error: out of memory (integer overflow)\n");
abort();
}
 
np = realloc(p, count * size);
if (np == NULL)
{
fprintf(stderr, "fatal error: out of memory\n");
abort();
}
return np;
}
 
void
fz_free(void *p)
{
free(p);
}
 
char *
fz_strdup(char *s)
{
int len = strlen(s) + 1;
char *ns = fz_malloc(len);
memcpy(ns, s, len);
return ns;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/base_object.c
0,0 → 1,802
#include "fitz.h"
 
typedef enum fz_objkind_e
{
FZ_NULL,
FZ_BOOL,
FZ_INT,
FZ_REAL,
FZ_STRING,
FZ_NAME,
FZ_ARRAY,
FZ_DICT,
FZ_INDIRECT
} fz_objkind;
 
struct keyval
{
fz_obj *k;
fz_obj *v;
};
 
struct fz_obj_s
{
int refs;
fz_objkind kind;
union
{
int b;
int i;
float f;
struct {
unsigned short len;
char buf[1];
} s;
char n[1];
struct {
int len;
int cap;
fz_obj **items;
} a;
struct {
char sorted;
int len;
int cap;
struct keyval *items;
} d;
struct {
int num;
int gen;
struct pdf_xref_s *xref;
} r;
} u;
};
 
static fz_obj *fz_resolve_indirect_null(fz_obj *ref)
{
return ref;
}
 
fz_obj* (*fz_resolve_indirect)(fz_obj*) = fz_resolve_indirect_null;
 
fz_obj *
fz_new_null(void)
{
fz_obj *obj = fz_malloc(sizeof(fz_obj));
obj->refs = 1;
obj->kind = FZ_NULL;
return obj;
}
 
fz_obj *
fz_new_bool(int b)
{
fz_obj *obj = fz_malloc(sizeof(fz_obj));
obj->refs = 1;
obj->kind = FZ_BOOL;
obj->u.b = b;
return obj;
}
 
fz_obj *
fz_new_int(int i)
{
fz_obj *obj = fz_malloc(sizeof(fz_obj));
obj->refs = 1;
obj->kind = FZ_INT;
obj->u.i = i;
return obj;
}
 
fz_obj *
fz_new_real(float f)
{
fz_obj *obj = fz_malloc(sizeof(fz_obj));
obj->refs = 1;
obj->kind = FZ_REAL;
obj->u.f = f;
return obj;
}
 
fz_obj *
fz_new_string(char *str, int len)
{
fz_obj *obj = fz_malloc(offsetof(fz_obj, u.s.buf) + len + 1);
obj->refs = 1;
obj->kind = FZ_STRING;
obj->u.s.len = len;
memcpy(obj->u.s.buf, str, len);
obj->u.s.buf[len] = '\0';
return obj;
}
 
fz_obj *
fz_new_name(char *str)
{
fz_obj *obj = fz_malloc(offsetof(fz_obj, u.n) + strlen(str) + 1);
obj->refs = 1;
obj->kind = FZ_NAME;
strcpy(obj->u.n, str);
return obj;
}
 
fz_obj *
fz_new_indirect(int num, int gen, void *xref)
{
fz_obj *obj = fz_malloc(sizeof(fz_obj));
obj->refs = 1;
obj->kind = FZ_INDIRECT;
obj->u.r.num = num;
obj->u.r.gen = gen;
obj->u.r.xref = xref;
return obj;
}
 
fz_obj *
fz_keep_obj(fz_obj *obj)
{
assert(obj != NULL);
obj->refs ++;
return obj;
}
 
int fz_is_indirect(fz_obj *obj)
{
return obj ? obj->kind == FZ_INDIRECT : 0;
}
 
int fz_is_null(fz_obj *obj)
{
obj = fz_resolve_indirect(obj);
return obj ? obj->kind == FZ_NULL : 0;
}
 
int fz_is_bool(fz_obj *obj)
{
obj = fz_resolve_indirect(obj);
return obj ? obj->kind == FZ_BOOL : 0;
}
 
int fz_is_int(fz_obj *obj)
{
obj = fz_resolve_indirect(obj);
return obj ? obj->kind == FZ_INT : 0;
}
 
int fz_is_real(fz_obj *obj)
{
obj = fz_resolve_indirect(obj);
return obj ? obj->kind == FZ_REAL : 0;
}
 
int fz_is_string(fz_obj *obj)
{
obj = fz_resolve_indirect(obj);
return obj ? obj->kind == FZ_STRING : 0;
}
 
int fz_is_name(fz_obj *obj)
{
obj = fz_resolve_indirect(obj);
return obj ? obj->kind == FZ_NAME : 0;
}
 
int fz_is_array(fz_obj *obj)
{
obj = fz_resolve_indirect(obj);
return obj ? obj->kind == FZ_ARRAY : 0;
}
 
int fz_is_dict(fz_obj *obj)
{
obj = fz_resolve_indirect(obj);
return obj ? obj->kind == FZ_DICT : 0;
}
 
int fz_to_bool(fz_obj *obj)
{
obj = fz_resolve_indirect(obj);
if (fz_is_bool(obj))
return obj->u.b;
return 0;
}
 
int fz_to_int(fz_obj *obj)
{
obj = fz_resolve_indirect(obj);
if (fz_is_int(obj))
return obj->u.i;
if (fz_is_real(obj))
return obj->u.f;
return 0;
}
 
float fz_to_real(fz_obj *obj)
{
obj = fz_resolve_indirect(obj);
if (fz_is_real(obj))
return obj->u.f;
if (fz_is_int(obj))
return obj->u.i;
return 0;
}
 
char *fz_to_name(fz_obj *obj)
{
obj = fz_resolve_indirect(obj);
if (fz_is_name(obj))
return obj->u.n;
return "";
}
 
char *fz_to_str_buf(fz_obj *obj)
{
obj = fz_resolve_indirect(obj);
if (fz_is_string(obj))
return obj->u.s.buf;
return "";
}
 
int fz_to_str_len(fz_obj *obj)
{
obj = fz_resolve_indirect(obj);
if (fz_is_string(obj))
return obj->u.s.len;
return 0;
}
 
/* for use by pdf_crypt_obj_imp to decrypt AES string in place */
void fz_set_str_len(fz_obj *obj, int newlen)
{
obj = fz_resolve_indirect(obj);
if (fz_is_string(obj))
if (newlen < obj->u.s.len)
obj->u.s.len = newlen;
}
 
int fz_to_num(fz_obj *obj)
{
if (fz_is_indirect(obj))
return obj->u.r.num;
return 0;
}
 
int fz_to_gen(fz_obj *obj)
{
if (fz_is_indirect(obj))
return obj->u.r.gen;
return 0;
}
 
void *fz_get_indirect_xref(fz_obj *obj)
{
if (fz_is_indirect(obj))
return obj->u.r.xref;
return NULL;
}
 
int
fz_objcmp(fz_obj *a, fz_obj *b)
{
int i;
 
if (a == b)
return 0;
 
if (!a || !b)
return 1;
 
if (a->kind != b->kind)
return 1;
 
switch (a->kind)
{
case FZ_NULL:
return 0;
 
case FZ_BOOL:
return a->u.b - b->u.b;
 
case FZ_INT:
return a->u.i - b->u.i;
 
case FZ_REAL:
if (a->u.f < b->u.f)
return -1;
if (a->u.f > b->u.f)
return 1;
return 0;
 
case FZ_STRING:
if (a->u.s.len < b->u.s.len)
{
if (memcmp(a->u.s.buf, b->u.s.buf, a->u.s.len) <= 0)
return -1;
return 1;
}
if (a->u.s.len > b->u.s.len)
{
if (memcmp(a->u.s.buf, b->u.s.buf, b->u.s.len) >= 0)
return 1;
return -1;
}
return memcmp(a->u.s.buf, b->u.s.buf, a->u.s.len);
 
case FZ_NAME:
return strcmp(a->u.n, b->u.n);
 
case FZ_INDIRECT:
if (a->u.r.num == b->u.r.num)
return a->u.r.gen - b->u.r.gen;
return a->u.r.num - b->u.r.num;
 
case FZ_ARRAY:
if (a->u.a.len != b->u.a.len)
return a->u.a.len - b->u.a.len;
for (i = 0; i < a->u.a.len; i++)
if (fz_objcmp(a->u.a.items[i], b->u.a.items[i]))
return 1;
return 0;
 
case FZ_DICT:
if (a->u.d.len != b->u.d.len)
return a->u.d.len - b->u.d.len;
for (i = 0; i < a->u.d.len; i++)
{
if (fz_objcmp(a->u.d.items[i].k, b->u.d.items[i].k))
return 1;
if (fz_objcmp(a->u.d.items[i].v, b->u.d.items[i].v))
return 1;
}
return 0;
 
}
return 1;
}
 
static char *
fz_objkindstr(fz_obj *obj)
{
if (obj == NULL)
return "<NULL>";
switch (obj->kind)
{
case FZ_NULL: return "null";
case FZ_BOOL: return "boolean";
case FZ_INT: return "integer";
case FZ_REAL: return "real";
case FZ_STRING: return "string";
case FZ_NAME: return "name";
case FZ_ARRAY: return "array";
case FZ_DICT: return "dictionary";
case FZ_INDIRECT: return "reference";
}
return "<unknown>";
}
 
fz_obj *
fz_new_array(int initialcap)
{
fz_obj *obj;
int i;
 
obj = fz_malloc(sizeof(fz_obj));
obj->refs = 1;
obj->kind = FZ_ARRAY;
 
obj->u.a.len = 0;
obj->u.a.cap = initialcap > 1 ? initialcap : 6;
 
obj->u.a.items = fz_calloc(obj->u.a.cap, sizeof(fz_obj*));
for (i = 0; i < obj->u.a.cap; i++)
obj->u.a.items[i] = NULL;
 
return obj;
}
 
fz_obj *
fz_copy_array(fz_obj *obj)
{
fz_obj *new;
int i;
 
if (fz_is_indirect(obj) || !fz_is_array(obj))
fz_warn("assert: not an array (%s)", fz_objkindstr(obj));
 
new = fz_new_array(fz_array_len(obj));
for (i = 0; i < fz_array_len(obj); i++)
fz_array_push(new, fz_array_get(obj, i));
 
return new;
}
 
int
fz_array_len(fz_obj *obj)
{
obj = fz_resolve_indirect(obj);
if (!fz_is_array(obj))
return 0;
return obj->u.a.len;
}
 
fz_obj *
fz_array_get(fz_obj *obj, int i)
{
obj = fz_resolve_indirect(obj);
 
if (!fz_is_array(obj))
return NULL;
 
if (i < 0 || i >= obj->u.a.len)
return NULL;
 
return obj->u.a.items[i];
}
 
void
fz_array_put(fz_obj *obj, int i, fz_obj *item)
{
obj = fz_resolve_indirect(obj);
 
if (!fz_is_array(obj))
fz_warn("assert: not an array (%s)", fz_objkindstr(obj));
else if (i < 0)
fz_warn("assert: index %d < 0", i);
else if (i >= obj->u.a.len)
fz_warn("assert: index %d > length %d", i, obj->u.a.len);
else
{
if (obj->u.a.items[i])
fz_drop_obj(obj->u.a.items[i]);
obj->u.a.items[i] = fz_keep_obj(item);
}
}
 
void
fz_array_push(fz_obj *obj, fz_obj *item)
{
obj = fz_resolve_indirect(obj);
 
if (!fz_is_array(obj))
fz_warn("assert: not an array (%s)", fz_objkindstr(obj));
else
{
if (obj->u.a.len + 1 > obj->u.a.cap)
{
int i;
obj->u.a.cap = (obj->u.a.cap * 3) / 2;
obj->u.a.items = fz_realloc(obj->u.a.items, obj->u.a.cap, sizeof(fz_obj*));
for (i = obj->u.a.len ; i < obj->u.a.cap; i++)
obj->u.a.items[i] = NULL;
}
obj->u.a.items[obj->u.a.len] = fz_keep_obj(item);
obj->u.a.len++;
}
}
 
void
fz_array_insert(fz_obj *obj, fz_obj *item)
{
obj = fz_resolve_indirect(obj);
 
if (!fz_is_array(obj))
fz_warn("assert: not an array (%s)", fz_objkindstr(obj));
else
{
if (obj->u.a.len + 1 > obj->u.a.cap)
{
int i;
obj->u.a.cap = (obj->u.a.cap * 3) / 2;
obj->u.a.items = fz_realloc(obj->u.a.items, obj->u.a.cap, sizeof(fz_obj*));
for (i = obj->u.a.len ; i < obj->u.a.cap; i++)
obj->u.a.items[i] = NULL;
}
memmove(obj->u.a.items + 1, obj->u.a.items, obj->u.a.len * sizeof(fz_obj*));
obj->u.a.items[0] = fz_keep_obj(item);
obj->u.a.len++;
}
}
 
/* dicts may only have names as keys! */
 
static int keyvalcmp(const void *ap, const void *bp)
{
const struct keyval *a = ap;
const struct keyval *b = bp;
return strcmp(fz_to_name(a->k), fz_to_name(b->k));
}
 
fz_obj *
fz_new_dict(int initialcap)
{
fz_obj *obj;
int i;
 
obj = fz_malloc(sizeof(fz_obj));
obj->refs = 1;
obj->kind = FZ_DICT;
 
obj->u.d.sorted = 1;
obj->u.d.len = 0;
obj->u.d.cap = initialcap > 1 ? initialcap : 10;
 
obj->u.d.items = fz_calloc(obj->u.d.cap, sizeof(struct keyval));
for (i = 0; i < obj->u.d.cap; i++)
{
obj->u.d.items[i].k = NULL;
obj->u.d.items[i].v = NULL;
}
 
return obj;
}
 
fz_obj *
fz_copy_dict(fz_obj *obj)
{
fz_obj *new;
int i;
 
if (fz_is_indirect(obj) || !fz_is_dict(obj))
fz_throw("assert: not a dict (%s)", fz_objkindstr(obj));
 
new = fz_new_dict(fz_dict_len(obj));
for (i = 0; i < fz_dict_len(obj); i++)
fz_dict_put(new, fz_dict_get_key(obj, i), fz_dict_get_val(obj, i));
 
return new;
}
 
int
fz_dict_len(fz_obj *obj)
{
obj = fz_resolve_indirect(obj);
if (!fz_is_dict(obj))
return 0;
return obj->u.d.len;
}
 
fz_obj *
fz_dict_get_key(fz_obj *obj, int i)
{
obj = fz_resolve_indirect(obj);
 
if (!fz_is_dict(obj))
return NULL;
 
if (i < 0 || i >= obj->u.d.len)
return NULL;
 
return obj->u.d.items[i].k;
}
 
fz_obj *
fz_dict_get_val(fz_obj *obj, int i)
{
obj = fz_resolve_indirect(obj);
 
if (!fz_is_dict(obj))
return NULL;
 
if (i < 0 || i >= obj->u.d.len)
return NULL;
 
return obj->u.d.items[i].v;
}
 
static int
fz_dict_finds(fz_obj *obj, char *key)
{
if (obj->u.d.sorted)
{
int l = 0;
int r = obj->u.d.len - 1;
while (l <= r)
{
int m = (l + r) >> 1;
int c = -strcmp(fz_to_name(obj->u.d.items[m].k), key);
if (c < 0)
r = m - 1;
else if (c > 0)
l = m + 1;
else
return m;
}
}
 
else
{
int i;
for (i = 0; i < obj->u.d.len; i++)
if (strcmp(fz_to_name(obj->u.d.items[i].k), key) == 0)
return i;
}
 
return -1;
}
 
fz_obj *
fz_dict_gets(fz_obj *obj, char *key)
{
int i;
 
obj = fz_resolve_indirect(obj);
 
if (!fz_is_dict(obj))
return NULL;
 
i = fz_dict_finds(obj, key);
if (i >= 0)
return obj->u.d.items[i].v;
 
return NULL;
}
 
fz_obj *
fz_dict_get(fz_obj *obj, fz_obj *key)
{
if (fz_is_name(key))
return fz_dict_gets(obj, fz_to_name(key));
return NULL;
}
 
fz_obj *
fz_dict_getsa(fz_obj *obj, char *key, char *abbrev)
{
fz_obj *v;
v = fz_dict_gets(obj, key);
if (v)
return v;
return fz_dict_gets(obj, abbrev);
}
 
void
fz_dict_put(fz_obj *obj, fz_obj *key, fz_obj *val)
{
char *s;
int i;
 
obj = fz_resolve_indirect(obj);
 
if (!fz_is_dict(obj))
{
fz_warn("assert: not a dict (%s)", fz_objkindstr(obj));
return;
}
 
if (fz_is_name(key))
s = fz_to_name(key);
else
{
fz_warn("assert: key is not a name (%s)", fz_objkindstr(obj));
return;
}
 
if (!val)
{
fz_warn("assert: val does not exist for key (%s)", s);
return;
}
 
i = fz_dict_finds(obj, s);
if (i >= 0)
{
fz_drop_obj(obj->u.d.items[i].v);
obj->u.d.items[i].v = fz_keep_obj(val);
return;
}
 
if (obj->u.d.len + 1 > obj->u.d.cap)
{
obj->u.d.cap = (obj->u.d.cap * 3) / 2;
obj->u.d.items = fz_realloc(obj->u.d.items, obj->u.d.cap, sizeof(struct keyval));
for (i = obj->u.d.len; i < obj->u.d.cap; i++)
{
obj->u.d.items[i].k = NULL;
obj->u.d.items[i].v = NULL;
}
}
 
/* borked! */
if (obj->u.d.len)
if (strcmp(fz_to_name(obj->u.d.items[obj->u.d.len - 1].k), s) > 0)
obj->u.d.sorted = 0;
 
obj->u.d.items[obj->u.d.len].k = fz_keep_obj(key);
obj->u.d.items[obj->u.d.len].v = fz_keep_obj(val);
obj->u.d.len ++;
}
 
void
fz_dict_puts(fz_obj *obj, char *key, fz_obj *val)
{
fz_obj *keyobj = fz_new_name(key);
fz_dict_put(obj, keyobj, val);
fz_drop_obj(keyobj);
}
 
void
fz_dict_dels(fz_obj *obj, char *key)
{
obj = fz_resolve_indirect(obj);
 
if (!fz_is_dict(obj))
fz_warn("assert: not a dict (%s)", fz_objkindstr(obj));
else
{
int i = fz_dict_finds(obj, key);
if (i >= 0)
{
fz_drop_obj(obj->u.d.items[i].k);
fz_drop_obj(obj->u.d.items[i].v);
obj->u.d.sorted = 0;
obj->u.d.items[i] = obj->u.d.items[obj->u.d.len-1];
obj->u.d.len --;
}
}
}
 
void
fz_dict_del(fz_obj *obj, fz_obj *key)
{
if (fz_is_name(key))
fz_dict_dels(obj, fz_to_name(key));
else
fz_warn("assert: key is not a name (%s)", fz_objkindstr(obj));
}
 
void
fz_sort_dict(fz_obj *obj)
{
obj = fz_resolve_indirect(obj);
if (!fz_is_dict(obj))
return;
if (!obj->u.d.sorted)
{
qsort(obj->u.d.items, obj->u.d.len, sizeof(struct keyval), keyvalcmp);
obj->u.d.sorted = 1;
}
}
 
static void
fz_free_array(fz_obj *obj)
{
int i;
 
for (i = 0; i < obj->u.a.len; i++)
if (obj->u.a.items[i])
fz_drop_obj(obj->u.a.items[i]);
 
fz_free(obj->u.a.items);
fz_free(obj);
}
 
static void
fz_free_dict(fz_obj *obj)
{
int i;
 
for (i = 0; i < obj->u.d.len; i++) {
if (obj->u.d.items[i].k)
fz_drop_obj(obj->u.d.items[i].k);
if (obj->u.d.items[i].v)
fz_drop_obj(obj->u.d.items[i].v);
}
 
fz_free(obj->u.d.items);
fz_free(obj);
}
 
void
fz_drop_obj(fz_obj *obj)
{
assert(obj != NULL);
if (--obj->refs == 0)
{
if (obj->kind == FZ_ARRAY)
fz_free_array(obj);
else if (obj->kind == FZ_DICT)
fz_free_dict(obj);
else
fz_free(obj);
}
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/base_string.c
0,0 → 1,265
#include "fitz.h"
 
int
fz_is_big_endian(void)
{
static const int one = 1;
return *(char*)&one == 0;
}
 
char *
fz_strsep(char **stringp, const char *delim)
{
char *ret = *stringp;
if (ret == NULL) return NULL;
if ((*stringp = strpbrk(*stringp, delim)) != NULL)
*((*stringp)++) = '\0';
return ret;
}
 
int
fz_strlcpy(char *dst, const char *src, int siz)
{
register char *d = dst;
register const char *s = src;
register int n = siz;
 
/* Copy as many bytes as will fit */
if (n != 0 && --n != 0) {
do {
if ((*d++ = *s++) == 0)
break;
} while (--n != 0);
}
 
/* Not enough room in dst, add NUL and traverse rest of src */
if (n == 0) {
if (siz != 0)
*d = '\0'; /* NUL-terminate dst */
while (*s++)
;
}
 
return(s - src - 1); /* count does not include NUL */
}
 
int
fz_strlcat(char *dst, const char *src, int siz)
{
register char *d = dst;
register const char *s = src;
register int n = siz;
int dlen;
 
/* Find the end of dst and adjust bytes left but don't go past end */
while (*d != '\0' && n-- != 0)
d++;
dlen = d - dst;
n = siz - dlen;
 
if (n == 0)
return dlen + strlen(s);
while (*s != '\0') {
if (n != 1) {
*d++ = *s;
n--;
}
s++;
}
*d = '\0';
 
return dlen + (s - src); /* count does not include NUL */
}
 
enum
{
UTFmax = 4, /* maximum bytes per rune */
Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */
Runeself = 0x80, /* rune and UTF sequences are the same (<) */
Runeerror = 0xFFFD, /* decoding error in UTF */
Runemax = 0x10FFFF, /* maximum rune value */
};
 
enum
{
Bit1 = 7,
Bitx = 6,
Bit2 = 5,
Bit3 = 4,
Bit4 = 3,
Bit5 = 2,
 
T1 = ((1<<(Bit1+1))-1) ^ 0xFF, /* 0000 0000 */
Tx = ((1<<(Bitx+1))-1) ^ 0xFF, /* 1000 0000 */
T2 = ((1<<(Bit2+1))-1) ^ 0xFF, /* 1100 0000 */
T3 = ((1<<(Bit3+1))-1) ^ 0xFF, /* 1110 0000 */
T4 = ((1<<(Bit4+1))-1) ^ 0xFF, /* 1111 0000 */
T5 = ((1<<(Bit5+1))-1) ^ 0xFF, /* 1111 1000 */
 
Rune1 = (1<<(Bit1+0*Bitx))-1, /* 0000 0000 0111 1111 */
Rune2 = (1<<(Bit2+1*Bitx))-1, /* 0000 0111 1111 1111 */
Rune3 = (1<<(Bit3+2*Bitx))-1, /* 1111 1111 1111 1111 */
Rune4 = (1<<(Bit4+3*Bitx))-1, /* 0001 1111 1111 1111 1111 1111 */
 
Maskx = (1<<Bitx)-1, /* 0011 1111 */
Testx = Maskx ^ 0xFF, /* 1100 0000 */
 
Bad = Runeerror,
};
 
int
chartorune(int *rune, char *str)
{
int c, c1, c2, c3;
long l;
 
/*
* one character sequence
* 00000-0007F => T1
*/
c = *(unsigned char*)str;
if(c < Tx) {
*rune = c;
return 1;
}
 
/*
* two character sequence
* 0080-07FF => T2 Tx
*/
c1 = *(unsigned char*)(str+1) ^ Tx;
if(c1 & Testx)
goto bad;
if(c < T3) {
if(c < T2)
goto bad;
l = ((c << Bitx) | c1) & Rune2;
if(l <= Rune1)
goto bad;
*rune = l;
return 2;
}
 
/*
* three character sequence
* 0800-FFFF => T3 Tx Tx
*/
c2 = *(unsigned char*)(str+2) ^ Tx;
if(c2 & Testx)
goto bad;
if(c < T4) {
l = ((((c << Bitx) | c1) << Bitx) | c2) & Rune3;
if(l <= Rune2)
goto bad;
*rune = l;
return 3;
}
 
/*
* four character sequence (21-bit value)
* 10000-1FFFFF => T4 Tx Tx Tx
*/
c3 = *(unsigned char*)(str+3) ^ Tx;
if (c3 & Testx)
goto bad;
if (c < T5) {
l = ((((((c << Bitx) | c1) << Bitx) | c2) << Bitx) | c3) & Rune4;
if (l <= Rune3)
goto bad;
*rune = l;
return 4;
}
/*
* Support for 5-byte or longer UTF-8 would go here, but
* since we don't have that, we'll just fall through to bad.
*/
 
/*
* bad decoding
*/
bad:
*rune = Bad;
return 1;
}
 
int
runetochar(char *str, int *rune)
{
/* Runes are signed, so convert to unsigned for range check. */
unsigned long c;
 
/*
* one character sequence
* 00000-0007F => 00-7F
*/
c = *rune;
if(c <= Rune1) {
str[0] = c;
return 1;
}
 
/*
* two character sequence
* 0080-07FF => T2 Tx
*/
if(c <= Rune2) {
str[0] = T2 | (c >> 1*Bitx);
str[1] = Tx | (c & Maskx);
return 2;
}
 
/*
* If the Rune is out of range, convert it to the error rune.
* Do this test here because the error rune encodes to three bytes.
* Doing it earlier would duplicate work, since an out of range
* Rune wouldn't have fit in one or two bytes.
*/
if (c > Runemax)
c = Runeerror;
 
/*
* three character sequence
* 0800-FFFF => T3 Tx Tx
*/
if (c <= Rune3) {
str[0] = T3 | (c >> 2*Bitx);
str[1] = Tx | ((c >> 1*Bitx) & Maskx);
str[2] = Tx | (c & Maskx);
return 3;
}
 
/*
* four character sequence (21-bit value)
* 10000-1FFFFF => T4 Tx Tx Tx
*/
str[0] = T4 | (c >> 3*Bitx);
str[1] = Tx | ((c >> 2*Bitx) & Maskx);
str[2] = Tx | ((c >> 1*Bitx) & Maskx);
str[3] = Tx | (c & Maskx);
return 4;
}
 
int
runelen(int c)
{
char str[10];
return runetochar(str, &c);
}
 
float fz_atof(const char *s)
{
double d;
 
/* The errno voodoo here checks for us reading numbers that are too
* big to fit into a double. The checks for FLT_MAX ensure that we
* don't read a number that's OK as a double and then become invalid
* as we convert to a float. */
errno = 0;
d = strtod(s, NULL);
if (errno == ERANGE || d > FLT_MAX || d < -FLT_MAX) {
/* Return 1.0, as it's a small known value that won't cause a
* divide by 0. */
return 1.0;
}
return (float)d;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/base_time.c
0,0 → 1,42
#ifdef _WIN32
 
#include <time.h>
#include <winsock2.h>
#include <windows.h>
 
#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
#define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64
#else
#define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL
#endif
 
struct timeval;
 
int gettimeofday(struct timeval *tv, struct timezone *tz)
{
FILETIME ft;
unsigned __int64 tmpres = 0;
 
if (tv)
{
GetSystemTimeAsFileTime(&ft);
 
tmpres |= ft.dwHighDateTime;
tmpres <<= 32;
tmpres |= ft.dwLowDateTime;
 
tmpres /= 10; /*convert into microseconds*/
/*converting file time to unix epoch*/
tmpres -= DELTA_EPOCH_IN_MICROSECS;
tv->tv_sec = (long)(tmpres / 1000000UL);
tv->tv_usec = (long)(tmpres % 1000000UL);
}
 
return 0;
}
 
#else
 
void fz_gettimeofday_dummy() { }
 
#endif
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/crypt_aes.c
0,0 → 1,565
/*
* FIPS-197 compliant AES implementation
*
* Copyright (C) 2006-2007 Christophe Devine
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code _must_ retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form may or may not reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* * Neither the name of XySSL nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* The AES block cipher was designed by Vincent Rijmen and Joan Daemen.
*
* http://csrc.nist.gov/encryption/aes/rijndael/Rijndael.pdf
* http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
*/
 
#include "fitz.h"
 
#define aes_context fz_aes
 
/* AES block cipher implementation from XYSSL */
 
/*
* 32-bit integer manipulation macros (little endian)
*/
#ifndef GET_ULONG_LE
#define GET_ULONG_LE(n,b,i) \
{ \
(n) = ( (unsigned long) (b)[(i)] ) \
| ( (unsigned long) (b)[(i) + 1] << 8 ) \
| ( (unsigned long) (b)[(i) + 2] << 16 ) \
| ( (unsigned long) (b)[(i) + 3] << 24 ); \
}
#endif
 
#ifndef PUT_ULONG_LE
#define PUT_ULONG_LE(n,b,i) \
{ \
(b)[(i) ] = (unsigned char) ( (n) ); \
(b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \
(b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \
(b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \
}
#endif
 
/*
* Forward S-box & tables
*/
static unsigned char FSb[256];
static unsigned long FT0[256];
static unsigned long FT1[256];
static unsigned long FT2[256];
static unsigned long FT3[256];
 
/*
* Reverse S-box & tables
*/
static unsigned char RSb[256];
static unsigned long RT0[256];
static unsigned long RT1[256];
static unsigned long RT2[256];
static unsigned long RT3[256];
 
/*
* Round constants
*/
static unsigned long RCON[10];
 
/*
* Tables generation code
*/
#define ROTL8(x) ( ( x << 8 ) & 0xFFFFFFFF ) | ( x >> 24 )
#define XTIME(x) ( ( x << 1 ) ^ ( ( x & 0x80 ) ? 0x1B : 0x00 ) )
#define MUL(x,y) ( ( x && y ) ? pow[(log[x]+log[y]) % 255] : 0 )
 
static int aes_init_done = 0;
 
static void aes_gen_tables( void )
{
int i, x, y, z;
int pow[256];
int log[256];
 
/*
* compute pow and log tables over GF(2^8)
*/
for( i = 0, x = 1; i < 256; i++ )
{
pow[i] = x;
log[x] = i;
x = ( x ^ XTIME( x ) ) & 0xFF;
}
 
/*
* calculate the round constants
*/
for( i = 0, x = 1; i < 10; i++ )
{
RCON[i] = (unsigned long) x;
x = XTIME( x ) & 0xFF;
}
 
/*
* generate the forward and reverse S-boxes
*/
FSb[0x00] = 0x63;
RSb[0x63] = 0x00;
 
for( i = 1; i < 256; i++ )
{
x = pow[255 - log[i]];
 
y = x; y = ( (y << 1) | (y >> 7) ) & 0xFF;
x ^= y; y = ( (y << 1) | (y >> 7) ) & 0xFF;
x ^= y; y = ( (y << 1) | (y >> 7) ) & 0xFF;
x ^= y; y = ( (y << 1) | (y >> 7) ) & 0xFF;
x ^= y ^ 0x63;
 
FSb[i] = (unsigned char) x;
RSb[x] = (unsigned char) i;
}
 
/*
* generate the forward and reverse tables
*/
for( i = 0; i < 256; i++ )
{
x = FSb[i];
y = XTIME( x ) & 0xFF;
z = ( y ^ x ) & 0xFF;
 
FT0[i] = ( (unsigned long) y ) ^
( (unsigned long) x << 8 ) ^
( (unsigned long) x << 16 ) ^
( (unsigned long) z << 24 );
 
FT1[i] = ROTL8( FT0[i] );
FT2[i] = ROTL8( FT1[i] );
FT3[i] = ROTL8( FT2[i] );
 
x = RSb[i];
 
RT0[i] = ( (unsigned long) MUL( 0x0E, x ) ) ^
( (unsigned long) MUL( 0x09, x ) << 8 ) ^
( (unsigned long) MUL( 0x0D, x ) << 16 ) ^
( (unsigned long) MUL( 0x0B, x ) << 24 );
 
RT1[i] = ROTL8( RT0[i] );
RT2[i] = ROTL8( RT1[i] );
RT3[i] = ROTL8( RT2[i] );
}
}
 
/*
* AES key schedule (encryption)
*/
void aes_setkey_enc( aes_context *ctx, const unsigned char *key, int keysize )
{
int i;
unsigned long *RK;
 
#if !defined(XYSSL_AES_ROM_TABLES)
if( aes_init_done == 0 )
{
aes_gen_tables();
aes_init_done = 1;
}
#endif
 
switch( keysize )
{
case 128: ctx->nr = 10; break;
case 192: ctx->nr = 12; break;
case 256: ctx->nr = 14; break;
default : return;
}
 
#if defined(PADLOCK_ALIGN16)
ctx->rk = RK = PADLOCK_ALIGN16( ctx->buf );
#else
ctx->rk = RK = ctx->buf;
#endif
 
for( i = 0; i < (keysize >> 5); i++ )
{
GET_ULONG_LE( RK[i], key, i << 2 );
}
 
switch( ctx->nr )
{
case 10:
 
for( i = 0; i < 10; i++, RK += 4 )
{
RK[4] = RK[0] ^ RCON[i] ^
( FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^
( FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^
( FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^
( FSb[ ( RK[3] ) & 0xFF ] << 24 );
 
RK[5] = RK[1] ^ RK[4];
RK[6] = RK[2] ^ RK[5];
RK[7] = RK[3] ^ RK[6];
}
break;
 
case 12:
 
for( i = 0; i < 8; i++, RK += 6 )
{
RK[6] = RK[0] ^ RCON[i] ^
( FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^
( FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^
( FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^
( FSb[ ( RK[5] ) & 0xFF ] << 24 );
 
RK[7] = RK[1] ^ RK[6];
RK[8] = RK[2] ^ RK[7];
RK[9] = RK[3] ^ RK[8];
RK[10] = RK[4] ^ RK[9];
RK[11] = RK[5] ^ RK[10];
}
break;
 
case 14:
 
for( i = 0; i < 7; i++, RK += 8 )
{
RK[8] = RK[0] ^ RCON[i] ^
( FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^
( FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^
( FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^
( FSb[ ( RK[7] ) & 0xFF ] << 24 );
 
RK[9] = RK[1] ^ RK[8];
RK[10] = RK[2] ^ RK[9];
RK[11] = RK[3] ^ RK[10];
 
RK[12] = RK[4] ^
( FSb[ ( RK[11] ) & 0xFF ] ) ^
( FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^
( FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^
( FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 );
 
RK[13] = RK[5] ^ RK[12];
RK[14] = RK[6] ^ RK[13];
RK[15] = RK[7] ^ RK[14];
}
break;
 
default:
 
break;
}
}
 
/*
* AES key schedule (decryption)
*/
void aes_setkey_dec( aes_context *ctx, const unsigned char *key, int keysize )
{
int i, j;
aes_context cty;
unsigned long *RK;
unsigned long *SK;
 
switch( keysize )
{
case 128: ctx->nr = 10; break;
case 192: ctx->nr = 12; break;
case 256: ctx->nr = 14; break;
default : return;
}
 
#if defined(PADLOCK_ALIGN16)
ctx->rk = RK = PADLOCK_ALIGN16( ctx->buf );
#else
ctx->rk = RK = ctx->buf;
#endif
 
aes_setkey_enc( &cty, key, keysize );
SK = cty.rk + cty.nr * 4;
 
*RK++ = *SK++;
*RK++ = *SK++;
*RK++ = *SK++;
*RK++ = *SK++;
 
for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 )
{
for( j = 0; j < 4; j++, SK++ )
{
*RK++ = RT0[ FSb[ ( *SK ) & 0xFF ] ] ^
RT1[ FSb[ ( *SK >> 8 ) & 0xFF ] ] ^
RT2[ FSb[ ( *SK >> 16 ) & 0xFF ] ] ^
RT3[ FSb[ ( *SK >> 24 ) & 0xFF ] ];
}
}
 
*RK++ = *SK++;
*RK++ = *SK++;
*RK++ = *SK++;
*RK++ = *SK++;
 
memset( &cty, 0, sizeof( aes_context ) );
}
 
#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
{ \
X0 = *RK++ ^ FT0[ ( Y0 ) & 0xFF ] ^ \
FT1[ ( Y1 >> 8 ) & 0xFF ] ^ \
FT2[ ( Y2 >> 16 ) & 0xFF ] ^ \
FT3[ ( Y3 >> 24 ) & 0xFF ]; \
\
X1 = *RK++ ^ FT0[ ( Y1 ) & 0xFF ] ^ \
FT1[ ( Y2 >> 8 ) & 0xFF ] ^ \
FT2[ ( Y3 >> 16 ) & 0xFF ] ^ \
FT3[ ( Y0 >> 24 ) & 0xFF ]; \
\
X2 = *RK++ ^ FT0[ ( Y2 ) & 0xFF ] ^ \
FT1[ ( Y3 >> 8 ) & 0xFF ] ^ \
FT2[ ( Y0 >> 16 ) & 0xFF ] ^ \
FT3[ ( Y1 >> 24 ) & 0xFF ]; \
\
X3 = *RK++ ^ FT0[ ( Y3 ) & 0xFF ] ^ \
FT1[ ( Y0 >> 8 ) & 0xFF ] ^ \
FT2[ ( Y1 >> 16 ) & 0xFF ] ^ \
FT3[ ( Y2 >> 24 ) & 0xFF ]; \
}
 
#define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
{ \
X0 = *RK++ ^ RT0[ ( Y0 ) & 0xFF ] ^ \
RT1[ ( Y3 >> 8 ) & 0xFF ] ^ \
RT2[ ( Y2 >> 16 ) & 0xFF ] ^ \
RT3[ ( Y1 >> 24 ) & 0xFF ]; \
\
X1 = *RK++ ^ RT0[ ( Y1 ) & 0xFF ] ^ \
RT1[ ( Y0 >> 8 ) & 0xFF ] ^ \
RT2[ ( Y3 >> 16 ) & 0xFF ] ^ \
RT3[ ( Y2 >> 24 ) & 0xFF ]; \
\
X2 = *RK++ ^ RT0[ ( Y2 ) & 0xFF ] ^ \
RT1[ ( Y1 >> 8 ) & 0xFF ] ^ \
RT2[ ( Y0 >> 16 ) & 0xFF ] ^ \
RT3[ ( Y3 >> 24 ) & 0xFF ]; \
\
X3 = *RK++ ^ RT0[ ( Y3 ) & 0xFF ] ^ \
RT1[ ( Y2 >> 8 ) & 0xFF ] ^ \
RT2[ ( Y1 >> 16 ) & 0xFF ] ^ \
RT3[ ( Y0 >> 24 ) & 0xFF ]; \
}
 
/*
* AES-ECB block encryption/decryption
*/
void aes_crypt_ecb( aes_context *ctx,
int mode,
const unsigned char input[16],
unsigned char output[16] )
{
int i;
unsigned long *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
 
#if defined(XYSSL_PADLOCK_C) && defined(XYSSL_HAVE_X86)
if( padlock_supports( PADLOCK_ACE ) )
{
if( padlock_xcryptecb( ctx, mode, input, output ) == 0 )
return;
}
#endif
 
RK = ctx->rk;
 
GET_ULONG_LE( X0, input, 0 ); X0 ^= *RK++;
GET_ULONG_LE( X1, input, 4 ); X1 ^= *RK++;
GET_ULONG_LE( X2, input, 8 ); X2 ^= *RK++;
GET_ULONG_LE( X3, input, 12 ); X3 ^= *RK++;
 
if( mode == AES_DECRYPT )
{
for( i = (ctx->nr >> 1) - 1; i > 0; i-- )
{
AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
}
 
AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
 
X0 = *RK++ ^ ( RSb[ ( Y0 ) & 0xFF ] ) ^
( RSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
( RSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
( RSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
 
X1 = *RK++ ^ ( RSb[ ( Y1 ) & 0xFF ] ) ^
( RSb[ ( Y0 >>8 ) & 0xFF ] << 8 ) ^
( RSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
( RSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
 
X2 = *RK++ ^ ( RSb[ ( Y2 ) & 0xFF ] ) ^
( RSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
( RSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
( RSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
 
X3 = *RK++ ^ ( RSb[ ( Y3 ) & 0xFF ] ) ^
( RSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
( RSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
( RSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
}
else /* AES_ENCRYPT */
{
for( i = (ctx->nr >> 1) - 1; i > 0; i-- )
{
AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
}
 
AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
 
X0 = *RK++ ^ ( FSb[ ( Y0 ) & 0xFF ] ) ^
( FSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
( FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
( FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
 
X1 = *RK++ ^ ( FSb[ ( Y1 ) & 0xFF ] ) ^
( FSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
( FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
( FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
 
X2 = *RK++ ^ ( FSb[ ( Y2 ) & 0xFF ] ) ^
( FSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
( FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
( FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
 
X3 = *RK++ ^ ( FSb[ ( Y3 ) & 0xFF ] ) ^
( FSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
( FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
( FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
}
 
PUT_ULONG_LE( X0, output, 0 );
PUT_ULONG_LE( X1, output, 4 );
PUT_ULONG_LE( X2, output, 8 );
PUT_ULONG_LE( X3, output, 12 );
}
 
/*
* AES-CBC buffer encryption/decryption
*/
void aes_crypt_cbc( aes_context *ctx,
int mode,
int length,
unsigned char iv[16],
const unsigned char *input,
unsigned char *output )
{
int i;
unsigned char temp[16];
 
#if defined(XYSSL_PADLOCK_C) && defined(XYSSL_HAVE_X86)
if( padlock_supports( PADLOCK_ACE ) )
{
if( padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 )
return;
}
#endif
 
if( mode == AES_DECRYPT )
{
while( length > 0 )
{
memcpy( temp, input, 16 );
aes_crypt_ecb( ctx, mode, input, output );
 
for( i = 0; i < 16; i++ )
output[i] = (unsigned char)( output[i] ^ iv[i] );
 
memcpy( iv, temp, 16 );
 
input += 16;
output += 16;
length -= 16;
}
}
else
{
while( length > 0 )
{
for( i = 0; i < 16; i++ )
output[i] = (unsigned char)( input[i] ^ iv[i] );
 
aes_crypt_ecb( ctx, mode, output, output );
memcpy( iv, output, 16 );
 
input += 16;
output += 16;
length -= 16;
}
}
}
 
/*
* AES-CFB buffer encryption/decryption
*/
void aes_crypt_cfb( aes_context *ctx,
int mode,
int length,
int *iv_off,
unsigned char iv[16],
const unsigned char *input,
unsigned char *output )
{
int c, n = *iv_off;
 
if( mode == AES_DECRYPT )
{
while( length-- )
{
if( n == 0 )
aes_crypt_ecb( ctx, AES_ENCRYPT, iv, iv );
 
c = *input++;
*output++ = (unsigned char)( c ^ iv[n] );
iv[n] = (unsigned char) c;
 
n = (n + 1) & 0x0F;
}
}
else
{
while( length-- )
{
if( n == 0 )
aes_crypt_ecb( ctx, AES_ENCRYPT, iv, iv );
 
iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
 
n = (n + 1) & 0x0F;
}
}
 
*iv_off = n;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/crypt_arc4.c
0,0 → 1,98
/* This code illustrates a sample implementation
* of the Arcfour algorithm
* Copyright (c) April 29, 1997 Kalle Kaukonen.
* All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that this copyright
* notice and disclaimer are retained.
*
* THIS SOFTWARE IS PROVIDED BY KALLE KAUKONEN AND CONTRIBUTORS ``AS
* IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KALLE
* KAUKONEN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
 
#include "fitz.h"
 
void
fz_arc4_init(fz_arc4 *arc4, const unsigned char *key, const unsigned keylen)
{
unsigned int t, u;
unsigned int keyindex;
unsigned int stateindex;
unsigned char *state;
unsigned int counter;
 
state = arc4->state;
 
arc4->x = 0;
arc4->y = 0;
 
for (counter = 0; counter < 256; counter++)
{
state[counter] = counter;
}
 
keyindex = 0;
stateindex = 0;
 
for (counter = 0; counter < 256; counter++)
{
t = state[counter];
stateindex = (stateindex + key[keyindex] + t) & 0xff;
u = state[stateindex];
 
state[stateindex] = t;
state[counter] = u;
 
if (++keyindex >= keylen)
{
keyindex = 0;
}
}
}
 
static unsigned char
fz_arc4_next(fz_arc4 *arc4)
{
unsigned int x;
unsigned int y;
unsigned int sx, sy;
unsigned char *state;
 
state = arc4->state;
 
x = (arc4->x + 1) & 0xff;
sx = state[x];
y = (sx + arc4->y) & 0xff;
sy = state[y];
 
arc4->x = x;
arc4->y = y;
 
state[y] = sx;
state[x] = sy;
 
return state[(sx + sy) & 0xff];
}
 
void
fz_arc4_encrypt(fz_arc4 *arc4, unsigned char *dest, const unsigned char *src, const unsigned len)
{
unsigned int i;
for (i = 0; i < len; i++)
{
unsigned char x;
x = fz_arc4_next(arc4);
dest[i] = src[i] ^ x;
}
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/crypt_md5.c
0,0 → 1,272
/*
MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
 
Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991.
All rights reserved.
 
License to copy and use this software is granted provided that it
is identified as the "RSA Data Security, Inc. MD5 Message-Digest
Algorithm" in all material mentioning or referencing this software
or this function.
 
License is also granted to make and use derivative works provided
that such works are identified as "derived from the RSA Data
Security, Inc. MD5 Message-Digest Algorithm" in all material
mentioning or referencing the derived work.
 
RSA Data Security, Inc. makes no representations concerning either
the merchantability of this software or the suitability of this
software for any particular purpose. It is provided "as is"
without express or implied warranty of any kind.
 
These notices must be retained in any copies of any part of this
documentation and/or software.
*/
 
#include "fitz.h"
 
/* Constants for MD5Transform routine */
enum
{
S11 = 7, S12 = 12, S13 = 17, S14 = 22,
S21 = 5, S22 = 9, S23 = 14, S24 = 20,
S31 = 4, S32 = 11, S33 = 16, S34 = 23,
S41 = 6, S42 = 10, S43 = 15, S44 = 21
};
 
static void encode(unsigned char *, const unsigned int *, const unsigned);
static void decode(unsigned int *, const unsigned char *, const unsigned);
static void transform(unsigned int state[4], const unsigned char block[64]);
 
static unsigned char padding[64] =
{
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
 
/* F, G, H and I are basic MD5 functions */
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define I(x, y, z) ((y) ^ ((x) | (~z)))
 
/* ROTATE rotates x left n bits */
#define ROTATE(x, n) (((x) << (n)) | ((x) >> (32-(n))))
 
/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
* Rotation is separate from addition to prevent recomputation.
*/
#define FF(a, b, c, d, x, s, ac) { \
(a) += F ((b), (c), (d)) + (x) + (unsigned int)(ac); \
(a) = ROTATE ((a), (s)); \
(a) += (b); \
}
#define GG(a, b, c, d, x, s, ac) { \
(a) += G ((b), (c), (d)) + (x) + (unsigned int)(ac); \
(a) = ROTATE ((a), (s)); \
(a) += (b); \
}
#define HH(a, b, c, d, x, s, ac) { \
(a) += H ((b), (c), (d)) + (x) + (unsigned int)(ac); \
(a) = ROTATE ((a), (s)); \
(a) += (b); \
}
#define II(a, b, c, d, x, s, ac) { \
(a) += I ((b), (c), (d)) + (x) + (unsigned int)(ac); \
(a) = ROTATE ((a), (s)); \
(a) += (b); \
}
 
static void encode(unsigned char *output, const unsigned int *input, const unsigned len)
{
unsigned i, j;
 
for (i = 0, j = 0; j < len; i++, j += 4)
{
output[j] = (unsigned char)(input[i] & 0xff);
output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
}
}
 
static void decode(unsigned int *output, const unsigned char *input, const unsigned len)
{
unsigned i, j;
 
for (i = 0, j = 0; j < len; i++, j += 4)
{
output[i] = ((unsigned int)input[j]) |
(((unsigned int)input[j+1]) << 8) |
(((unsigned int)input[j+2]) << 16) |
(((unsigned int)input[j+3]) << 24);
}
}
 
static void transform(unsigned int state[4], const unsigned char block[64])
{
unsigned int a = state[0];
unsigned int b = state[1];
unsigned int c = state[2];
unsigned int d = state[3];
unsigned int x[16];
 
decode(x, block, 64);
 
/* Round 1 */
FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
 
/* Round 2 */
GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
GG (d, a, b, c, x[10], S22, 0x02441453); /* 22 */
GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
 
/* Round 3 */
HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
HH (b, c, d, a, x[ 6], S34, 0x04881d05); /* 44 */
HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
 
/* Round 4 */
II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
 
state[0] += a;
state[1] += b;
state[2] += c;
state[3] += d;
 
/* Zeroize sensitive information */
memset(x, 0, sizeof (x));
}
 
/* MD5 initialization. Begins an MD5 operation, writing a new context. */
void fz_md5_init(fz_md5 *context)
{
context->count[0] = context->count[1] = 0;
 
/* Load magic initialization constants */
context->state[0] = 0x67452301;
context->state[1] = 0xefcdab89;
context->state[2] = 0x98badcfe;
context->state[3] = 0x10325476;
}
 
/* MD5 block update operation. Continues an MD5 message-digest operation,
* processing another message block, and updating the context.
*/
void fz_md5_update(fz_md5 *context, const unsigned char *input, const unsigned inlen)
{
unsigned i, index, partlen;
 
/* Compute number of bytes mod 64 */
index = (unsigned)((context->count[0] >> 3) & 0x3F);
 
/* Update number of bits */
context->count[0] += (unsigned int) inlen << 3;
if (context->count[0] < (unsigned int) inlen << 3)
context->count[1] ++;
context->count[1] += (unsigned int) inlen >> 29;
 
partlen = 64 - index;
 
/* Transform as many times as possible. */
if (inlen >= partlen)
{
memcpy(context->buffer + index, input, partlen);
transform(context->state, context->buffer);
 
for (i = partlen; i + 63 < inlen; i += 64)
transform(context->state, input + i);
 
index = 0;
}
else
{
i = 0;
}
 
/* Buffer remaining input */
memcpy(context->buffer + index, input + i, inlen - i);
}
 
/* MD5 finalization. Ends an MD5 message-digest operation, writing the
* the message digest and zeroizing the context.
*/
void fz_md5_final(fz_md5 *context, unsigned char digest[16])
{
unsigned char bits[8];
unsigned index, padlen;
 
/* Save number of bits */
encode(bits, context->count, 8);
 
/* Pad out to 56 mod 64 */
index = (unsigned)((context->count[0] >> 3) & 0x3f);
padlen = index < 56 ? 56 - index : 120 - index;
fz_md5_update(context, padding, padlen);
 
/* Append length (before padding) */
fz_md5_update(context, bits, 8);
 
/* Store state in digest */
encode(digest, context->state, 16);
 
/* Zeroize sensitive information */
memset(context, 0, sizeof(fz_md5));
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/crypt_sha2.c
0,0 → 1,182
/*
This code is based on the code found from 7-Zip, which has a modified
version of the SHA-256 found from Crypto++ <http://www.cryptopp.com/>.
The code was modified a little to fit into liblzma and fitz.
 
This file has been put into the public domain.
You can do whatever you want with this file.
*/
 
#include "fitz.h"
 
static inline int isbigendian(void)
{
static const int one = 1;
return *(char*)&one == 0;
}
 
static inline unsigned int bswap32(unsigned int num)
{
if (!isbigendian())
{
return ( (((num) << 24))
| (((num) << 8) & 0x00FF0000)
| (((num) >> 8) & 0x0000FF00)
| (((num) >> 24)) );
}
return num;
}
 
/* At least on x86, GCC is able to optimize this to a rotate instruction. */
#define rotr_32(num, amount) ((num) >> (amount) | (num) << (32 - (amount)))
 
#define blk0(i) (W[i] = data[i])
#define blk2(i) (W[i & 15] += s1(W[(i - 2) & 15]) + W[(i - 7) & 15] \
+ s0(W[(i - 15) & 15]))
 
#define Ch(x, y, z) (z ^ (x & (y ^ z)))
#define Maj(x, y, z) ((x & y) | (z & (x | y)))
 
#define a(i) T[(0 - i) & 7]
#define b(i) T[(1 - i) & 7]
#define c(i) T[(2 - i) & 7]
#define d(i) T[(3 - i) & 7]
#define e(i) T[(4 - i) & 7]
#define f(i) T[(5 - i) & 7]
#define g(i) T[(6 - i) & 7]
#define h(i) T[(7 - i) & 7]
 
#define R(i) \
h(i) += S1(e(i)) + Ch(e(i), f(i), g(i)) + SHA256_K[i + j] \
+ (j ? blk2(i) : blk0(i)); \
d(i) += h(i); \
h(i) += S0(a(i)) + Maj(a(i), b(i), c(i))
 
#define S0(x) (rotr_32(x, 2) ^ rotr_32(x, 13) ^ rotr_32(x, 22))
#define S1(x) (rotr_32(x, 6) ^ rotr_32(x, 11) ^ rotr_32(x, 25))
#define s0(x) (rotr_32(x, 7) ^ rotr_32(x, 18) ^ (x >> 3))
#define s1(x) (rotr_32(x, 17) ^ rotr_32(x, 19) ^ (x >> 10))
 
static const unsigned int SHA256_K[64] = {
0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,
};
 
static void
transform(unsigned int state[8], const unsigned int data_xe[16])
{
unsigned int data[16];
unsigned int W[16];
unsigned int T[8];
unsigned int j;
 
/* ensure big-endian integers */
for (j = 0; j < 16; j++)
data[j] = bswap32(data_xe[j]);
 
/* Copy state[] to working vars. */
memcpy(T, state, sizeof(T));
 
/* 64 operations, partially loop unrolled */
for (j = 0; j < 64; j += 16) {
R( 0); R( 1); R( 2); R( 3);
R( 4); R( 5); R( 6); R( 7);
R( 8); R( 9); R(10); R(11);
R(12); R(13); R(14); R(15);
}
 
/* Add the working vars back into state[]. */
state[0] += a(0);
state[1] += b(0);
state[2] += c(0);
state[3] += d(0);
state[4] += e(0);
state[5] += f(0);
state[6] += g(0);
state[7] += h(0);
}
 
void fz_sha256_init(fz_sha256 *context)
{
context->count[0] = context->count[1] = 0;
 
context->state[0] = 0x6A09E667;
context->state[1] = 0xBB67AE85;
context->state[2] = 0x3C6EF372;
context->state[3] = 0xA54FF53A;
context->state[4] = 0x510E527F;
context->state[5] = 0x9B05688C;
context->state[6] = 0x1F83D9AB;
context->state[7] = 0x5BE0CD19;
}
 
void fz_sha256_update(fz_sha256 *context, const unsigned char *input, unsigned int inlen)
{
/* Copy the input data into a properly aligned temporary buffer.
* This way we can be called with arbitrarily sized buffers
* (no need to be multiple of 64 bytes), and the code works also
* on architectures that don't allow unaligned memory access. */
while (inlen > 0)
{
const unsigned int copy_start = context->count[0] & 0x3F;
unsigned int copy_size = 64 - copy_start;
if (copy_size > inlen)
copy_size = inlen;
 
memcpy(context->buffer.u8 + copy_start, input, copy_size);
 
input += copy_size;
inlen -= copy_size;
context->count[0] += copy_size;
/* carry overflow from low to high */
if (context->count[0] < copy_size)
context->count[1]++;
 
if ((context->count[0] & 0x3F) == 0)
transform(context->state, context->buffer.u32);
}
}
 
void fz_sha256_final(fz_sha256 *context, unsigned char digest[32])
{
/* Add padding as described in RFC 3174 (it describes SHA-1 but
* the same padding style is used for SHA-256 too). */
unsigned int j = context->count[0] & 0x3F;
context->buffer.u8[j++] = 0x80;
 
while (j != 56)
{
if (j == 64)
{
transform(context->state, context->buffer.u32);
j = 0;
}
context->buffer.u8[j++] = 0x00;
}
 
/* Convert the message size from bytes to bits. */
context->count[1] = (context->count[1] << 3) + (context->count[0] >> 29);
context->count[0] = context->count[0] << 3;
 
context->buffer.u32[14] = bswap32(context->count[1]);
context->buffer.u32[15] = bswap32(context->count[0]);
transform(context->state, context->buffer.u32);
 
for (j = 0; j < 8; j++)
((unsigned int *)digest)[j] = bswap32(context->state[j]);
memset(context, 0, sizeof(fz_sha256));
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/dev_bbox.c
0,0 → 1,82
#include "fitz.h"
 
/* TODO: add clip stack and use to intersect bboxes */
 
static void
fz_bbox_fill_path(void *user, fz_path *path, int even_odd, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
fz_bbox *result = user;
fz_bbox bbox = fz_round_rect(fz_bound_path(path, NULL, ctm));
*result = fz_union_bbox(*result, bbox);
}
 
static void
fz_bbox_stroke_path(void *user, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
fz_bbox *result = user;
fz_bbox bbox = fz_round_rect(fz_bound_path(path, stroke, ctm));
*result = fz_union_bbox(*result, bbox);
}
 
static void
fz_bbox_fill_text(void *user, fz_text *text, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
fz_bbox *result = user;
fz_bbox bbox = fz_round_rect(fz_bound_text(text, ctm));
*result = fz_union_bbox(*result, bbox);
}
 
static void
fz_bbox_stroke_text(void *user, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
fz_bbox *result = user;
fz_bbox bbox = fz_round_rect(fz_bound_text(text, ctm));
*result = fz_union_bbox(*result, bbox);
}
 
static void
fz_bbox_fill_shade(void *user, fz_shade *shade, fz_matrix ctm, float alpha)
{
fz_bbox *result = user;
fz_bbox bbox = fz_round_rect(fz_bound_shade(shade, ctm));
*result = fz_union_bbox(*result, bbox);
}
 
static void
fz_bbox_fill_image(void *user, fz_pixmap *image, fz_matrix ctm, float alpha)
{
fz_bbox *result = user;
fz_bbox bbox = fz_round_rect(fz_transform_rect(ctm, fz_unit_rect));
*result = fz_union_bbox(*result, bbox);
}
 
static void
fz_bbox_fill_image_mask(void *user, fz_pixmap *image, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
fz_bbox_fill_image(user, image, ctm, alpha);
}
 
fz_device *
fz_new_bbox_device(fz_bbox *result)
{
fz_device *dev;
 
dev = fz_new_device(result);
 
dev->fill_path = fz_bbox_fill_path;
dev->stroke_path = fz_bbox_stroke_path;
dev->fill_text = fz_bbox_fill_text;
dev->stroke_text = fz_bbox_stroke_text;
dev->fill_shade = fz_bbox_fill_shade;
dev->fill_image = fz_bbox_fill_image;
dev->fill_image_mask = fz_bbox_fill_image_mask;
 
*result = fz_empty_bbox;
 
return dev;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/dev_list.c
0,0 → 1,660
#include "fitz.h"
 
typedef struct fz_display_node_s fz_display_node;
 
#define STACK_SIZE 96
 
typedef enum fz_display_command_e
{
FZ_CMD_FILL_PATH,
FZ_CMD_STROKE_PATH,
FZ_CMD_CLIP_PATH,
FZ_CMD_CLIP_STROKE_PATH,
FZ_CMD_FILL_TEXT,
FZ_CMD_STROKE_TEXT,
FZ_CMD_CLIP_TEXT,
FZ_CMD_CLIP_STROKE_TEXT,
FZ_CMD_IGNORE_TEXT,
FZ_CMD_FILL_SHADE,
FZ_CMD_FILL_IMAGE,
FZ_CMD_FILL_IMAGE_MASK,
FZ_CMD_CLIP_IMAGE_MASK,
FZ_CMD_POP_CLIP,
FZ_CMD_BEGIN_MASK,
FZ_CMD_END_MASK,
FZ_CMD_BEGIN_GROUP,
FZ_CMD_END_GROUP,
FZ_CMD_BEGIN_TILE,
FZ_CMD_END_TILE
} fz_display_command;
 
struct fz_display_node_s
{
fz_display_command cmd;
fz_display_node *next;
fz_rect rect;
union {
fz_path *path;
fz_text *text;
fz_shade *shade;
fz_pixmap *image;
int blendmode;
} item;
fz_stroke_state *stroke;
int flag; /* even_odd, accumulate, isolated/knockout... */
fz_matrix ctm;
fz_colorspace *colorspace;
float alpha;
float color[FZ_MAX_COLORS];
};
 
struct fz_display_list_s
{
fz_display_node *first;
fz_display_node *last;
 
int top;
struct {
fz_rect *update;
fz_rect rect;
} stack[STACK_SIZE];
int tiled;
};
 
enum { ISOLATED = 1, KNOCKOUT = 2 };
 
static fz_display_node *
fz_new_display_node(fz_display_command cmd, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
fz_display_node *node;
int i;
 
node = fz_malloc(sizeof(fz_display_node));
node->cmd = cmd;
node->next = NULL;
node->rect = fz_empty_rect;
node->item.path = NULL;
node->stroke = NULL;
node->flag = 0;
node->ctm = ctm;
if (colorspace)
{
node->colorspace = fz_keep_colorspace(colorspace);
if (color)
{
for (i = 0; i < node->colorspace->n; i++)
node->color[i] = color[i];
}
}
else
{
node->colorspace = NULL;
}
node->alpha = alpha;
 
return node;
}
 
static fz_stroke_state *
fz_clone_stroke_state(fz_stroke_state *stroke)
{
fz_stroke_state *newstroke = fz_malloc(sizeof(fz_stroke_state));
*newstroke = *stroke;
return newstroke;
}
 
static void
fz_append_display_node(fz_display_list *list, fz_display_node *node)
{
switch (node->cmd)
{
case FZ_CMD_CLIP_PATH:
case FZ_CMD_CLIP_STROKE_PATH:
case FZ_CMD_CLIP_IMAGE_MASK:
if (list->top < STACK_SIZE)
{
list->stack[list->top].update = &node->rect;
list->stack[list->top].rect = fz_empty_rect;
}
list->top++;
break;
case FZ_CMD_END_MASK:
case FZ_CMD_CLIP_TEXT:
case FZ_CMD_CLIP_STROKE_TEXT:
if (list->top < STACK_SIZE)
{
list->stack[list->top].update = NULL;
list->stack[list->top].rect = fz_empty_rect;
}
list->top++;
break;
case FZ_CMD_BEGIN_TILE:
list->tiled++;
if (list->top > 0 && list->top < STACK_SIZE)
{
list->stack[list->top-1].rect = fz_infinite_rect;
}
break;
case FZ_CMD_END_TILE:
list->tiled--;
break;
case FZ_CMD_END_GROUP:
break;
case FZ_CMD_POP_CLIP:
if (list->top > STACK_SIZE)
{
list->top--;
node->rect = fz_infinite_rect;
}
else if (list->top > 0)
{
fz_rect *update;
list->top--;
update = list->stack[list->top].update;
if (list->tiled == 0)
{
if (update != NULL)
{
*update = fz_intersect_rect(*update, list->stack[list->top].rect);
node->rect = *update;
}
else
node->rect = list->stack[list->top].rect;
}
else
node->rect = fz_infinite_rect;
}
/* fallthrough */
default:
if (list->top > 0 && list->tiled == 0 && list->top <= STACK_SIZE)
list->stack[list->top-1].rect = fz_union_rect(list->stack[list->top-1].rect, node->rect);
break;
}
if (!list->first)
{
list->first = node;
list->last = node;
}
else
{
list->last->next = node;
list->last = node;
}
}
 
static void
fz_free_display_node(fz_display_node *node)
{
switch (node->cmd)
{
case FZ_CMD_FILL_PATH:
case FZ_CMD_STROKE_PATH:
case FZ_CMD_CLIP_PATH:
case FZ_CMD_CLIP_STROKE_PATH:
fz_free_path(node->item.path);
break;
case FZ_CMD_FILL_TEXT:
case FZ_CMD_STROKE_TEXT:
case FZ_CMD_CLIP_TEXT:
case FZ_CMD_CLIP_STROKE_TEXT:
case FZ_CMD_IGNORE_TEXT:
fz_free_text(node->item.text);
break;
case FZ_CMD_FILL_SHADE:
fz_drop_shade(node->item.shade);
break;
case FZ_CMD_FILL_IMAGE:
case FZ_CMD_FILL_IMAGE_MASK:
case FZ_CMD_CLIP_IMAGE_MASK:
fz_drop_pixmap(node->item.image);
break;
case FZ_CMD_POP_CLIP:
case FZ_CMD_BEGIN_MASK:
case FZ_CMD_END_MASK:
case FZ_CMD_BEGIN_GROUP:
case FZ_CMD_END_GROUP:
case FZ_CMD_BEGIN_TILE:
case FZ_CMD_END_TILE:
break;
}
if (node->stroke)
fz_free(node->stroke);
if (node->colorspace)
fz_drop_colorspace(node->colorspace);
fz_free(node);
}
 
static void
fz_list_fill_path(void *user, fz_path *path, int even_odd, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
fz_display_node *node;
node = fz_new_display_node(FZ_CMD_FILL_PATH, ctm, colorspace, color, alpha);
node->rect = fz_bound_path(path, NULL, ctm);
node->item.path = fz_clone_path(path);
node->flag = even_odd;
fz_append_display_node(user, node);
}
 
static void
fz_list_stroke_path(void *user, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
fz_display_node *node;
node = fz_new_display_node(FZ_CMD_STROKE_PATH, ctm, colorspace, color, alpha);
node->rect = fz_bound_path(path, stroke, ctm);
node->item.path = fz_clone_path(path);
node->stroke = fz_clone_stroke_state(stroke);
fz_append_display_node(user, node);
}
 
static void
fz_list_clip_path(void *user, fz_path *path, fz_rect *rect, int even_odd, fz_matrix ctm)
{
fz_display_node *node;
node = fz_new_display_node(FZ_CMD_CLIP_PATH, ctm, NULL, NULL, 0);
node->rect = fz_bound_path(path, NULL, ctm);
if (rect != NULL)
node->rect = fz_intersect_rect(node->rect, *rect);
node->item.path = fz_clone_path(path);
node->flag = even_odd;
fz_append_display_node(user, node);
}
 
static void
fz_list_clip_stroke_path(void *user, fz_path *path, fz_rect *rect, fz_stroke_state *stroke, fz_matrix ctm)
{
fz_display_node *node;
node = fz_new_display_node(FZ_CMD_CLIP_STROKE_PATH, ctm, NULL, NULL, 0);
node->rect = fz_bound_path(path, stroke, ctm);
if (rect != NULL)
node->rect = fz_intersect_rect(node->rect, *rect);
node->item.path = fz_clone_path(path);
node->stroke = fz_clone_stroke_state(stroke);
fz_append_display_node(user, node);
}
 
static void
fz_list_fill_text(void *user, fz_text *text, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
fz_display_node *node;
node = fz_new_display_node(FZ_CMD_FILL_TEXT, ctm, colorspace, color, alpha);
node->rect = fz_bound_text(text, ctm);
node->item.text = fz_clone_text(text);
fz_append_display_node(user, node);
}
 
static void
fz_list_stroke_text(void *user, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
fz_display_node *node;
node = fz_new_display_node(FZ_CMD_STROKE_TEXT, ctm, colorspace, color, alpha);
node->rect = fz_bound_text(text, ctm);
node->item.text = fz_clone_text(text);
node->stroke = fz_clone_stroke_state(stroke);
fz_append_display_node(user, node);
}
 
static void
fz_list_clip_text(void *user, fz_text *text, fz_matrix ctm, int accumulate)
{
fz_display_node *node;
node = fz_new_display_node(FZ_CMD_CLIP_TEXT, ctm, NULL, NULL, 0);
node->rect = fz_bound_text(text, ctm);
node->item.text = fz_clone_text(text);
node->flag = accumulate;
/* when accumulating, be conservative about culling */
if (accumulate)
node->rect = fz_infinite_rect;
fz_append_display_node(user, node);
}
 
static void
fz_list_clip_stroke_text(void *user, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm)
{
fz_display_node *node;
node = fz_new_display_node(FZ_CMD_CLIP_STROKE_TEXT, ctm, NULL, NULL, 0);
node->rect = fz_bound_text(text, ctm);
node->item.text = fz_clone_text(text);
node->stroke = fz_clone_stroke_state(stroke);
fz_append_display_node(user, node);
}
 
static void
fz_list_ignore_text(void *user, fz_text *text, fz_matrix ctm)
{
fz_display_node *node;
node = fz_new_display_node(FZ_CMD_IGNORE_TEXT, ctm, NULL, NULL, 0);
node->rect = fz_bound_text(text, ctm);
node->item.text = fz_clone_text(text);
fz_append_display_node(user, node);
}
 
static void
fz_list_pop_clip(void *user)
{
fz_display_node *node;
node = fz_new_display_node(FZ_CMD_POP_CLIP, fz_identity, NULL, NULL, 0);
fz_append_display_node(user, node);
}
 
static void
fz_list_fill_shade(void *user, fz_shade *shade, fz_matrix ctm, float alpha)
{
fz_display_node *node;
node = fz_new_display_node(FZ_CMD_FILL_SHADE, ctm, NULL, NULL, alpha);
node->rect = fz_bound_shade(shade, ctm);
node->item.shade = fz_keep_shade(shade);
fz_append_display_node(user, node);
}
 
static void
fz_list_fill_image(void *user, fz_pixmap *image, fz_matrix ctm, float alpha)
{
fz_display_node *node;
node = fz_new_display_node(FZ_CMD_FILL_IMAGE, ctm, NULL, NULL, alpha);
node->rect = fz_transform_rect(ctm, fz_unit_rect);
node->item.image = fz_keep_pixmap(image);
fz_append_display_node(user, node);
}
 
static void
fz_list_fill_image_mask(void *user, fz_pixmap *image, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
fz_display_node *node;
node = fz_new_display_node(FZ_CMD_FILL_IMAGE_MASK, ctm, colorspace, color, alpha);
node->rect = fz_transform_rect(ctm, fz_unit_rect);
node->item.image = fz_keep_pixmap(image);
fz_append_display_node(user, node);
}
 
static void
fz_list_clip_image_mask(void *user, fz_pixmap *image, fz_rect *rect, fz_matrix ctm)
{
fz_display_node *node;
node = fz_new_display_node(FZ_CMD_CLIP_IMAGE_MASK, ctm, NULL, NULL, 0);
node->rect = fz_transform_rect(ctm, fz_unit_rect);
if (rect != NULL)
node->rect = fz_intersect_rect(node->rect, *rect);
node->item.image = fz_keep_pixmap(image);
fz_append_display_node(user, node);
}
 
static void
fz_list_begin_mask(void *user, fz_rect rect, int luminosity, fz_colorspace *colorspace, float *color)
{
fz_display_node *node;
node = fz_new_display_node(FZ_CMD_BEGIN_MASK, fz_identity, colorspace, color, 0);
node->rect = rect;
node->flag = luminosity;
fz_append_display_node(user, node);
}
 
static void
fz_list_end_mask(void *user)
{
fz_display_node *node;
node = fz_new_display_node(FZ_CMD_END_MASK, fz_identity, NULL, NULL, 0);
fz_append_display_node(user, node);
}
 
static void
fz_list_begin_group(void *user, fz_rect rect, int isolated, int knockout, int blendmode, float alpha)
{
fz_display_node *node;
node = fz_new_display_node(FZ_CMD_BEGIN_GROUP, fz_identity, NULL, NULL, alpha);
node->rect = rect;
node->item.blendmode = blendmode;
node->flag |= isolated ? ISOLATED : 0;
node->flag |= knockout ? KNOCKOUT : 0;
fz_append_display_node(user, node);
}
 
static void
fz_list_end_group(void *user)
{
fz_display_node *node;
node = fz_new_display_node(FZ_CMD_END_GROUP, fz_identity, NULL, NULL, 0);
fz_append_display_node(user, node);
}
 
static void
fz_list_begin_tile(void *user, fz_rect area, fz_rect view, float xstep, float ystep, fz_matrix ctm)
{
fz_display_node *node;
node = fz_new_display_node(FZ_CMD_BEGIN_TILE, ctm, NULL, NULL, 0);
node->rect = area;
node->color[0] = xstep;
node->color[1] = ystep;
node->color[2] = view.x0;
node->color[3] = view.y0;
node->color[4] = view.x1;
node->color[5] = view.y1;
fz_append_display_node(user, node);
}
 
static void
fz_list_end_tile(void *user)
{
fz_display_node *node;
node = fz_new_display_node(FZ_CMD_END_TILE, fz_identity, NULL, NULL, 0);
fz_append_display_node(user, node);
}
 
fz_device *
fz_new_list_device(fz_display_list *list)
{
fz_device *dev = fz_new_device(list);
 
dev->fill_path = fz_list_fill_path;
dev->stroke_path = fz_list_stroke_path;
dev->clip_path = fz_list_clip_path;
dev->clip_stroke_path = fz_list_clip_stroke_path;
 
dev->fill_text = fz_list_fill_text;
dev->stroke_text = fz_list_stroke_text;
dev->clip_text = fz_list_clip_text;
dev->clip_stroke_text = fz_list_clip_stroke_text;
dev->ignore_text = fz_list_ignore_text;
 
dev->fill_shade = fz_list_fill_shade;
dev->fill_image = fz_list_fill_image;
dev->fill_image_mask = fz_list_fill_image_mask;
dev->clip_image_mask = fz_list_clip_image_mask;
 
dev->pop_clip = fz_list_pop_clip;
 
dev->begin_mask = fz_list_begin_mask;
dev->end_mask = fz_list_end_mask;
dev->begin_group = fz_list_begin_group;
dev->end_group = fz_list_end_group;
 
dev->begin_tile = fz_list_begin_tile;
dev->end_tile = fz_list_end_tile;
 
return dev;
}
 
fz_display_list *
fz_new_display_list(void)
{
fz_display_list *list = fz_malloc(sizeof(fz_display_list));
list->first = NULL;
list->last = NULL;
list->top = 0;
list->tiled = 0;
return list;
}
 
void
fz_free_display_list(fz_display_list *list)
{
fz_display_node *node = list->first;
while (node)
{
fz_display_node *next = node->next;
fz_free_display_node(node);
node = next;
}
fz_free(list);
}
 
void
fz_execute_display_list(fz_display_list *list, fz_device *dev, fz_matrix top_ctm, fz_bbox scissor)
{
fz_display_node *node;
fz_matrix ctm;
fz_rect rect;
fz_bbox bbox;
int clipped = 0;
int tiled = 0;
int empty;
 
if (!fz_is_infinite_bbox(scissor))
{
/* add some fuzz at the edges, as especially glyph rects
* are sometimes not actually completely bounding the glyph */
scissor.x0 -= 20; scissor.y0 -= 20;
scissor.x1 += 20; scissor.y1 += 20;
}
 
for (node = list->first; node; node = node->next)
{
/* cull objects to draw using a quick visibility test */
 
if (tiled || node->cmd == FZ_CMD_BEGIN_TILE || node->cmd == FZ_CMD_END_TILE)
{
empty = 0;
}
else
{
bbox = fz_round_rect(fz_transform_rect(top_ctm, node->rect));
bbox = fz_intersect_bbox(bbox, scissor);
empty = fz_is_empty_bbox(bbox);
}
 
if (clipped || empty)
{
switch (node->cmd)
{
case FZ_CMD_CLIP_PATH:
case FZ_CMD_CLIP_STROKE_PATH:
case FZ_CMD_CLIP_TEXT:
case FZ_CMD_CLIP_STROKE_TEXT:
case FZ_CMD_CLIP_IMAGE_MASK:
case FZ_CMD_BEGIN_MASK:
case FZ_CMD_BEGIN_GROUP:
clipped++;
continue;
case FZ_CMD_POP_CLIP:
case FZ_CMD_END_GROUP:
if (!clipped)
goto visible;
clipped--;
continue;
case FZ_CMD_END_MASK:
if (!clipped)
goto visible;
continue;
default:
continue;
}
}
 
visible:
ctm = fz_concat(node->ctm, top_ctm);
 
switch (node->cmd)
{
case FZ_CMD_FILL_PATH:
fz_fill_path(dev, node->item.path, node->flag, ctm,
node->colorspace, node->color, node->alpha);
break;
case FZ_CMD_STROKE_PATH:
fz_stroke_path(dev, node->item.path, node->stroke, ctm,
node->colorspace, node->color, node->alpha);
break;
case FZ_CMD_CLIP_PATH:
{
fz_rect trect = fz_transform_rect(top_ctm, node->rect);
fz_clip_path(dev, node->item.path, &trect, node->flag, ctm);
break;
}
case FZ_CMD_CLIP_STROKE_PATH:
{
fz_rect trect = fz_transform_rect(top_ctm, node->rect);
fz_clip_stroke_path(dev, node->item.path, &trect, node->stroke, ctm);
break;
}
case FZ_CMD_FILL_TEXT:
fz_fill_text(dev, node->item.text, ctm,
node->colorspace, node->color, node->alpha);
break;
case FZ_CMD_STROKE_TEXT:
fz_stroke_text(dev, node->item.text, node->stroke, ctm,
node->colorspace, node->color, node->alpha);
break;
case FZ_CMD_CLIP_TEXT:
fz_clip_text(dev, node->item.text, ctm, node->flag);
break;
case FZ_CMD_CLIP_STROKE_TEXT:
fz_clip_stroke_text(dev, node->item.text, node->stroke, ctm);
break;
case FZ_CMD_IGNORE_TEXT:
fz_ignore_text(dev, node->item.text, ctm);
break;
case FZ_CMD_FILL_SHADE:
fz_fill_shade(dev, node->item.shade, ctm, node->alpha);
break;
case FZ_CMD_FILL_IMAGE:
fz_fill_image(dev, node->item.image, ctm, node->alpha);
break;
case FZ_CMD_FILL_IMAGE_MASK:
fz_fill_image_mask(dev, node->item.image, ctm,
node->colorspace, node->color, node->alpha);
break;
case FZ_CMD_CLIP_IMAGE_MASK:
{
fz_rect trect = fz_transform_rect(top_ctm, node->rect);
fz_clip_image_mask(dev, node->item.image, &trect, ctm);
break;
}
case FZ_CMD_POP_CLIP:
fz_pop_clip(dev);
break;
case FZ_CMD_BEGIN_MASK:
rect = fz_transform_rect(top_ctm, node->rect);
fz_begin_mask(dev, rect, node->flag, node->colorspace, node->color);
break;
case FZ_CMD_END_MASK:
fz_end_mask(dev);
break;
case FZ_CMD_BEGIN_GROUP:
rect = fz_transform_rect(top_ctm, node->rect);
fz_begin_group(dev, rect,
(node->flag & ISOLATED) != 0, (node->flag & KNOCKOUT) != 0,
node->item.blendmode, node->alpha);
break;
case FZ_CMD_END_GROUP:
fz_end_group(dev);
break;
case FZ_CMD_BEGIN_TILE:
tiled++;
rect.x0 = node->color[2];
rect.y0 = node->color[3];
rect.x1 = node->color[4];
rect.y1 = node->color[5];
fz_begin_tile(dev, node->rect, rect,
node->color[0], node->color[1], ctm);
break;
case FZ_CMD_END_TILE:
tiled--;
fz_end_tile(dev);
break;
}
}
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/dev_null.c
0,0 → 1,165
#include "fitz.h"
 
fz_device *
fz_new_device(void *user)
{
fz_device *dev = fz_malloc(sizeof(fz_device));
memset(dev, 0, sizeof(fz_device));
dev->hints = 0;
dev->flags = 0;
dev->user = user;
return dev;
}
 
void
fz_free_device(fz_device *dev)
{
if (dev->free_user)
dev->free_user(dev->user);
fz_free(dev);
}
 
void
fz_fill_path(fz_device *dev, fz_path *path, int even_odd, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
if (dev->fill_path)
dev->fill_path(dev->user, path, even_odd, ctm, colorspace, color, alpha);
}
 
void
fz_stroke_path(fz_device *dev, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
if (dev->stroke_path)
dev->stroke_path(dev->user, path, stroke, ctm, colorspace, color, alpha);
}
 
void
fz_clip_path(fz_device *dev, fz_path *path, fz_rect *rect, int even_odd, fz_matrix ctm)
{
if (dev->clip_path)
dev->clip_path(dev->user, path, rect, even_odd, ctm);
}
 
void
fz_clip_stroke_path(fz_device *dev, fz_path *path, fz_rect *rect, fz_stroke_state *stroke, fz_matrix ctm)
{
if (dev->clip_stroke_path)
dev->clip_stroke_path(dev->user, path, rect, stroke, ctm);
}
 
void
fz_fill_text(fz_device *dev, fz_text *text, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
if (dev->fill_text)
dev->fill_text(dev->user, text, ctm, colorspace, color, alpha);
}
 
void
fz_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
if (dev->stroke_text)
dev->stroke_text(dev->user, text, stroke, ctm, colorspace, color, alpha);
}
 
void
fz_clip_text(fz_device *dev, fz_text *text, fz_matrix ctm, int accumulate)
{
if (dev->clip_text)
dev->clip_text(dev->user, text, ctm, accumulate);
}
 
void
fz_clip_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm)
{
if (dev->clip_stroke_text)
dev->clip_stroke_text(dev->user, text, stroke, ctm);
}
 
void
fz_ignore_text(fz_device *dev, fz_text *text, fz_matrix ctm)
{
if (dev->ignore_text)
dev->ignore_text(dev->user, text, ctm);
}
 
void
fz_pop_clip(fz_device *dev)
{
if (dev->pop_clip)
dev->pop_clip(dev->user);
}
 
void
fz_fill_shade(fz_device *dev, fz_shade *shade, fz_matrix ctm, float alpha)
{
if (dev->fill_shade)
dev->fill_shade(dev->user, shade, ctm, alpha);
}
 
void
fz_fill_image(fz_device *dev, fz_pixmap *image, fz_matrix ctm, float alpha)
{
if (dev->fill_image)
dev->fill_image(dev->user, image, ctm, alpha);
}
 
void
fz_fill_image_mask(fz_device *dev, fz_pixmap *image, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
if (dev->fill_image_mask)
dev->fill_image_mask(dev->user, image, ctm, colorspace, color, alpha);
}
 
void
fz_clip_image_mask(fz_device *dev, fz_pixmap *image, fz_rect *rect, fz_matrix ctm)
{
if (dev->clip_image_mask)
dev->clip_image_mask(dev->user, image, rect, ctm);
}
 
void
fz_begin_mask(fz_device *dev, fz_rect area, int luminosity, fz_colorspace *colorspace, float *bc)
{
if (dev->begin_mask)
dev->begin_mask(dev->user, area, luminosity, colorspace, bc);
}
 
void
fz_end_mask(fz_device *dev)
{
if (dev->end_mask)
dev->end_mask(dev->user);
}
 
void
fz_begin_group(fz_device *dev, fz_rect area, int isolated, int knockout, int blendmode, float alpha)
{
if (dev->begin_group)
dev->begin_group(dev->user, area, isolated, knockout, blendmode, alpha);
}
 
void
fz_end_group(fz_device *dev)
{
if (dev->end_group)
dev->end_group(dev->user);
}
 
void
fz_begin_tile(fz_device *dev, fz_rect area, fz_rect view, float xstep, float ystep, fz_matrix ctm)
{
if (dev->begin_tile)
dev->begin_tile(dev->user, area, view, xstep, ystep, ctm);
}
 
void
fz_end_tile(fz_device *dev)
{
if (dev->end_tile)
dev->end_tile(dev->user);
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/dev_text.c
0,0 → 1,418
#include "fitz.h"
 
#define LINE_DIST 0.9f
#define SPACE_DIST 0.2f
 
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_ADVANCES_H
 
typedef struct fz_text_device_s fz_text_device;
 
struct fz_text_device_s
{
fz_point point;
fz_text_span *head;
fz_text_span *span;
};
 
fz_text_span *
fz_new_text_span(void)
{
fz_text_span *span;
span = fz_malloc(sizeof(fz_text_span));
span->font = NULL;
span->wmode = 0;
span->size = 0;
span->len = 0;
span->cap = 0;
span->text = NULL;
span->next = NULL;
span->eol = 0;
return span;
}
 
void
fz_free_text_span(fz_text_span *span)
{
if (span->font)
fz_drop_font(span->font);
if (span->next)
fz_free_text_span(span->next);
fz_free(span->text);
fz_free(span);
}
 
static void
fz_add_text_char_imp(fz_text_span *span, int c, fz_bbox bbox)
{
if (span->len + 1 >= span->cap)
{
span->cap = span->cap > 1 ? (span->cap * 3) / 2 : 80;
span->text = fz_realloc(span->text, span->cap, sizeof(fz_text_char));
}
span->text[span->len].c = c;
span->text[span->len].bbox = bbox;
span->len ++;
}
 
static fz_bbox
fz_split_bbox(fz_bbox bbox, int i, int n)
{
float w = (float)(bbox.x1 - bbox.x0) / n;
float x0 = bbox.x0;
bbox.x0 = x0 + i * w;
bbox.x1 = x0 + (i + 1) * w;
return bbox;
}
 
static void
fz_add_text_char(fz_text_span **last, fz_font *font, float size, int wmode, int c, fz_bbox bbox)
{
fz_text_span *span = *last;
 
if (!span->font)
{
span->font = fz_keep_font(font);
span->size = size;
}
 
if ((span->font != font || span->size != size || span->wmode != wmode) && c != 32)
{
span = fz_new_text_span();
span->font = fz_keep_font(font);
span->size = size;
span->wmode = wmode;
(*last)->next = span;
*last = span;
}
 
switch (c)
{
case -1: /* ignore when one unicode character maps to multiple glyphs */
break;
case 0xFB00: /* ff */
fz_add_text_char_imp(span, 'f', fz_split_bbox(bbox, 0, 2));
fz_add_text_char_imp(span, 'f', fz_split_bbox(bbox, 1, 2));
break;
case 0xFB01: /* fi */
fz_add_text_char_imp(span, 'f', fz_split_bbox(bbox, 0, 2));
fz_add_text_char_imp(span, 'i', fz_split_bbox(bbox, 1, 2));
break;
case 0xFB02: /* fl */
fz_add_text_char_imp(span, 'f', fz_split_bbox(bbox, 0, 2));
fz_add_text_char_imp(span, 'l', fz_split_bbox(bbox, 1, 2));
break;
case 0xFB03: /* ffi */
fz_add_text_char_imp(span, 'f', fz_split_bbox(bbox, 0, 3));
fz_add_text_char_imp(span, 'f', fz_split_bbox(bbox, 1, 3));
fz_add_text_char_imp(span, 'i', fz_split_bbox(bbox, 2, 3));
break;
case 0xFB04: /* ffl */
fz_add_text_char_imp(span, 'f', fz_split_bbox(bbox, 0, 3));
fz_add_text_char_imp(span, 'f', fz_split_bbox(bbox, 1, 3));
fz_add_text_char_imp(span, 'l', fz_split_bbox(bbox, 2, 3));
break;
case 0xFB05: /* long st */
case 0xFB06: /* st */
fz_add_text_char_imp(span, 's', fz_split_bbox(bbox, 0, 2));
fz_add_text_char_imp(span, 't', fz_split_bbox(bbox, 1, 2));
break;
default:
fz_add_text_char_imp(span, c, bbox);
break;
}
}
 
static void
fz_divide_text_chars(fz_text_span **last, int n, fz_bbox bbox)
{
fz_text_span *span = *last;
int i, x;
x = span->len - n;
if (x >= 0)
for (i = 0; i < n; i++)
span->text[x + i].bbox = fz_split_bbox(bbox, i, n);
}
 
static void
fz_add_text_newline(fz_text_span **last, fz_font *font, float size, int wmode)
{
fz_text_span *span;
span = fz_new_text_span();
span->font = fz_keep_font(font);
span->size = size;
span->wmode = wmode;
(*last)->eol = 1;
(*last)->next = span;
*last = span;
}
 
void
fz_debug_text_span_xml(fz_text_span *span)
{
char buf[10];
int c, n, k, i;
 
printf("<span font=\"%s\" size=\"%g\" wmode=\"%d\" eol=\"%d\">\n",
span->font ? span->font->name : "NULL", span->size, span->wmode, span->eol);
 
for (i = 0; i < span->len; i++)
{
printf("\t<char ucs=\"");
c = span->text[i].c;
if (c < 128)
putchar(c);
else
{
n = runetochar(buf, &c);
for (k = 0; k < n; k++)
putchar(buf[k]);
}
printf("\" bbox=\"%d %d %d %d\" />\n",
span->text[i].bbox.x0,
span->text[i].bbox.y0,
span->text[i].bbox.x1,
span->text[i].bbox.y1);
}
 
printf("</span>\n");
 
if (span->next)
fz_debug_text_span_xml(span->next);
}
 
void
fz_debug_text_span(fz_text_span *span)
{
char buf[10];
int c, n, k, i;
 
for (i = 0; i < span->len; i++)
{
c = span->text[i].c;
if (c < 128)
putchar(c);
else
{
n = runetochar(buf, &c);
for (k = 0; k < n; k++)
putchar(buf[k]);
}
}
 
if (span->eol)
putchar('\n');
 
if (span->next)
fz_debug_text_span(span->next);
}
 
static void
fz_text_extract_span(fz_text_span **last, fz_text *text, fz_matrix ctm, fz_point *pen)
{
fz_font *font = text->font;
FT_Face face = font->ft_face;
fz_matrix tm = text->trm;
fz_matrix trm;
float size;
float adv;
fz_rect rect;
fz_point dir, ndir;
fz_point delta, ndelta;
float dist, dot;
float ascender = 1;
float descender = 0;
int multi;
int i, err;
 
if (text->len == 0)
return;
 
if (font->ft_face)
{
err = FT_Set_Char_Size(font->ft_face, 64, 64, 72, 72);
if (err)
fz_warn("freetype set character size: %s", ft_error_string(err));
ascender = (float)face->ascender / face->units_per_EM;
descender = (float)face->descender / face->units_per_EM;
}
 
rect = fz_empty_rect;
 
if (text->wmode == 0)
{
dir.x = 1;
dir.y = 0;
}
else
{
dir.x = 0;
dir.y = 1;
}
 
tm.e = 0;
tm.f = 0;
trm = fz_concat(tm, ctm);
dir = fz_transform_vector(trm, dir);
dist = sqrtf(dir.x * dir.x + dir.y * dir.y);
ndir.x = dir.x / dist;
ndir.y = dir.y / dist;
 
size = fz_matrix_expansion(trm);
 
multi = 1;
 
for (i = 0; i < text->len; i++)
{
if (text->items[i].gid < 0)
{
fz_add_text_char(last, font, size, text->wmode, text->items[i].ucs, fz_round_rect(rect));
multi ++;
fz_divide_text_chars(last, multi, fz_round_rect(rect));
continue;
}
multi = 1;
 
/* Calculate new pen location and delta */
tm.e = text->items[i].x;
tm.f = text->items[i].y;
trm = fz_concat(tm, ctm);
 
delta.x = pen->x - trm.e;
delta.y = pen->y - trm.f;
if (pen->x == -1 && pen->y == -1)
delta.x = delta.y = 0;
 
dist = sqrtf(delta.x * delta.x + delta.y * delta.y);
 
/* Add space and newlines based on pen movement */
if (dist > 0)
{
ndelta.x = delta.x / dist;
ndelta.y = delta.y / dist;
dot = ndelta.x * ndir.x + ndelta.y * ndir.y;
 
if (dist > size * LINE_DIST)
{
fz_add_text_newline(last, font, size, text->wmode);
}
else if (fabsf(dot) > 0.95f && dist > size * SPACE_DIST)
{
if ((*last)->len > 0 && (*last)->text[(*last)->len - 1].c != ' ')
{
fz_rect spacerect;
spacerect.x0 = -0.2f;
spacerect.y0 = 0;
spacerect.x1 = 0;
spacerect.y1 = 1;
spacerect = fz_transform_rect(trm, spacerect);
fz_add_text_char(last, font, size, text->wmode, ' ', fz_round_rect(spacerect));
}
}
}
 
/* Calculate bounding box and new pen position based on font metrics */
if (font->ft_face)
{
FT_Fixed ftadv = 0;
int mask = FT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING | FT_LOAD_IGNORE_TRANSFORM;
 
/* TODO: freetype returns broken vertical metrics */
/* if (text->wmode) mask |= FT_LOAD_VERTICAL_LAYOUT; */
 
FT_Get_Advance(font->ft_face, text->items[i].gid, mask, &ftadv);
adv = ftadv / 65536.0f;
 
rect.x0 = 0;
rect.y0 = descender;
rect.x1 = adv;
rect.y1 = ascender;
}
else
{
adv = font->t3widths[text->items[i].gid];
rect.x0 = 0;
rect.y0 = descender;
rect.x1 = adv;
rect.y1 = ascender;
}
 
rect = fz_transform_rect(trm, rect);
pen->x = trm.e + dir.x * adv;
pen->y = trm.f + dir.y * adv;
 
fz_add_text_char(last, font, size, text->wmode, text->items[i].ucs, fz_round_rect(rect));
}
}
 
static void
fz_text_fill_text(void *user, fz_text *text, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
fz_text_device *tdev = user;
fz_text_extract_span(&tdev->span, text, ctm, &tdev->point);
}
 
static void
fz_text_stroke_text(void *user, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
fz_text_device *tdev = user;
fz_text_extract_span(&tdev->span, text, ctm, &tdev->point);
}
 
static void
fz_text_clip_text(void *user, fz_text *text, fz_matrix ctm, int accumulate)
{
fz_text_device *tdev = user;
fz_text_extract_span(&tdev->span, text, ctm, &tdev->point);
}
 
static void
fz_text_clip_stroke_text(void *user, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm)
{
fz_text_device *tdev = user;
fz_text_extract_span(&tdev->span, text, ctm, &tdev->point);
}
 
static void
fz_text_ignore_text(void *user, fz_text *text, fz_matrix ctm)
{
fz_text_device *tdev = user;
fz_text_extract_span(&tdev->span, text, ctm, &tdev->point);
}
 
static void
fz_text_free_user(void *user)
{
fz_text_device *tdev = user;
 
tdev->span->eol = 1;
 
/* TODO: unicode NFC normalization */
/* TODO: bidi logical reordering */
 
fz_free(tdev);
}
 
fz_device *
fz_new_text_device(fz_text_span *root)
{
fz_device *dev;
fz_text_device *tdev = fz_malloc(sizeof(fz_text_device));
tdev->head = root;
tdev->span = root;
tdev->point.x = -1;
tdev->point.y = -1;
 
dev = fz_new_device(tdev);
dev->hints = FZ_IGNORE_IMAGE | FZ_IGNORE_SHADE;
dev->free_user = fz_text_free_user;
dev->fill_text = fz_text_fill_text;
dev->stroke_text = fz_text_stroke_text;
dev->clip_text = fz_text_clip_text;
dev->clip_stroke_text = fz_text_clip_stroke_text;
dev->ignore_text = fz_text_ignore_text;
return dev;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/dev_trace.c
0,0 → 1,305
#include "fitz.h"
 
static void
fz_trace_matrix(fz_matrix ctm)
{
printf("matrix=\"%g %g %g %g %g %g\" ",
ctm.a, ctm.b, ctm.c, ctm.d, ctm.e, ctm.f);
}
 
static void
fz_trace_color(fz_colorspace *colorspace, float *color, float alpha)
{
int i;
printf("colorspace=\"%s\" color=\"", colorspace->name);
for (i = 0; i < colorspace->n; i++)
printf("%s%g", i == 0 ? "" : " ", color[i]);
printf("\" ");
if (alpha < 1)
printf("alpha=\"%g\" ", alpha);
}
 
static void
fz_trace_path(fz_path *path, int indent)
{
float x, y;
int i = 0;
int n;
while (i < path->len)
{
for (n = 0; n < indent; n++)
putchar(' ');
switch (path->items[i++].k)
{
case FZ_MOVETO:
x = path->items[i++].v;
y = path->items[i++].v;
printf("<moveto x=\"%g\" y=\"%g\" />\n", x, y);
break;
case FZ_LINETO:
x = path->items[i++].v;
y = path->items[i++].v;
printf("<lineto x=\"%g\" y=\"%g\" />\n", x, y);
break;
case FZ_CURVETO:
x = path->items[i++].v;
y = path->items[i++].v;
printf("<curveto x1=\"%g\" y1=\"%g\" ", x, y);
x = path->items[i++].v;
y = path->items[i++].v;
printf("x2=\"%g\" y2=\"%g\" ", x, y);
x = path->items[i++].v;
y = path->items[i++].v;
printf("x3=\"%g\" y3=\"%g\" />\n", x, y);
break;
case FZ_CLOSE_PATH:
printf("<closepath />\n");
break;
}
}
}
 
static void
fz_trace_fill_path(void *user, fz_path *path, int even_odd, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
printf("<fill_path ");
if (even_odd)
printf("winding=\"eofill\" ");
else
printf("winding=\"nonzero\" ");
fz_trace_color(colorspace, color, alpha);
fz_trace_matrix(ctm);
printf(">\n");
fz_trace_path(path, 0);
printf("</fill_path>\n");
}
 
static void
fz_trace_stroke_path(void *user, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
int i;
 
printf("<stroke_path ");
printf("linewidth=\"%g\" ", stroke->linewidth);
printf("miterlimit=\"%g\" ", stroke->miterlimit);
printf("linecap=\"%d,%d,%d\" ", stroke->start_cap, stroke->dash_cap, stroke->end_cap);
printf("linejoin=\"%d\" ", stroke->linejoin);
 
if (stroke->dash_len)
{
printf("dash_phase=\"%g\" dash=\"", stroke->dash_phase);
for (i = 0; i < stroke->dash_len; i++)
printf("%g ", stroke->dash_list[i]);
printf("\"");
}
 
fz_trace_color(colorspace, color, alpha);
fz_trace_matrix(ctm);
printf(">\n");
 
fz_trace_path(path, 0);
 
printf("</stroke_path>\n");
}
 
static void
fz_trace_clip_path(void *user, fz_path *path, fz_rect *rect, int even_odd, fz_matrix ctm)
{
printf("<clip_path ");
if (even_odd)
printf("winding=\"eofill\" ");
else
printf("winding=\"nonzero\" ");
fz_trace_matrix(ctm);
printf("contentbbox=\"%g %g %g %g\">\n",
rect->x0, rect->y0, rect->x1, rect->y1);
fz_trace_path(path, 0);
printf("</clip_path>\n");
}
 
static void
fz_trace_clip_stroke_path(void *user, fz_path *path, fz_rect *rect, fz_stroke_state *stroke, fz_matrix ctm)
{
printf("<clip_stroke_path ");
fz_trace_matrix(ctm);
printf(">\n");
fz_trace_path(path, 0);
printf("</clip_stroke_path>\n");
}
 
static void
fz_trace_fill_text(void *user, fz_text *text, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
printf("<fill_text font=\"%s\" wmode=\"%d\" ", text->font->name, text->wmode);
fz_trace_color(colorspace, color, alpha);
fz_trace_matrix(fz_concat(ctm, text->trm));
printf(">\n");
fz_debug_text(text, 0);
printf("</fill_text>\n");
}
 
static void
fz_trace_stroke_text(void *user, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
printf("<stroke_text font=\"%s\" wmode=\"%d\" ", text->font->name, text->wmode);
fz_trace_color(colorspace, color, alpha);
fz_trace_matrix(fz_concat(ctm, text->trm));
printf(">\n");
fz_debug_text(text, 0);
printf("</stroke_text>\n");
}
 
static void
fz_trace_clip_text(void *user, fz_text *text, fz_matrix ctm, int accumulate)
{
printf("<clip_text font=\"%s\" wmode=\"%d\" ", text->font->name, text->wmode);
printf("accumulate=\"%d\" ", accumulate);
fz_trace_matrix(fz_concat(ctm, text->trm));
printf(">\n");
fz_debug_text(text, 0);
printf("</clip_text>\n");
}
 
static void
fz_trace_clip_stroke_text(void *user, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm)
{
printf("<clip_stroke_text font=\"%s\" wmode=\"%d\" ", text->font->name, text->wmode);
fz_trace_matrix(fz_concat(ctm, text->trm));
printf(">\n");
fz_debug_text(text, 0);
printf("</clip_stroke_text>\n");
}
 
static void
fz_trace_ignore_text(void *user, fz_text *text, fz_matrix ctm)
{
printf("<ignore_text font=\"%s\" wmode=\"%d\" ", text->font->name, text->wmode);
fz_trace_matrix(fz_concat(ctm, text->trm));
printf(">\n");
fz_debug_text(text, 0);
printf("</ignore_text>\n");
}
 
static void
fz_trace_fill_image(void *user, fz_pixmap *image, fz_matrix ctm, float alpha)
{
printf("<fill_image alpha=\"%g\" ", alpha);
fz_trace_matrix(ctm);
printf("/>\n");
}
 
static void
fz_trace_fill_shade(void *user, fz_shade *shade, fz_matrix ctm, float alpha)
{
printf("<fill_shade alpha=\"%g\" ", alpha);
fz_trace_matrix(ctm);
printf("/>\n");
}
 
static void
fz_trace_fill_image_mask(void *user, fz_pixmap *image, fz_matrix ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
printf("<fill_image_mask ");
fz_trace_matrix(ctm);
fz_trace_color(colorspace, color, alpha);
printf("/>\n");
}
 
static void
fz_trace_clip_image_mask(void *user, fz_pixmap *image, fz_rect *rect, fz_matrix ctm)
{
printf("<clip_image_mask ");
fz_trace_matrix(ctm);
printf("/>\n");
}
 
static void
fz_trace_pop_clip(void *user)
{
printf("<pop_clip />\n");
}
 
static void
fz_trace_begin_mask(void *user, fz_rect bbox, int luminosity, fz_colorspace *colorspace, float *color)
{
printf("<mask bbox=\"%g %g %g %g\" s=\"%s\" ",
bbox.x0, bbox.y0, bbox.x1, bbox.y1,
luminosity ? "luminosity" : "alpha");
// fz_trace_color(colorspace, color, 1);
printf(">\n");
}
 
static void
fz_trace_end_mask(void *user)
{
printf("</mask>\n");
}
 
static void
fz_trace_begin_group(void *user, fz_rect bbox, int isolated, int knockout, int blendmode, float alpha)
{
printf("<group bbox=\"%g %g %g %g\" isolated=\"%d\" knockout=\"%d\" blendmode=\"%s\" alpha=\"%g\">\n",
bbox.x0, bbox.y0, bbox.x1, bbox.y1,
isolated, knockout, fz_blendmode_name(blendmode), alpha);
}
 
static void
fz_trace_end_group(void *user)
{
printf("</group>\n");
}
 
static void
fz_trace_begin_tile(void *user, fz_rect area, fz_rect view, float xstep, float ystep, fz_matrix ctm)
{
printf("<tile ");
printf("area=\"%g %g %g %g\" ", area.x0, area.y0, area.x1, area.y1);
printf("view=\"%g %g %g %g\" ", view.x0, view.y0, view.x1, view.y1);
printf("xstep=\"%g\" ystep=\"%g\" ", xstep, ystep);
fz_trace_matrix(ctm);
printf(">\n");
}
 
static void
fz_trace_end_tile(void *user)
{
printf("</tile>\n");
}
 
fz_device *fz_new_trace_device(void)
{
fz_device *dev = fz_new_device(NULL);
 
dev->fill_path = fz_trace_fill_path;
dev->stroke_path = fz_trace_stroke_path;
dev->clip_path = fz_trace_clip_path;
dev->clip_stroke_path = fz_trace_clip_stroke_path;
 
dev->fill_text = fz_trace_fill_text;
dev->stroke_text = fz_trace_stroke_text;
dev->clip_text = fz_trace_clip_text;
dev->clip_stroke_text = fz_trace_clip_stroke_text;
dev->ignore_text = fz_trace_ignore_text;
 
dev->fill_shade = fz_trace_fill_shade;
dev->fill_image = fz_trace_fill_image;
dev->fill_image_mask = fz_trace_fill_image_mask;
dev->clip_image_mask = fz_trace_clip_image_mask;
 
dev->pop_clip = fz_trace_pop_clip;
 
dev->begin_mask = fz_trace_begin_mask;
dev->end_mask = fz_trace_end_mask;
dev->begin_group = fz_trace_begin_group;
dev->end_group = fz_trace_end_group;
 
dev->begin_tile = fz_trace_begin_tile;
dev->end_tile = fz_trace_end_tile;
 
return dev;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/filt_basic.c
0,0 → 1,504
#include "fitz.h"
 
/* Pretend we have a filter that just copies data forever */
 
fz_stream *
fz_open_copy(fz_stream *chain)
{
return fz_keep_stream(chain);
}
 
/* Null filter copies a specified amount of data */
 
struct null_filter
{
fz_stream *chain;
int remain;
};
 
static int
read_null(fz_stream *stm, unsigned char *buf, int len)
{
struct null_filter *state = stm->state;
int amount = MIN(len, state->remain);
int n = fz_read(state->chain, buf, amount);
if (n < 0)
return fz_rethrow(n, "read error in null filter");
state->remain -= n;
return n;
}
 
static void
close_null(fz_stream *stm)
{
struct null_filter *state = stm->state;
fz_close(state->chain);
fz_free(state);
}
 
fz_stream *
fz_open_null(fz_stream *chain, int len)
{
struct null_filter *state;
 
state = fz_malloc(sizeof(struct null_filter));
state->chain = chain;
state->remain = len;
 
return fz_new_stream(state, read_null, close_null);
}
 
/* ASCII Hex Decode */
 
typedef struct fz_ahxd_s fz_ahxd;
 
struct fz_ahxd_s
{
fz_stream *chain;
int eod;
};
 
static inline int iswhite(int a)
{
switch (a) {
case '\n': case '\r': case '\t': case ' ':
case '\0': case '\f': case '\b': case 0177:
return 1;
}
return 0;
}
 
static inline int ishex(int a)
{
return (a >= 'A' && a <= 'F') ||
(a >= 'a' && a <= 'f') ||
(a >= '0' && a <= '9');
}
 
static inline int unhex(int a)
{
if (a >= 'A' && a <= 'F') return a - 'A' + 0xA;
if (a >= 'a' && a <= 'f') return a - 'a' + 0xA;
if (a >= '0' && a <= '9') return a - '0';
return 0;
}
 
static int
read_ahxd(fz_stream *stm, unsigned char *buf, int len)
{
fz_ahxd *state = stm->state;
unsigned char *p = buf;
unsigned char *ep = buf + len;
int a, b, c, odd;
 
odd = 0;
 
while (p < ep)
{
if (state->eod)
return p - buf;
 
c = fz_read_byte(state->chain);
if (c < 0)
return p - buf;
 
if (ishex(c))
{
if (!odd)
{
a = unhex(c);
odd = 1;
}
else
{
b = unhex(c);
*p++ = (a << 4) | b;
odd = 0;
}
}
else if (c == '>')
{
if (odd)
*p++ = (a << 4);
state->eod = 1;
}
else if (!iswhite(c))
{
return fz_throw("bad data in ahxd: '%c'", c);
}
}
 
return p - buf;
}
 
static void
close_ahxd(fz_stream *stm)
{
fz_ahxd *state = stm->state;
fz_close(state->chain);
fz_free(state);
}
 
fz_stream *
fz_open_ahxd(fz_stream *chain)
{
fz_ahxd *state;
 
state = fz_malloc(sizeof(fz_ahxd));
state->chain = chain;
state->eod = 0;
 
return fz_new_stream(state, read_ahxd, close_ahxd);
}
 
/* ASCII 85 Decode */
 
typedef struct fz_a85d_s fz_a85d;
 
struct fz_a85d_s
{
fz_stream *chain;
unsigned char bp[4];
unsigned char *rp, *wp;
int eod;
};
 
static int
read_a85d(fz_stream *stm, unsigned char *buf, int len)
{
fz_a85d *state = stm->state;
unsigned char *p = buf;
unsigned char *ep = buf + len;
int count = 0;
int word = 0;
int c;
 
while (state->rp < state->wp && p < ep)
*p++ = *state->rp++;
 
while (p < ep)
{
if (state->eod)
return p - buf;
 
c = fz_read_byte(state->chain);
if (c < 0)
return p - buf;
 
if (c >= '!' && c <= 'u')
{
if (count == 4)
{
word = word * 85 + (c - '!');
 
state->bp[0] = (word >> 24) & 0xff;
state->bp[1] = (word >> 16) & 0xff;
state->bp[2] = (word >> 8) & 0xff;
state->bp[3] = (word) & 0xff;
state->rp = state->bp;
state->wp = state->bp + 4;
 
word = 0;
count = 0;
}
else
{
word = word * 85 + (c - '!');
count ++;
}
}
 
else if (c == 'z' && count == 0)
{
state->bp[0] = 0;
state->bp[1] = 0;
state->bp[2] = 0;
state->bp[3] = 0;
state->rp = state->bp;
state->wp = state->bp + 4;
}
 
else if (c == '~')
{
c = fz_read_byte(state->chain);
if (c != '>')
fz_warn("bad eod marker in a85d");
 
switch (count) {
case 0:
break;
case 1:
return fz_throw("partial final byte in a85d");
case 2:
word = word * (85 * 85 * 85) + 0xffffff;
state->bp[0] = word >> 24;
state->rp = state->bp;
state->wp = state->bp + 1;
break;
case 3:
word = word * (85 * 85) + 0xffff;
state->bp[0] = word >> 24;
state->bp[1] = word >> 16;
state->rp = state->bp;
state->wp = state->bp + 2;
break;
case 4:
word = word * 85 + 0xff;
state->bp[0] = word >> 24;
state->bp[1] = word >> 16;
state->bp[2] = word >> 8;
state->rp = state->bp;
state->wp = state->bp + 3;
break;
}
state->eod = 1;
}
 
else if (!iswhite(c))
{
return fz_throw("bad data in a85d: '%c'", c);
}
 
while (state->rp < state->wp && p < ep)
*p++ = *state->rp++;
}
 
return p - buf;
}
 
static void
close_a85d(fz_stream *stm)
{
fz_a85d *state = stm->state;
fz_close(state->chain);
fz_free(state);
}
 
fz_stream *
fz_open_a85d(fz_stream *chain)
{
fz_a85d *state;
 
state = fz_malloc(sizeof(fz_a85d));
state->chain = chain;
state->rp = state->bp;
state->wp = state->bp;
state->eod = 0;
 
return fz_new_stream(state, read_a85d, close_a85d);
}
 
/* Run Length Decode */
 
typedef struct fz_rld_s fz_rld;
 
struct fz_rld_s
{
fz_stream *chain;
int run, n, c;
};
 
static int
read_rld(fz_stream *stm, unsigned char *buf, int len)
{
fz_rld *state = stm->state;
unsigned char *p = buf;
unsigned char *ep = buf + len;
 
while (p < ep)
{
if (state->run == 128)
return p - buf;
 
if (state->n == 0)
{
state->run = fz_read_byte(state->chain);
if (state->run < 0)
state->run = 128;
if (state->run < 128)
state->n = state->run + 1;
if (state->run > 128)
{
state->n = 257 - state->run;
state->c = fz_read_byte(state->chain);
if (state->c < 0)
return fz_throw("premature end of data in run length decode");
}
}
 
if (state->run < 128)
{
while (p < ep && state->n)
{
int c = fz_read_byte(state->chain);
if (c < 0)
return fz_throw("premature end of data in run length decode");
*p++ = c;
state->n--;
}
}
 
if (state->run > 128)
{
while (p < ep && state->n)
{
*p++ = state->c;
state->n--;
}
}
}
 
return p - buf;
}
 
static void
close_rld(fz_stream *stm)
{
fz_rld *state = stm->state;
fz_close(state->chain);
fz_free(state);
}
 
fz_stream *
fz_open_rld(fz_stream *chain)
{
fz_rld *state;
 
state = fz_malloc(sizeof(fz_rld));
state->chain = chain;
state->run = 0;
state->n = 0;
state->c = 0;
 
return fz_new_stream(state, read_rld, close_rld);
}
 
/* RC4 Filter */
 
typedef struct fz_arc4c_s fz_arc4c;
 
struct fz_arc4c_s
{
fz_stream *chain;
fz_arc4 arc4;
};
 
static int
read_arc4(fz_stream *stm, unsigned char *buf, int len)
{
fz_arc4c *state = stm->state;
int n;
 
n = fz_read(state->chain, buf, len);
if (n < 0)
return fz_rethrow(n, "read error in arc4 filter");
 
fz_arc4_encrypt(&state->arc4, buf, buf, n);
 
return n;
}
 
static void
close_arc4(fz_stream *stm)
{
fz_arc4c *state = stm->state;
fz_close(state->chain);
fz_free(state);
}
 
fz_stream *
fz_open_arc4(fz_stream *chain, unsigned char *key, unsigned keylen)
{
fz_arc4c *state;
 
state = fz_malloc(sizeof(fz_arc4c));
state->chain = chain;
fz_arc4_init(&state->arc4, key, keylen);
 
return fz_new_stream(state, read_arc4, close_arc4);
}
 
/* AES Filter */
 
typedef struct fz_aesd_s fz_aesd;
 
struct fz_aesd_s
{
fz_stream *chain;
fz_aes aes;
unsigned char iv[16];
int ivcount;
unsigned char bp[16];
unsigned char *rp, *wp;
};
 
static int
read_aesd(fz_stream *stm, unsigned char *buf, int len)
{
fz_aesd *state = stm->state;
unsigned char *p = buf;
unsigned char *ep = buf + len;
 
while (state->ivcount < 16)
{
int c = fz_read_byte(state->chain);
if (c < 0)
return fz_throw("premature end in aes filter");
state->iv[state->ivcount++] = c;
}
 
while (state->rp < state->wp && p < ep)
*p++ = *state->rp++;
 
while (p < ep)
{
int n = fz_read(state->chain, state->bp, 16);
if (n < 0)
return fz_rethrow(n, "read error in aes filter");
else if (n == 0)
return p - buf;
else if (n < 16)
return fz_throw("partial block in aes filter");
 
aes_crypt_cbc(&state->aes, AES_DECRYPT, 16, state->iv, state->bp, state->bp);
state->rp = state->bp;
state->wp = state->bp + 16;
 
/* strip padding at end of file */
if (fz_is_eof(state->chain))
{
int pad = state->bp[15];
if (pad < 1 || pad > 16)
return fz_throw("aes padding out of range: %d", pad);
state->wp -= pad;
}
 
while (state->rp < state->wp && p < ep)
*p++ = *state->rp++;
}
 
return p - buf;
}
 
static void
close_aesd(fz_stream *stm)
{
fz_aesd *state = stm->state;
fz_close(state->chain);
fz_free(state);
}
 
fz_stream *
fz_open_aesd(fz_stream *chain, unsigned char *key, unsigned keylen)
{
fz_aesd *state;
 
state = fz_malloc(sizeof(fz_aesd));
state->chain = chain;
aes_setkey_dec(&state->aes, key, keylen * 8);
state->ivcount = 0;
state->rp = state->bp;
state->wp = state->bp;
 
return fz_new_stream(state, read_aesd, close_aesd);
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/filt_dctd.c
0,0 → 1,221
#include "fitz.h"
 
#include <jpeglib.h>
#include <setjmp.h>
 
typedef struct fz_dctd_s fz_dctd;
 
struct fz_dctd_s
{
fz_stream *chain;
int color_transform;
int init;
int stride;
unsigned char *scanline;
unsigned char *rp, *wp;
struct jpeg_decompress_struct cinfo;
struct jpeg_source_mgr srcmgr;
struct jpeg_error_mgr errmgr;
jmp_buf jb;
char msg[JMSG_LENGTH_MAX];
};
 
static void error_exit(j_common_ptr cinfo)
{
fz_dctd *state = cinfo->client_data;
cinfo->err->format_message(cinfo, state->msg);
longjmp(state->jb, 1);
}
 
static void init_source(j_decompress_ptr cinfo)
{
/* nothing to do */
}
 
static void term_source(j_decompress_ptr cinfo)
{
/* nothing to do */
}
 
static boolean fill_input_buffer(j_decompress_ptr cinfo)
{
struct jpeg_source_mgr *src = cinfo->src;
fz_dctd *state = cinfo->client_data;
fz_stream *chain = state->chain;
 
chain->rp = chain->wp;
fz_fill_buffer(chain);
src->next_input_byte = chain->rp;
src->bytes_in_buffer = chain->wp - chain->rp;
 
if (src->bytes_in_buffer == 0)
{
static unsigned char eoi[2] = { 0xFF, JPEG_EOI };
fz_warn("premature end of file in jpeg");
src->next_input_byte = eoi;
src->bytes_in_buffer = 2;
}
 
return 1;
}
 
static void skip_input_data(j_decompress_ptr cinfo, long num_bytes)
{
struct jpeg_source_mgr *src = cinfo->src;
if (num_bytes > 0)
{
while ((size_t)num_bytes > src->bytes_in_buffer)
{
num_bytes -= src->bytes_in_buffer;
(void) src->fill_input_buffer(cinfo);
}
src->next_input_byte += num_bytes;
src->bytes_in_buffer -= num_bytes;
}
}
 
static int
read_dctd(fz_stream *stm, unsigned char *buf, int len)
{
fz_dctd *state = stm->state;
j_decompress_ptr cinfo = &state->cinfo;
unsigned char *p = buf;
unsigned char *ep = buf + len;
 
if (setjmp(state->jb))
{
if (cinfo->src)
state->chain->rp = state->chain->wp - cinfo->src->bytes_in_buffer;
return fz_throw("jpeg error: %s", state->msg);
}
 
if (!state->init)
{
cinfo->client_data = state;
cinfo->err = &state->errmgr;
jpeg_std_error(cinfo->err);
cinfo->err->error_exit = error_exit;
jpeg_create_decompress(cinfo);
 
cinfo->src = &state->srcmgr;
cinfo->src->init_source = init_source;
cinfo->src->fill_input_buffer = fill_input_buffer;
cinfo->src->skip_input_data = skip_input_data;
cinfo->src->resync_to_restart = jpeg_resync_to_restart;
cinfo->src->term_source = term_source;
cinfo->src->next_input_byte = state->chain->rp;
cinfo->src->bytes_in_buffer = state->chain->wp - state->chain->rp;
 
jpeg_read_header(cinfo, 1);
 
/* speed up jpeg decoding a bit */
cinfo->dct_method = JDCT_FASTEST;
cinfo->do_fancy_upsampling = FALSE;
 
/* default value if ColorTransform is not set */
if (state->color_transform == -1)
{
if (state->cinfo.num_components == 3)
state->color_transform = 1;
else
state->color_transform = 0;
}
 
if (cinfo->saw_Adobe_marker)
state->color_transform = cinfo->Adobe_transform;
 
/* Guess the input colorspace, and set output colorspace accordingly */
switch (cinfo->num_components)
{
case 3:
if (state->color_transform)
cinfo->jpeg_color_space = JCS_YCbCr;
else
cinfo->jpeg_color_space = JCS_RGB;
break;
case 4:
if (state->color_transform)
cinfo->jpeg_color_space = JCS_YCCK;
else
cinfo->jpeg_color_space = JCS_CMYK;
break;
}
 
jpeg_start_decompress(cinfo);
 
state->stride = cinfo->output_width * cinfo->output_components;
state->scanline = fz_malloc(state->stride);
state->rp = state->scanline;
state->wp = state->scanline;
 
state->init = 1;
}
 
while (state->rp < state->wp && p < ep)
*p++ = *state->rp++;
 
while (p < ep)
{
if (cinfo->output_scanline == cinfo->output_height)
break;
 
if (p + state->stride <= ep)
{
jpeg_read_scanlines(cinfo, &p, 1);
p += state->stride;
}
else
{
jpeg_read_scanlines(cinfo, &state->scanline, 1);
state->rp = state->scanline;
state->wp = state->scanline + state->stride;
}
 
while (state->rp < state->wp && p < ep)
*p++ = *state->rp++;
}
 
return p - buf;
}
 
static void
close_dctd(fz_stream *stm)
{
fz_dctd *state = stm->state;
 
if (setjmp(state->jb))
{
state->chain->rp = state->chain->wp - state->cinfo.src->bytes_in_buffer;
fz_warn("jpeg error: %s", state->msg);
goto skip;
}
 
if (state->init)
jpeg_finish_decompress(&state->cinfo);
 
skip:
state->chain->rp = state->chain->wp - state->cinfo.src->bytes_in_buffer;
jpeg_destroy_decompress(&state->cinfo);
fz_free(state->scanline);
fz_close(state->chain);
fz_free(state);
}
 
fz_stream *
fz_open_dctd(fz_stream *chain, fz_obj *params)
{
fz_dctd *state;
fz_obj *obj;
 
state = fz_malloc(sizeof(fz_dctd));
memset(state, 0, sizeof(fz_dctd));
state->chain = chain;
state->color_transform = -1; /* unset */
state->init = 0;
 
obj = fz_dict_gets(params, "ColorTransform");
if (obj)
state->color_transform = fz_to_int(obj);
 
return fz_new_stream(state, read_dctd, close_dctd);
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/filt_faxd.c
0,0 → 1,731
#include "fitz.h"
 
/* Fax G3/G4 decoder */
 
/* TODO: uncompressed */
 
/*
<raph> the first 2^(initialbits) entries map bit patterns to decodes
<raph> let's say initial_bits is 8 for the sake of example
<raph> and that the code is 1001
<raph> that means that entries 0x90 .. 0x9f have the entry { val, 4 }
<raph> because those are all the bytes that start with the code
<raph> and the 4 is the length of the code
... if (n_bits > initial_bits) ...
<raph> anyway, in that case, it basically points to a mini table
<raph> the n_bits is the maximum length of all codes beginning with that byte
<raph> so 2^(n_bits - initial_bits) is the size of the mini-table
<raph> peter came up with this, and it makes sense
*/
 
typedef struct cfd_node_s cfd_node;
 
struct cfd_node_s
{
short val;
short nbits;
};
 
enum
{
cfd_white_initial_bits = 8,
cfd_black_initial_bits = 7,
cfd_2d_initial_bits = 7,
cfd_uncompressed_initial_bits = 6 /* must be 6 */
};
 
/* non-run codes in tables */
enum
{
ERROR = -1,
ZEROS = -2, /* EOL follows, possibly with more padding first */
UNCOMPRESSED = -3
};
 
/* semantic codes for cf_2d_decode */
enum
{
P = -4,
H = -5,
VR3 = 0,
VR2 = 1,
VR1 = 2,
V0 = 3,
VL1 = 4,
VL2 = 5,
VL3 = 6
};
 
/* White decoding table. */
const cfd_node cf_white_decode[] = {
{256,12},{272,12},{29,8},{30,8},{45,8},{46,8},{22,7},{22,7},
{23,7},{23,7},{47,8},{48,8},{13,6},{13,6},{13,6},{13,6},{20,7},
{20,7},{33,8},{34,8},{35,8},{36,8},{37,8},{38,8},{19,7},{19,7},
{31,8},{32,8},{1,6},{1,6},{1,6},{1,6},{12,6},{12,6},{12,6},{12,6},
{53,8},{54,8},{26,7},{26,7},{39,8},{40,8},{41,8},{42,8},{43,8},
{44,8},{21,7},{21,7},{28,7},{28,7},{61,8},{62,8},{63,8},{0,8},
{320,8},{384,8},{10,5},{10,5},{10,5},{10,5},{10,5},{10,5},{10,5},
{10,5},{11,5},{11,5},{11,5},{11,5},{11,5},{11,5},{11,5},{11,5},
{27,7},{27,7},{59,8},{60,8},{288,9},{290,9},{18,7},{18,7},{24,7},
{24,7},{49,8},{50,8},{51,8},{52,8},{25,7},{25,7},{55,8},{56,8},
{57,8},{58,8},{192,6},{192,6},{192,6},{192,6},{1664,6},{1664,6},
{1664,6},{1664,6},{448,8},{512,8},{292,9},{640,8},{576,8},{294,9},
{296,9},{298,9},{300,9},{302,9},{256,7},{256,7},{2,4},{2,4},{2,4},
{2,4},{2,4},{2,4},{2,4},{2,4},{2,4},{2,4},{2,4},{2,4},{2,4},{2,4},
{2,4},{2,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},
{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{128,5},{128,5},{128,5},
{128,5},{128,5},{128,5},{128,5},{128,5},{8,5},{8,5},{8,5},{8,5},
{8,5},{8,5},{8,5},{8,5},{9,5},{9,5},{9,5},{9,5},{9,5},{9,5},{9,5},
{9,5},{16,6},{16,6},{16,6},{16,6},{17,6},{17,6},{17,6},{17,6},
{4,4},{4,4},{4,4},{4,4},{4,4},{4,4},{4,4},{4,4},{4,4},{4,4},{4,4},
{4,4},{4,4},{4,4},{4,4},{4,4},{5,4},{5,4},{5,4},{5,4},{5,4},{5,4},
{5,4},{5,4},{5,4},{5,4},{5,4},{5,4},{5,4},{5,4},{5,4},{5,4},
{14,6},{14,6},{14,6},{14,6},{15,6},{15,6},{15,6},{15,6},{64,5},
{64,5},{64,5},{64,5},{64,5},{64,5},{64,5},{64,5},{6,4},{6,4},
{6,4},{6,4},{6,4},{6,4},{6,4},{6,4},{6,4},{6,4},{6,4},{6,4},{6,4},
{6,4},{6,4},{6,4},{7,4},{7,4},{7,4},{7,4},{7,4},{7,4},{7,4},{7,4},
{7,4},{7,4},{7,4},{7,4},{7,4},{7,4},{7,4},{7,4},{-2,3},{-2,3},
{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},
{-1,0},{-1,0},{-1,0},{-1,0},{-3,4},{1792,3},{1792,3},{1984,4},
{2048,4},{2112,4},{2176,4},{2240,4},{2304,4},{1856,3},{1856,3},
{1920,3},{1920,3},{2368,4},{2432,4},{2496,4},{2560,4},{1472,1},
{1536,1},{1600,1},{1728,1},{704,1},{768,1},{832,1},{896,1},
{960,1},{1024,1},{1088,1},{1152,1},{1216,1},{1280,1},{1344,1},
{1408,1}
};
 
/* Black decoding table. */
const cfd_node cf_black_decode[] = {
{128,12},{160,13},{224,12},{256,12},{10,7},{11,7},{288,12},{12,7},
{9,6},{9,6},{8,6},{8,6},{7,5},{7,5},{7,5},{7,5},{6,4},{6,4},{6,4},
{6,4},{6,4},{6,4},{6,4},{6,4},{5,4},{5,4},{5,4},{5,4},{5,4},{5,4},
{5,4},{5,4},{1,3},{1,3},{1,3},{1,3},{1,3},{1,3},{1,3},{1,3},{1,3},
{1,3},{1,3},{1,3},{1,3},{1,3},{1,3},{1,3},{4,3},{4,3},{4,3},{4,3},
{4,3},{4,3},{4,3},{4,3},{4,3},{4,3},{4,3},{4,3},{4,3},{4,3},{4,3},
{4,3},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},
{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},
{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},
{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},
{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},
{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},
{-2,4},{-2,4},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},
{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-3,5},{1792,4},
{1792,4},{1984,5},{2048,5},{2112,5},{2176,5},{2240,5},{2304,5},
{1856,4},{1856,4},{1920,4},{1920,4},{2368,5},{2432,5},{2496,5},
{2560,5},{18,3},{18,3},{18,3},{18,3},{18,3},{18,3},{18,3},{18,3},
{52,5},{52,5},{640,6},{704,6},{768,6},{832,6},{55,5},{55,5},
{56,5},{56,5},{1280,6},{1344,6},{1408,6},{1472,6},{59,5},{59,5},
{60,5},{60,5},{1536,6},{1600,6},{24,4},{24,4},{24,4},{24,4},
{25,4},{25,4},{25,4},{25,4},{1664,6},{1728,6},{320,5},{320,5},
{384,5},{384,5},{448,5},{448,5},{512,6},{576,6},{53,5},{53,5},
{54,5},{54,5},{896,6},{960,6},{1024,6},{1088,6},{1152,6},{1216,6},
{64,3},{64,3},{64,3},{64,3},{64,3},{64,3},{64,3},{64,3},{13,1},
{13,1},{13,1},{13,1},{13,1},{13,1},{13,1},{13,1},{13,1},{13,1},
{13,1},{13,1},{13,1},{13,1},{13,1},{13,1},{23,4},{23,4},{50,5},
{51,5},{44,5},{45,5},{46,5},{47,5},{57,5},{58,5},{61,5},{256,5},
{16,3},{16,3},{16,3},{16,3},{17,3},{17,3},{17,3},{17,3},{48,5},
{49,5},{62,5},{63,5},{30,5},{31,5},{32,5},{33,5},{40,5},{41,5},
{22,4},{22,4},{14,1},{14,1},{14,1},{14,1},{14,1},{14,1},{14,1},
{14,1},{14,1},{14,1},{14,1},{14,1},{14,1},{14,1},{14,1},{14,1},
{15,2},{15,2},{15,2},{15,2},{15,2},{15,2},{15,2},{15,2},{128,5},
{192,5},{26,5},{27,5},{28,5},{29,5},{19,4},{19,4},{20,4},{20,4},
{34,5},{35,5},{36,5},{37,5},{38,5},{39,5},{21,4},{21,4},{42,5},
{43,5},{0,3},{0,3},{0,3},{0,3}
};
 
/* 2-D decoding table. */
const cfd_node cf_2d_decode[] = {
{128,11},{144,10},{6,7},{0,7},{5,6},{5,6},{1,6},{1,6},{-4,4},
{-4,4},{-4,4},{-4,4},{-4,4},{-4,4},{-4,4},{-4,4},{-5,3},{-5,3},
{-5,3},{-5,3},{-5,3},{-5,3},{-5,3},{-5,3},{-5,3},{-5,3},{-5,3},
{-5,3},{-5,3},{-5,3},{-5,3},{-5,3},{4,3},{4,3},{4,3},{4,3},{4,3},
{4,3},{4,3},{4,3},{4,3},{4,3},{4,3},{4,3},{4,3},{4,3},{4,3},{4,3},
{2,3},{2,3},{2,3},{2,3},{2,3},{2,3},{2,3},{2,3},{2,3},{2,3},{2,3},
{2,3},{2,3},{2,3},{2,3},{2,3},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},
{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},
{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},
{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},
{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},
{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},
{3,1},{3,1},{3,1},{-2,4},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},
{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},
{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-3,3}
};
 
/* Uncompresssed decoding table. */
const cfd_node cf_uncompressed_decode[] = {
{64,12},{5,6},{4,5},{4,5},{3,4},{3,4},{3,4},{3,4},{2,3},{2,3},
{2,3},{2,3},{2,3},{2,3},{2,3},{2,3},{1,2},{1,2},{1,2},{1,2},{1,2},
{1,2},{1,2},{1,2},{1,2},{1,2},{1,2},{1,2},{1,2},{1,2},{1,2},{1,2},
{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},
{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},
{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},
{-1,0},{-1,0},{8,6},{9,6},{6,5},{6,5},{7,5},{7,5},{4,4},{4,4},
{4,4},{4,4},{5,4},{5,4},{5,4},{5,4},{2,3},{2,3},{2,3},{2,3},{2,3},
{2,3},{2,3},{2,3},{3,3},{3,3},{3,3},{3,3},{3,3},{3,3},{3,3},{3,3},
{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},
{0,2},{0,2},{0,2},{0,2},{0,2},{1,2},{1,2},{1,2},{1,2},{1,2},{1,2},
{1,2},{1,2},{1,2},{1,2},{1,2},{1,2},{1,2},{1,2},{1,2},{1,2}
};
 
/* bit magic */
 
static inline int getbit(const unsigned char *buf, int x)
{
return ( buf[x >> 3] >> ( 7 - (x & 7) ) ) & 1;
}
 
static int
find_changing(const unsigned char *line, int x, int w)
{
int a, b;
 
if (!line)
return w;
 
if (x == -1)
{
a = 0;
x = 0;
}
else
{
a = getbit(line, x);
x++;
}
 
while (x < w)
{
b = getbit(line, x);
if (a != b)
break;
x++;
}
 
return x;
}
 
static int
find_changing_color(const unsigned char *line, int x, int w, int color)
{
if (!line)
return w;
 
x = find_changing(line, x, w);
 
if (x < w && getbit(line, x) != color)
x = find_changing(line, x, w);
 
return x;
}
 
static const unsigned char lm[8] = {
0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01
};
 
static const unsigned char rm[8] = {
0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE
};
 
static inline void setbits(unsigned char *line, int x0, int x1)
{
int a0, a1, b0, b1, a;
 
a0 = x0 >> 3;
a1 = x1 >> 3;
 
b0 = x0 & 7;
b1 = x1 & 7;
 
if (a0 == a1)
{
if (b1)
line[a0] |= lm[b0] & rm[b1];
}
else
{
line[a0] |= lm[b0];
for (a = a0 + 1; a < a1; a++)
line[a] = 0xFF;
if (b1)
line[a1] |= rm[b1];
}
}
 
typedef struct fz_faxd_s fz_faxd;
 
enum
{
STATE_NORMAL, /* neutral state, waiting for any code */
STATE_MAKEUP, /* got a 1d makeup code, waiting for terminating code */
STATE_EOL, /* at eol, needs output buffer space */
STATE_H1, STATE_H2, /* in H part 1 and 2 (both makeup and terminating codes) */
STATE_DONE /* all done */
};
 
struct fz_faxd_s
{
fz_stream *chain;
 
int k;
int end_of_line;
int encoded_byte_align;
int columns;
int rows;
int end_of_block;
int black_is_1;
 
int stride;
int ridx;
 
int bidx;
unsigned int word;
 
int stage;
 
int a, c, dim, eolc;
unsigned char *ref;
unsigned char *dst;
unsigned char *rp, *wp;
};
 
static inline void eat_bits(fz_faxd *fax, int nbits)
{
fax->word <<= nbits;
fax->bidx += nbits;
}
 
static int
fill_bits(fz_faxd *fax)
{
while (fax->bidx >= 8)
{
int c = fz_read_byte(fax->chain);
if (c == EOF)
return EOF;
fax->bidx -= 8;
fax->word |= c << fax->bidx;
}
return 0;
}
 
static int
get_code(fz_faxd *fax, const cfd_node *table, int initialbits)
{
unsigned int word = fax->word;
int tidx = word >> (32 - initialbits);
int val = table[tidx].val;
int nbits = table[tidx].nbits;
 
if (nbits > initialbits)
{
int mask = (1 << (32 - initialbits)) - 1;
tidx = val + ((word & mask) >> (32 - nbits));
val = table[tidx].val;
nbits = initialbits + table[tidx].nbits;
}
 
eat_bits(fax, nbits);
 
return val;
}
 
/* decode one 1d code */
static fz_error
dec1d(fz_faxd *fax)
{
int code;
 
if (fax->a == -1)
fax->a = 0;
 
if (fax->c)
code = get_code(fax, cf_black_decode, cfd_black_initial_bits);
else
code = get_code(fax, cf_white_decode, cfd_white_initial_bits);
 
if (code == UNCOMPRESSED)
return fz_throw("uncompressed data in faxd");
 
if (code < 0)
return fz_throw("negative code in 1d faxd");
 
if (fax->a + code > fax->columns)
return fz_throw("overflow in 1d faxd");
 
if (fax->c)
setbits(fax->dst, fax->a, fax->a + code);
 
fax->a += code;
 
if (code < 64)
{
fax->c = !fax->c;
fax->stage = STATE_NORMAL;
}
else
fax->stage = STATE_MAKEUP;
 
return fz_okay;
}
 
/* decode one 2d code */
static fz_error
dec2d(fz_faxd *fax)
{
int code, b1, b2;
 
if (fax->stage == STATE_H1 || fax->stage == STATE_H2)
{
if (fax->a == -1)
fax->a = 0;
 
if (fax->c)
code = get_code(fax, cf_black_decode, cfd_black_initial_bits);
else
code = get_code(fax, cf_white_decode, cfd_white_initial_bits);
 
if (code == UNCOMPRESSED)
return fz_throw("uncompressed data in faxd");
 
if (code < 0)
return fz_throw("negative code in 2d faxd");
 
if (fax->a + code > fax->columns)
return fz_throw("overflow in 2d faxd");
 
if (fax->c)
setbits(fax->dst, fax->a, fax->a + code);
 
fax->a += code;
 
if (code < 64)
{
fax->c = !fax->c;
if (fax->stage == STATE_H1)
fax->stage = STATE_H2;
else if (fax->stage == STATE_H2)
fax->stage = STATE_NORMAL;
}
 
return fz_okay;
}
 
code = get_code(fax, cf_2d_decode, cfd_2d_initial_bits);
 
switch (code)
{
case H:
fax->stage = STATE_H1;
break;
 
case P:
b1 = find_changing_color(fax->ref, fax->a, fax->columns, !fax->c);
if (b1 >= fax->columns)
b2 = fax->columns;
else
b2 = find_changing(fax->ref, b1, fax->columns);
if (fax->c) setbits(fax->dst, fax->a, b2);
fax->a = b2;
break;
 
case V0:
b1 = find_changing_color(fax->ref, fax->a, fax->columns, !fax->c);
if (fax->c) setbits(fax->dst, fax->a, b1);
fax->a = b1;
fax->c = !fax->c;
break;
 
case VR1:
b1 = 1 + find_changing_color(fax->ref, fax->a, fax->columns, !fax->c);
if (b1 >= fax->columns) b1 = fax->columns;
if (fax->c) setbits(fax->dst, fax->a, b1);
fax->a = b1;
fax->c = !fax->c;
break;
 
case VR2:
b1 = 2 + find_changing_color(fax->ref, fax->a, fax->columns, !fax->c);
if (b1 >= fax->columns) b1 = fax->columns;
if (fax->c) setbits(fax->dst, fax->a, b1);
fax->a = b1;
fax->c = !fax->c;
break;
 
case VR3:
b1 = 3 + find_changing_color(fax->ref, fax->a, fax->columns, !fax->c);
if (b1 >= fax->columns) b1 = fax->columns;
if (fax->c) setbits(fax->dst, fax->a, b1);
fax->a = b1;
fax->c = !fax->c;
break;
 
case VL1:
b1 = -1 + find_changing_color(fax->ref, fax->a, fax->columns, !fax->c);
if (b1 < 0) b1 = 0;
if (fax->c) setbits(fax->dst, fax->a, b1);
fax->a = b1;
fax->c = !fax->c;
break;
 
case VL2:
b1 = -2 + find_changing_color(fax->ref, fax->a, fax->columns, !fax->c);
if (b1 < 0) b1 = 0;
if (fax->c) setbits(fax->dst, fax->a, b1);
fax->a = b1;
fax->c = !fax->c;
break;
 
case VL3:
b1 = -3 + find_changing_color(fax->ref, fax->a, fax->columns, !fax->c);
if (b1 < 0) b1 = 0;
if (fax->c) setbits(fax->dst, fax->a, b1);
fax->a = b1;
fax->c = !fax->c;
break;
 
case UNCOMPRESSED:
return fz_throw("uncompressed data in faxd");
 
case ERROR:
return fz_throw("invalid code in 2d faxd");
 
default:
return fz_throw("invalid code in 2d faxd (%d)", code);
}
 
return 0;
}
 
static int
read_faxd(fz_stream *stm, unsigned char *buf, int len)
{
fz_faxd *fax = stm->state;
unsigned char *p = buf;
unsigned char *ep = buf + len;
unsigned char *tmp;
fz_error error;
 
if (fax->stage == STATE_DONE)
return 0;
 
if (fax->stage == STATE_EOL)
goto eol;
 
loop:
 
if (fill_bits(fax))
{
if (fax->bidx > 31)
{
if (fax->a > 0)
goto eol;
goto rtc;
}
}
 
if ((fax->word >> (32 - 12)) == 0)
{
eat_bits(fax, 1);
goto loop;
}
 
if ((fax->word >> (32 - 12)) == 1)
{
eat_bits(fax, 12);
fax->eolc ++;
 
if (fax->k > 0)
{
if (fax->a == -1)
fax->a = 0;
if ((fax->word >> (32 - 1)) == 1)
fax->dim = 1;
else
fax->dim = 2;
eat_bits(fax, 1);
}
}
else if (fax->k > 0 && fax->a == -1)
{
fax->a = 0;
if ((fax->word >> (32 - 1)) == 1)
fax->dim = 1;
else
fax->dim = 2;
eat_bits(fax, 1);
}
else if (fax->dim == 1)
{
fax->eolc = 0;
error = dec1d(fax);
if (error)
return fz_rethrow(error, "cannot decode 1d code");
}
else if (fax->dim == 2)
{
fax->eolc = 0;
error = dec2d(fax);
if (error)
return fz_rethrow(error, "cannot decode 2d code");
}
 
/* no eol check after makeup codes nor in the middle of an H code */
if (fax->stage == STATE_MAKEUP || fax->stage == STATE_H1 || fax->stage == STATE_H2)
goto loop;
 
/* check for eol conditions */
if (fax->eolc || fax->a >= fax->columns)
{
if (fax->a > 0)
goto eol;
if (fax->eolc == (fax->k < 0 ? 2 : 6))
goto rtc;
}
 
goto loop;
 
eol:
fax->stage = STATE_EOL;
 
if (fax->black_is_1)
{
while (fax->rp < fax->wp && p < ep)
*p++ = *fax->rp++;
}
else
{
while (fax->rp < fax->wp && p < ep)
*p++ = *fax->rp++ ^ 0xff;
}
 
if (fax->rp < fax->wp)
return p - buf;
 
tmp = fax->ref;
fax->ref = fax->dst;
fax->dst = tmp;
memset(fax->dst, 0, fax->stride);
 
fax->rp = fax->dst;
fax->wp = fax->dst + fax->stride;
 
fax->stage = STATE_NORMAL;
fax->c = 0;
fax->a = -1;
fax->ridx ++;
 
if (!fax->end_of_block && fax->rows)
{
if (fax->ridx >= fax->rows)
goto rtc;
}
 
/* we have not read dim from eol, make a guess */
if (fax->k > 0 && !fax->eolc && fax->a == -1)
{
if (fax->ridx % fax->k == 0)
fax->dim = 1;
else
fax->dim = 2;
}
 
/* if end_of_line & encoded_byte_align, EOLs are *not* optional */
if (fax->encoded_byte_align)
{
if (fax->end_of_line)
eat_bits(fax, (12 - fax->bidx) & 7);
else
eat_bits(fax, (8 - fax->bidx) & 7);
}
 
/* no more space in output, don't decode the next row yet */
if (p == buf + len)
return p - buf;
 
goto loop;
 
rtc:
fax->stage = STATE_DONE;
return p - buf;
}
 
static void
close_faxd(fz_stream *stm)
{
fz_faxd *fax = stm->state;
int i;
 
/* if we read any extra bytes, try to put them back */
i = (32 - fax->bidx) / 8;
while (i--)
fz_unread_byte(fax->chain);
 
fz_close(fax->chain);
fz_free(fax->ref);
fz_free(fax->dst);
fz_free(fax);
}
 
fz_stream *
fz_open_faxd(fz_stream *chain, fz_obj *params)
{
fz_faxd *fax;
fz_obj *obj;
 
fax = fz_malloc(sizeof(fz_faxd));
fax->chain = chain;
 
fax->ref = NULL;
fax->dst = NULL;
 
fax->k = 0;
fax->end_of_line = 0;
fax->encoded_byte_align = 0;
fax->columns = 1728;
fax->rows = 0;
fax->end_of_block = 1;
fax->black_is_1 = 0;
 
obj = fz_dict_gets(params, "K");
if (obj) fax->k = fz_to_int(obj);
 
obj = fz_dict_gets(params, "EndOfLine");
if (obj) fax->end_of_line = fz_to_bool(obj);
 
obj = fz_dict_gets(params, "EncodedByteAlign");
if (obj) fax->encoded_byte_align = fz_to_bool(obj);
 
obj = fz_dict_gets(params, "Columns");
if (obj) fax->columns = fz_to_int(obj);
 
obj = fz_dict_gets(params, "Rows");
if (obj) fax->rows = fz_to_int(obj);
 
obj = fz_dict_gets(params, "EndOfBlock");
if (obj) fax->end_of_block = fz_to_bool(obj);
 
obj = fz_dict_gets(params, "BlackIs1");
if (obj) fax->black_is_1 = fz_to_bool(obj);
 
fax->stride = ((fax->columns - 1) >> 3) + 1;
fax->ridx = 0;
fax->bidx = 32;
fax->word = 0;
 
fax->stage = STATE_NORMAL;
fax->a = -1;
fax->c = 0;
fax->dim = fax->k < 0 ? 2 : 1;
fax->eolc = 0;
 
fax->ref = fz_malloc(fax->stride);
fax->dst = fz_malloc(fax->stride);
fax->rp = fax->dst;
fax->wp = fax->dst + fax->stride;
 
memset(fax->ref, 0, fax->stride);
memset(fax->dst, 0, fax->stride);
 
return fz_new_stream(fax, read_faxd, close_faxd);
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/filt_flate.c
0,0 → 1,103
#include "fitz.h"
 
#include <zlib.h>
 
typedef struct fz_flate_s fz_flate;
 
struct fz_flate_s
{
fz_stream *chain;
z_stream z;
};
 
static void *zalloc(void *opaque, unsigned int items, unsigned int size)
{
return fz_calloc(items, size);
}
 
static void zfree(void *opaque, void *ptr)
{
fz_free(ptr);
}
 
static int
read_flated(fz_stream *stm, unsigned char *outbuf, int outlen)
{
fz_flate *state = stm->state;
fz_stream *chain = state->chain;
z_streamp zp = &state->z;
int code;
 
zp->next_out = outbuf;
zp->avail_out = outlen;
 
while (zp->avail_out > 0)
{
if (chain->rp == chain->wp)
fz_fill_buffer(chain);
 
zp->next_in = chain->rp;
zp->avail_in = chain->wp - chain->rp;
 
code = inflate(zp, Z_SYNC_FLUSH);
 
chain->rp = chain->wp - zp->avail_in;
 
if (code == Z_STREAM_END)
{
return outlen - zp->avail_out;
}
else if (code == Z_BUF_ERROR)
{
fz_warn("premature end of data in flate filter");
return outlen - zp->avail_out;
}
else if (code == Z_DATA_ERROR && zp->avail_in == 0)
{
fz_warn("ignoring zlib error: %s", zp->msg);
return outlen - zp->avail_out;
}
else if (code != Z_OK)
{
return fz_throw("zlib error: %s", zp->msg);
}
}
 
return outlen - zp->avail_out;
}
 
static void
close_flated(fz_stream *stm)
{
fz_flate *state = stm->state;
int code;
 
code = inflateEnd(&state->z);
if (code != Z_OK)
fz_warn("zlib error: inflateEnd: %s", state->z.msg);
 
fz_close(state->chain);
fz_free(state);
}
 
fz_stream *
fz_open_flated(fz_stream *chain)
{
fz_flate *state;
int code;
 
state = fz_malloc(sizeof(fz_flate));
state->chain = chain;
 
state->z.zalloc = zalloc;
state->z.zfree = zfree;
state->z.opaque = NULL;
state->z.next_in = NULL;
state->z.avail_in = 0;
 
code = inflateInit(&state->z);
if (code != Z_OK)
fz_warn("zlib error: inflateInit: %s", state->z.msg);
 
return fz_new_stream(state, read_flated, close_flated);
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/filt_jbig2d.c
0,0 → 1,103
#include "fitz.h"
 
#ifdef _WIN32 /* Microsoft Visual C++ */
 
typedef signed char int8_t;
typedef short int int16_t;
typedef int int32_t;
typedef __int64 int64_t;
 
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
 
#else
#include <inttypes.h>
#endif
 
#include <jbig2.h>
 
typedef struct fz_jbig2d_s fz_jbig2d;
 
struct fz_jbig2d_s
{
fz_stream *chain;
Jbig2Ctx *ctx;
Jbig2GlobalCtx *gctx;
Jbig2Image *page;
int idx;
};
 
static void
close_jbig2d(fz_stream *stm)
{
fz_jbig2d *state = stm->state;
if (state->page)
jbig2_release_page(state->ctx, state->page);
if (state->gctx)
jbig2_global_ctx_free(state->gctx);
jbig2_ctx_free(state->ctx);
fz_close(state->chain);
fz_free(state);
}
 
static int
read_jbig2d(fz_stream *stm, unsigned char *buf, int len)
{
fz_jbig2d *state = stm->state;
unsigned char tmp[4096];
unsigned char *p = buf;
unsigned char *ep = buf + len;
unsigned char *s;
int x, w, n;
 
if (!state->page)
{
while (1)
{
n = fz_read(state->chain, tmp, sizeof tmp);
if (n < 0)
return fz_rethrow(n, "read error in jbig2 filter");
if (n == 0)
break;
jbig2_data_in(state->ctx, tmp, n);
}
 
jbig2_complete_page(state->ctx);
 
state->page = jbig2_page_out(state->ctx);
if (!state->page)
return fz_throw("jbig2_page_out failed");
}
 
s = state->page->data;
w = state->page->height * state->page->stride;
x = state->idx;
while (p < ep && x < w)
*p++ = s[x++] ^ 0xff;
state->idx = x;
 
return p - buf;
}
 
fz_stream *
fz_open_jbig2d(fz_stream *chain, fz_buffer *globals)
{
fz_jbig2d *state;
 
state = fz_malloc(sizeof(fz_jbig2d));
state->chain = chain;
state->ctx = jbig2_ctx_new(NULL, JBIG2_OPTIONS_EMBEDDED, NULL, NULL, NULL);
state->gctx = NULL;
state->page = NULL;
state->idx = 0;
 
if (globals)
{
jbig2_data_in(state->ctx, globals->data, globals->len);
state->gctx = jbig2_make_global_ctx(state->ctx);
state->ctx = jbig2_ctx_new(NULL, JBIG2_OPTIONS_EMBEDDED, state->gctx, NULL, NULL);
}
 
return fz_new_stream(state, read_jbig2d, close_jbig2d);
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/filt_jpxd.c
0,0 → 1,153
#include "fitz.h"
 
#define OPJ_STATIC
#include <openjpeg.h>
 
static void fz_opj_error_callback(const char *msg, void *client_data)
{
fprintf(stderr, "openjpeg error: %s", msg);
}
 
static void fz_opj_warning_callback(const char *msg, void *client_data)
{
fprintf(stderr, "openjpeg warning: %s", msg);
}
 
static void fz_opj_info_callback(const char *msg, void *client_data)
{
/* fprintf(stderr, "openjpeg info: %s", msg); */
}
 
fz_error
fz_load_jpx_image(fz_pixmap **imgp, unsigned char *data, int size, fz_colorspace *defcs)
{
fz_pixmap *img;
opj_event_mgr_t evtmgr;
opj_dparameters_t params;
opj_dinfo_t *info;
opj_cio_t *cio;
opj_image_t *jpx;
fz_colorspace *colorspace;
unsigned char *p;
int format;
int a, n, w, h, depth, sgnd;
int x, y, k, v;
 
if (size < 2)
return fz_throw("not enough data to determine image format");
 
/* Check for SOC marker -- if found we have a bare J2K stream */
if (data[0] == 0xFF && data[1] == 0x4F)
format = CODEC_J2K;
else
format = CODEC_JP2;
 
memset(&evtmgr, 0, sizeof(evtmgr));
evtmgr.error_handler = fz_opj_error_callback;
evtmgr.warning_handler = fz_opj_warning_callback;
evtmgr.info_handler = fz_opj_info_callback;
 
opj_set_default_decoder_parameters(&params);
 
info = opj_create_decompress(format);
opj_set_event_mgr((opj_common_ptr)info, &evtmgr, stderr);
opj_setup_decoder(info, &params);
 
cio = opj_cio_open((opj_common_ptr)info, data, size);
 
jpx = opj_decode(info, cio);
 
opj_cio_close(cio);
opj_destroy_decompress(info);
 
if (!jpx)
return fz_throw("opj_decode failed");
 
for (k = 1; k < jpx->numcomps; k++)
{
if (jpx->comps[k].w != jpx->comps[0].w)
return fz_throw("image components have different width");
if (jpx->comps[k].h != jpx->comps[0].h)
return fz_throw("image components have different height");
if (jpx->comps[k].prec != jpx->comps[0].prec)
return fz_throw("image components have different precision");
}
 
n = jpx->numcomps;
w = jpx->comps[0].w;
h = jpx->comps[0].h;
depth = jpx->comps[0].prec;
sgnd = jpx->comps[0].sgnd;
 
if (jpx->color_space == CLRSPC_SRGB && n == 4) { n = 3; a = 1; }
else if (jpx->color_space == CLRSPC_SYCC && n == 4) { n = 3; a = 1; }
else if (n == 2) { n = 1; a = 1; }
else if (n > 4) { n = 4; a = 1; }
else { a = 0; }
 
if (defcs)
{
if (defcs->n == n)
{
colorspace = defcs;
}
else
{
fz_warn("jpx file and dict colorspaces do not match");
defcs = NULL;
}
}
 
if (!defcs)
{
switch (n)
{
case 1: colorspace = fz_device_gray; break;
case 3: colorspace = fz_device_rgb; break;
case 4: colorspace = fz_device_cmyk; break;
}
}
 
img = fz_new_pixmap_with_limit(colorspace, w, h);
if (!img)
{
opj_image_destroy(jpx);
return fz_throw("out of memory");
}
 
p = img->samples;
for (y = 0; y < h; y++)
{
for (x = 0; x < w; x++)
{
for (k = 0; k < n + a; k++)
{
v = jpx->comps[k].data[y * w + x];
if (sgnd)
v = v + (1 << (depth - 1));
if (depth > 8)
v = v >> (depth - 8);
*p++ = v;
}
if (!a)
*p++ = 255;
}
}
 
if (a)
{
if (n == 4)
{
fz_pixmap *tmp = fz_new_pixmap(fz_device_rgb, w, h);
fz_convert_pixmap(img, tmp);
fz_drop_pixmap(img);
img = tmp;
}
fz_premultiply_pixmap(img);
}
 
opj_image_destroy(jpx);
 
*imgp = img;
return fz_okay;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/filt_lzwd.c
0,0 → 1,206
#include "fitz.h"
 
/* TODO: error checking */
 
enum
{
MIN_BITS = 9,
MAX_BITS = 12,
NUM_CODES = (1 << MAX_BITS),
LZW_CLEAR = 256,
LZW_EOD = 257,
LZW_FIRST = 258,
MAX_LENGTH = 4097
};
 
typedef struct lzw_code_s lzw_code;
 
struct lzw_code_s
{
int prev; /* prev code (in string) */
unsigned short length; /* string len, including this token */
unsigned char value; /* data value */
unsigned char first_char; /* first token of string */
};
 
typedef struct fz_lzwd_s fz_lzwd;
 
struct fz_lzwd_s
{
fz_stream *chain;
int eod;
 
int early_change;
 
int code_bits; /* num bits/code */
int code; /* current code */
int old_code; /* previously recognized code */
int next_code; /* next free entry */
 
lzw_code table[NUM_CODES];
 
unsigned char bp[MAX_LENGTH];
unsigned char *rp, *wp;
};
 
static int
read_lzwd(fz_stream *stm, unsigned char *buf, int len)
{
fz_lzwd *lzw = stm->state;
lzw_code *table = lzw->table;
unsigned char *p = buf;
unsigned char *ep = buf + len;
unsigned char *s;
int codelen;
 
int code_bits = lzw->code_bits;
int code = lzw->code;
int old_code = lzw->old_code;
int next_code = lzw->next_code;
 
while (lzw->rp < lzw->wp && p < ep)
*p++ = *lzw->rp++;
 
while (p < ep)
{
if (lzw->eod)
return 0;
 
code = fz_read_bits(lzw->chain, code_bits);
 
if (fz_is_eof_bits(lzw->chain))
{
lzw->eod = 1;
break;
}
 
if (code == LZW_EOD)
{
lzw->eod = 1;
break;
}
 
if (code == LZW_CLEAR)
{
code_bits = MIN_BITS;
next_code = LZW_FIRST;
old_code = -1;
continue;
}
 
/* if stream starts without a clear code, old_code is undefined... */
if (old_code == -1)
{
old_code = code;
}
else
{
/* add new entry to the code table */
table[next_code].prev = old_code;
table[next_code].first_char = table[old_code].first_char;
table[next_code].length = table[old_code].length + 1;
if (code < next_code)
table[next_code].value = table[code].first_char;
else if (code == next_code)
table[next_code].value = table[next_code].first_char;
else
fz_warn("out of range code encountered in lzw decode");
 
next_code ++;
 
if (next_code > (1 << code_bits) - lzw->early_change - 1)
{
code_bits ++;
if (code_bits > MAX_BITS)
code_bits = MAX_BITS; /* FIXME */
}
 
old_code = code;
}
 
/* code maps to a string, copy to output (in reverse...) */
if (code > 255)
{
codelen = table[code].length;
lzw->rp = lzw->bp;
lzw->wp = lzw->bp + codelen;
 
assert(codelen < MAX_LENGTH);
 
s = lzw->wp;
do {
*(--s) = table[code].value;
code = table[code].prev;
} while (code >= 0 && s > lzw->bp);
}
 
/* ... or just a single character */
else
{
lzw->bp[0] = code;
lzw->rp = lzw->bp;
lzw->wp = lzw->bp + 1;
}
 
/* copy to output */
while (lzw->rp < lzw->wp && p < ep)
*p++ = *lzw->rp++;
}
 
lzw->code_bits = code_bits;
lzw->code = code;
lzw->old_code = old_code;
lzw->next_code = next_code;
 
return p - buf;
}
 
static void
close_lzwd(fz_stream *stm)
{
fz_lzwd *lzw = stm->state;
fz_close(lzw->chain);
fz_free(lzw);
}
 
fz_stream *
fz_open_lzwd(fz_stream *chain, fz_obj *params)
{
fz_lzwd *lzw;
fz_obj *obj;
int i;
 
lzw = fz_malloc(sizeof(fz_lzwd));
lzw->chain = chain;
lzw->eod = 0;
lzw->early_change = 1;
 
obj = fz_dict_gets(params, "EarlyChange");
if (obj)
lzw->early_change = !!fz_to_int(obj);
 
for (i = 0; i < 256; i++)
{
lzw->table[i].value = i;
lzw->table[i].first_char = i;
lzw->table[i].length = 1;
lzw->table[i].prev = -1;
}
 
for (i = 256; i < NUM_CODES; i++)
{
lzw->table[i].value = 0;
lzw->table[i].first_char = 0;
lzw->table[i].length = 0;
lzw->table[i].prev = -1;
}
 
lzw->code_bits = MIN_BITS;
lzw->code = -1;
lzw->next_code = LZW_FIRST;
lzw->old_code = -1;
lzw->rp = lzw->bp;
lzw->wp = lzw->bp;
 
return fz_new_stream(lzw, read_lzwd, close_lzwd);
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/filt_predict.c
0,0 → 1,243
#include "fitz.h"
 
/* TODO: check if this works with 16bpp images */
 
enum { MAXC = 32 };
 
typedef struct fz_predict_s fz_predict;
 
struct fz_predict_s
{
fz_stream *chain;
 
int predictor;
int columns;
int colors;
int bpc;
 
int stride;
int bpp;
unsigned char *in;
unsigned char *out;
unsigned char *ref;
unsigned char *rp, *wp;
};
 
static inline int getcomponent(unsigned char *line, int x, int bpc)
{
switch (bpc)
{
case 1: return (line[x >> 3] >> ( 7 - (x & 7) ) ) & 1;
case 2: return (line[x >> 2] >> ( ( 3 - (x & 3) ) << 1 ) ) & 3;
case 4: return (line[x >> 1] >> ( ( 1 - (x & 1) ) << 2 ) ) & 15;
case 8: return line[x];
}
return 0;
}
 
 
static inline void putcomponent(unsigned char *buf, int x, int bpc, int value)
{
switch (bpc)
{
case 1: buf[x >> 3] |= value << (7 - (x & 7)); break;
case 2: buf[x >> 2] |= value << ((3 - (x & 3)) << 1); break;
case 4: buf[x >> 1] |= value << ((1 - (x & 1)) << 2); break;
case 8: buf[x] = value; break;
}
}
 
static inline int paeth(int a, int b, int c)
{
/* The definitions of ac and bc are correct, not a typo. */
int ac = b - c, bc = a - c, abcc = ac + bc;
int pa = ABS(ac);
int pb = ABS(bc);
int pc = ABS(abcc);
return pa <= pb && pa <= pc ? a : pb <= pc ? b : c;
}
 
static void
fz_predict_tiff(fz_predict *state, unsigned char *out, unsigned char *in, int len)
{
int left[MAXC];
int i, k;
 
for (k = 0; k < state->colors; k++)
left[k] = 0;
 
for (i = 0; i < state->columns; i++)
{
for (k = 0; k < state->colors; k++)
{
int a = getcomponent(in, i * state->colors + k, state->bpc);
int b = a + left[k];
int c = b % (1 << state->bpc);
putcomponent(out, i * state->colors + k, state->bpc, c);
left[k] = c;
}
}
}
 
static void
fz_predict_png(fz_predict *state, unsigned char *out, unsigned char *in, int len, int predictor)
{
int bpp = state->bpp;
int i;
unsigned char *ref = state->ref;
 
switch (predictor)
{
case 0:
memcpy(out, in, len);
break;
case 1:
for (i = bpp; i > 0; i--)
{
*out++ = *in++;
}
for (i = len - bpp; i > 0; i--)
{
*out = *in++ + out[-bpp];
out++;
}
break;
case 2:
for (i = bpp; i > 0; i--)
{
*out++ = *in++ + *ref++;
}
for (i = len - bpp; i > 0; i--)
{
*out++ = *in++ + *ref++;
}
break;
case 3:
for (i = bpp; i > 0; i--)
{
*out++ = *in++ + (*ref++) / 2;
}
for (i = len - bpp; i > 0; i--)
{
*out = *in++ + (out[-bpp] + *ref++) / 2;
out++;
}
break;
case 4:
for (i = bpp; i > 0; i--)
{
*out++ = *in++ + paeth(0, *ref++, 0);
}
for (i = len - bpp; i > 0; i --)
{
*out = *in++ + paeth(out[-bpp], *ref, ref[-bpp]);
ref++;
out++;
}
break;
}
}
 
static int
read_predict(fz_stream *stm, unsigned char *buf, int len)
{
fz_predict *state = stm->state;
unsigned char *p = buf;
unsigned char *ep = buf + len;
int ispng = state->predictor >= 10;
int n;
 
while (state->rp < state->wp && p < ep)
*p++ = *state->rp++;
 
while (p < ep)
{
n = fz_read(state->chain, state->in, state->stride + ispng);
if (n < 0)
return fz_rethrow(n, "read error in prediction filter");
if (n == 0)
return p - buf;
 
if (state->predictor == 1)
memcpy(state->out, state->in, n);
else if (state->predictor == 2)
fz_predict_tiff(state, state->out, state->in, n);
else
{
fz_predict_png(state, state->out, state->in + 1, n - 1, state->in[0]);
memcpy(state->ref, state->out, state->stride);
}
 
state->rp = state->out;
state->wp = state->out + n - ispng;
 
while (state->rp < state->wp && p < ep)
*p++ = *state->rp++;
}
 
return p - buf;
}
 
static void
close_predict(fz_stream *stm)
{
fz_predict *state = stm->state;
fz_close(state->chain);
fz_free(state->in);
fz_free(state->out);
fz_free(state->ref);
fz_free(state);
}
 
fz_stream *
fz_open_predict(fz_stream *chain, fz_obj *params)
{
fz_predict *state;
fz_obj *obj;
 
state = fz_malloc(sizeof(fz_predict));
state->chain = chain;
 
state->predictor = 1;
state->columns = 1;
state->colors = 1;
state->bpc = 8;
 
obj = fz_dict_gets(params, "Predictor");
if (obj)
state->predictor = fz_to_int(obj);
 
if (state->predictor != 1 && state->predictor != 2 &&
state->predictor != 10 && state->predictor != 11 &&
state->predictor != 12 && state->predictor != 13 &&
state->predictor != 14 && state->predictor != 15)
{
fz_warn("invalid predictor: %d", state->predictor);
state->predictor = 1;
}
 
obj = fz_dict_gets(params, "Columns");
if (obj)
state->columns = fz_to_int(obj);
 
obj = fz_dict_gets(params, "Colors");
if (obj)
state->colors = fz_to_int(obj);
 
obj = fz_dict_gets(params, "BitsPerComponent");
if (obj)
state->bpc = fz_to_int(obj);
 
state->stride = (state->bpc * state->colors * state->columns + 7) / 8;
state->bpp = (state->bpc * state->colors + 7) / 8;
 
state->in = fz_malloc(state->stride + 1);
state->out = fz_malloc(state->stride);
state->ref = fz_malloc(state->stride);
state->rp = state->out;
state->wp = state->out;
 
memset(state->ref, 0, state->stride);
 
return fz_new_stream(state, read_predict, close_predict);
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/fitz.h
0,0 → 1,1120
#ifndef _FITZ_H_
#define _FITZ_H_
 
/*
* Include the standard libc headers.
*/
 
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <stdarg.h>
#include <string.h>
#include <math.h>
 
#include <assert.h>
#include <errno.h>
#include <limits.h> /* INT_MAX & co */
#include <float.h> /* FLT_EPSILON */
#include <fcntl.h> /* O_RDONLY & co */
 
#define nelem(x) (sizeof(x)/sizeof((x)[0]))
 
#define ABS(x) ( (x) < 0 ? -(x) : (x) )
#define MIN(a,b) ( (a) < (b) ? (a) : (b) )
#define MAX(a,b) ( (a) > (b) ? (a) : (b) )
#define CLAMP(x,a,b) ( (x) > (b) ? (b) : ( (x) < (a) ? (a) : (x) ) )
 
/*
* Some differences in libc can be smoothed over
*/
 
#ifdef _MSC_VER /* Microsoft Visual C */
 
#pragma warning( disable: 4244 ) /* conversion from X to Y, possible loss of data */
#pragma warning( disable: 4996 ) /* The POSIX name for this item is deprecated */
#pragma warning( disable: 4996 ) /* This function or variable may be unsafe */
 
#include <io.h>
 
int gettimeofday(struct timeval *tv, struct timezone *tz);
 
#define snprintf _snprintf
#define strtoll _strtoi64
 
#else /* Unix or close enough */
 
#include <unistd.h>
 
#ifndef O_BINARY
#define O_BINARY 0
#endif
 
#endif
 
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
 
#ifndef M_SQRT2
#define M_SQRT2 1.41421356237309504880
#endif
 
/*
* Variadic macros, inline and restrict keywords
*/
 
#if __STDC_VERSION__ == 199901L /* C99 */
 
#define fz_throw(...) fz_throw_imp(__FILE__, __LINE__, __func__, __VA_ARGS__)
#define fz_rethrow(cause, ...) fz_rethrow_imp(__FILE__, __LINE__, __func__, cause, __VA_ARGS__)
#define fz_catch(cause, ...) fz_catch_imp(__FILE__, __LINE__, __func__, cause, __VA_ARGS__)
 
#elif _MSC_VER >= 1500 /* MSVC 9 or newer */
 
#define inline __inline
#define restrict __restrict
#define fz_throw(...) fz_throw_imp(__FILE__, __LINE__, __FUNCTION__, __VA_ARGS__)
#define fz_rethrow(cause, ...) fz_rethrow_imp(__FILE__, __LINE__, __FUNCTION__, cause, __VA_ARGS__)
#define fz_catch(cause, ...) fz_catch_imp(__FILE__, __LINE__, __FUNCTION__, cause, __VA_ARGS__)
 
#elif __GNUC__ >= 3 /* GCC 3 or newer */
 
#define inline __inline
#define restrict __restrict
#define fz_throw(fmt...) fz_throw_imp(__FILE__, __LINE__, __FUNCTION__, fmt)
#define fz_rethrow(cause, fmt...) fz_rethrow_imp(__FILE__, __LINE__, __FUNCTION__, cause, fmt)
#define fz_catch(cause, fmt...) fz_catch_imp(__FILE__, __LINE__, __FUNCTION__, cause, fmt)
 
#else /* Unknown or ancient */
 
#define inline
#define restrict
#define fz_throw fz_throw_impx
#define fz_rethrow fz_rethrow_impx
#define fz_catch fz_catch_impx
 
#endif
 
/*
* GCC can do type checking of printf strings
*/
 
#ifndef __printflike
#if __GNUC__ > 2 || __GNUC__ == 2 && __GNUC_MINOR__ >= 7
#define __printflike(fmtarg, firstvararg) \
__attribute__((__format__ (__printf__, fmtarg, firstvararg)))
#else
#define __printflike(fmtarg, firstvararg)
#endif
#endif
 
/*
* Error handling
*/
 
typedef int fz_error;
 
#define fz_okay ((fz_error)0)
 
void fz_warn(char *fmt, ...) __printflike(1, 2);
void fz_flush_warnings(void);
 
fz_error fz_throw_imp(const char *file, int line, const char *func, char *fmt, ...) __printflike(4, 5);
fz_error fz_rethrow_imp(const char *file, int line, const char *func, fz_error cause, char *fmt, ...) __printflike(5, 6);
void fz_catch_imp(const char *file, int line, const char *func, fz_error cause, char *fmt, ...) __printflike(5, 6);
 
fz_error fz_throw_impx(char *fmt, ...) __printflike(1, 2);
fz_error fz_rethrow_impx(fz_error cause, char *fmt, ...) __printflike(2, 3);
void fz_catch_impx(fz_error cause, char *fmt, ...) __printflike(2, 3);
 
/* extract the last error stack trace */
int fz_get_error_count(void);
char *fz_get_error_line(int n);
 
/*
* Basic runtime and utility functions
*/
 
/* memory allocation */
void *fz_malloc(int size);
void *fz_calloc(int count, int size);
void *fz_realloc(void *p, int count, int size);
void fz_free(void *p);
char *fz_strdup(char *s);
 
/* runtime (hah!) test for endian-ness */
int fz_is_big_endian(void);
 
/* safe string functions */
char *fz_strsep(char **stringp, const char *delim);
int fz_strlcpy(char *dst, const char *src, int n);
int fz_strlcat(char *dst, const char *src, int n);
 
/* Range checking atof */
float fz_atof(const char *s);
 
/* utf-8 encoding and decoding */
int chartorune(int *rune, char *str);
int runetochar(char *str, int *rune);
int runelen(int c);
 
/* getopt */
extern int fz_getopt(int nargc, char * const *nargv, const char *ostr);
extern int fz_optind;
extern char *fz_optarg;
 
/*
* Generic hash-table with fixed-length keys.
*/
 
typedef struct fz_hash_table_s fz_hash_table;
 
fz_hash_table *fz_new_hash_table(int initialsize, int keylen);
void fz_debug_hash(fz_hash_table *table);
void fz_empty_hash(fz_hash_table *table);
void fz_free_hash(fz_hash_table *table);
 
void *fz_hash_find(fz_hash_table *table, void *key);
void fz_hash_insert(fz_hash_table *table, void *key, void *val);
void fz_hash_remove(fz_hash_table *table, void *key);
 
int fz_hash_len(fz_hash_table *table);
void *fz_hash_get_key(fz_hash_table *table, int idx);
void *fz_hash_get_val(fz_hash_table *table, int idx);
 
/*
* Math and geometry
*/
 
/* Multiply scaled two integers in the 0..255 range */
static inline int fz_mul255(int a, int b)
{
/* see Jim Blinn's book "Dirty Pixels" for how this works */
int x = a * b + 128;
x += x >> 8;
return x >> 8;
}
 
/* Expand a value A from the 0...255 range to the 0..256 range */
#define FZ_EXPAND(A) ((A)+((A)>>7))
 
/* Combine values A (in any range) and B (in the 0..256 range),
* to give a single value in the same range as A was. */
#define FZ_COMBINE(A,B) (((A)*(B))>>8)
 
/* Combine values A and C (in the same (any) range) and B and D (in the
* 0..256 range), to give a single value in the same range as A and C were. */
#define FZ_COMBINE2(A,B,C,D) (FZ_COMBINE((A), (B)) + FZ_COMBINE((C), (D)))
 
/* Blend SRC and DST (in the same range) together according to
* AMOUNT (in the 0...256 range). */
#define FZ_BLEND(SRC, DST, AMOUNT) ((((SRC)-(DST))*(AMOUNT) + ((DST)<<8))>>8)
 
typedef struct fz_matrix_s fz_matrix;
typedef struct fz_point_s fz_point;
typedef struct fz_rect_s fz_rect;
typedef struct fz_bbox_s fz_bbox;
 
extern const fz_rect fz_unit_rect;
extern const fz_rect fz_empty_rect;
extern const fz_rect fz_infinite_rect;
 
extern const fz_bbox fz_unit_bbox;
extern const fz_bbox fz_empty_bbox;
extern const fz_bbox fz_infinite_bbox;
 
#define fz_is_empty_rect(r) ((r).x0 == (r).x1)
#define fz_is_infinite_rect(r) ((r).x0 > (r).x1)
#define fz_is_empty_bbox(b) ((b).x0 == (b).x1)
#define fz_is_infinite_bbox(b) ((b).x0 > (b).x1)
 
struct fz_matrix_s
{
float a, b, c, d, e, f;
};
 
struct fz_point_s
{
float x, y;
};
 
struct fz_rect_s
{
float x0, y0;
float x1, y1;
};
 
struct fz_bbox_s
{
int x0, y0;
int x1, y1;
};
 
extern const fz_matrix fz_identity;
 
fz_matrix fz_concat(fz_matrix one, fz_matrix two);
fz_matrix fz_scale(float sx, float sy);
fz_matrix fz_shear(float sx, float sy);
fz_matrix fz_rotate(float theta);
fz_matrix fz_translate(float tx, float ty);
fz_matrix fz_invert_matrix(fz_matrix m);
int fz_is_rectilinear(fz_matrix m);
float fz_matrix_expansion(fz_matrix m);
 
fz_bbox fz_round_rect(fz_rect r);
fz_bbox fz_intersect_bbox(fz_bbox a, fz_bbox b);
fz_rect fz_intersect_rect(fz_rect a, fz_rect b);
fz_bbox fz_union_bbox(fz_bbox a, fz_bbox b);
fz_rect fz_union_rect(fz_rect a, fz_rect b);
 
fz_point fz_transform_point(fz_matrix m, fz_point p);
fz_point fz_transform_vector(fz_matrix m, fz_point p);
fz_rect fz_transform_rect(fz_matrix m, fz_rect r);
fz_bbox fz_transform_bbox(fz_matrix m, fz_bbox b);
 
/*
* Basic crypto functions.
* Independent of the rest of fitz.
* For further encapsulation in filters, or not.
*/
 
/* md5 digests */
 
typedef struct fz_md5_s fz_md5;
 
struct fz_md5_s
{
unsigned int state[4];
unsigned int count[2];
unsigned char buffer[64];
};
 
void fz_md5_init(fz_md5 *state);
void fz_md5_update(fz_md5 *state, const unsigned char *input, unsigned inlen);
void fz_md5_final(fz_md5 *state, unsigned char digest[16]);
 
/* sha-256 digests */
 
typedef struct fz_sha256_s fz_sha256;
 
struct fz_sha256_s
{
unsigned int state[8];
unsigned int count[2];
union {
unsigned char u8[64];
unsigned int u32[16];
} buffer;
};
 
void fz_sha256_init(fz_sha256 *state);
void fz_sha256_update(fz_sha256 *state, const unsigned char *input, unsigned int inlen);
void fz_sha256_final(fz_sha256 *state, unsigned char digest[32]);
 
/* arc4 crypto */
 
typedef struct fz_arc4_s fz_arc4;
 
struct fz_arc4_s
{
unsigned x;
unsigned y;
unsigned char state[256];
};
 
void fz_arc4_init(fz_arc4 *state, const unsigned char *key, unsigned len);
void fz_arc4_encrypt(fz_arc4 *state, unsigned char *dest, const unsigned char *src, unsigned len);
 
/* AES block cipher implementation from XYSSL */
 
typedef struct fz_aes_s fz_aes;
 
#define AES_DECRYPT 0
#define AES_ENCRYPT 1
 
struct fz_aes_s
{
int nr; /* number of rounds */
unsigned long *rk; /* AES round keys */
unsigned long buf[68]; /* unaligned data */
};
 
void aes_setkey_enc( fz_aes *ctx, const unsigned char *key, int keysize );
void aes_setkey_dec( fz_aes *ctx, const unsigned char *key, int keysize );
void aes_crypt_cbc( fz_aes *ctx, int mode, int length,
unsigned char iv[16],
const unsigned char *input,
unsigned char *output );
 
/*
* Dynamic objects.
* The same type of objects as found in PDF and PostScript.
* Used by the filters and the mupdf parser.
*/
 
typedef struct fz_obj_s fz_obj;
 
extern fz_obj* (*fz_resolve_indirect)(fz_obj*);
 
fz_obj *fz_new_null(void);
fz_obj *fz_new_bool(int b);
fz_obj *fz_new_int(int i);
fz_obj *fz_new_real(float f);
fz_obj *fz_new_name(char *str);
fz_obj *fz_new_string(char *str, int len);
fz_obj *fz_new_indirect(int num, int gen, void *xref);
 
fz_obj *fz_new_array(int initialcap);
fz_obj *fz_new_dict(int initialcap);
fz_obj *fz_copy_array(fz_obj *array);
fz_obj *fz_copy_dict(fz_obj *dict);
 
fz_obj *fz_keep_obj(fz_obj *obj);
void fz_drop_obj(fz_obj *obj);
 
/* type queries */
int fz_is_null(fz_obj *obj);
int fz_is_bool(fz_obj *obj);
int fz_is_int(fz_obj *obj);
int fz_is_real(fz_obj *obj);
int fz_is_name(fz_obj *obj);
int fz_is_string(fz_obj *obj);
int fz_is_array(fz_obj *obj);
int fz_is_dict(fz_obj *obj);
int fz_is_indirect(fz_obj *obj);
 
int fz_objcmp(fz_obj *a, fz_obj *b);
 
/* safe, silent failure, no error reporting */
int fz_to_bool(fz_obj *obj);
int fz_to_int(fz_obj *obj);
float fz_to_real(fz_obj *obj);
char *fz_to_name(fz_obj *obj);
char *fz_to_str_buf(fz_obj *obj);
int fz_to_str_len(fz_obj *obj);
int fz_to_num(fz_obj *obj);
int fz_to_gen(fz_obj *obj);
 
int fz_array_len(fz_obj *array);
fz_obj *fz_array_get(fz_obj *array, int i);
void fz_array_put(fz_obj *array, int i, fz_obj *obj);
void fz_array_push(fz_obj *array, fz_obj *obj);
void fz_array_insert(fz_obj *array, fz_obj *obj);
 
int fz_dict_len(fz_obj *dict);
fz_obj *fz_dict_get_key(fz_obj *dict, int idx);
fz_obj *fz_dict_get_val(fz_obj *dict, int idx);
fz_obj *fz_dict_get(fz_obj *dict, fz_obj *key);
fz_obj *fz_dict_gets(fz_obj *dict, char *key);
fz_obj *fz_dict_getsa(fz_obj *dict, char *key, char *abbrev);
void fz_dict_put(fz_obj *dict, fz_obj *key, fz_obj *val);
void fz_dict_puts(fz_obj *dict, char *key, fz_obj *val);
void fz_dict_del(fz_obj *dict, fz_obj *key);
void fz_dict_dels(fz_obj *dict, char *key);
void fz_sort_dict(fz_obj *dict);
 
int fz_fprint_obj(FILE *fp, fz_obj *obj, int tight);
void fz_debug_obj(fz_obj *obj);
void fz_debug_ref(fz_obj *obj);
 
void fz_set_str_len(fz_obj *obj, int newlen); /* private */
void *fz_get_indirect_xref(fz_obj *obj); /* private */
 
/*
* Data buffers.
*/
 
typedef struct fz_buffer_s fz_buffer;
 
struct fz_buffer_s
{
int refs;
unsigned char *data;
int cap, len;
};
 
fz_buffer *fz_new_buffer(int size);
fz_buffer *fz_keep_buffer(fz_buffer *buf);
void fz_drop_buffer(fz_buffer *buf);
 
void fz_resize_buffer(fz_buffer *buf, int size);
void fz_grow_buffer(fz_buffer *buf);
 
/*
* Buffered reader.
* Only the data between rp and wp is valid data.
*/
 
typedef struct fz_stream_s fz_stream;
 
struct fz_stream_s
{
int refs;
int error;
int eof;
int pos;
int avail;
int bits;
unsigned char *bp, *rp, *wp, *ep;
void *state;
int (*read)(fz_stream *stm, unsigned char *buf, int len);
void (*close)(fz_stream *stm);
void (*seek)(fz_stream *stm, int offset, int whence);
unsigned char buf[4096];
};
 
fz_stream *fz_open_fd(int file);
fz_stream *fz_open_file(const char *filename);
fz_stream *fz_open_file_w(const wchar_t *filename); /* only on win32 */
fz_stream *fz_open_buffer(fz_buffer *buf);
fz_stream *fz_open_memory(unsigned char *data, int len);
void fz_close(fz_stream *stm);
 
fz_stream *fz_new_stream(void*, int(*)(fz_stream*, unsigned char*, int), void(*)(fz_stream *));
fz_stream *fz_keep_stream(fz_stream *stm);
void fz_fill_buffer(fz_stream *stm);
 
int fz_tell(fz_stream *stm);
void fz_seek(fz_stream *stm, int offset, int whence);
 
int fz_read(fz_stream *stm, unsigned char *buf, int len);
void fz_read_line(fz_stream *stm, char *buf, int max);
fz_error fz_read_all(fz_buffer **bufp, fz_stream *stm, int initial);
 
static inline int fz_read_byte(fz_stream *stm)
{
if (stm->rp == stm->wp)
{
fz_fill_buffer(stm);
return stm->rp < stm->wp ? *stm->rp++ : EOF;
}
return *stm->rp++;
}
 
static inline int fz_peek_byte(fz_stream *stm)
{
if (stm->rp == stm->wp)
{
fz_fill_buffer(stm);
return stm->rp < stm->wp ? *stm->rp : EOF;
}
return *stm->rp;
}
 
static inline void fz_unread_byte(fz_stream *stm)
{
if (stm->rp > stm->bp)
stm->rp--;
}
 
static inline int fz_is_eof(fz_stream *stm)
{
if (stm->rp == stm->wp)
{
if (stm->eof)
return 1;
return fz_peek_byte(stm) == EOF;
}
return 0;
}
 
static inline unsigned int fz_read_bits(fz_stream *stm, int n)
{
unsigned int x;
 
if (n <= stm->avail)
{
stm->avail -= n;
x = (stm->bits >> stm->avail) & ((1 << n) - 1);
}
else
{
x = stm->bits & ((1 << stm->avail) - 1);
n -= stm->avail;
stm->avail = 0;
 
while (n > 8)
{
x = (x << 8) | fz_read_byte(stm);
n -= 8;
}
 
if (n > 0)
{
stm->bits = fz_read_byte(stm);
stm->avail = 8 - n;
x = (x << n) | (stm->bits >> stm->avail);
}
}
 
return x;
}
 
static inline void fz_sync_bits(fz_stream *stm)
{
stm->avail = 0;
}
 
static inline int fz_is_eof_bits(fz_stream *stm)
{
return fz_is_eof(stm) && (stm->avail == 0 || stm->bits == EOF);
}
 
/*
* Data filters.
*/
 
fz_stream *fz_open_copy(fz_stream *chain);
fz_stream *fz_open_null(fz_stream *chain, int len);
fz_stream *fz_open_arc4(fz_stream *chain, unsigned char *key, unsigned keylen);
fz_stream *fz_open_aesd(fz_stream *chain, unsigned char *key, unsigned keylen);
fz_stream *fz_open_a85d(fz_stream *chain);
fz_stream *fz_open_ahxd(fz_stream *chain);
fz_stream *fz_open_rld(fz_stream *chain);
fz_stream *fz_open_dctd(fz_stream *chain, fz_obj *param);
fz_stream *fz_open_faxd(fz_stream *chain, fz_obj *param);
fz_stream *fz_open_flated(fz_stream *chain);
fz_stream *fz_open_lzwd(fz_stream *chain, fz_obj *param);
fz_stream *fz_open_predict(fz_stream *chain, fz_obj *param);
fz_stream *fz_open_jbig2d(fz_stream *chain, fz_buffer *global);
 
/*
* Resources and other graphics related objects.
*/
 
enum { FZ_MAX_COLORS = 32 };
 
int fz_find_blendmode(char *name);
char *fz_blendmode_name(int blendmode);
 
/*
* Pixmaps have n components per pixel. the last is always alpha.
* premultiplied alpha when rendering, but non-premultiplied for colorspace
* conversions and rescaling.
*/
 
typedef struct fz_pixmap_s fz_pixmap;
typedef struct fz_colorspace_s fz_colorspace;
 
struct fz_pixmap_s
{
int refs;
int x, y, w, h, n;
fz_pixmap *mask; /* explicit soft/image mask */
int interpolate;
int xres, yres;
fz_colorspace *colorspace;
unsigned char *samples;
int free_samples;
};
 
/* will return NULL if soft limit is exceeded */
fz_pixmap *fz_new_pixmap_with_limit(fz_colorspace *colorspace, int w, int h);
 
fz_pixmap *fz_new_pixmap_with_data(fz_colorspace *colorspace, int w, int h, unsigned char *samples);
fz_pixmap *fz_new_pixmap_with_rect(fz_colorspace *, fz_bbox bbox);
fz_pixmap *fz_new_pixmap_with_rect_and_data(fz_colorspace *, fz_bbox bbox, unsigned char *samples);
fz_pixmap *fz_new_pixmap(fz_colorspace *, int w, int h);
fz_pixmap *fz_keep_pixmap(fz_pixmap *pix);
void fz_drop_pixmap(fz_pixmap *pix);
void fz_clear_pixmap(fz_pixmap *pix);
void fz_clear_pixmap_with_color(fz_pixmap *pix, int value);
void fz_clear_pixmap_rect_with_color(fz_pixmap *pix, int value, fz_bbox r);
void fz_copy_pixmap_rect(fz_pixmap *dest, fz_pixmap *src, fz_bbox r);
void fz_premultiply_pixmap(fz_pixmap *pix);
fz_pixmap *fz_alpha_from_gray(fz_pixmap *gray, int luminosity);
fz_bbox fz_bound_pixmap(fz_pixmap *pix);
void fz_invert_pixmap(fz_pixmap *pix);
void fz_gamma_pixmap(fz_pixmap *pix, float gamma);
 
fz_pixmap *fz_scale_pixmap(fz_pixmap *src, float x, float y, float w, float h);
fz_pixmap *fz_scale_pixmap_gridfit(fz_pixmap *src, float x, float y, float w, float h, int gridfit);
 
fz_error fz_write_pnm(fz_pixmap *pixmap, char *filename);
fz_error fz_write_pam(fz_pixmap *pixmap, char *filename, int savealpha);
fz_error fz_write_png(fz_pixmap *pixmap, char *filename, int savealpha);
 
fz_error fz_load_jpx_image(fz_pixmap **imgp, unsigned char *data, int size, fz_colorspace *dcs);
 
/*
* Bitmaps have 1 component per bit. Only used for creating halftoned versions
* of contone buffers, and saving out. Samples are stored msb first, akin to
* pbms.
*/
 
typedef struct fz_bitmap_s fz_bitmap;
 
struct fz_bitmap_s
{
int refs;
int w, h, stride, n;
unsigned char *samples;
};
 
fz_bitmap *fz_new_bitmap(int w, int h, int n);
fz_bitmap *fz_keep_bitmap(fz_bitmap *bit);
void fz_clear_bitmap(fz_bitmap *bit);
void fz_drop_bitmap(fz_bitmap *bit);
 
fz_error fz_write_pbm(fz_bitmap *bitmap, char *filename);
 
/*
* A halftone is a set of threshold tiles, one per component. Each threshold
* tile is a pixmap, possibly of varying sizes and phases.
*/
 
typedef struct fz_halftone_s fz_halftone;
 
struct fz_halftone_s
{
int refs;
int n;
fz_pixmap *comp[1];
};
 
fz_halftone *fz_new_halftone(int num_comps);
fz_halftone *fz_get_default_halftone(int num_comps);
fz_halftone *fz_keep_halftone(fz_halftone *half);
void fz_drop_halftone(fz_halftone *half);
 
fz_bitmap *fz_halftone_pixmap(fz_pixmap *pix, fz_halftone *ht);
 
/*
* Colorspace resources.
*/
 
extern fz_colorspace *fz_device_gray;
extern fz_colorspace *fz_device_rgb;
extern fz_colorspace *fz_device_bgr;
extern fz_colorspace *fz_device_cmyk;
 
struct fz_colorspace_s
{
int refs;
char name[16];
int n;
void (*to_rgb)(fz_colorspace *, float *src, float *rgb);
void (*from_rgb)(fz_colorspace *, float *rgb, float *dst);
void (*free_data)(fz_colorspace *);
void *data;
};
 
fz_colorspace *fz_new_colorspace(char *name, int n);
fz_colorspace *fz_keep_colorspace(fz_colorspace *colorspace);
void fz_drop_colorspace(fz_colorspace *colorspace);
 
void fz_convert_color(fz_colorspace *srcs, float *srcv, fz_colorspace *dsts, float *dstv);
void fz_convert_pixmap(fz_pixmap *src, fz_pixmap *dst);
 
fz_colorspace *fz_find_device_colorspace(char *name);
 
/*
* Fonts come in two variants:
* Regular fonts are handled by FreeType.
* Type 3 fonts have callbacks to the interpreter.
*/
 
struct fz_device_s;
 
typedef struct fz_font_s fz_font;
char *ft_error_string(int err);
 
struct fz_font_s
{
int refs;
char name[32];
 
void *ft_face; /* has an FT_Face if used */
int ft_substitute; /* ... substitute metrics */
int ft_bold; /* ... synthesize bold */
int ft_italic; /* ... synthesize italic */
int ft_hint; /* ... force hinting for DynaLab fonts */
 
/* origin of font data */
char *ft_file;
unsigned char *ft_data;
int ft_size;
 
fz_matrix t3matrix;
fz_obj *t3resources;
fz_buffer **t3procs; /* has 256 entries if used */
float *t3widths; /* has 256 entries if used */
void *t3xref; /* a pdf_xref for the callback */
fz_error (*t3run)(void *xref, fz_obj *resources, fz_buffer *contents,
struct fz_device_s *dev, fz_matrix ctm);
 
fz_rect bbox;
 
/* substitute metrics */
int width_count;
int *width_table;
};
 
fz_font *fz_new_type3_font(char *name, fz_matrix matrix);
 
fz_error fz_new_font_from_memory(fz_font **fontp, unsigned char *data, int len, int index);
fz_error fz_new_font_from_file(fz_font **fontp, char *path, int index);
 
fz_font *fz_keep_font(fz_font *font);
void fz_drop_font(fz_font *font);
 
void fz_debug_font(fz_font *font);
void fz_set_font_bbox(fz_font *font, float xmin, float ymin, float xmax, float ymax);
 
/*
* Vector path buffer.
* It can be stroked and dashed, or be filled.
* It has a fill rule (nonzero or even_odd).
*
* When rendering, they are flattened, stroked and dashed straight
* into the Global Edge List.
*/
 
typedef struct fz_path_s fz_path;
typedef struct fz_stroke_state_s fz_stroke_state;
 
typedef union fz_path_item_s fz_path_item;
 
typedef enum fz_path_item_kind_e
{
FZ_MOVETO,
FZ_LINETO,
FZ_CURVETO,
FZ_CLOSE_PATH
} fz_path_item_kind;
 
union fz_path_item_s
{
fz_path_item_kind k;
float v;
};
 
struct fz_path_s
{
int len, cap;
fz_path_item *items;
};
 
struct fz_stroke_state_s
{
int start_cap, dash_cap, end_cap;
int linejoin;
float linewidth;
float miterlimit;
float dash_phase;
int dash_len;
float dash_list[32];
};
 
fz_path *fz_new_path(void);
void fz_moveto(fz_path*, float x, float y);
void fz_lineto(fz_path*, float x, float y);
void fz_curveto(fz_path*, float, float, float, float, float, float);
void fz_curvetov(fz_path*, float, float, float, float);
void fz_curvetoy(fz_path*, float, float, float, float);
void fz_closepath(fz_path*);
void fz_free_path(fz_path *path);
 
void fz_transform_path(fz_path *path, fz_matrix transform);
 
fz_path *fz_clone_path(fz_path *old);
 
fz_rect fz_bound_path(fz_path *path, fz_stroke_state *stroke, fz_matrix ctm);
void fz_debug_path(fz_path *, int indent);
 
/*
* Text buffer.
*
* The trm field contains the a, b, c and d coefficients.
* The e and f coefficients come from the individual elements,
* together they form the transform matrix for the glyph.
*
* Glyphs are referenced by glyph ID.
* The Unicode text equivalent is kept in a separate array
* with indexes into the glyph array.
*/
 
typedef struct fz_text_s fz_text;
typedef struct fz_text_item_s fz_text_item;
 
struct fz_text_item_s
{
float x, y;
int gid; /* -1 for one gid to many ucs mappings */
int ucs; /* -1 for one ucs to many gid mappings */
};
 
struct fz_text_s
{
fz_font *font;
fz_matrix trm;
int wmode;
int len, cap;
fz_text_item *items;
};
 
fz_text *fz_new_text(fz_font *face, fz_matrix trm, int wmode);
void fz_add_text(fz_text *text, int gid, int ucs, float x, float y);
void fz_free_text(fz_text *text);
void fz_debug_text(fz_text*, int indent);
fz_rect fz_bound_text(fz_text *text, fz_matrix ctm);
fz_text *fz_clone_text(fz_text *old);
 
/*
* The shading code uses gouraud shaded triangle meshes.
*/
 
enum
{
FZ_LINEAR,
FZ_RADIAL,
FZ_MESH,
};
 
typedef struct fz_shade_s fz_shade;
 
struct fz_shade_s
{
int refs;
 
fz_rect bbox; /* can be fz_infinite_rect */
fz_colorspace *colorspace;
 
fz_matrix matrix; /* matrix from pattern dict */
int use_background; /* background color for fills but not 'sh' */
float background[FZ_MAX_COLORS];
 
int use_function;
float function[256][FZ_MAX_COLORS + 1];
 
int type; /* linear, radial, mesh */
int extend[2];
 
int mesh_len;
int mesh_cap;
float *mesh; /* [x y 0], [x y r], [x y t] or [x y c1 ... cn] */
};
 
fz_shade *fz_keep_shade(fz_shade *shade);
void fz_drop_shade(fz_shade *shade);
void fz_debug_shade(fz_shade *shade);
 
fz_rect fz_bound_shade(fz_shade *shade, fz_matrix ctm);
void fz_paint_shade(fz_shade *shade, fz_matrix ctm, fz_pixmap *dest, fz_bbox bbox);
 
/*
* Glyph cache
*/
 
typedef struct fz_glyph_cache_s fz_glyph_cache;
 
fz_glyph_cache *fz_new_glyph_cache(void);
fz_pixmap *fz_render_ft_glyph(fz_font *font, int cid, fz_matrix trm);
fz_pixmap *fz_render_t3_glyph(fz_font *font, int cid, fz_matrix trm, fz_colorspace *model);
fz_pixmap *fz_render_ft_stroked_glyph(fz_font *font, int gid, fz_matrix trm, fz_matrix ctm, fz_stroke_state *state);
fz_pixmap *fz_render_glyph(fz_glyph_cache*, fz_font*, int, fz_matrix, fz_colorspace *model);
fz_pixmap *fz_render_stroked_glyph(fz_glyph_cache*, fz_font*, int, fz_matrix, fz_matrix, fz_stroke_state *stroke);
void fz_free_glyph_cache(fz_glyph_cache *);
 
/*
* Scan converter
*/
 
int fz_get_aa_level(void);
void fz_set_aa_level(int bits);
 
typedef struct fz_gel_s fz_gel;
 
fz_gel *fz_new_gel(void);
void fz_insert_gel(fz_gel *gel, float x0, float y0, float x1, float y1);
void fz_reset_gel(fz_gel *gel, fz_bbox clip);
void fz_sort_gel(fz_gel *gel);
fz_bbox fz_bound_gel(fz_gel *gel);
void fz_free_gel(fz_gel *gel);
int fz_is_rect_gel(fz_gel *gel);
 
void fz_scan_convert(fz_gel *gel, int eofill, fz_bbox clip, fz_pixmap *pix, unsigned char *colorbv);
 
void fz_flatten_fill_path(fz_gel *gel, fz_path *path, fz_matrix ctm, float flatness);
void fz_flatten_stroke_path(fz_gel *gel, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm, float flatness, float linewidth);
void fz_flatten_dash_path(fz_gel *gel, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm, float flatness, float linewidth);
 
/*
* The device interface.
*/
 
enum
{
/* Hints */
FZ_IGNORE_IMAGE = 1,
FZ_IGNORE_SHADE = 2,
 
/* Flags */
FZ_CHARPROC_MASK = 1,
FZ_CHARPROC_COLOR = 2,
};
 
typedef struct fz_device_s fz_device;
 
struct fz_device_s
{
int hints;
int flags;
 
void *user;
void (*free_user)(void *);
 
void (*fill_path)(void *, fz_path *, int even_odd, fz_matrix, fz_colorspace *, float *color, float alpha);
void (*stroke_path)(void *, fz_path *, fz_stroke_state *, fz_matrix, fz_colorspace *, float *color, float alpha);
void (*clip_path)(void *, fz_path *, fz_rect *rect, int even_odd, fz_matrix);
void (*clip_stroke_path)(void *, fz_path *, fz_rect *rect, fz_stroke_state *, fz_matrix);
 
void (*fill_text)(void *, fz_text *, fz_matrix, fz_colorspace *, float *color, float alpha);
void (*stroke_text)(void *, fz_text *, fz_stroke_state *, fz_matrix, fz_colorspace *, float *color, float alpha);
void (*clip_text)(void *, fz_text *, fz_matrix, int accumulate);
void (*clip_stroke_text)(void *, fz_text *, fz_stroke_state *, fz_matrix);
void (*ignore_text)(void *, fz_text *, fz_matrix);
 
void (*fill_shade)(void *, fz_shade *shd, fz_matrix ctm, float alpha);
void (*fill_image)(void *, fz_pixmap *img, fz_matrix ctm, float alpha);
void (*fill_image_mask)(void *, fz_pixmap *img, fz_matrix ctm, fz_colorspace *, float *color, float alpha);
void (*clip_image_mask)(void *, fz_pixmap *img, fz_rect *rect, fz_matrix ctm);
 
void (*pop_clip)(void *);
 
void (*begin_mask)(void *, fz_rect, int luminosity, fz_colorspace *, float *bc);
void (*end_mask)(void *);
void (*begin_group)(void *, fz_rect, int isolated, int knockout, int blendmode, float alpha);
void (*end_group)(void *);
 
void (*begin_tile)(void *, fz_rect area, fz_rect view, float xstep, float ystep, fz_matrix ctm);
void (*end_tile)(void *);
};
 
void fz_fill_path(fz_device *dev, fz_path *path, int even_odd, fz_matrix ctm, fz_colorspace *colorspace, float *color, float alpha);
void fz_stroke_path(fz_device *dev, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm, fz_colorspace *colorspace, float *color, float alpha);
void fz_clip_path(fz_device *dev, fz_path *path, fz_rect *rect, int even_odd, fz_matrix ctm);
void fz_clip_stroke_path(fz_device *dev, fz_path *path, fz_rect *rect, fz_stroke_state *stroke, fz_matrix ctm);
void fz_fill_text(fz_device *dev, fz_text *text, fz_matrix ctm, fz_colorspace *colorspace, float *color, float alpha);
void fz_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm, fz_colorspace *colorspace, float *color, float alpha);
void fz_clip_text(fz_device *dev, fz_text *text, fz_matrix ctm, int accumulate);
void fz_clip_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm);
void fz_ignore_text(fz_device *dev, fz_text *text, fz_matrix ctm);
void fz_pop_clip(fz_device *dev);
void fz_fill_shade(fz_device *dev, fz_shade *shade, fz_matrix ctm, float alpha);
void fz_fill_image(fz_device *dev, fz_pixmap *image, fz_matrix ctm, float alpha);
void fz_fill_image_mask(fz_device *dev, fz_pixmap *image, fz_matrix ctm, fz_colorspace *colorspace, float *color, float alpha);
void fz_clip_image_mask(fz_device *dev, fz_pixmap *image, fz_rect *rect, fz_matrix ctm);
void fz_begin_mask(fz_device *dev, fz_rect area, int luminosity, fz_colorspace *colorspace, float *bc);
void fz_end_mask(fz_device *dev);
void fz_begin_group(fz_device *dev, fz_rect area, int isolated, int knockout, int blendmode, float alpha);
void fz_end_group(fz_device *dev);
void fz_begin_tile(fz_device *dev, fz_rect area, fz_rect view, float xstep, float ystep, fz_matrix ctm);
void fz_end_tile(fz_device *dev);
 
fz_device *fz_new_device(void *user);
void fz_free_device(fz_device *dev);
 
fz_device *fz_new_trace_device(void);
fz_device *fz_new_bbox_device(fz_bbox *bboxp);
fz_device *fz_new_draw_device(fz_glyph_cache *cache, fz_pixmap *dest);
fz_device *fz_new_draw_device_type3(fz_glyph_cache *cache, fz_pixmap *dest);
 
/*
* Text extraction device
*/
 
typedef struct fz_text_span_s fz_text_span;
typedef struct fz_text_char_s fz_text_char;
 
struct fz_text_char_s
{
int c;
fz_bbox bbox;
};
 
struct fz_text_span_s
{
fz_font *font;
float size;
int wmode;
int len, cap;
fz_text_char *text;
fz_text_span *next;
int eol;
};
 
fz_text_span *fz_new_text_span(void);
void fz_free_text_span(fz_text_span *line);
void fz_debug_text_span(fz_text_span *line);
void fz_debug_text_span_xml(fz_text_span *span);
 
fz_device *fz_new_text_device(fz_text_span *text);
 
/*
* Display list device -- record and play back device commands.
*/
 
typedef struct fz_display_list_s fz_display_list;
 
fz_display_list *fz_new_display_list(void);
void fz_free_display_list(fz_display_list *list);
fz_device *fz_new_list_device(fz_display_list *list);
void fz_execute_display_list(fz_display_list *list, fz_device *dev, fz_matrix ctm, fz_bbox area);
 
/*
* Plotting functions.
*/
 
void fz_accelerate(void);
void fz_accelerate_arch(void);
 
void fz_decode_tile(fz_pixmap *pix, float *decode);
void fz_decode_indexed_tile(fz_pixmap *pix, float *decode, int maxval);
void fz_unpack_tile(fz_pixmap *dst, unsigned char * restrict src, int n, int depth, int stride, int scale);
 
void fz_paint_solid_alpha(unsigned char * restrict dp, int w, int alpha);
void fz_paint_solid_color(unsigned char * restrict dp, int n, int w, unsigned char *color);
 
void fz_paint_span(unsigned char * restrict dp, unsigned char * restrict sp, int n, int w, int alpha);
void fz_paint_span_with_color(unsigned char * restrict dp, unsigned char * restrict mp, int n, int w, unsigned char *color);
 
void fz_paint_image(fz_pixmap *dst, fz_bbox scissor, fz_pixmap *shape, fz_pixmap *img, fz_matrix ctm, int alpha);
void fz_paint_image_with_color(fz_pixmap *dst, fz_bbox scissor, fz_pixmap *shape, fz_pixmap *img, fz_matrix ctm, unsigned char *colorbv);
 
void fz_paint_pixmap(fz_pixmap *dst, fz_pixmap *src, int alpha);
void fz_paint_pixmap_with_mask(fz_pixmap *dst, fz_pixmap *src, fz_pixmap *msk);
void fz_paint_pixmap_with_rect(fz_pixmap *dst, fz_pixmap *src, int alpha, fz_bbox bbox);
 
void fz_blend_pixmap(fz_pixmap *dst, fz_pixmap *src, int alpha, int blendmode, int isolated, fz_pixmap *shape);
 
enum
{
/* PDF 1.4 -- standard separable */
FZ_BLEND_NORMAL,
FZ_BLEND_MULTIPLY,
FZ_BLEND_SCREEN,
FZ_BLEND_OVERLAY,
FZ_BLEND_DARKEN,
FZ_BLEND_LIGHTEN,
FZ_BLEND_COLOR_DODGE,
FZ_BLEND_COLOR_BURN,
FZ_BLEND_HARD_LIGHT,
FZ_BLEND_SOFT_LIGHT,
FZ_BLEND_DIFFERENCE,
FZ_BLEND_EXCLUSION,
 
/* PDF 1.4 -- standard non-separable */
FZ_BLEND_HUE,
FZ_BLEND_SATURATION,
FZ_BLEND_COLOR,
FZ_BLEND_LUMINOSITY,
 
/* For packing purposes */
FZ_BLEND_MODEMASK = 15,
FZ_BLEND_ISOLATED = 16,
FZ_BLEND_KNOCKOUT = 32
};
 
#endif
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/lrintf.c
0,0 → 1,5
#include <math.h>
/*
long long int lrintf(float x) {
return floor(x);
}*/
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/obj_print.c
0,0 → 1,335
#include "fitz.h"
 
struct fmt
{
char *buf;
int cap;
int len;
int indent;
int tight;
int col;
int sep;
int last;
};
 
static void fmt_obj(struct fmt *fmt, fz_obj *obj);
 
static inline int iswhite(int ch)
{
return
ch == '\000' ||
ch == '\011' ||
ch == '\012' ||
ch == '\014' ||
ch == '\015' ||
ch == '\040';
}
 
static inline int isdelim(int ch)
{
return ch == '(' || ch == ')' ||
ch == '<' || ch == '>' ||
ch == '[' || ch == ']' ||
ch == '{' || ch == '}' ||
ch == '/' ||
ch == '%';
}
 
static inline void fmt_putc(struct fmt *fmt, int c)
{
if (fmt->sep && !isdelim(fmt->last) && !isdelim(c)) {
fmt->sep = 0;
fmt_putc(fmt, ' ');
}
fmt->sep = 0;
 
if (fmt->buf && fmt->len < fmt->cap)
fmt->buf[fmt->len] = c;
 
if (c == '\n')
fmt->col = 0;
else
fmt->col ++;
 
fmt->len ++;
 
fmt->last = c;
}
 
static inline void fmt_indent(struct fmt *fmt)
{
int i = fmt->indent;
while (i--) {
fmt_putc(fmt, ' ');
fmt_putc(fmt, ' ');
}
}
 
static inline void fmt_puts(struct fmt *fmt, char *s)
{
while (*s)
fmt_putc(fmt, *s++);
}
 
static inline void fmt_sep(struct fmt *fmt)
{
fmt->sep = 1;
}
 
static void fmt_str(struct fmt *fmt, fz_obj *obj)
{
char *s = fz_to_str_buf(obj);
int n = fz_to_str_len(obj);
int i, c;
 
fmt_putc(fmt, '(');
for (i = 0; i < n; i++)
{
c = (unsigned char)s[i];
if (c == '\n')
fmt_puts(fmt, "\\n");
else if (c == '\r')
fmt_puts(fmt, "\\r");
else if (c == '\t')
fmt_puts(fmt, "\\t");
else if (c == '\b')
fmt_puts(fmt, "\\b");
else if (c == '\f')
fmt_puts(fmt, "\\f");
else if (c == '(')
fmt_puts(fmt, "\\(");
else if (c == ')')
fmt_puts(fmt, "\\)");
else if (c < 32 || c >= 127) {
char buf[16];
fmt_putc(fmt, '\\');
sprintf(buf, "%03o", c);
fmt_puts(fmt, buf);
}
else
fmt_putc(fmt, c);
}
fmt_putc(fmt, ')');
}
 
static void fmt_hex(struct fmt *fmt, fz_obj *obj)
{
char *s = fz_to_str_buf(obj);
int n = fz_to_str_len(obj);
int i, b, c;
 
fmt_putc(fmt, '<');
for (i = 0; i < n; i++) {
b = (unsigned char) s[i];
c = (b >> 4) & 0x0f;
fmt_putc(fmt, c < 0xA ? c + '0' : c + 'A' - 0xA);
c = (b) & 0x0f;
fmt_putc(fmt, c < 0xA ? c + '0' : c + 'A' - 0xA);
}
fmt_putc(fmt, '>');
}
 
static void fmt_name(struct fmt *fmt, fz_obj *obj)
{
unsigned char *s = (unsigned char *) fz_to_name(obj);
int i, c;
 
fmt_putc(fmt, '/');
 
for (i = 0; s[i]; i++)
{
if (isdelim(s[i]) || iswhite(s[i]) ||
s[i] == '#' || s[i] < 32 || s[i] >= 127)
{
fmt_putc(fmt, '#');
c = (s[i] >> 4) & 0xf;
fmt_putc(fmt, c < 0xA ? c + '0' : c + 'A' - 0xA);
c = s[i] & 0xf;
fmt_putc(fmt, c < 0xA ? c + '0' : c + 'A' - 0xA);
}
else
{
fmt_putc(fmt, s[i]);
}
}
}
 
static void fmt_array(struct fmt *fmt, fz_obj *obj)
{
int i;
 
if (fmt->tight) {
fmt_putc(fmt, '[');
for (i = 0; i < fz_array_len(obj); i++) {
fmt_obj(fmt, fz_array_get(obj, i));
fmt_sep(fmt);
}
fmt_putc(fmt, ']');
}
else {
fmt_puts(fmt, "[ ");
for (i = 0; i < fz_array_len(obj); i++) {
if (fmt->col > 60) {
fmt_putc(fmt, '\n');
fmt_indent(fmt);
}
fmt_obj(fmt, fz_array_get(obj, i));
fmt_putc(fmt, ' ');
}
fmt_putc(fmt, ']');
fmt_sep(fmt);
}
}
 
static void fmt_dict(struct fmt *fmt, fz_obj *obj)
{
int i;
fz_obj *key, *val;
 
if (fmt->tight) {
fmt_puts(fmt, "<<");
for (i = 0; i < fz_dict_len(obj); i++) {
fmt_obj(fmt, fz_dict_get_key(obj, i));
fmt_sep(fmt);
fmt_obj(fmt, fz_dict_get_val(obj, i));
fmt_sep(fmt);
}
fmt_puts(fmt, ">>");
}
else {
fmt_puts(fmt, "<<\n");
fmt->indent ++;
for (i = 0; i < fz_dict_len(obj); i++) {
key = fz_dict_get_key(obj, i);
val = fz_dict_get_val(obj, i);
fmt_indent(fmt);
fmt_obj(fmt, key);
fmt_putc(fmt, ' ');
if (!fz_is_indirect(val) && fz_is_array(val))
fmt->indent ++;
fmt_obj(fmt, val);
fmt_putc(fmt, '\n');
if (!fz_is_indirect(val) && fz_is_array(val))
fmt->indent --;
}
fmt->indent --;
fmt_indent(fmt);
fmt_puts(fmt, ">>");
}
}
 
static void fmt_obj(struct fmt *fmt, fz_obj *obj)
{
char buf[256];
 
if (!obj)
fmt_puts(fmt, "<NULL>");
else if (fz_is_indirect(obj))
{
sprintf(buf, "%d %d R", fz_to_num(obj), fz_to_gen(obj));
fmt_puts(fmt, buf);
}
else if (fz_is_null(obj))
fmt_puts(fmt, "null");
else if (fz_is_bool(obj))
fmt_puts(fmt, fz_to_bool(obj) ? "true" : "false");
else if (fz_is_int(obj))
{
sprintf(buf, "%d", fz_to_int(obj));
fmt_puts(fmt, buf);
}
else if (fz_is_real(obj))
{
sprintf(buf, "%g", fz_to_real(obj));
if (strchr(buf, 'e')) /* bad news! */
sprintf(buf, fabsf(fz_to_real(obj)) > 1 ? "%1.1f" : "%1.8f", fz_to_real(obj));
fmt_puts(fmt, buf);
}
else if (fz_is_string(obj))
{
char *str = fz_to_str_buf(obj);
int len = fz_to_str_len(obj);
int added = 0;
int i, c;
for (i = 0; i < len; i++) {
c = (unsigned char)str[i];
if (strchr("()\\\n\r\t\b\f", c))
added ++;
else if (c < 32 || c >= 127)
added += 3;
}
if (added < len)
fmt_str(fmt, obj);
else
fmt_hex(fmt, obj);
}
else if (fz_is_name(obj))
fmt_name(fmt, obj);
else if (fz_is_array(obj))
fmt_array(fmt, obj);
else if (fz_is_dict(obj))
fmt_dict(fmt, obj);
else
fmt_puts(fmt, "<unknown object>");
}
 
static int
fz_sprint_obj(char *s, int n, fz_obj *obj, int tight)
{
struct fmt fmt;
 
fmt.indent = 0;
fmt.col = 0;
fmt.sep = 0;
fmt.last = 0;
 
fmt.tight = tight;
fmt.buf = s;
fmt.cap = n;
fmt.len = 0;
fmt_obj(&fmt, obj);
 
if (fmt.buf && fmt.len < fmt.cap)
fmt.buf[fmt.len] = '\0';
 
return fmt.len;
}
 
int
fz_fprint_obj(FILE *fp, fz_obj *obj, int tight)
{
char buf[1024];
char *ptr;
int n;
 
n = fz_sprint_obj(NULL, 0, obj, tight);
if ((n + 1) < sizeof buf)
{
fz_sprint_obj(buf, sizeof buf, obj, tight);
fputs(buf, fp);
fputc('\n', fp);
}
else
{
ptr = fz_malloc(n + 1);
fz_sprint_obj(ptr, n + 1, obj, tight);
fputs(ptr, fp);
fputc('\n', fp);
fz_free(ptr);
}
return n;
}
 
void
fz_debug_obj(fz_obj *obj)
{
fz_fprint_obj(stdout, obj, 0);
}
 
void
fz_debug_ref(fz_obj *ref)
{
fz_obj *obj;
obj = fz_resolve_indirect(ref);
fz_debug_obj(obj);
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/res_bitmap.c
0,0 → 1,76
#include "fitz.h"
 
fz_bitmap *
fz_new_bitmap(int w, int h, int n)
{
fz_bitmap *bit;
 
bit = fz_malloc(sizeof(fz_bitmap));
bit->refs = 1;
bit->w = w;
bit->h = h;
bit->n = n;
/* Span is 32 bit aligned. We may want to make this 64 bit if we
* use SSE2 etc. */
bit->stride = ((n * w + 31) & ~31) >> 3;
 
bit->samples = fz_calloc(h, bit->stride);
 
return bit;
}
 
fz_bitmap *
fz_keep_bitmap(fz_bitmap *pix)
{
pix->refs++;
return pix;
}
 
void
fz_drop_bitmap(fz_bitmap *bit)
{
if (bit && --bit->refs == 0)
{
fz_free(bit->samples);
fz_free(bit);
}
}
 
void
fz_clear_bitmap(fz_bitmap *bit)
{
memset(bit->samples, 0, bit->stride * bit->h);
}
 
/*
* Write bitmap to PBM file
*/
 
fz_error
fz_write_pbm(fz_bitmap *bitmap, char *filename)
{
FILE *fp;
unsigned char *p;
int h, bytestride;
 
fp = fopen(filename, "wb");
if (!fp)
return fz_throw("cannot open file '%s': %s", filename, strerror(errno));
 
assert(bitmap->n == 1);
 
fprintf(fp, "P4\n%d %d\n", bitmap->w, bitmap->h);
 
p = bitmap->samples;
 
h = bitmap->h;
bytestride = (bitmap->w + 7) >> 3;
while (h--)
{
fwrite(p, 1, bytestride, fp);
p += bitmap->stride;
}
 
fclose(fp);
return fz_okay;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/res_colorspace.c
0,0 → 1,685
#include "fitz.h"
 
#define SLOWCMYK
 
fz_colorspace *
fz_new_colorspace(char *name, int n)
{
fz_colorspace *cs = fz_malloc(sizeof(fz_colorspace));
cs->refs = 1;
fz_strlcpy(cs->name, name, sizeof cs->name);
cs->n = n;
cs->to_rgb = NULL;
cs->from_rgb = NULL;
cs->free_data = NULL;
cs->data = NULL;
return cs;
}
 
fz_colorspace *
fz_keep_colorspace(fz_colorspace *cs)
{
if (cs->refs < 0)
return cs;
cs->refs ++;
return cs;
}
 
void
fz_drop_colorspace(fz_colorspace *cs)
{
if (cs && cs->refs < 0)
return;
if (cs && --cs->refs == 0)
{
if (cs->free_data && cs->data)
cs->free_data(cs);
fz_free(cs);
}
}
 
/* Device colorspace definitions */
 
static void gray_to_rgb(fz_colorspace *cs, float *gray, float *rgb)
{
rgb[0] = gray[0];
rgb[1] = gray[0];
rgb[2] = gray[0];
}
 
static void rgb_to_gray(fz_colorspace *cs, float *rgb, float *gray)
{
float r = rgb[0];
float g = rgb[1];
float b = rgb[2];
gray[0] = r * 0.3f + g * 0.59f + b * 0.11f;
}
 
static void rgb_to_rgb(fz_colorspace *cs, float *rgb, float *xyz)
{
xyz[0] = rgb[0];
xyz[1] = rgb[1];
xyz[2] = rgb[2];
}
 
static void bgr_to_rgb(fz_colorspace *cs, float *bgr, float *rgb)
{
rgb[0] = bgr[2];
rgb[1] = bgr[1];
rgb[2] = bgr[0];
}
 
static void rgb_to_bgr(fz_colorspace *cs, float *rgb, float *bgr)
{
bgr[0] = rgb[2];
bgr[1] = rgb[1];
bgr[2] = rgb[0];
}
 
static void cmyk_to_rgb(fz_colorspace *cs, float *cmyk, float *rgb)
{
#ifdef SLOWCMYK /* from poppler */
float c = cmyk[0], m = cmyk[1], y = cmyk[2], k = cmyk[3];
float c1 = 1 - c, m1 = 1 - m, y1 = 1 - y, k1 = 1 - k;
float r, g, b, x;
 
/* this is a matrix multiplication, unrolled for performance */
x = c1 * m1 * y1 * k1; /* 0 0 0 0 */
r = g = b = x;
x = c1 * m1 * y1 * k; /* 0 0 0 1 */
r += 0.1373 * x;
g += 0.1216 * x;
b += 0.1255 * x;
x = c1 * m1 * y * k1; /* 0 0 1 0 */
r += x;
g += 0.9490 * x;
x = c1 * m1 * y * k; /* 0 0 1 1 */
r += 0.1098 * x;
g += 0.1020 * x;
x = c1 * m * y1 * k1; /* 0 1 0 0 */
r += 0.9255 * x;
b += 0.5490 * x;
x = c1 * m * y1 * k; /* 0 1 0 1 */
r += 0.1412 * x;
x = c1 * m * y * k1; /* 0 1 1 0 */
r += 0.9294 * x;
g += 0.1098 * x;
b += 0.1412 * x;
x = c1 * m * y * k; /* 0 1 1 1 */
r += 0.1333 * x;
x = c * m1 * y1 * k1; /* 1 0 0 0 */
g += 0.6784 * x;
b += 0.9373 * x;
x = c * m1 * y1 * k; /* 1 0 0 1 */
g += 0.0588 * x;
b += 0.1412 * x;
x = c * m1 * y * k1; /* 1 0 1 0 */
g += 0.6510 * x;
b += 0.3137 * x;
x = c * m1 * y * k; /* 1 0 1 1 */
g += 0.0745 * x;
x = c * m * y1 * k1; /* 1 1 0 0 */
r += 0.1804 * x;
g += 0.1922 * x;
b += 0.5725 * x;
x = c * m * y1 * k; /* 1 1 0 1 */
b += 0.0078 * x;
x = c * m * y * k1; /* 1 1 1 0 */
r += 0.2118 * x;
g += 0.2119 * x;
b += 0.2235 * x;
 
rgb[0] = CLAMP(r, 0, 1);
rgb[1] = CLAMP(g, 0, 1);
rgb[2] = CLAMP(b, 0, 1);
#else
rgb[0] = 1 - MIN(1, cmyk[0] + cmyk[3]);
rgb[1] = 1 - MIN(1, cmyk[1] + cmyk[3]);
rgb[2] = 1 - MIN(1, cmyk[2] + cmyk[3]);
#endif
}
 
static void rgb_to_cmyk(fz_colorspace *cs, float *rgb, float *cmyk)
{
float c, m, y, k;
c = 1 - rgb[0];
m = 1 - rgb[1];
y = 1 - rgb[2];
k = MIN(c, MIN(m, y));
cmyk[0] = c - k;
cmyk[1] = m - k;
cmyk[2] = y - k;
cmyk[3] = k;
}
 
static fz_colorspace k_device_gray = { -1, "DeviceGray", 1, gray_to_rgb, rgb_to_gray };
static fz_colorspace k_device_rgb = { -1, "DeviceRGB", 3, rgb_to_rgb, rgb_to_rgb };
static fz_colorspace k_device_bgr = { -1, "DeviceRGB", 3, bgr_to_rgb, rgb_to_bgr };
static fz_colorspace k_device_cmyk = { -1, "DeviceCMYK", 4, cmyk_to_rgb, rgb_to_cmyk };
 
fz_colorspace *fz_device_gray = &k_device_gray;
fz_colorspace *fz_device_rgb = &k_device_rgb;
fz_colorspace *fz_device_bgr = &k_device_bgr;
fz_colorspace *fz_device_cmyk = &k_device_cmyk;
 
fz_colorspace *
fz_find_device_colorspace(char *name)
{
if (!strcmp(name, "DeviceGray"))
return fz_device_gray;
if (!strcmp(name, "DeviceRGB"))
return fz_device_rgb;
if (!strcmp(name, "DeviceBGR"))
return fz_device_bgr;
if (!strcmp(name, "DeviceCMYK"))
return fz_device_cmyk;
fz_warn("unknown device colorspace: %s", name);
return NULL;
}
 
/* Fast pixmap color conversions */
 
static void fast_gray_to_rgb(fz_pixmap *src, fz_pixmap *dst)
{
unsigned char *s = src->samples;
unsigned char *d = dst->samples;
int n = src->w * src->h;
while (n--)
{
d[0] = s[0];
d[1] = s[0];
d[2] = s[0];
d[3] = s[1];
s += 2;
d += 4;
}
}
 
static void fast_gray_to_cmyk(fz_pixmap *src, fz_pixmap *dst)
{
unsigned char *s = src->samples;
unsigned char *d = dst->samples;
int n = src->w * src->h;
while (n--)
{
d[0] = 0;
d[1] = 0;
d[2] = 0;
d[3] = s[0];
d[4] = s[1];
s += 2;
d += 5;
}
}
 
static void fast_rgb_to_gray(fz_pixmap *src, fz_pixmap *dst)
{
unsigned char *s = src->samples;
unsigned char *d = dst->samples;
int n = src->w * src->h;
while (n--)
{
d[0] = ((s[0]+1) * 77 + (s[1]+1) * 150 + (s[2]+1) * 28) >> 8;
d[1] = s[3];
s += 4;
d += 2;
}
}
 
static void fast_bgr_to_gray(fz_pixmap *src, fz_pixmap *dst)
{
unsigned char *s = src->samples;
unsigned char *d = dst->samples;
int n = src->w * src->h;
while (n--)
{
d[0] = ((s[0]+1) * 28 + (s[1]+1) * 150 + (s[2]+1) * 77) >> 8;
d[1] = s[3];
s += 4;
d += 2;
}
}
 
static void fast_rgb_to_cmyk(fz_pixmap *src, fz_pixmap *dst)
{
unsigned char *s = src->samples;
unsigned char *d = dst->samples;
int n = src->w * src->h;
while (n--)
{
unsigned char c = 255 - s[0];
unsigned char m = 255 - s[1];
unsigned char y = 255 - s[2];
unsigned char k = MIN(c, MIN(m, y));
d[0] = c - k;
d[1] = m - k;
d[2] = y - k;
d[3] = k;
d[4] = s[3];
s += 4;
d += 5;
}
}
 
static void fast_bgr_to_cmyk(fz_pixmap *src, fz_pixmap *dst)
{
unsigned char *s = src->samples;
unsigned char *d = dst->samples;
int n = src->w * src->h;
while (n--)
{
unsigned char c = 255 - s[2];
unsigned char m = 255 - s[1];
unsigned char y = 255 - s[0];
unsigned char k = MIN(c, MIN(m, y));
d[0] = c - k;
d[1] = m - k;
d[2] = y - k;
d[3] = k;
d[4] = s[3];
s += 4;
d += 5;
}
}
 
static void fast_cmyk_to_gray(fz_pixmap *src, fz_pixmap *dst)
{
unsigned char *s = src->samples;
unsigned char *d = dst->samples;
int n = src->w * src->h;
while (n--)
{
unsigned char c = fz_mul255(s[0], 77);
unsigned char m = fz_mul255(s[1], 150);
unsigned char y = fz_mul255(s[2], 28);
d[0] = 255 - MIN(c + m + y + s[3], 255);
d[1] = s[4];
s += 5;
d += 2;
}
}
 
static void fast_cmyk_to_rgb(fz_pixmap *src, fz_pixmap *dst)
{
unsigned char *s = src->samples;
unsigned char *d = dst->samples;
int n = src->w * src->h;
while (n--)
{
#ifdef SLOWCMYK
float cmyk[4], rgb[3];
cmyk[0] = s[0] / 255.0f;
cmyk[1] = s[1] / 255.0f;
cmyk[2] = s[2] / 255.0f;
cmyk[3] = s[3] / 255.0f;
cmyk_to_rgb(NULL, cmyk, rgb);
d[0] = rgb[0] * 255;
d[1] = rgb[1] * 255;
d[2] = rgb[2] * 255;
#else
d[0] = 255 - MIN(s[0] + s[3], 255);
d[1] = 255 - MIN(s[1] + s[3], 255);
d[2] = 255 - MIN(s[2] + s[3], 255);
#endif
d[3] = s[4];
s += 5;
d += 4;
}
}
 
static void fast_cmyk_to_bgr(fz_pixmap *src, fz_pixmap *dst)
{
unsigned char *s = src->samples;
unsigned char *d = dst->samples;
int n = src->w * src->h;
while (n--)
{
#ifdef SLOWCMYK
float cmyk[4], rgb[3];
cmyk[0] = s[0] / 255.0f;
cmyk[1] = s[1] / 255.0f;
cmyk[2] = s[2] / 255.0f;
cmyk[3] = s[3] / 255.0f;
cmyk_to_rgb(NULL, cmyk, rgb);
d[0] = rgb[2] * 255;
d[1] = rgb[1] * 255;
d[2] = rgb[0] * 255;
#else
d[0] = 255 - MIN(s[2] + s[3], 255);
d[1] = 255 - MIN(s[1] + s[3], 255);
d[2] = 255 - MIN(s[0] + s[3], 255);
#endif
d[3] = s[4];
s += 5;
d += 4;
}
}
 
static void fast_rgb_to_bgr(fz_pixmap *src, fz_pixmap *dst)
{
unsigned char *s = src->samples;
unsigned char *d = dst->samples;
int n = src->w * src->h;
while (n--)
{
d[0] = s[2];
d[1] = s[1];
d[2] = s[0];
d[3] = s[3];
s += 4;
d += 4;
}
}
 
static void
fz_std_conv_pixmap(fz_pixmap *src, fz_pixmap *dst)
{
float srcv[FZ_MAX_COLORS];
float dstv[FZ_MAX_COLORS];
int srcn, dstn;
int y, x, k, i;
 
fz_colorspace *ss = src->colorspace;
fz_colorspace *ds = dst->colorspace;
 
unsigned char *s = src->samples;
unsigned char *d = dst->samples;
 
assert(src->w == dst->w && src->h == dst->h);
assert(src->n == ss->n + 1);
assert(dst->n == ds->n + 1);
 
srcn = ss->n;
dstn = ds->n;
 
/* Special case for Lab colorspace (scaling of components to float) */
if (!strcmp(ss->name, "Lab") && srcn == 3)
{
for (y = 0; y < src->h; y++)
{
for (x = 0; x < src->w; x++)
{
srcv[0] = *s++ / 255.0f * 100;
srcv[1] = *s++ - 128;
srcv[2] = *s++ - 128;
 
fz_convert_color(ss, srcv, ds, dstv);
 
for (k = 0; k < dstn; k++)
*d++ = dstv[k] * 255;
 
*d++ = *s++;
}
}
}
 
/* Brute-force for small images */
else if (src->w * src->h < 256)
{
for (y = 0; y < src->h; y++)
{
for (x = 0; x < src->w; x++)
{
for (k = 0; k < srcn; k++)
srcv[k] = *s++ / 255.0f;
 
fz_convert_color(ss, srcv, ds, dstv);
 
for (k = 0; k < dstn; k++)
*d++ = dstv[k] * 255;
 
*d++ = *s++;
}
}
}
 
/* 1-d lookup table for separation and similar colorspaces */
else if (srcn == 1)
{
unsigned char lookup[FZ_MAX_COLORS * 256];
 
for (i = 0; i < 256; i++)
{
srcv[0] = i / 255.0f;
fz_convert_color(ss, srcv, ds, dstv);
for (k = 0; k < dstn; k++)
lookup[i * dstn + k] = dstv[k] * 255;
}
 
for (y = 0; y < src->h; y++)
{
for (x = 0; x < src->w; x++)
{
i = *s++;
for (k = 0; k < dstn; k++)
*d++ = lookup[i * dstn + k];
*d++ = *s++;
}
}
}
 
/* Memoize colors using a hash table for the general case */
else
{
fz_hash_table *lookup;
unsigned char *color;
 
lookup = fz_new_hash_table(509, srcn);
 
for (y = 0; y < src->h; y++)
{
for (x = 0; x < src->w; x++)
{
color = fz_hash_find(lookup, s);
if (color)
{
memcpy(d, color, dstn);
s += srcn;
d += dstn;
*d++ = *s++;
}
else
{
for (k = 0; k < srcn; k++)
srcv[k] = *s++ / 255.0f;
fz_convert_color(ss, srcv, ds, dstv);
for (k = 0; k < dstn; k++)
*d++ = dstv[k] * 255;
 
fz_hash_insert(lookup, s - srcn, d - dstn);
 
*d++ = *s++;
}
}
}
 
fz_free_hash(lookup);
}
}
 
void
fz_convert_pixmap(fz_pixmap *sp, fz_pixmap *dp)
{
fz_colorspace *ss = sp->colorspace;
fz_colorspace *ds = dp->colorspace;
 
assert(ss && ds);
 
if (sp->mask)
dp->mask = fz_keep_pixmap(sp->mask);
dp->interpolate = sp->interpolate;
 
if (ss == fz_device_gray)
{
if (ds == fz_device_rgb) fast_gray_to_rgb(sp, dp);
else if (ds == fz_device_bgr) fast_gray_to_rgb(sp, dp); /* bgr == rgb here */
else if (ds == fz_device_cmyk) fast_gray_to_cmyk(sp, dp);
else fz_std_conv_pixmap(sp, dp);
}
 
else if (ss == fz_device_rgb)
{
if (ds == fz_device_gray) fast_rgb_to_gray(sp, dp);
else if (ds == fz_device_bgr) fast_rgb_to_bgr(sp, dp);
else if (ds == fz_device_cmyk) fast_rgb_to_cmyk(sp, dp);
else fz_std_conv_pixmap(sp, dp);
}
 
else if (ss == fz_device_bgr)
{
if (ds == fz_device_gray) fast_bgr_to_gray(sp, dp);
else if (ds == fz_device_rgb) fast_rgb_to_bgr(sp, dp); /* bgr = rgb here */
else if (ds == fz_device_cmyk) fast_bgr_to_cmyk(sp, dp);
else fz_std_conv_pixmap(sp, dp);
}
 
else if (ss == fz_device_cmyk)
{
if (ds == fz_device_gray) fast_cmyk_to_gray(sp, dp);
else if (ds == fz_device_bgr) fast_cmyk_to_bgr(sp, dp);
else if (ds == fz_device_rgb) fast_cmyk_to_rgb(sp, dp);
else fz_std_conv_pixmap(sp, dp);
}
 
else fz_std_conv_pixmap(sp, dp);
}
 
/* Convert a single color */
 
static void
fz_std_conv_color(fz_colorspace *srcs, float *srcv, fz_colorspace *dsts, float *dstv)
{
float rgb[3];
int i;
 
if (srcs != dsts)
{
assert(srcs->to_rgb && dsts->from_rgb);
srcs->to_rgb(srcs, srcv, rgb);
dsts->from_rgb(dsts, rgb, dstv);
for (i = 0; i < dsts->n; i++)
dstv[i] = CLAMP(dstv[i], 0, 1);
}
else
{
for (i = 0; i < srcs->n; i++)
dstv[i] = srcv[i];
}
}
 
void
fz_convert_color(fz_colorspace *ss, float *sv, fz_colorspace *ds, float *dv)
{
if (ss == fz_device_gray)
{
if ((ds == fz_device_rgb) || (ds == fz_device_bgr))
{
dv[0] = sv[0];
dv[1] = sv[0];
dv[2] = sv[0];
}
else if (ds == fz_device_cmyk)
{
dv[0] = 0;
dv[1] = 0;
dv[2] = 0;
dv[3] = sv[0];
}
else
fz_std_conv_color(ss, sv, ds, dv);
}
 
else if (ss == fz_device_rgb)
{
if (ds == fz_device_gray)
{
dv[0] = sv[0] * 0.3f + sv[1] * 0.59f + sv[2] * 0.11f;
}
else if (ds == fz_device_bgr)
{
dv[0] = sv[2];
dv[1] = sv[1];
dv[2] = sv[0];
}
else if (ds == fz_device_cmyk)
{
float c = 1 - sv[0];
float m = 1 - sv[1];
float y = 1 - sv[2];
float k = MIN(c, MIN(m, y));
dv[0] = c - k;
dv[1] = m - k;
dv[2] = y - k;
dv[3] = k;
}
else
fz_std_conv_color(ss, sv, ds, dv);
}
 
else if (ss == fz_device_bgr)
{
if (ds == fz_device_gray)
{
dv[0] = sv[0] * 0.11f + sv[1] * 0.59f + sv[2] * 0.3f;
}
else if (ds == fz_device_bgr)
{
dv[0] = sv[2];
dv[1] = sv[1];
dv[2] = sv[0];
}
else if (ds == fz_device_cmyk)
{
float c = 1 - sv[2];
float m = 1 - sv[1];
float y = 1 - sv[0];
float k = MIN(c, MIN(m, y));
dv[0] = c - k;
dv[1] = m - k;
dv[2] = y - k;
dv[3] = k;
}
else
fz_std_conv_color(ss, sv, ds, dv);
}
 
else if (ss == fz_device_cmyk)
{
if (ds == fz_device_gray)
{
float c = sv[0] * 0.3f;
float m = sv[1] * 0.59f;
float y = sv[2] * 0.11f;
dv[0] = 1 - MIN(c + m + y + sv[3], 1);
}
else if (ds == fz_device_rgb)
{
#ifdef SLOWCMYK
cmyk_to_rgb(NULL, sv, dv);
#else
dv[0] = 1 - MIN(sv[0] + sv[3], 1);
dv[1] = 1 - MIN(sv[1] + sv[3], 1);
dv[2] = 1 - MIN(sv[2] + sv[3], 1);
#endif
}
else if (ds == fz_device_bgr)
{
#ifdef SLOWCMYK
float rgb[3];
cmyk_to_rgb(NULL, sv, rgb);
dv[0] = rgb[2];
dv[1] = rgb[1];
dv[2] = rgb[0];
#else
dv[0] = 1 - MIN(sv[2] + sv[3], 1);
dv[1] = 1 - MIN(sv[1] + sv[3], 1);
dv[2] = 1 - MIN(sv[0] + sv[3], 1);
#endif
}
else
fz_std_conv_color(ss, sv, ds, dv);
}
 
else
fz_std_conv_color(ss, sv, ds, dv);
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/res_font.c
0,0 → 1,609
#include "fitz.h"
 
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_STROKER_H
 
static void fz_finalize_freetype(void);
 
static fz_font *
fz_new_font(char *name)
{
fz_font *font;
 
font = fz_malloc(sizeof(fz_font));
font->refs = 1;
 
if (name)
fz_strlcpy(font->name, name, sizeof font->name);
else
fz_strlcpy(font->name, "(null)", sizeof font->name);
 
font->ft_face = NULL;
font->ft_substitute = 0;
font->ft_bold = 0;
font->ft_italic = 0;
font->ft_hint = 0;
 
font->ft_file = NULL;
font->ft_data = NULL;
font->ft_size = 0;
 
font->t3matrix = fz_identity;
font->t3resources = NULL;
font->t3procs = NULL;
font->t3widths = NULL;
font->t3xref = NULL;
font->t3run = NULL;
 
font->bbox.x0 = 0;
font->bbox.y0 = 0;
font->bbox.x1 = 1000;
font->bbox.y1 = 1000;
 
font->width_count = 0;
font->width_table = NULL;
 
return font;
}
 
fz_font *
fz_keep_font(fz_font *font)
{
font->refs ++;
return font;
}
 
void
fz_drop_font(fz_font *font)
{
int fterr;
int i;
 
if (font && --font->refs == 0)
{
if (font->t3procs)
{
if (font->t3resources)
fz_drop_obj(font->t3resources);
for (i = 0; i < 256; i++)
if (font->t3procs[i])
fz_drop_buffer(font->t3procs[i]);
fz_free(font->t3procs);
fz_free(font->t3widths);
}
 
if (font->ft_face)
{
fterr = FT_Done_Face((FT_Face)font->ft_face);
if (fterr)
fz_warn("freetype finalizing face: %s", ft_error_string(fterr));
fz_finalize_freetype();
}
 
if (font->ft_file)
fz_free(font->ft_file);
if (font->ft_data)
fz_free(font->ft_data);
 
if (font->width_table)
fz_free(font->width_table);
 
fz_free(font);
}
}
 
void
fz_set_font_bbox(fz_font *font, float xmin, float ymin, float xmax, float ymax)
{
font->bbox.x0 = xmin;
font->bbox.y0 = ymin;
font->bbox.x1 = xmax;
font->bbox.y1 = ymax;
}
 
/*
* Freetype hooks
*/
 
static FT_Library fz_ftlib = NULL;
static int fz_ftlib_refs = 0;
 
#undef __FTERRORS_H__
#define FT_ERRORDEF(e, v, s) { (e), (s) },
#define FT_ERROR_START_LIST
#define FT_ERROR_END_LIST { 0, NULL }
 
struct ft_error
{
int err;
char *str;
};
 
static const struct ft_error ft_errors[] =
{
#include FT_ERRORS_H
};
 
char *ft_error_string(int err)
{
const struct ft_error *e;
 
for (e = ft_errors; e->str != NULL; e++)
if (e->err == err)
return e->str;
 
return "Unknown error";
}
 
static fz_error
fz_init_freetype(void)
{
int fterr;
int maj, min, pat;
 
if (fz_ftlib)
{
fz_ftlib_refs++;
return fz_okay;
}
 
fterr = FT_Init_FreeType(&fz_ftlib);
if (fterr)
return fz_throw("cannot init freetype: %s", ft_error_string(fterr));
 
FT_Library_Version(fz_ftlib, &maj, &min, &pat);
if (maj == 2 && min == 1 && pat < 7)
{
fterr = FT_Done_FreeType(fz_ftlib);
if (fterr)
fz_warn("freetype finalizing: %s", ft_error_string(fterr));
return fz_throw("freetype version too old: %d.%d.%d", maj, min, pat);
}
 
fz_ftlib_refs++;
return fz_okay;
}
 
static void
fz_finalize_freetype(void)
{
int fterr;
 
if (--fz_ftlib_refs == 0)
{
fterr = FT_Done_FreeType(fz_ftlib);
if (fterr)
fz_warn("freetype finalizing: %s", ft_error_string(fterr));
fz_ftlib = NULL;
}
}
 
fz_error
fz_new_font_from_file(fz_font **fontp, char *path, int index)
{
FT_Face face;
fz_error error;
fz_font *font;
int fterr;
 
error = fz_init_freetype();
if (error)
return fz_rethrow(error, "cannot init freetype library");
 
fterr = FT_New_Face(fz_ftlib, path, index, &face);
if (fterr)
return fz_throw("freetype: cannot load font: %s", ft_error_string(fterr));
 
font = fz_new_font(face->family_name);
font->ft_face = face;
font->bbox.x0 = face->bbox.xMin * 1000 / face->units_per_EM;
font->bbox.y0 = face->bbox.yMin * 1000 / face->units_per_EM;
font->bbox.x1 = face->bbox.xMax * 1000 / face->units_per_EM;
font->bbox.y1 = face->bbox.yMax * 1000 / face->units_per_EM;
 
*fontp = font;
return fz_okay;
}
 
fz_error
fz_new_font_from_memory(fz_font **fontp, unsigned char *data, int len, int index)
{
FT_Face face;
fz_error error;
fz_font *font;
int fterr;
 
error = fz_init_freetype();
if (error)
return fz_rethrow(error, "cannot init freetype library");
 
fterr = FT_New_Memory_Face(fz_ftlib, data, len, index, &face);
if (fterr)
return fz_throw("freetype: cannot load font: %s", ft_error_string(fterr));
 
font = fz_new_font(face->family_name);
font->ft_face = face;
font->bbox.x0 = face->bbox.xMin * 1000 / face->units_per_EM;
font->bbox.y0 = face->bbox.yMin * 1000 / face->units_per_EM;
font->bbox.x1 = face->bbox.xMax * 1000 / face->units_per_EM;
font->bbox.y1 = face->bbox.yMax * 1000 / face->units_per_EM;
 
*fontp = font;
return fz_okay;
}
 
static fz_matrix
fz_adjust_ft_glyph_width(fz_font *font, int gid, fz_matrix trm)
{
/* Fudge the font matrix to stretch the glyph if we've substituted the font. */
if (font->ft_substitute && gid < font->width_count)
{
FT_Error fterr;
int subw;
int realw;
float scale;
 
/* TODO: use FT_Get_Advance */
fterr = FT_Set_Char_Size(font->ft_face, 1000, 1000, 72, 72);
if (fterr)
fz_warn("freetype setting character size: %s", ft_error_string(fterr));
 
fterr = FT_Load_Glyph(font->ft_face, gid,
FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_TRANSFORM);
if (fterr)
fz_warn("freetype failed to load glyph: %s", ft_error_string(fterr));
 
realw = ((FT_Face)font->ft_face)->glyph->metrics.horiAdvance;
subw = font->width_table[gid];
if (realw)
scale = (float) subw / realw;
else
scale = 1;
 
return fz_concat(fz_scale(scale, 1), trm);
}
 
return trm;
}
 
static fz_pixmap *
fz_copy_ft_bitmap(int left, int top, FT_Bitmap *bitmap)
{
fz_pixmap *pixmap;
int y;
 
pixmap = fz_new_pixmap(NULL, bitmap->width, bitmap->rows);
pixmap->x = left;
pixmap->y = top - bitmap->rows;
 
if (bitmap->pixel_mode == FT_PIXEL_MODE_MONO)
{
for (y = 0; y < pixmap->h; y++)
{
unsigned char *out = pixmap->samples + y * pixmap->w;
unsigned char *in = bitmap->buffer + (pixmap->h - y - 1) * bitmap->pitch;
unsigned char bit = 0x80;
int w = pixmap->w;
while (w--)
{
*out++ = (*in & bit) ? 255 : 0;
bit >>= 1;
if (bit == 0)
{
bit = 0x80;
in++;
}
}
}
}
else
{
for (y = 0; y < pixmap->h; y++)
{
memcpy(pixmap->samples + y * pixmap->w,
bitmap->buffer + (pixmap->h - y - 1) * bitmap->pitch,
pixmap->w);
}
}
 
return pixmap;
}
 
fz_pixmap *
fz_render_ft_glyph(fz_font *font, int gid, fz_matrix trm)
{
FT_Face face = font->ft_face;
FT_Matrix m;
FT_Vector v;
FT_Error fterr;
 
trm = fz_adjust_ft_glyph_width(font, gid, trm);
 
if (font->ft_italic)
trm = fz_concat(fz_shear(0.3f, 0), trm);
 
/*
Freetype mutilates complex glyphs if they are loaded
with FT_Set_Char_Size 1.0. it rounds the coordinates
before applying transformation. to get more precision in
freetype, we shift part of the scale in the matrix
into FT_Set_Char_Size instead
*/
 
m.xx = trm.a * 64; /* should be 65536 */
m.yx = trm.b * 64;
m.xy = trm.c * 64;
m.yy = trm.d * 64;
v.x = trm.e * 64;
v.y = trm.f * 64;
 
fterr = FT_Set_Char_Size(face, 65536, 65536, 72, 72); /* should be 64, 64 */
if (fterr)
fz_warn("freetype setting character size: %s", ft_error_string(fterr));
FT_Set_Transform(face, &m, &v);
 
if (fz_get_aa_level() == 0)
{
/* If you really want grid fitting, enable this code. */
float scale = fz_matrix_expansion(trm);
m.xx = trm.a * 65536 / scale;
m.xy = trm.b * 65536 / scale;
m.yx = trm.c * 65536 / scale;
m.yy = trm.d * 65536 / scale;
v.x = 0;
v.y = 0;
 
fterr = FT_Set_Char_Size(face, 64 * scale, 64 * scale, 72, 72);
if (fterr)
fz_warn("freetype setting character size: %s", ft_error_string(fterr));
FT_Set_Transform(face, &m, &v);
fterr = FT_Load_Glyph(face, gid, FT_LOAD_NO_BITMAP | FT_LOAD_TARGET_MONO);
if (fterr)
fz_warn("freetype load glyph (gid %d): %s", gid, ft_error_string(fterr));
}
else if (font->ft_hint)
{
/*
Enable hinting, but keep the huge char size so that
it is hinted for a character. This will in effect nullify
the effect of grid fitting. This form of hinting should
only be used for DynaLab and similar tricky TrueType fonts,
so that we get the correct outline shape.
*/
fterr = FT_Load_Glyph(face, gid, FT_LOAD_NO_BITMAP);
if (fterr)
fz_warn("freetype load glyph (gid %d): %s", gid, ft_error_string(fterr));
}
else
{
fterr = FT_Load_Glyph(face, gid, FT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING);
if (fterr)
{
fz_warn("freetype load glyph (gid %d): %s", gid, ft_error_string(fterr));
return NULL;
}
}
 
if (font->ft_bold)
{
float strength = fz_matrix_expansion(trm) * 0.04f;
FT_Outline_Embolden(&face->glyph->outline, strength * 64);
FT_Outline_Translate(&face->glyph->outline, -strength * 32, -strength * 32);
}
 
fterr = FT_Render_Glyph(face->glyph, fz_get_aa_level() > 0 ? FT_RENDER_MODE_NORMAL : FT_RENDER_MODE_MONO);
if (fterr)
{
fz_warn("freetype render glyph (gid %d): %s", gid, ft_error_string(fterr));
return NULL;
}
 
return fz_copy_ft_bitmap(face->glyph->bitmap_left, face->glyph->bitmap_top, &face->glyph->bitmap);
}
 
fz_pixmap *
fz_render_ft_stroked_glyph(fz_font *font, int gid, fz_matrix trm, fz_matrix ctm, fz_stroke_state *state)
{
FT_Face face = font->ft_face;
float expansion = fz_matrix_expansion(ctm);
int linewidth = state->linewidth * expansion * 64 / 2;
FT_Matrix m;
FT_Vector v;
FT_Error fterr;
FT_Stroker stroker;
FT_Glyph glyph;
FT_BitmapGlyph bitmap;
fz_pixmap *pixmap;
 
trm = fz_adjust_ft_glyph_width(font, gid, trm);
 
if (font->ft_italic)
trm = fz_concat(fz_shear(0.3f, 0), trm);
 
m.xx = trm.a * 64; /* should be 65536 */
m.yx = trm.b * 64;
m.xy = trm.c * 64;
m.yy = trm.d * 64;
v.x = trm.e * 64;
v.y = trm.f * 64;
 
fterr = FT_Set_Char_Size(face, 65536, 65536, 72, 72); /* should be 64, 64 */
if (fterr)
{
fz_warn("FT_Set_Char_Size: %s", ft_error_string(fterr));
return NULL;
}
 
FT_Set_Transform(face, &m, &v);
 
fterr = FT_Load_Glyph(face, gid, FT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING);
if (fterr)
{
fz_warn("FT_Load_Glyph(gid %d): %s", gid, ft_error_string(fterr));
return NULL;
}
 
fterr = FT_Stroker_New(fz_ftlib, &stroker);
if (fterr)
{
fz_warn("FT_Stroker_New: %s", ft_error_string(fterr));
return NULL;
}
 
FT_Stroker_Set(stroker, linewidth, state->start_cap, state->linejoin, state->miterlimit * 65536);
 
fterr = FT_Get_Glyph(face->glyph, &glyph);
if (fterr)
{
fz_warn("FT_Get_Glyph: %s", ft_error_string(fterr));
FT_Stroker_Done(stroker);
return NULL;
}
 
fterr = FT_Glyph_Stroke(&glyph, stroker, 1);
if (fterr)
{
fz_warn("FT_Glyph_Stroke: %s", ft_error_string(fterr));
FT_Done_Glyph(glyph);
FT_Stroker_Done(stroker);
return NULL;
}
 
FT_Stroker_Done(stroker);
 
fterr = FT_Glyph_To_Bitmap(&glyph, fz_get_aa_level() > 0 ? FT_RENDER_MODE_NORMAL : FT_RENDER_MODE_MONO, 0, 1);
if (fterr)
{
fz_warn("FT_Glyph_To_Bitmap: %s", ft_error_string(fterr));
FT_Done_Glyph(glyph);
return NULL;
}
 
bitmap = (FT_BitmapGlyph)glyph;
pixmap = fz_copy_ft_bitmap(bitmap->left, bitmap->top, &bitmap->bitmap);
FT_Done_Glyph(glyph);
 
return pixmap;
}
 
/*
* Type 3 fonts...
*/
 
fz_font *
fz_new_type3_font(char *name, fz_matrix matrix)
{
fz_font *font;
int i;
 
font = fz_new_font(name);
font->t3procs = fz_calloc(256, sizeof(fz_buffer*));
font->t3widths = fz_calloc(256, sizeof(float));
 
font->t3matrix = matrix;
for (i = 0; i < 256; i++)
{
font->t3procs[i] = NULL;
font->t3widths[i] = 0;
}
 
return font;
}
 
fz_pixmap *
fz_render_t3_glyph(fz_font *font, int gid, fz_matrix trm, fz_colorspace *model)
{
fz_error error;
fz_matrix ctm;
fz_buffer *contents;
fz_bbox bbox;
fz_device *dev;
fz_glyph_cache *cache;
fz_pixmap *glyph;
fz_pixmap *result;
 
if (gid < 0 || gid > 255)
return NULL;
 
contents = font->t3procs[gid];
if (!contents)
return NULL;
 
ctm = fz_concat(font->t3matrix, trm);
dev = fz_new_bbox_device(&bbox);
error = font->t3run(font->t3xref, font->t3resources, contents, dev, ctm);
if (error)
fz_catch(error, "cannot draw type3 glyph");
 
if (dev->flags & FZ_CHARPROC_MASK)
{
if (dev->flags & FZ_CHARPROC_COLOR)
fz_warn("type3 glyph claims to be both masked and colored");
model = NULL;
}
else if (dev->flags & FZ_CHARPROC_COLOR)
{
if (model == NULL)
fz_warn("colored type3 glyph wanted in masked context");
}
else
{
fz_warn("type3 glyph doesn't specify masked or colored");
model = NULL; /* Treat as masked */
}
 
fz_free_device(dev);
 
bbox.x0--;
bbox.y0--;
bbox.x1++;
bbox.y1++;
 
glyph = fz_new_pixmap_with_rect(model ? model : fz_device_gray, bbox);
fz_clear_pixmap(glyph);
 
cache = fz_new_glyph_cache();
dev = fz_new_draw_device_type3(cache, glyph);
error = font->t3run(font->t3xref, font->t3resources, contents, dev, ctm);
if (error)
fz_catch(error, "cannot draw type3 glyph");
fz_free_device(dev);
fz_free_glyph_cache(cache);
 
if (model == NULL)
{
result = fz_alpha_from_gray(glyph, 0);
fz_drop_pixmap(glyph);
}
else
result = glyph;
 
return result;
}
 
void
fz_debug_font(fz_font *font)
{
printf("font '%s' {\n", font->name);
 
if (font->ft_face)
{
printf("\tfreetype face %p\n", font->ft_face);
if (font->ft_substitute)
printf("\tsubstitute font\n");
}
 
if (font->t3procs)
{
printf("\ttype3 matrix [%g %g %g %g]\n",
font->t3matrix.a, font->t3matrix.b,
font->t3matrix.c, font->t3matrix.d);
}
 
printf("\tbbox [%g %g %g %g]\n",
font->bbox.x0, font->bbox.y0,
font->bbox.x1, font->bbox.y1);
 
printf("}\n");
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/res_halftone.c
0,0 → 1,190
#include "fitz.h"
 
fz_halftone *
fz_new_halftone(int comps)
{
fz_halftone *ht;
int i;
 
ht = fz_malloc(sizeof(fz_halftone) + (comps-1)*sizeof(fz_pixmap *));
ht->refs = 1;
ht->n = comps;
for (i = 0; i < comps; i++)
ht->comp[i] = NULL;
 
return ht;
}
 
fz_halftone *
fz_keep_halftone(fz_halftone *ht)
{
ht->refs++;
return ht;
}
 
void
fz_drop_halftone(fz_halftone *ht)
{
int i;
 
if (!ht || --ht->refs != 0)
return;
for (i = 0; i < ht->n; i++)
fz_drop_pixmap(ht->comp[i]);
fz_free(ht);
}
 
/* Default mono halftone, lifted from Ghostscript. */
static unsigned char mono_ht[] =
{
0x0E, 0x8E, 0x2E, 0xAE, 0x06, 0x86, 0x26, 0xA6, 0x0C, 0x8C, 0x2C, 0xAC, 0x04, 0x84, 0x24, 0xA4,
0xCE, 0x4E, 0xEE, 0x6E, 0xC6, 0x46, 0xE6, 0x66, 0xCC, 0x4C, 0xEC, 0x6C, 0xC4, 0x44, 0xE4, 0x64,
0x3E, 0xBE, 0x1E, 0x9E, 0x36, 0xB6, 0x16, 0x96, 0x3C, 0xBC, 0x1C, 0x9C, 0x34, 0xB4, 0x14, 0x94,
0xFE, 0x7E, 0xDE, 0x5E, 0xF6, 0x76, 0xD6, 0x56, 0xFC, 0x7C, 0xDC, 0x5C, 0xF4, 0x74, 0xD4, 0x54,
0x01, 0x81, 0x21, 0xA1, 0x09, 0x89, 0x29, 0xA9, 0x03, 0x83, 0x23, 0xA3, 0x0B, 0x8B, 0x2B, 0xAB,
0xC1, 0x41, 0xE1, 0x61, 0xC9, 0x49, 0xE9, 0x69, 0xC3, 0x43, 0xE3, 0x63, 0xCB, 0x4B, 0xEB, 0x6B,
0x31, 0xB1, 0x11, 0x91, 0x39, 0xB9, 0x19, 0x99, 0x33, 0xB3, 0x13, 0x93, 0x3B, 0xBB, 0x1B, 0x9B,
0xF1, 0x71, 0xD1, 0x51, 0xF9, 0x79, 0xD9, 0x59, 0xF3, 0x73, 0xD3, 0x53, 0xFB, 0x7B, 0xDB, 0x5B,
0x0D, 0x8D, 0x2D, 0xAD, 0x05, 0x85, 0x25, 0xA5, 0x0F, 0x8F, 0x2F, 0xAF, 0x07, 0x87, 0x27, 0xA7,
0xCD, 0x4D, 0xED, 0x6D, 0xC5, 0x45, 0xE5, 0x65, 0xCF, 0x4F, 0xEF, 0x6F, 0xC7, 0x47, 0xE7, 0x67,
0x3D, 0xBD, 0x1D, 0x9D, 0x35, 0xB5, 0x15, 0x95, 0x3F, 0xBF, 0x1F, 0x9F, 0x37, 0xB7, 0x17, 0x97,
0xFD, 0x7D, 0xDD, 0x5D, 0xF5, 0x75, 0xD5, 0x55, 0xFF, 0x7F, 0xDF, 0x5F, 0xF7, 0x77, 0xD7, 0x57,
0x02, 0x82, 0x22, 0xA2, 0x0A, 0x8A, 0x2A, 0xAA, 0x00, 0x80, 0x20, 0xA0, 0x08, 0x88, 0x28, 0xA8,
0xC2, 0x42, 0xE2, 0x62, 0xCA, 0x4A, 0xEA, 0x6A, 0xC0, 0x40, 0xE0, 0x60, 0xC8, 0x48, 0xE8, 0x68,
0x32, 0xB2, 0x12, 0x92, 0x3A, 0xBA, 0x1A, 0x9A, 0x30, 0xB0, 0x10, 0x90, 0x38, 0xB8, 0x18, 0x98,
0xF2, 0x72, 0xD2, 0x52, 0xFA, 0x7A, 0xDA, 0x5A, 0xF0, 0x70, 0xD0, 0x50, 0xF8, 0x78, 0xD8, 0x58
};
 
fz_halftone *fz_get_default_halftone(int num_comps)
{
fz_halftone *ht = fz_new_halftone(num_comps);
assert(num_comps == 1); /* Only support 1 component for now */
ht->comp[0] = fz_new_pixmap_with_data(NULL, 16, 16, mono_ht);
return ht;
}
 
/* Finally, code to actually perform halftoning. */
static void make_ht_line(unsigned char *buf, fz_halftone *ht, int x, int y, int w)
{
/* FIXME: There is a potential optimisation here; in the case where
* the LCM of the halftone tile widths is smaller than w, we could
* form just one 'LCM' run, then copy it repeatedly.
*/
int k, n;
n = ht->n;
for (k = 0; k < n; k++)
{
fz_pixmap *tile = ht->comp[k];
unsigned char *b = buf++;
unsigned char *t;
unsigned char *tbase;
int px = x + tile->x;
int py = y + tile->y;
int tw = tile->w;
int th = tile->h;
int w2 = w;
int len;
px = px % tw;
if (px < 0)
px += tw;
py = py % th;
if (py < 0)
py += th;
 
assert(tile->n == 1);
 
/* Left hand section; from x to tile width */
tbase = tile->samples + py * tw;
t = tbase + px;
len = tw - px;
if (len > w2)
len = w2;
w2 -= len;
while (len--)
{
*b = *t++;
b += n;
}
 
/* Centre section - complete copies */
w2 -= tw;
while (w2 >= 0)
{
len = tw;
t = tbase;
while (len--)
{
*b = *t++;
b += n;
}
w2 -= tw;
}
w2 += tw;
 
/* Right hand section - stragglers */
t = tbase;
while (w2--)
{
*b = *t++;
b += n;
}
}
}
 
/* Inner mono thresholding code */
static void do_threshold_1(unsigned char *ht_line, unsigned char *pixmap, unsigned char *out, int w)
{
int bit = 0x80;
int h = 0;
 
do
{
if (*pixmap < *ht_line++)
h |= bit;
pixmap += 2; /* Skip the alpha */
bit >>= 1;
if (bit == 0)
{
*out++ = h;
h = 0;
bit = 0x80;
}
 
}
while (--w);
if (bit != 0x80)
*out++ = h;
}
 
fz_bitmap *fz_halftone_pixmap(fz_pixmap *pix, fz_halftone *ht)
{
fz_bitmap *out;
unsigned char *ht_line, *o, *p;
int w, h, x, y, n, pstride, ostride;
 
if (pix == NULL || ht == NULL)
return NULL;
 
assert(pix->n == 2); /* Mono + Alpha */
 
n = pix->n-1; /* Remove alpha */
ht_line = fz_malloc(pix->w * n);
out = fz_new_bitmap(pix->w, pix->h, n);
o = out->samples;
p = pix->samples;
 
h = pix->h;
x = pix->x;
y = pix->y;
w = pix->w;
ostride = out->stride;
pstride = pix->w * pix->n;
while (h--)
{
make_ht_line(ht_line, ht, x, y++, w);
do_threshold_1(ht_line, p, o, w);
o += ostride;
p += pstride;
}
return out;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/res_path.c
0,0 → 1,262
#include "fitz.h"
 
fz_path *
fz_new_path(void)
{
fz_path *path;
 
path = fz_malloc(sizeof(fz_path));
path->len = 0;
path->cap = 0;
path->items = NULL;
 
return path;
}
 
fz_path *
fz_clone_path(fz_path *old)
{
fz_path *path;
 
path = fz_malloc(sizeof(fz_path));
path->len = old->len;
path->cap = old->len;
path->items = fz_calloc(path->cap, sizeof(fz_path_item));
memcpy(path->items, old->items, sizeof(fz_path_item) * path->len);
 
return path;
}
 
void
fz_free_path(fz_path *path)
{
fz_free(path->items);
fz_free(path);
}
 
static void
grow_path(fz_path *path, int n)
{
if (path->len + n < path->cap)
return;
while (path->len + n > path->cap)
path->cap = path->cap + 36;
path->items = fz_realloc(path->items, path->cap, sizeof(fz_path_item));
}
 
void
fz_moveto(fz_path *path, float x, float y)
{
grow_path(path, 3);
path->items[path->len++].k = FZ_MOVETO;
path->items[path->len++].v = x;
path->items[path->len++].v = y;
}
 
void
fz_lineto(fz_path *path, float x, float y)
{
if (path->len == 0)
{
fz_warn("lineto with no current point");
return;
}
grow_path(path, 3);
path->items[path->len++].k = FZ_LINETO;
path->items[path->len++].v = x;
path->items[path->len++].v = y;
}
 
void
fz_curveto(fz_path *path,
float x1, float y1,
float x2, float y2,
float x3, float y3)
{
if (path->len == 0)
{
fz_warn("curveto with no current point");
return;
}
grow_path(path, 7);
path->items[path->len++].k = FZ_CURVETO;
path->items[path->len++].v = x1;
path->items[path->len++].v = y1;
path->items[path->len++].v = x2;
path->items[path->len++].v = y2;
path->items[path->len++].v = x3;
path->items[path->len++].v = y3;
}
 
void
fz_curvetov(fz_path *path, float x2, float y2, float x3, float y3)
{
float x1, y1;
if (path->len == 0)
{
fz_warn("curvetov with no current point");
return;
}
x1 = path->items[path->len-2].v;
y1 = path->items[path->len-1].v;
fz_curveto(path, x1, y1, x2, y2, x3, y3);
}
 
void
fz_curvetoy(fz_path *path, float x1, float y1, float x3, float y3)
{
fz_curveto(path, x1, y1, x3, y3, x3, y3);
}
 
void
fz_closepath(fz_path *path)
{
if (path->len == 0)
{
fz_warn("closepath with no current point");
return;
}
grow_path(path, 1);
path->items[path->len++].k = FZ_CLOSE_PATH;
}
 
static inline fz_rect bound_expand(fz_rect r, fz_point p)
{
if (p.x < r.x0) r.x0 = p.x;
if (p.y < r.y0) r.y0 = p.y;
if (p.x > r.x1) r.x1 = p.x;
if (p.y > r.y1) r.y1 = p.y;
return r;
}
 
fz_rect
fz_bound_path(fz_path *path, fz_stroke_state *stroke, fz_matrix ctm)
{
fz_point p;
fz_rect r = fz_empty_rect;
int i = 0;
 
if (path->len)
{
p.x = path->items[1].v;
p.y = path->items[2].v;
p = fz_transform_point(ctm, p);
r.x0 = r.x1 = p.x;
r.y0 = r.y1 = p.y;
}
 
while (i < path->len)
{
switch (path->items[i++].k)
{
case FZ_CURVETO:
p.x = path->items[i++].v;
p.y = path->items[i++].v;
r = bound_expand(r, fz_transform_point(ctm, p));
p.x = path->items[i++].v;
p.y = path->items[i++].v;
r = bound_expand(r, fz_transform_point(ctm, p));
p.x = path->items[i++].v;
p.y = path->items[i++].v;
r = bound_expand(r, fz_transform_point(ctm, p));
break;
case FZ_MOVETO:
case FZ_LINETO:
p.x = path->items[i++].v;
p.y = path->items[i++].v;
r = bound_expand(r, fz_transform_point(ctm, p));
break;
case FZ_CLOSE_PATH:
break;
}
}
 
if (stroke)
{
float miterlength = stroke->miterlimit;
float linewidth = stroke->linewidth;
float expand = MAX(miterlength, linewidth) * 0.5f;
r.x0 -= expand;
r.y0 -= expand;
r.x1 += expand;
r.y1 += expand;
}
 
return r;
}
 
void
fz_transform_path(fz_path *path, fz_matrix ctm)
{
fz_point p;
int k, i = 0;
 
while (i < path->len)
{
switch (path->items[i++].k)
{
case FZ_CURVETO:
for (k = 0; k < 3; k++)
{
p.x = path->items[i].v;
p.y = path->items[i+1].v;
p = fz_transform_point(ctm, p);
path->items[i].v = p.x;
path->items[i+1].v = p.y;
i += 2;
}
break;
case FZ_MOVETO:
case FZ_LINETO:
p.x = path->items[i].v;
p.y = path->items[i+1].v;
p = fz_transform_point(ctm, p);
path->items[i].v = p.x;
path->items[i+1].v = p.y;
i += 2;
break;
case FZ_CLOSE_PATH:
break;
}
}
}
 
void
fz_debug_path(fz_path *path, int indent)
{
float x, y;
int i = 0;
int n;
while (i < path->len)
{
for (n = 0; n < indent; n++)
putchar(' ');
switch (path->items[i++].k)
{
case FZ_MOVETO:
x = path->items[i++].v;
y = path->items[i++].v;
printf("%g %g m\n", x, y);
break;
case FZ_LINETO:
x = path->items[i++].v;
y = path->items[i++].v;
printf("%g %g l\n", x, y);
break;
case FZ_CURVETO:
x = path->items[i++].v;
y = path->items[i++].v;
printf("%g %g ", x, y);
x = path->items[i++].v;
y = path->items[i++].v;
printf("%g %g ", x, y);
x = path->items[i++].v;
y = path->items[i++].v;
printf("%g %g c\n", x, y);
break;
case FZ_CLOSE_PATH:
printf("h\n");
break;
}
}
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/res_pixmap.c
0,0 → 1,519
#include "fitz.h"
 
static int fz_memory_limit = 256 << 20;
static int fz_memory_used = 0;
 
fz_pixmap *
fz_new_pixmap_with_data(fz_colorspace *colorspace, int w, int h, unsigned char *samples)
{
fz_pixmap *pix;
 
pix = fz_malloc(sizeof(fz_pixmap));
pix->refs = 1;
pix->x = 0;
pix->y = 0;
pix->w = w;
pix->h = h;
pix->mask = NULL;
pix->interpolate = 1;
pix->xres = 96;
pix->yres = 96;
pix->colorspace = NULL;
pix->n = 1;
 
if (colorspace)
{
pix->colorspace = fz_keep_colorspace(colorspace);
pix->n = 1 + colorspace->n;
}
 
if (samples)
{
pix->samples = samples;
pix->free_samples = 0;
}
else
{
fz_memory_used += pix->w * pix->h * pix->n;
pix->samples = fz_calloc(pix->h, pix->w * pix->n);
pix->free_samples = 1;
}
 
return pix;
}
 
fz_pixmap *
fz_new_pixmap_with_limit(fz_colorspace *colorspace, int w, int h)
{
int n = colorspace ? colorspace->n + 1 : 1;
int size = w * h * n;
if (fz_memory_used + size > fz_memory_limit)
{
fz_warn("pixmap memory exceeds soft limit %dM + %dM > %dM",
fz_memory_used/(1<<20), size/(1<<20), fz_memory_limit/(1<<20));
return NULL;
}
return fz_new_pixmap_with_data(colorspace, w, h, NULL);
}
 
fz_pixmap *
fz_new_pixmap(fz_colorspace *colorspace, int w, int h)
{
return fz_new_pixmap_with_data(colorspace, w, h, NULL);
}
 
fz_pixmap *
fz_new_pixmap_with_rect(fz_colorspace *colorspace, fz_bbox r)
{
fz_pixmap *pixmap;
pixmap = fz_new_pixmap(colorspace, r.x1 - r.x0, r.y1 - r.y0);
pixmap->x = r.x0;
pixmap->y = r.y0;
return pixmap;
}
 
fz_pixmap *
fz_new_pixmap_with_rect_and_data(fz_colorspace *colorspace, fz_bbox r, unsigned char *samples)
{
fz_pixmap *pixmap;
pixmap = fz_new_pixmap_with_data(colorspace, r.x1 - r.x0, r.y1 - r.y0, samples);
pixmap->x = r.x0;
pixmap->y = r.y0;
return pixmap;
}
 
fz_pixmap *
fz_keep_pixmap(fz_pixmap *pix)
{
pix->refs++;
return pix;
}
 
void
fz_drop_pixmap(fz_pixmap *pix)
{
if (pix && --pix->refs == 0)
{
fz_memory_used -= pix->w * pix->h * pix->n;
if (pix->mask)
fz_drop_pixmap(pix->mask);
if (pix->colorspace)
fz_drop_colorspace(pix->colorspace);
if (pix->free_samples)
fz_free(pix->samples);
fz_free(pix);
}
}
 
fz_bbox
fz_bound_pixmap(fz_pixmap *pix)
{
fz_bbox bbox;
bbox.x0 = pix->x;
bbox.y0 = pix->y;
bbox.x1 = pix->x + pix->w;
bbox.y1 = pix->y + pix->h;
return bbox;
}
 
void
fz_clear_pixmap(fz_pixmap *pix)
{
memset(pix->samples, 0, pix->w * pix->h * pix->n);
}
 
void
fz_clear_pixmap_with_color(fz_pixmap *pix, int value)
{
if (value == 255)
memset(pix->samples, 255, pix->w * pix->h * pix->n);
else
{
int k, x, y;
unsigned char *s = pix->samples;
for (y = 0; y < pix->h; y++)
{
for (x = 0; x < pix->w; x++)
{
for (k = 0; k < pix->n - 1; k++)
*s++ = value;
*s++ = 255;
}
}
}
}
 
void
fz_copy_pixmap_rect(fz_pixmap *dest, fz_pixmap *src, fz_bbox r)
{
const unsigned char *srcp;
unsigned char *destp;
int y, w, destspan, srcspan;
 
r = fz_intersect_bbox(r, fz_bound_pixmap(dest));
r = fz_intersect_bbox(r, fz_bound_pixmap(src));
w = r.x1 - r.x0;
y = r.y1 - r.y0;
if (w <= 0 || y <= 0)
return;
 
w *= src->n;
srcspan = src->w * src->n;
srcp = src->samples + srcspan * (r.y0 - src->y) + src->n * (r.x0 - src->x);
destspan = dest->w * dest->n;
destp = dest->samples + destspan * (r.y0 - dest->y) + dest->n * (r.x0 - dest->x);
do
{
memcpy(destp, srcp, w);
srcp += srcspan;
destp += destspan;
}
while (--y);
}
 
void
fz_clear_pixmap_rect_with_color(fz_pixmap *dest, int value, fz_bbox r)
{
unsigned char *destp;
int x, y, w, k, destspan;
 
r = fz_intersect_bbox(r, fz_bound_pixmap(dest));
w = r.x1 - r.x0;
y = r.y1 - r.y0;
if (w <= 0 || y <= 0)
return;
 
destspan = dest->w * dest->n;
destp = dest->samples + destspan * (r.y0 - dest->y) + dest->n * (r.x0 - dest->x);
if (value == 255)
do
{
memset(destp, 255, w * dest->n);
destp += destspan;
}
while (--y);
else
do
{
unsigned char *s = destp;
for (x = 0; x < w; x++)
{
for (k = 0; k < dest->n - 1; k++)
*s++ = value;
*s++ = 255;
}
destp += destspan;
}
while (--y);
}
 
void
fz_premultiply_pixmap(fz_pixmap *pix)
{
unsigned char *s = pix->samples;
unsigned char a;
int k, x, y;
 
for (y = 0; y < pix->h; y++)
{
for (x = 0; x < pix->w; x++)
{
a = s[pix->n - 1];
for (k = 0; k < pix->n - 1; k++)
s[k] = fz_mul255(s[k], a);
s += pix->n;
}
}
}
 
fz_pixmap *
fz_alpha_from_gray(fz_pixmap *gray, int luminosity)
{
fz_pixmap *alpha;
unsigned char *sp, *dp;
int len;
 
assert(gray->n == 2);
 
alpha = fz_new_pixmap_with_rect(NULL, fz_bound_pixmap(gray));
dp = alpha->samples;
sp = gray->samples;
if (!luminosity)
sp ++;
 
len = gray->w * gray->h;
while (len--)
{
*dp++ = sp[0];
sp += 2;
}
 
return alpha;
}
 
void
fz_invert_pixmap(fz_pixmap *pix)
{
unsigned char *s = pix->samples;
int k, x, y;
 
for (y = 0; y < pix->h; y++)
{
for (x = 0; x < pix->w; x++)
{
for (k = 0; k < pix->n - 1; k++)
s[k] = 255 - s[k];
s += pix->n;
}
}
}
 
void
fz_gamma_pixmap(fz_pixmap *pix, float gamma)
{
unsigned char gamma_map[256];
unsigned char *s = pix->samples;
int k, x, y;
 
for (k = 0; k < 256; k++)
gamma_map[k] = pow(k / 255.0f, gamma) * 255;
 
for (y = 0; y < pix->h; y++)
{
for (x = 0; x < pix->w; x++)
{
for (k = 0; k < pix->n - 1; k++)
s[k] = gamma_map[s[k]];
s += pix->n;
}
}
}
 
/*
* Write pixmap to PNM file (without alpha channel)
*/
 
fz_error
fz_write_pnm(fz_pixmap *pixmap, char *filename)
{
FILE *fp;
unsigned char *p;
int len;
 
if (pixmap->n != 1 && pixmap->n != 2 && pixmap->n != 4)
return fz_throw("pixmap must be grayscale or rgb to write as pnm");
 
fp = fopen(filename, "wb");
if (!fp)
return fz_throw("cannot open file '%s': %s", filename, strerror(errno));
 
if (pixmap->n == 1 || pixmap->n == 2)
fprintf(fp, "P5\n");
if (pixmap->n == 4)
fprintf(fp, "P6\n");
fprintf(fp, "%d %d\n", pixmap->w, pixmap->h);
fprintf(fp, "255\n");
 
len = pixmap->w * pixmap->h;
p = pixmap->samples;
 
switch (pixmap->n)
{
case 1:
fwrite(p, 1, len, fp);
break;
case 2:
while (len--)
{
putc(p[0], fp);
p += 2;
}
break;
case 4:
while (len--)
{
putc(p[0], fp);
putc(p[1], fp);
putc(p[2], fp);
p += 4;
}
}
 
fclose(fp);
return fz_okay;
}
 
/*
* Write pixmap to PAM file (with or without alpha channel)
*/
 
fz_error
fz_write_pam(fz_pixmap *pixmap, char *filename, int savealpha)
{
unsigned char *sp;
int y, w, k;
FILE *fp;
 
int sn = pixmap->n;
int dn = pixmap->n;
if (!savealpha && dn > 1)
dn--;
 
fp = fopen(filename, "wb");
if (!fp)
return fz_throw("cannot open file '%s': %s", filename, strerror(errno));
 
fprintf(fp, "P7\n");
fprintf(fp, "WIDTH %d\n", pixmap->w);
fprintf(fp, "HEIGHT %d\n", pixmap->h);
fprintf(fp, "DEPTH %d\n", dn);
fprintf(fp, "MAXVAL 255\n");
if (pixmap->colorspace)
fprintf(fp, "# COLORSPACE %s\n", pixmap->colorspace->name);
switch (dn)
{
case 1: fprintf(fp, "TUPLTYPE GRAYSCALE\n"); break;
case 2: if (sn == 2) fprintf(fp, "TUPLTYPE GRAYSCALE_ALPHA\n"); break;
case 3: if (sn == 4) fprintf(fp, "TUPLTYPE RGB\n"); break;
case 4: if (sn == 4) fprintf(fp, "TUPLTYPE RGB_ALPHA\n"); break;
}
fprintf(fp, "ENDHDR\n");
 
sp = pixmap->samples;
for (y = 0; y < pixmap->h; y++)
{
w = pixmap->w;
while (w--)
{
for (k = 0; k < dn; k++)
putc(sp[k], fp);
sp += sn;
}
}
 
fclose(fp);
 
return fz_okay;
}
 
/*
* Write pixmap to PNG file (with or without alpha channel)
*/
 
#include <zlib.h>
 
static inline void big32(unsigned char *buf, unsigned int v)
{
buf[0] = (v >> 24) & 0xff;
buf[1] = (v >> 16) & 0xff;
buf[2] = (v >> 8) & 0xff;
buf[3] = (v) & 0xff;
}
 
static inline void put32(unsigned int v, FILE *fp)
{
putc(v >> 24, fp);
putc(v >> 16, fp);
putc(v >> 8, fp);
putc(v, fp);
}
 
static void putchunk(char *tag, unsigned char *data, int size, FILE *fp)
{
unsigned int sum;
put32(size, fp);
fwrite(tag, 1, 4, fp);
fwrite(data, 1, size, fp);
sum = crc32(0, NULL, 0);
sum = crc32(sum, (unsigned char*)tag, 4);
sum = crc32(sum, data, size);
put32(sum, fp);
}
 
fz_error
fz_write_png(fz_pixmap *pixmap, char *filename, int savealpha)
{
static const unsigned char pngsig[8] = { 137, 80, 78, 71, 13, 10, 26, 10 };
FILE *fp;
unsigned char head[13];
unsigned char *udata, *cdata, *sp, *dp;
uLong usize, csize;
int y, x, k, sn, dn;
int color;
int err;
 
if (pixmap->n != 1 && pixmap->n != 2 && pixmap->n != 4)
return fz_throw("pixmap must be grayscale or rgb to write as png");
 
sn = pixmap->n;
dn = pixmap->n;
if (!savealpha && dn > 1)
dn--;
 
switch (dn)
{
default:
case 1: color = 0; break;
case 2: color = 4; break;
case 3: color = 2; break;
case 4: color = 6; break;
}
 
usize = (pixmap->w * dn + 1) * pixmap->h;
csize = compressBound(usize);
udata = fz_malloc(usize);
cdata = fz_malloc(csize);
 
sp = pixmap->samples;
dp = udata;
for (y = 0; y < pixmap->h; y++)
{
*dp++ = 1; /* sub prediction filter */
for (x = 0; x < pixmap->w; x++)
{
for (k = 0; k < dn; k++)
{
if (x == 0)
dp[k] = sp[k];
else
dp[k] = sp[k] - sp[k-sn];
}
sp += sn;
dp += dn;
}
}
 
err = compress(cdata, &csize, udata, usize);
if (err != Z_OK)
{
fz_free(udata);
fz_free(cdata);
return fz_throw("cannot compress image data");
}
 
fp = fopen(filename, "wb");
if (!fp)
{
fz_free(udata);
fz_free(cdata);
return fz_throw("cannot open file '%s': %s", filename, strerror(errno));
}
 
big32(head+0, pixmap->w);
big32(head+4, pixmap->h);
head[8] = 8; /* depth */
head[9] = color;
head[10] = 0; /* compression */
head[11] = 0; /* filter */
head[12] = 0; /* interlace */
 
fwrite(pngsig, 1, 8, fp);
putchunk("IHDR", head, 13, fp);
putchunk("IDAT", cdata, csize, fp);
putchunk("IEND", head, 0, fp);
fclose(fp);
 
fz_free(udata);
fz_free(cdata);
return fz_okay;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/res_shade.c
0,0 → 1,127
#include "fitz.h"
 
fz_shade *
fz_keep_shade(fz_shade *shade)
{
shade->refs ++;
return shade;
}
 
void
fz_drop_shade(fz_shade *shade)
{
if (shade && --shade->refs == 0)
{
if (shade->colorspace)
fz_drop_colorspace(shade->colorspace);
fz_free(shade->mesh);
fz_free(shade);
}
}
 
fz_rect
fz_bound_shade(fz_shade *shade, fz_matrix ctm)
{
float *v;
fz_rect r;
fz_point p;
int i, ncomp, nvert;
 
ctm = fz_concat(shade->matrix, ctm);
ncomp = shade->use_function ? 3 : 2 + shade->colorspace->n;
nvert = shade->mesh_len / ncomp;
v = shade->mesh;
 
if (shade->type == FZ_LINEAR)
return fz_infinite_rect;
if (shade->type == FZ_RADIAL)
return fz_infinite_rect;
 
if (nvert == 0)
return fz_empty_rect;
 
p.x = v[0];
p.y = v[1];
v += ncomp;
p = fz_transform_point(ctm, p);
r.x0 = r.x1 = p.x;
r.y0 = r.y1 = p.y;
 
for (i = 1; i < nvert; i++)
{
p.x = v[0];
p.y = v[1];
p = fz_transform_point(ctm, p);
v += ncomp;
if (p.x < r.x0) r.x0 = p.x;
if (p.y < r.y0) r.y0 = p.y;
if (p.x > r.x1) r.x1 = p.x;
if (p.y > r.y1) r.y1 = p.y;
}
 
return r;
}
 
void
fz_debug_shade(fz_shade *shade)
{
int i, j, n;
float *vertex;
int triangle;
 
printf("shading {\n");
 
switch (shade->type)
{
case FZ_LINEAR: printf("\ttype linear\n"); break;
case FZ_RADIAL: printf("\ttype radial\n"); break;
case FZ_MESH: printf("\ttype mesh\n"); break;
}
 
printf("\tbbox [%g %g %g %g]\n",
shade->bbox.x0, shade->bbox.y0,
shade->bbox.x1, shade->bbox.y1);
 
printf("\tcolorspace %s\n", shade->colorspace->name);
 
printf("\tmatrix [%g %g %g %g %g %g]\n",
shade->matrix.a, shade->matrix.b, shade->matrix.c,
shade->matrix.d, shade->matrix.e, shade->matrix.f);
 
if (shade->use_background)
{
printf("\tbackground [");
for (i = 0; i < shade->colorspace->n; i++)
printf("%s%g", i == 0 ? "" : " ", shade->background[i]);
printf("]\n");
}
 
if (shade->use_function)
{
printf("\tfunction\n");
n = 3;
}
else
n = 2 + shade->colorspace->n;
 
printf("\tvertices: %d\n", shade->mesh_len);
 
vertex = shade->mesh;
triangle = 0;
i = 0;
while (i < shade->mesh_len)
{
printf("\t%d:(%g, %g): ", triangle, vertex[0], vertex[1]);
 
for (j = 2; j < n; j++)
printf("%s%g", j == 2 ? "" : " ", vertex[j]);
printf("\n");
 
vertex += n;
i++;
if (i % 3 == 0)
triangle++;
}
 
printf("}\n");
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/res_text.c
0,0 → 1,133
#include "fitz.h"
 
fz_text *
fz_new_text(fz_font *font, fz_matrix trm, int wmode)
{
fz_text *text;
 
text = fz_malloc(sizeof(fz_text));
text->font = fz_keep_font(font);
text->trm = trm;
text->wmode = wmode;
text->len = 0;
text->cap = 0;
text->items = NULL;
 
return text;
}
 
void
fz_free_text(fz_text *text)
{
fz_drop_font(text->font);
fz_free(text->items);
fz_free(text);
}
 
fz_text *
fz_clone_text(fz_text *old)
{
fz_text *text;
 
text = fz_malloc(sizeof(fz_text));
text->font = fz_keep_font(old->font);
text->trm = old->trm;
text->wmode = old->wmode;
text->len = old->len;
text->cap = text->len;
text->items = fz_calloc(text->len, sizeof(fz_text_item));
memcpy(text->items, old->items, text->len * sizeof(fz_text_item));
 
return text;
}
 
fz_rect
fz_bound_text(fz_text *text, fz_matrix ctm)
{
fz_matrix trm;
fz_rect bbox;
fz_rect fbox;
int i;
 
if (text->len == 0)
return fz_empty_rect;
 
/* find bbox of glyph origins in ctm space */
 
bbox.x0 = bbox.x1 = text->items[0].x;
bbox.y0 = bbox.y1 = text->items[0].y;
 
for (i = 1; i < text->len; i++)
{
bbox.x0 = MIN(bbox.x0, text->items[i].x);
bbox.y0 = MIN(bbox.y0, text->items[i].y);
bbox.x1 = MAX(bbox.x1, text->items[i].x);
bbox.y1 = MAX(bbox.y1, text->items[i].y);
}
 
bbox = fz_transform_rect(ctm, bbox);
 
/* find bbox of font in trm * ctm space */
 
trm = fz_concat(text->trm, ctm);
trm.e = 0;
trm.f = 0;
 
fbox.x0 = text->font->bbox.x0 * 0.001f;
fbox.y0 = text->font->bbox.y0 * 0.001f;
fbox.x1 = text->font->bbox.x1 * 0.001f;
fbox.y1 = text->font->bbox.y1 * 0.001f;
 
fbox = fz_transform_rect(trm, fbox);
 
/* expand glyph origin bbox by font bbox */
 
bbox.x0 += fbox.x0;
bbox.y0 += fbox.y0;
bbox.x1 += fbox.x1;
bbox.y1 += fbox.y1;
 
return bbox;
}
 
static void
fz_grow_text(fz_text *text, int n)
{
if (text->len + n < text->cap)
return;
while (text->len + n > text->cap)
text->cap = text->cap + 36;
text->items = fz_realloc(text->items, text->cap, sizeof(fz_text_item));
}
 
void
fz_add_text(fz_text *text, int gid, int ucs, float x, float y)
{
fz_grow_text(text, 1);
text->items[text->len].ucs = ucs;
text->items[text->len].gid = gid;
text->items[text->len].x = x;
text->items[text->len].y = y;
text->len++;
}
 
static int isxmlmeta(int c)
{
return c < 32 || c >= 128 || c == '&' || c == '<' || c == '>' || c == '\'' || c == '"';
}
 
void fz_debug_text(fz_text *text, int indent)
{
int i, n;
for (i = 0; i < text->len; i++)
{
for (n = 0; n < indent; n++)
putchar(' ');
if (!isxmlmeta(text->items[i].ucs))
printf("<g ucs=\"%c\" gid=\"%d\" x=\"%g\" y=\"%g\" />\n",
text->items[i].ucs, text->items[i].gid, text->items[i].x, text->items[i].y);
else
printf("<g ucs=\"U+%04X\" gid=\"%d\" x=\"%g\" y=\"%g\" />\n",
text->items[i].ucs, text->items[i].gid, text->items[i].x, text->items[i].y);
}
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/stm_buffer.c
0,0 → 1,49
#include "fitz.h"
 
fz_buffer *
fz_new_buffer(int size)
{
fz_buffer *b;
 
size = size > 1 ? size : 16;
 
b = fz_malloc(sizeof(fz_buffer));
b->refs = 1;
b->data = fz_malloc(size);
b->cap = size;
b->len = 0;
 
return b;
}
 
fz_buffer *
fz_keep_buffer(fz_buffer *buf)
{
buf->refs ++;
return buf;
}
 
void
fz_drop_buffer(fz_buffer *buf)
{
if (--buf->refs == 0)
{
fz_free(buf->data);
fz_free(buf);
}
}
 
void
fz_resize_buffer(fz_buffer *buf, int size)
{
buf->data = fz_realloc(buf->data, size, 1);
buf->cap = size;
if (buf->len > buf->cap)
buf->len = buf->cap;
}
 
void
fz_grow_buffer(fz_buffer *buf)
{
fz_resize_buffer(buf, (buf->cap * 3) / 2);
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/stm_open.c
0,0 → 1,174
#include "fitz.h"
 
fz_stream *
fz_new_stream(void *state,
int(*read)(fz_stream *stm, unsigned char *buf, int len),
void(*close)(fz_stream *stm))
{
fz_stream *stm;
 
stm = fz_malloc(sizeof(fz_stream));
 
stm->refs = 1;
stm->error = 0;
stm->eof = 0;
stm->pos = 0;
 
stm->bits = 0;
stm->avail = 0;
 
stm->bp = stm->buf;
stm->rp = stm->bp;
stm->wp = stm->bp;
stm->ep = stm->buf + sizeof stm->buf;
 
stm->state = state;
stm->read = read;
stm->close = close;
stm->seek = NULL;
 
return stm;
}
 
fz_stream *
fz_keep_stream(fz_stream *stm)
{
stm->refs ++;
return stm;
}
 
void
fz_close(fz_stream *stm)
{
stm->refs --;
if (stm->refs == 0)
{
if (stm->close)
stm->close(stm);
fz_free(stm);
}
}
 
/* File stream */
 
static int read_file(fz_stream *stm, unsigned char *buf, int len)
{
int n = read(*(int*)stm->state, buf, len);
if (n < 0)
return fz_throw("read error: %s", strerror(errno));
return n;
}
 
static void seek_file(fz_stream *stm, int offset, int whence)
{
int n = lseek(*(int*)stm->state, offset, whence);
if (n < 0)
fz_warn("cannot lseek: %s", strerror(errno));
stm->pos = n;
stm->rp = stm->bp;
stm->wp = stm->bp;
}
 
static void close_file(fz_stream *stm)
{
int n = close(*(int*)stm->state);
if (n < 0)
fz_warn("close error: %s", strerror(errno));
fz_free(stm->state);
}
 
fz_stream *
fz_open_fd(int fd)
{
fz_stream *stm;
int *state;
 
state = fz_malloc(sizeof(int));
*state = fd;
 
stm = fz_new_stream(state, read_file, close_file);
stm->seek = seek_file;
 
return stm;
}
 
fz_stream *
fz_open_file(const char *name)
{
int fd = open(name, O_BINARY | O_RDONLY, 0);
if (fd == -1)
return NULL;
return fz_open_fd(fd);
}
 
#ifdef _WIN32
fz_stream *
fz_open_file_w(const wchar_t *name)
{
int fd = _wopen(name, O_BINARY | O_RDONLY, 0);
if (fd == -1)
return NULL;
return fz_open_fd(fd);
}
#endif
 
/* Memory stream */
 
static int read_buffer(fz_stream *stm, unsigned char *buf, int len)
{
return 0;
}
 
static void seek_buffer(fz_stream *stm, int offset, int whence)
{
if (whence == 0)
stm->rp = stm->bp + offset;
if (whence == 1)
stm->rp += offset;
if (whence == 2)
stm->rp = stm->ep - offset;
stm->rp = CLAMP(stm->rp, stm->bp, stm->ep);
stm->wp = stm->ep;
}
 
static void close_buffer(fz_stream *stm)
{
if (stm->state)
fz_drop_buffer(stm->state);
}
 
fz_stream *
fz_open_buffer(fz_buffer *buf)
{
fz_stream *stm;
 
stm = fz_new_stream(fz_keep_buffer(buf), read_buffer, close_buffer);
stm->seek = seek_buffer;
 
stm->bp = buf->data;
stm->rp = buf->data;
stm->wp = buf->data + buf->len;
stm->ep = buf->data + buf->len;
 
stm->pos = buf->len;
 
return stm;
}
 
fz_stream *
fz_open_memory(unsigned char *data, int len)
{
fz_stream *stm;
 
stm = fz_new_stream(NULL, read_buffer, close_buffer);
stm->seek = seek_buffer;
 
stm->bp = data;
stm->rp = data;
stm->wp = data + len;
stm->ep = data + len;
 
stm->pos = len;
 
return stm;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/stm_read.c
0,0 → 1,201
#include "fitz.h"
 
int
fz_read(fz_stream *stm, unsigned char *buf, int len)
{
int count, n;
 
count = MIN(len, stm->wp - stm->rp);
if (count)
{
memcpy(buf, stm->rp, count);
stm->rp += count;
}
 
if (count == len || stm->error || stm->eof)
return count;
 
assert(stm->rp == stm->wp);
 
if (len - count < stm->ep - stm->bp)
{
n = stm->read(stm, stm->bp, stm->ep - stm->bp);
if (n < 0)
{
stm->error = 1;
return fz_rethrow(n, "read error");
}
else if (n == 0)
{
stm->eof = 1;
}
else if (n > 0)
{
stm->rp = stm->bp;
stm->wp = stm->bp + n;
stm->pos += n;
}
 
n = MIN(len - count, stm->wp - stm->rp);
if (n)
{
memcpy(buf + count, stm->rp, n);
stm->rp += n;
count += n;
}
}
else
{
n = stm->read(stm, buf + count, len - count);
if (n < 0)
{
stm->error = 1;
return fz_rethrow(n, "read error");
}
else if (n == 0)
{
stm->eof = 1;
}
else if (n > 0)
{
stm->pos += n;
count += n;
}
}
 
return count;
}
 
void
fz_fill_buffer(fz_stream *stm)
{
int n;
 
assert(stm->rp == stm->wp);
 
if (stm->error || stm->eof)
return;
 
n = stm->read(stm, stm->bp, stm->ep - stm->bp);
if (n < 0)
{
stm->error = 1;
fz_catch(n, "read error; treating as end of file");
}
else if (n == 0)
{
stm->eof = 1;
}
else if (n > 0)
{
stm->rp = stm->bp;
stm->wp = stm->bp + n;
stm->pos += n;
}
}
 
fz_error
fz_read_all(fz_buffer **bufp, fz_stream *stm, int initial)
{
fz_buffer *buf;
int n;
 
if (initial < 1024)
initial = 1024;
 
buf = fz_new_buffer(initial);
 
while (1)
{
if (buf->len == buf->cap)
fz_grow_buffer(buf);
 
if (buf->len / 200 > initial)
{
fz_drop_buffer(buf);
return fz_throw("compression bomb detected");
}
 
n = fz_read(stm, buf->data + buf->len, buf->cap - buf->len);
if (n < 0)
{
fz_drop_buffer(buf);
return fz_rethrow(n, "read error");
}
if (n == 0)
break;
 
buf->len += n;
}
 
*bufp = buf;
return fz_okay;
}
 
void
fz_read_line(fz_stream *stm, char *mem, int n)
{
char *s = mem;
int c = EOF;
while (n > 1)
{
c = fz_read_byte(stm);
if (c == EOF)
break;
if (c == '\r') {
c = fz_peek_byte(stm);
if (c == '\n')
fz_read_byte(stm);
break;
}
if (c == '\n')
break;
*s++ = c;
n--;
}
if (n)
*s = '\0';
}
 
int
fz_tell(fz_stream *stm)
{
return stm->pos - (stm->wp - stm->rp);
}
 
void
fz_seek(fz_stream *stm, int offset, int whence)
{
if (stm->seek)
{
if (whence == 1)
{
offset = fz_tell(stm) + offset;
whence = 0;
}
if (whence == 0)
{
unsigned char *p = stm->wp - (stm->pos - offset);
if (p >= stm->bp && p <= stm->wp)
{
stm->rp = p;
stm->eof = 0;
return;
}
}
stm->seek(stm, offset, whence);
stm->eof = 0;
}
else if (whence != 2)
{
if (whence == 0)
offset -= fz_tell(stm);
if (offset < 0)
fz_warn("cannot seek backwards");
/* dog slow, but rare enough */
while (offset-- > 0)
fz_read_byte(stm);
}
else
fz_warn("cannot seek");
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/strtoll.c
0,0 → 1,30
#include <ctype.h>
#include <stdlib.h>
#include <limits.h>
#include <errno.h>
#include <inttypes.h>
 
long long int strtoll(const char *nptr, char **endptr, int base)
{
int neg=0;
unsigned long long int v;
const char*orig=nptr;
 
while(isspace(*nptr)) nptr++;
 
if (*nptr == '-' && isalnum(nptr[1])) { neg=-1; nptr++; }
v=strtoull(nptr,endptr,base);
if (endptr && *endptr==nptr) *endptr=(char *)orig;
if (v>LLONG_MAX) {
if (v==0x8000000000000000ull && neg) {
errno=0;
return v;
}
errno=ERANGE;
return (neg?LLONG_MIN:LLONG_MAX);
}
return (neg?-v:v);
}
 
intmax_t strtoimax(const char *nptr, char **endptr, int base)
__attribute__((alias("strtoll")));
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/fitz/strtoull.c
0,0 → 1,68
#include <ctype.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>
#include <inttypes.h>
 
#define __expect(foo,bar) (foo)
#define __likely(foo) __expect((foo),1)
#define __unlikely(foo) __expect((foo),0)
 
unsigned long long int strtoull(const char *ptr, char **endptr, int base)
{
int neg = 0, overflow = 0;
long long int v=0;
const char* orig;
const char* nptr=ptr;
 
while(isspace(*nptr)) ++nptr;
 
if (*nptr == '-') { neg=1; nptr++; }
else if (*nptr == '+') ++nptr;
orig=nptr;
if (base==16 && nptr[0]=='0') goto skip0x;
if (base) {
register unsigned int b=base-2;
if (__unlikely(b>34)) { errno=EINVAL; return 0; }
} else {
if (*nptr=='0') {
base=8;
skip0x:
if (((*(nptr+1)=='x')||(*(nptr+1)=='X')) && isxdigit(nptr[2])) {
nptr+=2;
base=16;
}
} else
base=10;
}
while(__likely(*nptr)) {
register unsigned char c=*nptr;
c=(c>='a'?c-'a'+10:c>='A'?c-'A'+10:c<='9'?c-'0':0xff);
if (__unlikely(c>=base)) break; /* out of base */
{
register unsigned long x=(v&0xff)*base+c;
register unsigned long long w=(v>>8)*base+(x>>8);
if (w>(ULLONG_MAX>>8)) overflow=1;
v=(w<<8)+(x&0xff);
}
++nptr;
}
if (__unlikely(nptr==orig)) { /* no conversion done */
nptr=ptr;
errno=EINVAL;
v=0;
}
if (endptr) *endptr=(char *)nptr;
if (overflow) {
errno=ERANGE;
return ULLONG_MAX;
}
return (neg?-v:v);
}
 
/* die, BSD, die!!! */
unsigned long long int strtouq(const char *nptr, char **endptr, int base)
__attribute__((alias("strtoull")));
 
uintmax_t strtoumax(const char *nptr, char **endptr, int base)
__attribute__((alias("strtoull")));
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/generated/cmap_cns.h
0,0 → 1,681
/* This is an automatically generated file. Do not edit. */
 
/* B5-V */
 
static const pdf_range cmap_Adobe_CNS1_0_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_CNS1_0_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_CNS1_0 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_CNS1_0_ranges,
0, 0, (unsigned short*) cmap_Adobe_CNS1_0_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Adobe_CNS1_1_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_CNS1_1_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_CNS1_1 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_CNS1_1_ranges,
0, 0, (unsigned short*) cmap_Adobe_CNS1_1_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Adobe_CNS1_2_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_CNS1_2_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_CNS1_2 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_CNS1_2_ranges,
0, 0, (unsigned short*) cmap_Adobe_CNS1_2_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Adobe_CNS1_3_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_CNS1_3_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_CNS1_3 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_CNS1_3_ranges,
0, 0, (unsigned short*) cmap_Adobe_CNS1_3_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Adobe_CNS1_4_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_CNS1_4_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_CNS1_4 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_CNS1_4_ranges,
0, 0, (unsigned short*) cmap_Adobe_CNS1_4_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Adobe_CNS1_5_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_CNS1_5_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_CNS1_5 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_CNS1_5_ranges,
0, 0, (unsigned short*) cmap_Adobe_CNS1_5_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Adobe_CNS1_6_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_CNS1_6_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_CNS1_6 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_CNS1_6_ranges,
0, 0, (unsigned short*) cmap_Adobe_CNS1_6_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Adobe_CNS1_UCS2_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_CNS1_UCS2_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_CNS1_UCS2 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_CNS1_UCS2_ranges,
0, 0, (unsigned short*) cmap_Adobe_CNS1_UCS2_table,
};
 
/* B5-V */
 
static const pdf_range cmap_B5_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_B5_H_table[] = { 0 };
 
static pdf_cmap cmap_B5_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_B5_H_ranges,
0, 0, (unsigned short*) cmap_B5_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_B5pc_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_B5pc_H_table[] = { 0 };
 
static pdf_cmap cmap_B5pc_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_B5pc_H_ranges,
0, 0, (unsigned short*) cmap_B5pc_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_B5pc_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_B5pc_V_table[] = { 0 };
 
static pdf_cmap cmap_B5pc_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_B5pc_V_ranges,
0, 0, (unsigned short*) cmap_B5pc_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_B5_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_B5_V_table[] = { 0 };
 
static pdf_cmap cmap_B5_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_B5_V_ranges,
0, 0, (unsigned short*) cmap_B5_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_CNS1_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_CNS1_H_table[] = { 0 };
 
static pdf_cmap cmap_CNS1_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_CNS1_H_ranges,
0, 0, (unsigned short*) cmap_CNS1_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_CNS1_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_CNS1_V_table[] = { 0 };
 
static pdf_cmap cmap_CNS1_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_CNS1_V_ranges,
0, 0, (unsigned short*) cmap_CNS1_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_CNS2_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_CNS2_H_table[] = { 0 };
 
static pdf_cmap cmap_CNS2_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_CNS2_H_ranges,
0, 0, (unsigned short*) cmap_CNS2_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_CNS2_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_CNS2_V_table[] = { 0 };
 
static pdf_cmap cmap_CNS2_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_CNS2_V_ranges,
0, 0, (unsigned short*) cmap_CNS2_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_CNS_EUC_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_CNS_EUC_H_table[] = { 0 };
 
static pdf_cmap cmap_CNS_EUC_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_CNS_EUC_H_ranges,
0, 0, (unsigned short*) cmap_CNS_EUC_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_CNS_EUC_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_CNS_EUC_V_table[] = { 0 };
 
static pdf_cmap cmap_CNS_EUC_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_CNS_EUC_V_ranges,
0, 0, (unsigned short*) cmap_CNS_EUC_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_ETen_B5_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_ETen_B5_H_table[] = { 0 };
 
static pdf_cmap cmap_ETen_B5_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_ETen_B5_H_ranges,
0, 0, (unsigned short*) cmap_ETen_B5_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_ETen_B5_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_ETen_B5_V_table[] = { 0 };
 
static pdf_cmap cmap_ETen_B5_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_ETen_B5_V_ranges,
0, 0, (unsigned short*) cmap_ETen_B5_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_ETenms_B5_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_ETenms_B5_H_table[] = { 0 };
 
static pdf_cmap cmap_ETenms_B5_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_ETenms_B5_H_ranges,
0, 0, (unsigned short*) cmap_ETenms_B5_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_ETenms_B5_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_ETenms_B5_V_table[] = { 0 };
 
static pdf_cmap cmap_ETenms_B5_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_ETenms_B5_V_ranges,
0, 0, (unsigned short*) cmap_ETenms_B5_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_ETHK_B5_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_ETHK_B5_H_table[] = { 0 };
 
static pdf_cmap cmap_ETHK_B5_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_ETHK_B5_H_ranges,
0, 0, (unsigned short*) cmap_ETHK_B5_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_ETHK_B5_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_ETHK_B5_V_table[] = { 0 };
 
static pdf_cmap cmap_ETHK_B5_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_ETHK_B5_V_ranges,
0, 0, (unsigned short*) cmap_ETHK_B5_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_HKdla_B5_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_HKdla_B5_H_table[] = { 0 };
 
static pdf_cmap cmap_HKdla_B5_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_HKdla_B5_H_ranges,
0, 0, (unsigned short*) cmap_HKdla_B5_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_HKdla_B5_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_HKdla_B5_V_table[] = { 0 };
 
static pdf_cmap cmap_HKdla_B5_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_HKdla_B5_V_ranges,
0, 0, (unsigned short*) cmap_HKdla_B5_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_HKdlb_B5_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_HKdlb_B5_H_table[] = { 0 };
 
static pdf_cmap cmap_HKdlb_B5_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_HKdlb_B5_H_ranges,
0, 0, (unsigned short*) cmap_HKdlb_B5_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_HKdlb_B5_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_HKdlb_B5_V_table[] = { 0 };
 
static pdf_cmap cmap_HKdlb_B5_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_HKdlb_B5_V_ranges,
0, 0, (unsigned short*) cmap_HKdlb_B5_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_HKgccs_B5_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_HKgccs_B5_H_table[] = { 0 };
 
static pdf_cmap cmap_HKgccs_B5_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_HKgccs_B5_H_ranges,
0, 0, (unsigned short*) cmap_HKgccs_B5_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_HKgccs_B5_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_HKgccs_B5_V_table[] = { 0 };
 
static pdf_cmap cmap_HKgccs_B5_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_HKgccs_B5_V_ranges,
0, 0, (unsigned short*) cmap_HKgccs_B5_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_HKm314_B5_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_HKm314_B5_H_table[] = { 0 };
 
static pdf_cmap cmap_HKm314_B5_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_HKm314_B5_H_ranges,
0, 0, (unsigned short*) cmap_HKm314_B5_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_HKm314_B5_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_HKm314_B5_V_table[] = { 0 };
 
static pdf_cmap cmap_HKm314_B5_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_HKm314_B5_V_ranges,
0, 0, (unsigned short*) cmap_HKm314_B5_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_HKm471_B5_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_HKm471_B5_H_table[] = { 0 };
 
static pdf_cmap cmap_HKm471_B5_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_HKm471_B5_H_ranges,
0, 0, (unsigned short*) cmap_HKm471_B5_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_HKm471_B5_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_HKm471_B5_V_table[] = { 0 };
 
static pdf_cmap cmap_HKm471_B5_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_HKm471_B5_V_ranges,
0, 0, (unsigned short*) cmap_HKm471_B5_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_HKscs_B5_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_HKscs_B5_H_table[] = { 0 };
 
static pdf_cmap cmap_HKscs_B5_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_HKscs_B5_H_ranges,
0, 0, (unsigned short*) cmap_HKscs_B5_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_HKscs_B5_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_HKscs_B5_V_table[] = { 0 };
 
static pdf_cmap cmap_HKscs_B5_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_HKscs_B5_V_ranges,
0, 0, (unsigned short*) cmap_HKscs_B5_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_UniCNS_UCS2_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_UniCNS_UCS2_H_table[] = { 0 };
 
static pdf_cmap cmap_UniCNS_UCS2_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_UniCNS_UCS2_H_ranges,
0, 0, (unsigned short*) cmap_UniCNS_UCS2_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_UniCNS_UCS2_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_UniCNS_UCS2_V_table[] = { 0 };
 
static pdf_cmap cmap_UniCNS_UCS2_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_UniCNS_UCS2_V_ranges,
0, 0, (unsigned short*) cmap_UniCNS_UCS2_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_UniCNS_UTF16_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_UniCNS_UTF16_H_table[] = { 0 };
 
static pdf_cmap cmap_UniCNS_UTF16_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_UniCNS_UTF16_H_ranges,
0, 0, (unsigned short*) cmap_UniCNS_UTF16_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_UniCNS_UTF16_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_UniCNS_UTF16_V_table[] = { 0 };
 
static pdf_cmap cmap_UniCNS_UTF16_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_UniCNS_UTF16_V_ranges,
0, 0, (unsigned short*) cmap_UniCNS_UTF16_V_table,
};
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/generated/cmap_gb.h
0,0 → 1,494
/* This is an automatically generated file. Do not edit. */
 
/* B5-V */
 
static const pdf_range cmap_Adobe_GB1_0_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_GB1_0_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_GB1_0 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_GB1_0_ranges,
0, 0, (unsigned short*) cmap_Adobe_GB1_0_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Adobe_GB1_1_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_GB1_1_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_GB1_1 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_GB1_1_ranges,
0, 0, (unsigned short*) cmap_Adobe_GB1_1_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Adobe_GB1_2_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_GB1_2_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_GB1_2 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_GB1_2_ranges,
0, 0, (unsigned short*) cmap_Adobe_GB1_2_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Adobe_GB1_3_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_GB1_3_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_GB1_3 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_GB1_3_ranges,
0, 0, (unsigned short*) cmap_Adobe_GB1_3_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Adobe_GB1_4_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_GB1_4_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_GB1_4 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_GB1_4_ranges,
0, 0, (unsigned short*) cmap_Adobe_GB1_4_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Adobe_GB1_5_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_GB1_5_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_GB1_5 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_GB1_5_ranges,
0, 0, (unsigned short*) cmap_Adobe_GB1_5_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Adobe_GB1_UCS2_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_GB1_UCS2_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_GB1_UCS2 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_GB1_UCS2_ranges,
0, 0, (unsigned short*) cmap_Adobe_GB1_UCS2_table,
};
 
/* B5-V */
 
static const pdf_range cmap_GB_EUC_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_GB_EUC_H_table[] = { 0 };
 
static pdf_cmap cmap_GB_EUC_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_GB_EUC_H_ranges,
0, 0, (unsigned short*) cmap_GB_EUC_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_GB_EUC_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_GB_EUC_V_table[] = { 0 };
 
static pdf_cmap cmap_GB_EUC_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_GB_EUC_V_ranges,
0, 0, (unsigned short*) cmap_GB_EUC_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_GB_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_GB_H_table[] = { 0 };
 
static pdf_cmap cmap_GB_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_GB_H_ranges,
0, 0, (unsigned short*) cmap_GB_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_GBK2K_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_GBK2K_H_table[] = { 0 };
 
static pdf_cmap cmap_GBK2K_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_GBK2K_H_ranges,
0, 0, (unsigned short*) cmap_GBK2K_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_GBK2K_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_GBK2K_V_table[] = { 0 };
 
static pdf_cmap cmap_GBK2K_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_GBK2K_V_ranges,
0, 0, (unsigned short*) cmap_GBK2K_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_GBK_EUC_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_GBK_EUC_H_table[] = { 0 };
 
static pdf_cmap cmap_GBK_EUC_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_GBK_EUC_H_ranges,
0, 0, (unsigned short*) cmap_GBK_EUC_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_GBK_EUC_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_GBK_EUC_V_table[] = { 0 };
 
static pdf_cmap cmap_GBK_EUC_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_GBK_EUC_V_ranges,
0, 0, (unsigned short*) cmap_GBK_EUC_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_GBKp_EUC_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_GBKp_EUC_H_table[] = { 0 };
 
static pdf_cmap cmap_GBKp_EUC_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_GBKp_EUC_H_ranges,
0, 0, (unsigned short*) cmap_GBKp_EUC_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_GBKp_EUC_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_GBKp_EUC_V_table[] = { 0 };
 
static pdf_cmap cmap_GBKp_EUC_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_GBKp_EUC_V_ranges,
0, 0, (unsigned short*) cmap_GBKp_EUC_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_GBpc_EUC_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_GBpc_EUC_H_table[] = { 0 };
 
static pdf_cmap cmap_GBpc_EUC_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_GBpc_EUC_H_ranges,
0, 0, (unsigned short*) cmap_GBpc_EUC_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_GBpc_EUC_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_GBpc_EUC_V_table[] = { 0 };
 
static pdf_cmap cmap_GBpc_EUC_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_GBpc_EUC_V_ranges,
0, 0, (unsigned short*) cmap_GBpc_EUC_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_GBT_EUC_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_GBT_EUC_H_table[] = { 0 };
 
static pdf_cmap cmap_GBT_EUC_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_GBT_EUC_H_ranges,
0, 0, (unsigned short*) cmap_GBT_EUC_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_GBT_EUC_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_GBT_EUC_V_table[] = { 0 };
 
static pdf_cmap cmap_GBT_EUC_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_GBT_EUC_V_ranges,
0, 0, (unsigned short*) cmap_GBT_EUC_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_GBT_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_GBT_H_table[] = { 0 };
 
static pdf_cmap cmap_GBT_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_GBT_H_ranges,
0, 0, (unsigned short*) cmap_GBT_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_GBTpc_EUC_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_GBTpc_EUC_H_table[] = { 0 };
 
static pdf_cmap cmap_GBTpc_EUC_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_GBTpc_EUC_H_ranges,
0, 0, (unsigned short*) cmap_GBTpc_EUC_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_GBTpc_EUC_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_GBTpc_EUC_V_table[] = { 0 };
 
static pdf_cmap cmap_GBTpc_EUC_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_GBTpc_EUC_V_ranges,
0, 0, (unsigned short*) cmap_GBTpc_EUC_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_GBT_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_GBT_V_table[] = { 0 };
 
static pdf_cmap cmap_GBT_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_GBT_V_ranges,
0, 0, (unsigned short*) cmap_GBT_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_GB_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_GB_V_table[] = { 0 };
 
static pdf_cmap cmap_GB_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_GB_V_ranges,
0, 0, (unsigned short*) cmap_GB_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_UniGB_UCS2_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_UniGB_UCS2_H_table[] = { 0 };
 
static pdf_cmap cmap_UniGB_UCS2_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_UniGB_UCS2_H_ranges,
0, 0, (unsigned short*) cmap_UniGB_UCS2_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_UniGB_UCS2_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_UniGB_UCS2_V_table[] = { 0 };
 
static pdf_cmap cmap_UniGB_UCS2_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_UniGB_UCS2_V_ranges,
0, 0, (unsigned short*) cmap_UniGB_UCS2_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_UniGB_UTF16_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_UniGB_UTF16_H_table[] = { 0 };
 
static pdf_cmap cmap_UniGB_UTF16_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_UniGB_UTF16_H_ranges,
0, 0, (unsigned short*) cmap_UniGB_UTF16_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_UniGB_UTF16_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_UniGB_UTF16_V_table[] = { 0 };
 
static pdf_cmap cmap_UniGB_UTF16_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_UniGB_UTF16_V_ranges,
0, 0, (unsigned short*) cmap_UniGB_UTF16_V_table,
};
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/generated/cmap_japan.h
0,0 → 1,1038
/* This is an automatically generated file. Do not edit. */
 
/* B5-V */
 
static const pdf_range cmap_78_EUC_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_78_EUC_H_table[] = { 0 };
 
static pdf_cmap cmap_78_EUC_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_78_EUC_H_ranges,
0, 0, (unsigned short*) cmap_78_EUC_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_78_EUC_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_78_EUC_V_table[] = { 0 };
 
static pdf_cmap cmap_78_EUC_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_78_EUC_V_ranges,
0, 0, (unsigned short*) cmap_78_EUC_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_78_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_78_H_table[] = { 0 };
 
static pdf_cmap cmap_78_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_78_H_ranges,
0, 0, (unsigned short*) cmap_78_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_78ms_RKSJ_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_78ms_RKSJ_H_table[] = { 0 };
 
static pdf_cmap cmap_78ms_RKSJ_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_78ms_RKSJ_H_ranges,
0, 0, (unsigned short*) cmap_78ms_RKSJ_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_78ms_RKSJ_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_78ms_RKSJ_V_table[] = { 0 };
 
static pdf_cmap cmap_78ms_RKSJ_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_78ms_RKSJ_V_ranges,
0, 0, (unsigned short*) cmap_78ms_RKSJ_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_78_RKSJ_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_78_RKSJ_H_table[] = { 0 };
 
static pdf_cmap cmap_78_RKSJ_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_78_RKSJ_H_ranges,
0, 0, (unsigned short*) cmap_78_RKSJ_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_78_RKSJ_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_78_RKSJ_V_table[] = { 0 };
 
static pdf_cmap cmap_78_RKSJ_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_78_RKSJ_V_ranges,
0, 0, (unsigned short*) cmap_78_RKSJ_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_78_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_78_V_table[] = { 0 };
 
static pdf_cmap cmap_78_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_78_V_ranges,
0, 0, (unsigned short*) cmap_78_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_83pv_RKSJ_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_83pv_RKSJ_H_table[] = { 0 };
 
static pdf_cmap cmap_83pv_RKSJ_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_83pv_RKSJ_H_ranges,
0, 0, (unsigned short*) cmap_83pv_RKSJ_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_90msp_RKSJ_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_90msp_RKSJ_H_table[] = { 0 };
 
static pdf_cmap cmap_90msp_RKSJ_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_90msp_RKSJ_H_ranges,
0, 0, (unsigned short*) cmap_90msp_RKSJ_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_90msp_RKSJ_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_90msp_RKSJ_V_table[] = { 0 };
 
static pdf_cmap cmap_90msp_RKSJ_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_90msp_RKSJ_V_ranges,
0, 0, (unsigned short*) cmap_90msp_RKSJ_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_90ms_RKSJ_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_90ms_RKSJ_H_table[] = { 0 };
 
static pdf_cmap cmap_90ms_RKSJ_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_90ms_RKSJ_H_ranges,
0, 0, (unsigned short*) cmap_90ms_RKSJ_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_90ms_RKSJ_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_90ms_RKSJ_V_table[] = { 0 };
 
static pdf_cmap cmap_90ms_RKSJ_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_90ms_RKSJ_V_ranges,
0, 0, (unsigned short*) cmap_90ms_RKSJ_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_90pv_RKSJ_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_90pv_RKSJ_H_table[] = { 0 };
 
static pdf_cmap cmap_90pv_RKSJ_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_90pv_RKSJ_H_ranges,
0, 0, (unsigned short*) cmap_90pv_RKSJ_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_90pv_RKSJ_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_90pv_RKSJ_V_table[] = { 0 };
 
static pdf_cmap cmap_90pv_RKSJ_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_90pv_RKSJ_V_ranges,
0, 0, (unsigned short*) cmap_90pv_RKSJ_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Add_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Add_H_table[] = { 0 };
 
static pdf_cmap cmap_Add_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Add_H_ranges,
0, 0, (unsigned short*) cmap_Add_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Add_RKSJ_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Add_RKSJ_H_table[] = { 0 };
 
static pdf_cmap cmap_Add_RKSJ_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Add_RKSJ_H_ranges,
0, 0, (unsigned short*) cmap_Add_RKSJ_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Add_RKSJ_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Add_RKSJ_V_table[] = { 0 };
 
static pdf_cmap cmap_Add_RKSJ_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Add_RKSJ_V_ranges,
0, 0, (unsigned short*) cmap_Add_RKSJ_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Add_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Add_V_table[] = { 0 };
 
static pdf_cmap cmap_Add_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Add_V_ranges,
0, 0, (unsigned short*) cmap_Add_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Adobe_Japan1_0_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_Japan1_0_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_Japan1_0 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_Japan1_0_ranges,
0, 0, (unsigned short*) cmap_Adobe_Japan1_0_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Adobe_Japan1_1_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_Japan1_1_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_Japan1_1 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_Japan1_1_ranges,
0, 0, (unsigned short*) cmap_Adobe_Japan1_1_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Adobe_Japan1_2_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_Japan1_2_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_Japan1_2 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_Japan1_2_ranges,
0, 0, (unsigned short*) cmap_Adobe_Japan1_2_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Adobe_Japan1_3_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_Japan1_3_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_Japan1_3 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_Japan1_3_ranges,
0, 0, (unsigned short*) cmap_Adobe_Japan1_3_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Adobe_Japan1_4_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_Japan1_4_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_Japan1_4 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_Japan1_4_ranges,
0, 0, (unsigned short*) cmap_Adobe_Japan1_4_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Adobe_Japan1_5_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_Japan1_5_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_Japan1_5 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_Japan1_5_ranges,
0, 0, (unsigned short*) cmap_Adobe_Japan1_5_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Adobe_Japan1_6_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_Japan1_6_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_Japan1_6 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_Japan1_6_ranges,
0, 0, (unsigned short*) cmap_Adobe_Japan1_6_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Adobe_Japan1_UCS2_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_Japan1_UCS2_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_Japan1_UCS2 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_Japan1_UCS2_ranges,
0, 0, (unsigned short*) cmap_Adobe_Japan1_UCS2_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Adobe_Japan2_0_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_Japan2_0_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_Japan2_0 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_Japan2_0_ranges,
0, 0, (unsigned short*) cmap_Adobe_Japan2_0_table,
};
 
/* B5-V */
 
static const pdf_range cmap_EUC_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_EUC_H_table[] = { 0 };
 
static pdf_cmap cmap_EUC_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_EUC_H_ranges,
0, 0, (unsigned short*) cmap_EUC_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_EUC_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_EUC_V_table[] = { 0 };
 
static pdf_cmap cmap_EUC_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_EUC_V_ranges,
0, 0, (unsigned short*) cmap_EUC_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Ext_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Ext_H_table[] = { 0 };
 
static pdf_cmap cmap_Ext_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Ext_H_ranges,
0, 0, (unsigned short*) cmap_Ext_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Ext_RKSJ_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Ext_RKSJ_H_table[] = { 0 };
 
static pdf_cmap cmap_Ext_RKSJ_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Ext_RKSJ_H_ranges,
0, 0, (unsigned short*) cmap_Ext_RKSJ_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Ext_RKSJ_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Ext_RKSJ_V_table[] = { 0 };
 
static pdf_cmap cmap_Ext_RKSJ_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Ext_RKSJ_V_ranges,
0, 0, (unsigned short*) cmap_Ext_RKSJ_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Ext_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Ext_V_table[] = { 0 };
 
static pdf_cmap cmap_Ext_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Ext_V_ranges,
0, 0, (unsigned short*) cmap_Ext_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_H_table[] = { 0 };
 
static pdf_cmap cmap_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_H_ranges,
0, 0, (unsigned short*) cmap_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Hankaku_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Hankaku_table[] = { 0 };
 
static pdf_cmap cmap_Hankaku = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Hankaku_ranges,
0, 0, (unsigned short*) cmap_Hankaku_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Hiragana_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Hiragana_table[] = { 0 };
 
static pdf_cmap cmap_Hiragana = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Hiragana_ranges,
0, 0, (unsigned short*) cmap_Hiragana_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Hojo_EUC_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Hojo_EUC_H_table[] = { 0 };
 
static pdf_cmap cmap_Hojo_EUC_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Hojo_EUC_H_ranges,
0, 0, (unsigned short*) cmap_Hojo_EUC_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Hojo_EUC_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Hojo_EUC_V_table[] = { 0 };
 
static pdf_cmap cmap_Hojo_EUC_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Hojo_EUC_V_ranges,
0, 0, (unsigned short*) cmap_Hojo_EUC_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Hojo_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Hojo_H_table[] = { 0 };
 
static pdf_cmap cmap_Hojo_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Hojo_H_ranges,
0, 0, (unsigned short*) cmap_Hojo_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Hojo_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Hojo_V_table[] = { 0 };
 
static pdf_cmap cmap_Hojo_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Hojo_V_ranges,
0, 0, (unsigned short*) cmap_Hojo_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Katakana_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Katakana_table[] = { 0 };
 
static pdf_cmap cmap_Katakana = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Katakana_ranges,
0, 0, (unsigned short*) cmap_Katakana_table,
};
 
/* B5-V */
 
static const pdf_range cmap_NWP_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_NWP_H_table[] = { 0 };
 
static pdf_cmap cmap_NWP_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_NWP_H_ranges,
0, 0, (unsigned short*) cmap_NWP_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_NWP_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_NWP_V_table[] = { 0 };
 
static pdf_cmap cmap_NWP_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_NWP_V_ranges,
0, 0, (unsigned short*) cmap_NWP_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_RKSJ_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_RKSJ_H_table[] = { 0 };
 
static pdf_cmap cmap_RKSJ_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_RKSJ_H_ranges,
0, 0, (unsigned short*) cmap_RKSJ_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_RKSJ_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_RKSJ_V_table[] = { 0 };
 
static pdf_cmap cmap_RKSJ_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_RKSJ_V_ranges,
0, 0, (unsigned short*) cmap_RKSJ_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Roman_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Roman_table[] = { 0 };
 
static pdf_cmap cmap_Roman = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Roman_ranges,
0, 0, (unsigned short*) cmap_Roman_table,
};
 
/* B5-V */
 
static const pdf_range cmap_UniHojo_UCS2_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_UniHojo_UCS2_H_table[] = { 0 };
 
static pdf_cmap cmap_UniHojo_UCS2_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_UniHojo_UCS2_H_ranges,
0, 0, (unsigned short*) cmap_UniHojo_UCS2_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_UniHojo_UCS2_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_UniHojo_UCS2_V_table[] = { 0 };
 
static pdf_cmap cmap_UniHojo_UCS2_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_UniHojo_UCS2_V_ranges,
0, 0, (unsigned short*) cmap_UniHojo_UCS2_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_UniHojo_UTF16_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_UniHojo_UTF16_H_table[] = { 0 };
 
static pdf_cmap cmap_UniHojo_UTF16_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_UniHojo_UTF16_H_ranges,
0, 0, (unsigned short*) cmap_UniHojo_UTF16_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_UniHojo_UTF16_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_UniHojo_UTF16_V_table[] = { 0 };
 
static pdf_cmap cmap_UniHojo_UTF16_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_UniHojo_UTF16_V_ranges,
0, 0, (unsigned short*) cmap_UniHojo_UTF16_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_UniJISPro_UCS2_HW_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_UniJISPro_UCS2_HW_V_table[] = { 0 };
 
static pdf_cmap cmap_UniJISPro_UCS2_HW_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_UniJISPro_UCS2_HW_V_ranges,
0, 0, (unsigned short*) cmap_UniJISPro_UCS2_HW_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_UniJISPro_UCS2_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_UniJISPro_UCS2_V_table[] = { 0 };
 
static pdf_cmap cmap_UniJISPro_UCS2_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_UniJISPro_UCS2_V_ranges,
0, 0, (unsigned short*) cmap_UniJISPro_UCS2_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_UniJIS_UCS2_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_UniJIS_UCS2_H_table[] = { 0 };
 
static pdf_cmap cmap_UniJIS_UCS2_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_UniJIS_UCS2_H_ranges,
0, 0, (unsigned short*) cmap_UniJIS_UCS2_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_UniJIS_UCS2_HW_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_UniJIS_UCS2_HW_H_table[] = { 0 };
 
static pdf_cmap cmap_UniJIS_UCS2_HW_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_UniJIS_UCS2_HW_H_ranges,
0, 0, (unsigned short*) cmap_UniJIS_UCS2_HW_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_UniJIS_UCS2_HW_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_UniJIS_UCS2_HW_V_table[] = { 0 };
 
static pdf_cmap cmap_UniJIS_UCS2_HW_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_UniJIS_UCS2_HW_V_ranges,
0, 0, (unsigned short*) cmap_UniJIS_UCS2_HW_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_UniJIS_UCS2_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_UniJIS_UCS2_V_table[] = { 0 };
 
static pdf_cmap cmap_UniJIS_UCS2_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_UniJIS_UCS2_V_ranges,
0, 0, (unsigned short*) cmap_UniJIS_UCS2_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_UniJIS_UTF16_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_UniJIS_UTF16_H_table[] = { 0 };
 
static pdf_cmap cmap_UniJIS_UTF16_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_UniJIS_UTF16_H_ranges,
0, 0, (unsigned short*) cmap_UniJIS_UTF16_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_UniJIS_UTF16_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_UniJIS_UTF16_V_table[] = { 0 };
 
static pdf_cmap cmap_UniJIS_UTF16_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_UniJIS_UTF16_V_ranges,
0, 0, (unsigned short*) cmap_UniJIS_UTF16_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_V_table[] = { 0 };
 
static pdf_cmap cmap_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_V_ranges,
0, 0, (unsigned short*) cmap_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_WP_Symbol_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_WP_Symbol_table[] = { 0 };
 
static pdf_cmap cmap_WP_Symbol = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_WP_Symbol_ranges,
0, 0, (unsigned short*) cmap_WP_Symbol_table,
};
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/generated/cmap_korea.h
0,0 → 1,341
/* This is an automatically generated file. Do not edit. */
 
/* B5-V */
 
static const pdf_range cmap_Adobe_Korea1_0_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_Korea1_0_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_Korea1_0 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_Korea1_0_ranges,
0, 0, (unsigned short*) cmap_Adobe_Korea1_0_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Adobe_Korea1_1_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_Korea1_1_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_Korea1_1 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_Korea1_1_ranges,
0, 0, (unsigned short*) cmap_Adobe_Korea1_1_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Adobe_Korea1_2_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_Korea1_2_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_Korea1_2 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_Korea1_2_ranges,
0, 0, (unsigned short*) cmap_Adobe_Korea1_2_table,
};
 
/* B5-V */
 
static const pdf_range cmap_Adobe_Korea1_UCS2_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_Adobe_Korea1_UCS2_table[] = { 0 };
 
static pdf_cmap cmap_Adobe_Korea1_UCS2 = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_Adobe_Korea1_UCS2_ranges,
0, 0, (unsigned short*) cmap_Adobe_Korea1_UCS2_table,
};
 
/* B5-V */
 
static const pdf_range cmap_KSC_EUC_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_KSC_EUC_H_table[] = { 0 };
 
static pdf_cmap cmap_KSC_EUC_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_KSC_EUC_H_ranges,
0, 0, (unsigned short*) cmap_KSC_EUC_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_KSC_EUC_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_KSC_EUC_V_table[] = { 0 };
 
static pdf_cmap cmap_KSC_EUC_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_KSC_EUC_V_ranges,
0, 0, (unsigned short*) cmap_KSC_EUC_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_KSC_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_KSC_H_table[] = { 0 };
 
static pdf_cmap cmap_KSC_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_KSC_H_ranges,
0, 0, (unsigned short*) cmap_KSC_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_KSC_Johab_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_KSC_Johab_H_table[] = { 0 };
 
static pdf_cmap cmap_KSC_Johab_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_KSC_Johab_H_ranges,
0, 0, (unsigned short*) cmap_KSC_Johab_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_KSC_Johab_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_KSC_Johab_V_table[] = { 0 };
 
static pdf_cmap cmap_KSC_Johab_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_KSC_Johab_V_ranges,
0, 0, (unsigned short*) cmap_KSC_Johab_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_KSCms_UHC_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_KSCms_UHC_H_table[] = { 0 };
 
static pdf_cmap cmap_KSCms_UHC_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_KSCms_UHC_H_ranges,
0, 0, (unsigned short*) cmap_KSCms_UHC_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_KSCms_UHC_HW_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_KSCms_UHC_HW_H_table[] = { 0 };
 
static pdf_cmap cmap_KSCms_UHC_HW_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_KSCms_UHC_HW_H_ranges,
0, 0, (unsigned short*) cmap_KSCms_UHC_HW_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_KSCms_UHC_HW_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_KSCms_UHC_HW_V_table[] = { 0 };
 
static pdf_cmap cmap_KSCms_UHC_HW_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_KSCms_UHC_HW_V_ranges,
0, 0, (unsigned short*) cmap_KSCms_UHC_HW_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_KSCms_UHC_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_KSCms_UHC_V_table[] = { 0 };
 
static pdf_cmap cmap_KSCms_UHC_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_KSCms_UHC_V_ranges,
0, 0, (unsigned short*) cmap_KSCms_UHC_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_KSCpc_EUC_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_KSCpc_EUC_H_table[] = { 0 };
 
static pdf_cmap cmap_KSCpc_EUC_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_KSCpc_EUC_H_ranges,
0, 0, (unsigned short*) cmap_KSCpc_EUC_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_KSCpc_EUC_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_KSCpc_EUC_V_table[] = { 0 };
 
static pdf_cmap cmap_KSCpc_EUC_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_KSCpc_EUC_V_ranges,
0, 0, (unsigned short*) cmap_KSCpc_EUC_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_KSC_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_KSC_V_table[] = { 0 };
 
static pdf_cmap cmap_KSC_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_KSC_V_ranges,
0, 0, (unsigned short*) cmap_KSC_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_UniKS_UCS2_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_UniKS_UCS2_H_table[] = { 0 };
 
static pdf_cmap cmap_UniKS_UCS2_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_UniKS_UCS2_H_ranges,
0, 0, (unsigned short*) cmap_UniKS_UCS2_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_UniKS_UCS2_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_UniKS_UCS2_V_table[] = { 0 };
 
static pdf_cmap cmap_UniKS_UCS2_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_UniKS_UCS2_V_ranges,
0, 0, (unsigned short*) cmap_UniKS_UCS2_V_table,
};
 
/* B5-V */
 
static const pdf_range cmap_UniKS_UTF16_H_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_UniKS_UTF16_H_table[] = { 0 };
 
static pdf_cmap cmap_UniKS_UTF16_H = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_UniKS_UTF16_H_ranges,
0, 0, (unsigned short*) cmap_UniKS_UTF16_H_table,
};
 
/* B5-V */
 
static const pdf_range cmap_UniKS_UTF16_V_ranges[] = {
{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130},
{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146},
{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647},
};
 
static const unsigned short cmap_UniKS_UTF16_V_table[] = { 0 };
 
static pdf_cmap cmap_UniKS_UTF16_V = {
-1, "B5-V", "B5-H", 0, 1, 0,
{ {0,0,0}, },
12, 12, (pdf_range*) cmap_UniKS_UTF16_V_ranges,
0, 0, (unsigned short*) cmap_UniKS_UTF16_V_table,
};
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/generated/font_base14.h
0,0 → 1,10561
#ifndef __STRICT_ANSI__
#if defined(__linux__) || defined(__FreeBSD__)
#define HAVE_INCBIN
#endif
#endif
 
#ifdef HAVE_INCBIN
extern const unsigned char pdf_font_Dingbats[15788];
asm(".globl pdf_font_Dingbats");
asm(".balign 8");
asm("pdf_font_Dingbats:");
asm(".incbin \"fonts/Dingbats.cff\"");
#else
static const unsigned char pdf_font_Dingbats[15788] = {
1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0,
1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251,
66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28,
55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111,
109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112,
97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,
43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,
85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,
112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101,
103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1,
0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,
18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,
0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,
0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,
0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,
0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,
0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,
106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,
0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0,
131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143,
0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0,
177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187,
0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0,
202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211,
0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0,
223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161,
0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0,
160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170,
2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195,
5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175,
9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11,
232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14,
71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15,
253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18,
205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134,
20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24,
169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25,
230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27,
173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29,
183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33,
222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36,
68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38,
63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124,
40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175,
42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209,
44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100,
47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50,
55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223,
56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247,
115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21,
32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62,
139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71,
247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247,
103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170,
247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66,
5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70,
69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94,
145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247,
33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139,
210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140,
66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178,
139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139,
100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247,
93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19,
191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236,
64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194,
31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46,
62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69,
4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116,
217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226,
21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231,
71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89,
139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154,
177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199,
8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90,
30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67,
139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3,
204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39,
251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247,
35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89,
159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247,
50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51,
90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33,
177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169,
120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3,
248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132,
211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3,
247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21,
251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229,
247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251,
23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117,
231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41,
46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247,
151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76,
7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171,
176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97,
177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142,
187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83,
106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217,
248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140,
5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102,
156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104,
189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139,
251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163,
194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138,
8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160,
251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82,
5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247,
226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220,
139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178,
118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239,
243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247,
187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3,
248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119,
52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236,
239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235,
240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74,
58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156,
249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125,
8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247,
115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183,
163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103,
211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229,
247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73,
90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83,
56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217,
247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0,
139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215,
97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31,
206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247,
20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31,
14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160,
4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21,
35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125,
251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247,
183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130,
159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53,
139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247,
222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247,
9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158,
176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139,
139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102,
251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229,
248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251,
26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223,
148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139,
247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251,
26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166,
8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247,
74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159,
163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180,
97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191,
205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110,
247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124,
221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158,
178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174,
193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232,
251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99,
139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143,
247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104,
127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1,
187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85,
79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139,
247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105,
61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121,
169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232,
248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247,
30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78,
251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232,
3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229,
232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253,
109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221,
3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139,
72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247,
3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116,
82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238,
139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247,
187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232,
249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124,
139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247,
99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149,
7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186,
44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10,
139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252,
10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139,
248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65,
249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159,
1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139,
249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227,
139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248,
30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109,
227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221,
1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139,
159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247,
121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251,
36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86,
91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138,
21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251,
102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155,
198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139,
8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251,
71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232,
232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139,
94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175,
60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109,
232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106,
139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247,
246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221,
249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251,
9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7,
251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159,
249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248,
253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247,
77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251,
29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5,
14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139,
251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247,
5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69,
159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221,
1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247,
142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249,
89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211,
249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253,
177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192,
247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21,
252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10,
14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,
247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191,
226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139,
8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8,
247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247,
15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107,
247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251,
4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125,
55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149,
66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188,
248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251,
59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251,
122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14,
247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126,
21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222,
3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18,
168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72,
139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194,
139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121,
88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216,
80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28,
248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216,
247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222,
247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166,
139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76,
194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244,
18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109,
4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160,
21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144,
138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99,
139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222,
247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32,
139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109,
21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223,
247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206,
215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200,
175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108,
195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212,
104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247,
181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110,
159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193,
251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,
247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6,
19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31,
247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165,
226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194,
80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189,
165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51,
47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159,
18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158,
188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139,
85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226,
247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222,
3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204,
30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149,
176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222,
64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159,
248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61,
45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46,
248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247,
44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159,
1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44,
139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236,
139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99,
139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204,
1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120,
106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185,
204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180,
139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3,
239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1,
216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196,
151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155,
6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8,
251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248,
47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149,
120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149,
161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164,
139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19,
160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192,
138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200,
134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27,
125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8,
145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91,
211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194,
247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132,
152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88,
142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35,
46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114,
139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160,
132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110,
119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139,
96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247,
28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190,
216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93,
247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247,
251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144,
251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217,
248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171,
183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99,
139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247,
5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55,
5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209,
8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218,
121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159,
5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108,
94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139,
88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6,
139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139,
182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191,
8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177,
99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179,
158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113,
102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247,
82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194,
82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83,
86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82,
190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251,
45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31,
14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139,
247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247,
143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119,
21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239,
244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207,
21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72,
207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50,
10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247,
204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138,
21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6,
14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51,
251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247,
86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247,
103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203,
221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169,
70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249,
222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195,
206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81,
124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1,
186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188,
232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10,
247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243,
3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35,
35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148,
198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249,
108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4,
190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247,
226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79,
4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243,
1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114,
95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134,
111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192,
186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229,
243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159,
1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14,
179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139,
127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128,
72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10,
14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233,
208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195,
139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134,
183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179,
248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21,
35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134,
21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22,
97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108,
31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215,
186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179,
249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52,
159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161,
131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139,
92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247,
102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67,
250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232,
3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244,
247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221,
21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191,
247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247,
169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7,
202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182,
163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123,
119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76,
145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97,
108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145,
8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59,
83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139,
247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154,
232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247,
34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77,
193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189,
69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139,
204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251,
12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221,
247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220,
221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66,
139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79,
213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7,
19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204,
139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179,
58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206,
247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191,
76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87,
87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247,
52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94,
163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105,
224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117,
104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180,
112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93,
139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132,
144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19,
184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101,
171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21,
73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160,
223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251,
244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203,
5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21,
107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154,
80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227,
244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95,
139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176,
139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116,
216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72,
139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,
187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139,
8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179,
73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233,
195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247,
130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247,
131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126,
173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156,
139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166,
174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107,
123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82,
93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243,
197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35,
36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159,
1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248,
10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21,
38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248,
110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139,
159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37,
10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112,
146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159,
247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247,
111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248,
65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116,
21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77,
105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194,
121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41,
139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182,
109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156,
125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200,
112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126,
137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228,
247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247,
30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133,
247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139,
221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247,
224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,
10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,
76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3,
247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142,
221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251,
42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214,
242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6,
19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,
249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66,
10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,
6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,
21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206,
110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17,
248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251,
71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156,
131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150,
139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208,
8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247,
18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247,
54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116,
221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,
108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221,
248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121,
21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146,
115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139,
188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249,
30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78,
10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,
79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62,
247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247,
102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188,
249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1,
247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247,
251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63,
21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107,
247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232,
247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54,
219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7,
226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247,
100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21,
35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181,
226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139,
8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100,
115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31,
117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108,
92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193,
139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248,
92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216,
247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21,
47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247,
152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65,
10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21,
46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216,
213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38,
247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108,
103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44,
80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165,
222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10,
95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214,
3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139,
8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135,
190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66,
139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146,
141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8,
130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89,
31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247,
45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49,
21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216,
247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66,
10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10,
141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116,
216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21,
49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142,
243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19,
116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248,
120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249,
120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248,
160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247,
89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10,
14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222,
19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89,
109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95,
139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130,
8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248,
44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52,
10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14,
116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21,
52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247,
170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247,
164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44,
216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251,
39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243,
251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139,
95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163,
130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130,
226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120,
159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22,
55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6,
19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159,
18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,
57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18,
204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,
10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204,
222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251,
72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24,
248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247,
89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44,
214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129,
174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251,
9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217,
101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8,
95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62,
251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110,
159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247,
165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251,
28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251,
17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110,
221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251,
153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198,
205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151,
71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58,
91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138,
139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198,
251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219,
5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139,
117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248,
216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234,
21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,
139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,
153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,
81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192,
18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124,
247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14,
179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196,
247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70,
221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96,
182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252,
140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37,
90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189,
189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247,
132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35,
35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247,
177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247,
233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45,
139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247,
179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177,
119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247,
27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121,
6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79,
191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167,
154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19,
44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245,
192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247,
21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21,
251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247,
9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21,
82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19,
69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80,
117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248,
180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247,
7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96,
83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215,
139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117,
201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26,
207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145,
111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180,
169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247,
26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86,
10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70,
251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37,
199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212,
248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139,
8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248,
7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194,
141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21,
116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10,
217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19,
0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1,
104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3,
81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74,
4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61,
5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3,
5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240,
7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6,
11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7,
11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139,
251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11,
248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6,
11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139,
218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251,
106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247,
12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251,
52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102,
139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181,
112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3,
139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166,
8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204,
86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251,
7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74,
252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91,
7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137,
135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,
76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,
181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78,
114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,
115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108,
98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157,
143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45,
251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6,
116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146,
236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52,
221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140,
122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195,
209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39,
50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251,
43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217,
232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100,
247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139,
101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139,
247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161,
139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251,
189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30,
11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247,
69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64,
7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181,
8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139,
139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249,
109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11,
251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71,
57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98,
98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139,
5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43,
202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8,
11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158,
120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199,
139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5,
11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40,
200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251,
40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251,
42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,
251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128,
128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139,
169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124,
138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105,
109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30,
139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139,
46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139,
8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251,
158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97,
247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65,
247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247,
66,247,68,247,33,247,36,247,65,31,11,0,};
#endif
 
#ifdef HAVE_INCBIN
extern const unsigned char pdf_font_NimbusMonL_Bold[15788];
asm(".globl pdf_font_NimbusMonL_Bold");
asm(".balign 8");
asm("pdf_font_NimbusMonL_Bold:");
asm(".incbin \"fonts/NimbusMonL-Bold.cff\"");
#else
static const unsigned char pdf_font_NimbusMonL_Bold[15788] = {
1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0,
1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251,
66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28,
55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111,
109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112,
97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,
43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,
85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,
112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101,
103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1,
0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,
18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,
0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,
0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,
0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,
0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,
0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,
106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,
0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0,
131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143,
0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0,
177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187,
0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0,
202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211,
0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0,
223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161,
0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0,
160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170,
2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195,
5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175,
9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11,
232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14,
71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15,
253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18,
205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134,
20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24,
169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25,
230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27,
173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29,
183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33,
222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36,
68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38,
63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124,
40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175,
42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209,
44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100,
47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50,
55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223,
56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247,
115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21,
32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62,
139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71,
247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247,
103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170,
247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66,
5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70,
69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94,
145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247,
33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139,
210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140,
66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178,
139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139,
100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247,
93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19,
191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236,
64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194,
31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46,
62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69,
4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116,
217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226,
21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231,
71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89,
139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154,
177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199,
8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90,
30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67,
139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3,
204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39,
251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247,
35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89,
159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247,
50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51,
90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33,
177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169,
120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3,
248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132,
211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3,
247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21,
251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229,
247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251,
23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117,
231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41,
46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247,
151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76,
7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171,
176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97,
177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142,
187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83,
106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217,
248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140,
5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102,
156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104,
189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139,
251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163,
194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138,
8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160,
251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82,
5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247,
226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220,
139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178,
118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239,
243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247,
187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3,
248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119,
52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236,
239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235,
240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74,
58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156,
249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125,
8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247,
115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183,
163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103,
211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229,
247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73,
90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83,
56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217,
247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0,
139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215,
97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31,
206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247,
20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31,
14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160,
4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21,
35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125,
251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247,
183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130,
159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53,
139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247,
222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247,
9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158,
176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139,
139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102,
251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229,
248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251,
26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223,
148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139,
247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251,
26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166,
8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247,
74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159,
163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180,
97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191,
205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110,
247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124,
221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158,
178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174,
193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232,
251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99,
139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143,
247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104,
127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1,
187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85,
79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139,
247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105,
61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121,
169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232,
248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247,
30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78,
251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232,
3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229,
232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253,
109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221,
3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139,
72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247,
3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116,
82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238,
139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247,
187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232,
249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124,
139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247,
99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149,
7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186,
44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10,
139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252,
10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139,
248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65,
249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159,
1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139,
249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227,
139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248,
30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109,
227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221,
1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139,
159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247,
121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251,
36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86,
91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138,
21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251,
102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155,
198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139,
8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251,
71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232,
232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139,
94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175,
60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109,
232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106,
139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247,
246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221,
249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251,
9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7,
251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159,
249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248,
253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247,
77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251,
29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5,
14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139,
251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247,
5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69,
159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221,
1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247,
142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249,
89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211,
249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253,
177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192,
247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21,
252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10,
14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,
247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191,
226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139,
8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8,
247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247,
15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107,
247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251,
4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125,
55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149,
66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188,
248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251,
59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251,
122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14,
247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126,
21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222,
3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18,
168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72,
139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194,
139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121,
88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216,
80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28,
248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216,
247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222,
247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166,
139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76,
194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244,
18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109,
4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160,
21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144,
138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99,
139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222,
247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32,
139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109,
21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223,
247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206,
215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200,
175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108,
195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212,
104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247,
181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110,
159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193,
251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,
247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6,
19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31,
247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165,
226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194,
80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189,
165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51,
47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159,
18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158,
188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139,
85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226,
247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222,
3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204,
30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149,
176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222,
64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159,
248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61,
45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46,
248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247,
44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159,
1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44,
139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236,
139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99,
139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204,
1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120,
106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185,
204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180,
139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3,
239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1,
216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196,
151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155,
6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8,
251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248,
47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149,
120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149,
161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164,
139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19,
160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192,
138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200,
134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27,
125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8,
145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91,
211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194,
247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132,
152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88,
142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35,
46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114,
139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160,
132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110,
119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139,
96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247,
28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190,
216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93,
247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247,
251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144,
251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217,
248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171,
183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99,
139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247,
5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55,
5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209,
8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218,
121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159,
5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108,
94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139,
88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6,
139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139,
182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191,
8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177,
99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179,
158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113,
102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247,
82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194,
82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83,
86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82,
190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251,
45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31,
14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139,
247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247,
143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119,
21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239,
244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207,
21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72,
207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50,
10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247,
204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138,
21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6,
14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51,
251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247,
86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247,
103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203,
221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169,
70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249,
222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195,
206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81,
124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1,
186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188,
232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10,
247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243,
3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35,
35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148,
198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249,
108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4,
190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247,
226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79,
4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243,
1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114,
95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134,
111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192,
186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229,
243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159,
1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14,
179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139,
127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128,
72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10,
14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233,
208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195,
139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134,
183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179,
248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21,
35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134,
21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22,
97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108,
31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215,
186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179,
249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52,
159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161,
131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139,
92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247,
102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67,
250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232,
3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244,
247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221,
21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191,
247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247,
169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7,
202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182,
163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123,
119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76,
145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97,
108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145,
8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59,
83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139,
247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154,
232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247,
34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77,
193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189,
69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139,
204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251,
12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221,
247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220,
221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66,
139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79,
213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7,
19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204,
139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179,
58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206,
247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191,
76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87,
87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247,
52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94,
163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105,
224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117,
104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180,
112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93,
139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132,
144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19,
184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101,
171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21,
73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160,
223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251,
244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203,
5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21,
107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154,
80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227,
244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95,
139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176,
139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116,
216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72,
139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,
187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139,
8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179,
73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233,
195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247,
130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247,
131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126,
173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156,
139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166,
174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107,
123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82,
93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243,
197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35,
36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159,
1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248,
10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21,
38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248,
110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139,
159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37,
10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112,
146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159,
247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247,
111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248,
65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116,
21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77,
105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194,
121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41,
139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182,
109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156,
125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200,
112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126,
137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228,
247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247,
30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133,
247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139,
221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247,
224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,
10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,
76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3,
247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142,
221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251,
42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214,
242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6,
19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,
249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66,
10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,
6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,
21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206,
110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17,
248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251,
71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156,
131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150,
139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208,
8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247,
18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247,
54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116,
221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,
108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221,
248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121,
21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146,
115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139,
188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249,
30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78,
10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,
79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62,
247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247,
102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188,
249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1,
247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247,
251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63,
21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107,
247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232,
247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54,
219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7,
226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247,
100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21,
35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181,
226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139,
8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100,
115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31,
117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108,
92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193,
139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248,
92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216,
247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21,
47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247,
152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65,
10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21,
46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216,
213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38,
247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108,
103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44,
80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165,
222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10,
95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214,
3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139,
8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135,
190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66,
139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146,
141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8,
130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89,
31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247,
45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49,
21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216,
247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66,
10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10,
141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116,
216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21,
49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142,
243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19,
116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248,
120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249,
120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248,
160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247,
89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10,
14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222,
19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89,
109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95,
139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130,
8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248,
44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52,
10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14,
116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21,
52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247,
170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247,
164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44,
216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251,
39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243,
251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139,
95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163,
130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130,
226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120,
159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22,
55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6,
19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159,
18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,
57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18,
204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,
10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204,
222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251,
72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24,
248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247,
89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44,
214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129,
174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251,
9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217,
101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8,
95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62,
251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110,
159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247,
165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251,
28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251,
17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110,
221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251,
153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198,
205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151,
71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58,
91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138,
139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198,
251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219,
5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139,
117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248,
216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234,
21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,
139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,
153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,
81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192,
18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124,
247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14,
179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196,
247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70,
221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96,
182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252,
140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37,
90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189,
189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247,
132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35,
35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247,
177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247,
233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45,
139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247,
179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177,
119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247,
27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121,
6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79,
191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167,
154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19,
44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245,
192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247,
21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21,
251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247,
9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21,
82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19,
69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80,
117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248,
180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247,
7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96,
83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215,
139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117,
201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26,
207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145,
111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180,
169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247,
26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86,
10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70,
251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37,
199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212,
248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139,
8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248,
7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194,
141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21,
116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10,
217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19,
0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1,
104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3,
81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74,
4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61,
5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3,
5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240,
7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6,
11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7,
11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139,
251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11,
248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6,
11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139,
218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251,
106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247,
12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251,
52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102,
139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181,
112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3,
139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166,
8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204,
86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251,
7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74,
252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91,
7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137,
135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,
76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,
181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78,
114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,
115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108,
98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157,
143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45,
251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6,
116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146,
236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52,
221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140,
122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195,
209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39,
50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251,
43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217,
232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100,
247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139,
101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139,
247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161,
139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251,
189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30,
11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247,
69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64,
7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181,
8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139,
139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249,
109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11,
251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71,
57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98,
98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139,
5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43,
202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8,
11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158,
120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199,
139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5,
11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40,
200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251,
40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251,
42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,
251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128,
128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139,
169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124,
138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105,
109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30,
139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139,
46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139,
8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251,
158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97,
247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65,
247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247,
66,247,68,247,33,247,36,247,65,31,11,0,};
#endif
 
#ifdef HAVE_INCBIN
extern const unsigned char pdf_font_NimbusMonL_BoldObli[15788];
asm(".globl pdf_font_NimbusMonL_BoldObli");
asm(".balign 8");
asm("pdf_font_NimbusMonL_BoldObli:");
asm(".incbin \"fonts/NimbusMonL-BoldObli.cff\"");
#else
static const unsigned char pdf_font_NimbusMonL_BoldObli[15788] = {
1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0,
1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251,
66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28,
55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111,
109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112,
97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,
43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,
85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,
112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101,
103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1,
0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,
18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,
0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,
0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,
0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,
0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,
0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,
106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,
0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0,
131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143,
0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0,
177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187,
0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0,
202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211,
0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0,
223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161,
0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0,
160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170,
2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195,
5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175,
9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11,
232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14,
71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15,
253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18,
205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134,
20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24,
169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25,
230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27,
173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29,
183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33,
222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36,
68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38,
63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124,
40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175,
42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209,
44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100,
47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50,
55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223,
56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247,
115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21,
32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62,
139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71,
247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247,
103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170,
247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66,
5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70,
69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94,
145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247,
33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139,
210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140,
66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178,
139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139,
100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247,
93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19,
191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236,
64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194,
31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46,
62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69,
4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116,
217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226,
21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231,
71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89,
139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154,
177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199,
8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90,
30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67,
139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3,
204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39,
251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247,
35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89,
159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247,
50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51,
90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33,
177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169,
120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3,
248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132,
211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3,
247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21,
251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229,
247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251,
23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117,
231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41,
46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247,
151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76,
7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171,
176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97,
177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142,
187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83,
106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217,
248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140,
5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102,
156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104,
189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139,
251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163,
194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138,
8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160,
251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82,
5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247,
226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220,
139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178,
118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239,
243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247,
187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3,
248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119,
52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236,
239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235,
240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74,
58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156,
249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125,
8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247,
115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183,
163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103,
211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229,
247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73,
90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83,
56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217,
247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0,
139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215,
97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31,
206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247,
20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31,
14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160,
4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21,
35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125,
251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247,
183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130,
159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53,
139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247,
222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247,
9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158,
176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139,
139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102,
251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229,
248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251,
26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223,
148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139,
247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251,
26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166,
8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247,
74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159,
163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180,
97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191,
205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110,
247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124,
221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158,
178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174,
193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232,
251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99,
139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143,
247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104,
127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1,
187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85,
79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139,
247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105,
61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121,
169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232,
248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247,
30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78,
251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232,
3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229,
232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253,
109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221,
3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139,
72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247,
3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116,
82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238,
139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247,
187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232,
249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124,
139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247,
99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149,
7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186,
44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10,
139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252,
10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139,
248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65,
249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159,
1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139,
249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227,
139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248,
30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109,
227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221,
1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139,
159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247,
121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251,
36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86,
91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138,
21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251,
102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155,
198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139,
8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251,
71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232,
232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139,
94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175,
60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109,
232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106,
139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247,
246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221,
249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251,
9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7,
251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159,
249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248,
253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247,
77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251,
29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5,
14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139,
251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247,
5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69,
159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221,
1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247,
142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249,
89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211,
249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253,
177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192,
247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21,
252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10,
14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,
247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191,
226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139,
8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8,
247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247,
15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107,
247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251,
4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125,
55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149,
66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188,
248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251,
59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251,
122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14,
247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126,
21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222,
3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18,
168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72,
139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194,
139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121,
88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216,
80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28,
248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216,
247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222,
247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166,
139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76,
194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244,
18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109,
4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160,
21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144,
138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99,
139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222,
247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32,
139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109,
21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223,
247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206,
215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200,
175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108,
195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212,
104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247,
181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110,
159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193,
251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,
247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6,
19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31,
247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165,
226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194,
80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189,
165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51,
47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159,
18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158,
188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139,
85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226,
247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222,
3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204,
30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149,
176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222,
64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159,
248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61,
45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46,
248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247,
44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159,
1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44,
139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236,
139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99,
139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204,
1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120,
106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185,
204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180,
139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3,
239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1,
216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196,
151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155,
6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8,
251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248,
47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149,
120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149,
161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164,
139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19,
160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192,
138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200,
134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27,
125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8,
145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91,
211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194,
247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132,
152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88,
142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35,
46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114,
139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160,
132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110,
119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139,
96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247,
28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190,
216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93,
247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247,
251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144,
251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217,
248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171,
183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99,
139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247,
5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55,
5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209,
8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218,
121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159,
5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108,
94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139,
88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6,
139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139,
182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191,
8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177,
99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179,
158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113,
102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247,
82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194,
82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83,
86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82,
190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251,
45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31,
14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139,
247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247,
143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119,
21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239,
244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207,
21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72,
207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50,
10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247,
204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138,
21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6,
14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51,
251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247,
86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247,
103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203,
221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169,
70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249,
222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195,
206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81,
124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1,
186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188,
232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10,
247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243,
3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35,
35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148,
198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249,
108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4,
190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247,
226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79,
4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243,
1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114,
95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134,
111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192,
186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229,
243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159,
1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14,
179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139,
127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128,
72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10,
14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233,
208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195,
139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134,
183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179,
248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21,
35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134,
21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22,
97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108,
31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215,
186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179,
249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52,
159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161,
131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139,
92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247,
102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67,
250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232,
3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244,
247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221,
21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191,
247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247,
169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7,
202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182,
163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123,
119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76,
145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97,
108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145,
8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59,
83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139,
247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154,
232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247,
34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77,
193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189,
69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139,
204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251,
12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221,
247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220,
221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66,
139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79,
213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7,
19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204,
139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179,
58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206,
247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191,
76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87,
87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247,
52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94,
163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105,
224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117,
104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180,
112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93,
139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132,
144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19,
184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101,
171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21,
73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160,
223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251,
244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203,
5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21,
107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154,
80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227,
244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95,
139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176,
139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116,
216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72,
139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,
187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139,
8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179,
73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233,
195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247,
130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247,
131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126,
173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156,
139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166,
174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107,
123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82,
93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243,
197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35,
36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159,
1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248,
10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21,
38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248,
110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139,
159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37,
10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112,
146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159,
247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247,
111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248,
65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116,
21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77,
105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194,
121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41,
139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182,
109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156,
125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200,
112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126,
137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228,
247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247,
30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133,
247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139,
221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247,
224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,
10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,
76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3,
247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142,
221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251,
42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214,
242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6,
19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,
249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66,
10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,
6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,
21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206,
110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17,
248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251,
71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156,
131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150,
139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208,
8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247,
18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247,
54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116,
221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,
108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221,
248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121,
21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146,
115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139,
188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249,
30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78,
10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,
79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62,
247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247,
102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188,
249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1,
247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247,
251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63,
21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107,
247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232,
247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54,
219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7,
226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247,
100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21,
35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181,
226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139,
8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100,
115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31,
117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108,
92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193,
139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248,
92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216,
247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21,
47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247,
152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65,
10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21,
46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216,
213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38,
247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108,
103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44,
80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165,
222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10,
95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214,
3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139,
8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135,
190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66,
139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146,
141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8,
130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89,
31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247,
45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49,
21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216,
247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66,
10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10,
141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116,
216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21,
49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142,
243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19,
116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248,
120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249,
120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248,
160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247,
89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10,
14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222,
19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89,
109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95,
139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130,
8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248,
44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52,
10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14,
116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21,
52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247,
170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247,
164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44,
216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251,
39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243,
251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139,
95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163,
130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130,
226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120,
159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22,
55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6,
19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159,
18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,
57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18,
204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,
10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204,
222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251,
72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24,
248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247,
89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44,
214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129,
174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251,
9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217,
101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8,
95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62,
251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110,
159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247,
165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251,
28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251,
17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110,
221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251,
153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198,
205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151,
71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58,
91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138,
139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198,
251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219,
5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139,
117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248,
216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234,
21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,
139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,
153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,
81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192,
18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124,
247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14,
179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196,
247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70,
221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96,
182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252,
140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37,
90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189,
189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247,
132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35,
35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247,
177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247,
233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45,
139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247,
179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177,
119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247,
27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121,
6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79,
191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167,
154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19,
44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245,
192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247,
21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21,
251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247,
9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21,
82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19,
69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80,
117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248,
180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247,
7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96,
83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215,
139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117,
201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26,
207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145,
111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180,
169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247,
26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86,
10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70,
251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37,
199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212,
248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139,
8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248,
7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194,
141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21,
116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10,
217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19,
0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1,
104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3,
81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74,
4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61,
5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3,
5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240,
7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6,
11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7,
11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139,
251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11,
248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6,
11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139,
218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251,
106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247,
12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251,
52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102,
139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181,
112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3,
139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166,
8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204,
86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251,
7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74,
252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91,
7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137,
135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,
76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,
181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78,
114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,
115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108,
98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157,
143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45,
251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6,
116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146,
236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52,
221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140,
122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195,
209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39,
50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251,
43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217,
232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100,
247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139,
101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139,
247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161,
139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251,
189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30,
11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247,
69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64,
7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181,
8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139,
139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249,
109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11,
251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71,
57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98,
98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139,
5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43,
202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8,
11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158,
120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199,
139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5,
11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40,
200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251,
40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251,
42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,
251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128,
128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139,
169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124,
138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105,
109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30,
139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139,
46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139,
8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251,
158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97,
247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65,
247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247,
66,247,68,247,33,247,36,247,65,31,11,0,};
#endif
 
#ifdef HAVE_INCBIN
extern const unsigned char pdf_font_NimbusMonL_Regu[15788];
asm(".globl pdf_font_NimbusMonL_Regu");
asm(".balign 8");
asm("pdf_font_NimbusMonL_Regu:");
asm(".incbin \"fonts/NimbusMonL-Regu.cff\"");
#else
static const unsigned char pdf_font_NimbusMonL_Regu[15788] = {
1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0,
1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251,
66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28,
55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111,
109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112,
97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,
43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,
85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,
112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101,
103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1,
0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,
18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,
0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,
0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,
0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,
0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,
0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,
106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,
0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0,
131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143,
0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0,
177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187,
0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0,
202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211,
0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0,
223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161,
0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0,
160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170,
2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195,
5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175,
9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11,
232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14,
71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15,
253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18,
205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134,
20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24,
169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25,
230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27,
173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29,
183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33,
222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36,
68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38,
63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124,
40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175,
42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209,
44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100,
47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50,
55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223,
56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247,
115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21,
32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62,
139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71,
247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247,
103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170,
247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66,
5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70,
69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94,
145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247,
33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139,
210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140,
66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178,
139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139,
100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247,
93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19,
191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236,
64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194,
31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46,
62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69,
4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116,
217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226,
21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231,
71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89,
139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154,
177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199,
8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90,
30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67,
139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3,
204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39,
251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247,
35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89,
159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247,
50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51,
90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33,
177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169,
120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3,
248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132,
211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3,
247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21,
251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229,
247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251,
23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117,
231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41,
46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247,
151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76,
7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171,
176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97,
177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142,
187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83,
106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217,
248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140,
5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102,
156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104,
189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139,
251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163,
194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138,
8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160,
251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82,
5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247,
226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220,
139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178,
118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239,
243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247,
187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3,
248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119,
52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236,
239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235,
240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74,
58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156,
249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125,
8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247,
115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183,
163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103,
211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229,
247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73,
90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83,
56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217,
247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0,
139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215,
97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31,
206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247,
20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31,
14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160,
4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21,
35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125,
251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247,
183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130,
159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53,
139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247,
222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247,
9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158,
176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139,
139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102,
251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229,
248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251,
26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223,
148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139,
247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251,
26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166,
8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247,
74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159,
163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180,
97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191,
205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110,
247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124,
221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158,
178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174,
193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232,
251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99,
139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143,
247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104,
127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1,
187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85,
79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139,
247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105,
61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121,
169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232,
248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247,
30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78,
251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232,
3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229,
232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253,
109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221,
3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139,
72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247,
3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116,
82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238,
139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247,
187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232,
249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124,
139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247,
99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149,
7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186,
44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10,
139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252,
10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139,
248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65,
249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159,
1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139,
249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227,
139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248,
30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109,
227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221,
1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139,
159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247,
121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251,
36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86,
91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138,
21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251,
102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155,
198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139,
8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251,
71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232,
232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139,
94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175,
60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109,
232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106,
139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247,
246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221,
249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251,
9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7,
251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159,
249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248,
253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247,
77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251,
29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5,
14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139,
251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247,
5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69,
159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221,
1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247,
142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249,
89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211,
249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253,
177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192,
247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21,
252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10,
14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,
247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191,
226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139,
8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8,
247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247,
15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107,
247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251,
4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125,
55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149,
66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188,
248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251,
59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251,
122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14,
247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126,
21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222,
3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18,
168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72,
139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194,
139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121,
88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216,
80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28,
248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216,
247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222,
247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166,
139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76,
194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244,
18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109,
4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160,
21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144,
138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99,
139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222,
247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32,
139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109,
21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223,
247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206,
215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200,
175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108,
195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212,
104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247,
181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110,
159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193,
251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,
247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6,
19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31,
247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165,
226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194,
80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189,
165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51,
47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159,
18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158,
188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139,
85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226,
247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222,
3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204,
30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149,
176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222,
64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159,
248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61,
45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46,
248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247,
44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159,
1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44,
139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236,
139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99,
139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204,
1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120,
106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185,
204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180,
139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3,
239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1,
216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196,
151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155,
6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8,
251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248,
47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149,
120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149,
161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164,
139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19,
160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192,
138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200,
134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27,
125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8,
145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91,
211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194,
247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132,
152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88,
142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35,
46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114,
139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160,
132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110,
119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139,
96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247,
28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190,
216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93,
247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247,
251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144,
251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217,
248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171,
183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99,
139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247,
5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55,
5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209,
8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218,
121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159,
5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108,
94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139,
88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6,
139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139,
182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191,
8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177,
99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179,
158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113,
102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247,
82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194,
82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83,
86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82,
190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251,
45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31,
14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139,
247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247,
143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119,
21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239,
244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207,
21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72,
207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50,
10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247,
204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138,
21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6,
14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51,
251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247,
86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247,
103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203,
221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169,
70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249,
222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195,
206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81,
124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1,
186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188,
232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10,
247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243,
3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35,
35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148,
198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249,
108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4,
190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247,
226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79,
4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243,
1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114,
95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134,
111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192,
186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229,
243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159,
1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14,
179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139,
127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128,
72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10,
14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233,
208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195,
139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134,
183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179,
248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21,
35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134,
21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22,
97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108,
31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215,
186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179,
249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52,
159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161,
131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139,
92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247,
102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67,
250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232,
3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244,
247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221,
21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191,
247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247,
169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7,
202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182,
163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123,
119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76,
145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97,
108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145,
8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59,
83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139,
247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154,
232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247,
34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77,
193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189,
69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139,
204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251,
12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221,
247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220,
221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66,
139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79,
213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7,
19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204,
139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179,
58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206,
247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191,
76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87,
87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247,
52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94,
163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105,
224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117,
104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180,
112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93,
139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132,
144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19,
184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101,
171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21,
73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160,
223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251,
244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203,
5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21,
107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154,
80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227,
244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95,
139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176,
139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116,
216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72,
139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,
187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139,
8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179,
73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233,
195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247,
130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247,
131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126,
173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156,
139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166,
174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107,
123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82,
93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243,
197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35,
36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159,
1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248,
10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21,
38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248,
110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139,
159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37,
10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112,
146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159,
247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247,
111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248,
65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116,
21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77,
105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194,
121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41,
139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182,
109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156,
125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200,
112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126,
137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228,
247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247,
30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133,
247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139,
221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247,
224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,
10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,
76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3,
247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142,
221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251,
42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214,
242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6,
19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,
249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66,
10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,
6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,
21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206,
110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17,
248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251,
71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156,
131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150,
139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208,
8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247,
18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247,
54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116,
221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,
108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221,
248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121,
21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146,
115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139,
188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249,
30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78,
10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,
79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62,
247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247,
102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188,
249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1,
247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247,
251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63,
21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107,
247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232,
247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54,
219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7,
226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247,
100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21,
35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181,
226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139,
8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100,
115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31,
117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108,
92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193,
139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248,
92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216,
247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21,
47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247,
152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65,
10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21,
46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216,
213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38,
247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108,
103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44,
80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165,
222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10,
95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214,
3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139,
8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135,
190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66,
139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146,
141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8,
130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89,
31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247,
45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49,
21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216,
247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66,
10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10,
141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116,
216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21,
49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142,
243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19,
116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248,
120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249,
120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248,
160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247,
89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10,
14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222,
19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89,
109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95,
139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130,
8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248,
44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52,
10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14,
116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21,
52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247,
170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247,
164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44,
216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251,
39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243,
251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139,
95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163,
130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130,
226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120,
159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22,
55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6,
19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159,
18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,
57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18,
204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,
10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204,
222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251,
72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24,
248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247,
89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44,
214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129,
174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251,
9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217,
101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8,
95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62,
251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110,
159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247,
165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251,
28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251,
17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110,
221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251,
153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198,
205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151,
71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58,
91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138,
139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198,
251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219,
5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139,
117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248,
216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234,
21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,
139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,
153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,
81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192,
18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124,
247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14,
179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196,
247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70,
221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96,
182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252,
140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37,
90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189,
189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247,
132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35,
35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247,
177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247,
233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45,
139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247,
179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177,
119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247,
27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121,
6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79,
191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167,
154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19,
44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245,
192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247,
21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21,
251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247,
9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21,
82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19,
69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80,
117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248,
180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247,
7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96,
83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215,
139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117,
201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26,
207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145,
111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180,
169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247,
26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86,
10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70,
251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37,
199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212,
248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139,
8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248,
7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194,
141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21,
116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10,
217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19,
0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1,
104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3,
81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74,
4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61,
5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3,
5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240,
7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6,
11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7,
11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139,
251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11,
248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6,
11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139,
218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251,
106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247,
12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251,
52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102,
139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181,
112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3,
139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166,
8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204,
86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251,
7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74,
252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91,
7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137,
135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,
76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,
181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78,
114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,
115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108,
98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157,
143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45,
251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6,
116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146,
236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52,
221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140,
122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195,
209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39,
50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251,
43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217,
232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100,
247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139,
101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139,
247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161,
139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251,
189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30,
11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247,
69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64,
7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181,
8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139,
139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249,
109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11,
251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71,
57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98,
98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139,
5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43,
202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8,
11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158,
120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199,
139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5,
11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40,
200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251,
40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251,
42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,
251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128,
128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139,
169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124,
138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105,
109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30,
139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139,
46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139,
8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251,
158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97,
247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65,
247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247,
66,247,68,247,33,247,36,247,65,31,11,0,};
#endif
 
#ifdef HAVE_INCBIN
extern const unsigned char pdf_font_NimbusMonL_ReguObli[15788];
asm(".globl pdf_font_NimbusMonL_ReguObli");
asm(".balign 8");
asm("pdf_font_NimbusMonL_ReguObli:");
asm(".incbin \"fonts/NimbusMonL-ReguObli.cff\"");
#else
static const unsigned char pdf_font_NimbusMonL_ReguObli[15788] = {
1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0,
1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251,
66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28,
55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111,
109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112,
97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,
43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,
85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,
112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101,
103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1,
0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,
18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,
0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,
0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,
0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,
0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,
0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,
106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,
0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0,
131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143,
0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0,
177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187,
0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0,
202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211,
0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0,
223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161,
0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0,
160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170,
2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195,
5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175,
9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11,
232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14,
71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15,
253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18,
205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134,
20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24,
169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25,
230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27,
173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29,
183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33,
222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36,
68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38,
63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124,
40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175,
42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209,
44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100,
47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50,
55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223,
56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247,
115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21,
32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62,
139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71,
247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247,
103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170,
247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66,
5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70,
69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94,
145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247,
33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139,
210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140,
66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178,
139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139,
100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247,
93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19,
191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236,
64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194,
31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46,
62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69,
4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116,
217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226,
21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231,
71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89,
139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154,
177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199,
8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90,
30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67,
139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3,
204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39,
251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247,
35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89,
159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247,
50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51,
90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33,
177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169,
120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3,
248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132,
211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3,
247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21,
251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229,
247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251,
23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117,
231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41,
46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247,
151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76,
7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171,
176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97,
177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142,
187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83,
106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217,
248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140,
5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102,
156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104,
189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139,
251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163,
194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138,
8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160,
251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82,
5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247,
226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220,
139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178,
118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239,
243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247,
187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3,
248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119,
52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236,
239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235,
240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74,
58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156,
249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125,
8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247,
115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183,
163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103,
211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229,
247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73,
90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83,
56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217,
247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0,
139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215,
97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31,
206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247,
20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31,
14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160,
4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21,
35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125,
251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247,
183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130,
159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53,
139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247,
222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247,
9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158,
176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139,
139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102,
251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229,
248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251,
26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223,
148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139,
247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251,
26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166,
8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247,
74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159,
163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180,
97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191,
205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110,
247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124,
221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158,
178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174,
193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232,
251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99,
139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143,
247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104,
127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1,
187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85,
79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139,
247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105,
61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121,
169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232,
248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247,
30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78,
251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232,
3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229,
232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253,
109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221,
3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139,
72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247,
3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116,
82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238,
139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247,
187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232,
249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124,
139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247,
99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149,
7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186,
44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10,
139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252,
10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139,
248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65,
249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159,
1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139,
249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227,
139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248,
30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109,
227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221,
1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139,
159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247,
121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251,
36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86,
91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138,
21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251,
102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155,
198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139,
8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251,
71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232,
232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139,
94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175,
60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109,
232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106,
139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247,
246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221,
249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251,
9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7,
251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159,
249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248,
253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247,
77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251,
29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5,
14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139,
251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247,
5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69,
159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221,
1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247,
142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249,
89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211,
249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253,
177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192,
247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21,
252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10,
14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,
247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191,
226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139,
8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8,
247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247,
15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107,
247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251,
4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125,
55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149,
66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188,
248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251,
59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251,
122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14,
247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126,
21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222,
3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18,
168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72,
139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194,
139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121,
88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216,
80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28,
248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216,
247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222,
247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166,
139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76,
194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244,
18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109,
4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160,
21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144,
138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99,
139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222,
247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32,
139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109,
21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223,
247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206,
215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200,
175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108,
195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212,
104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247,
181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110,
159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193,
251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,
247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6,
19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31,
247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165,
226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194,
80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189,
165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51,
47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159,
18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158,
188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139,
85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226,
247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222,
3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204,
30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149,
176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222,
64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159,
248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61,
45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46,
248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247,
44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159,
1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44,
139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236,
139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99,
139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204,
1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120,
106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185,
204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180,
139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3,
239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1,
216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196,
151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155,
6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8,
251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248,
47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149,
120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149,
161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164,
139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19,
160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192,
138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200,
134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27,
125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8,
145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91,
211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194,
247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132,
152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88,
142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35,
46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114,
139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160,
132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110,
119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139,
96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247,
28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190,
216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93,
247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247,
251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144,
251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217,
248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171,
183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99,
139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247,
5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55,
5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209,
8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218,
121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159,
5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108,
94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139,
88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6,
139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139,
182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191,
8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177,
99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179,
158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113,
102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247,
82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194,
82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83,
86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82,
190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251,
45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31,
14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139,
247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247,
143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119,
21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239,
244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207,
21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72,
207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50,
10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247,
204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138,
21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6,
14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51,
251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247,
86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247,
103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203,
221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169,
70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249,
222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195,
206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81,
124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1,
186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188,
232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10,
247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243,
3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35,
35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148,
198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249,
108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4,
190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247,
226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79,
4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243,
1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114,
95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134,
111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192,
186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229,
243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159,
1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14,
179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139,
127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128,
72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10,
14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233,
208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195,
139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134,
183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179,
248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21,
35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134,
21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22,
97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108,
31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215,
186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179,
249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52,
159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161,
131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139,
92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247,
102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67,
250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232,
3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244,
247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221,
21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191,
247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247,
169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7,
202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182,
163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123,
119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76,
145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97,
108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145,
8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59,
83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139,
247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154,
232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247,
34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77,
193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189,
69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139,
204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251,
12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221,
247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220,
221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66,
139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79,
213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7,
19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204,
139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179,
58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206,
247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191,
76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87,
87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247,
52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94,
163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105,
224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117,
104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180,
112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93,
139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132,
144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19,
184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101,
171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21,
73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160,
223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251,
244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203,
5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21,
107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154,
80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227,
244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95,
139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176,
139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116,
216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72,
139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,
187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139,
8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179,
73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233,
195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247,
130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247,
131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126,
173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156,
139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166,
174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107,
123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82,
93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243,
197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35,
36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159,
1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248,
10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21,
38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248,
110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139,
159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37,
10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112,
146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159,
247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247,
111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248,
65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116,
21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77,
105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194,
121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41,
139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182,
109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156,
125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200,
112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126,
137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228,
247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247,
30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133,
247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139,
221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247,
224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,
10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,
76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3,
247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142,
221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251,
42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214,
242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6,
19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,
249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66,
10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,
6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,
21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206,
110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17,
248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251,
71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156,
131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150,
139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208,
8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247,
18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247,
54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116,
221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,
108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221,
248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121,
21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146,
115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139,
188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249,
30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78,
10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,
79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62,
247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247,
102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188,
249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1,
247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247,
251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63,
21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107,
247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232,
247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54,
219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7,
226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247,
100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21,
35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181,
226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139,
8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100,
115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31,
117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108,
92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193,
139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248,
92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216,
247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21,
47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247,
152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65,
10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21,
46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216,
213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38,
247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108,
103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44,
80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165,
222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10,
95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214,
3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139,
8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135,
190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66,
139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146,
141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8,
130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89,
31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247,
45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49,
21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216,
247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66,
10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10,
141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116,
216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21,
49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142,
243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19,
116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248,
120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249,
120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248,
160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247,
89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10,
14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222,
19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89,
109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95,
139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130,
8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248,
44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52,
10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14,
116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21,
52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247,
170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247,
164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44,
216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251,
39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243,
251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139,
95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163,
130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130,
226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120,
159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22,
55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6,
19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159,
18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,
57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18,
204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,
10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204,
222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251,
72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24,
248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247,
89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44,
214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129,
174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251,
9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217,
101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8,
95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62,
251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110,
159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247,
165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251,
28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251,
17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110,
221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251,
153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198,
205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151,
71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58,
91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138,
139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198,
251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219,
5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139,
117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248,
216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234,
21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,
139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,
153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,
81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192,
18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124,
247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14,
179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196,
247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70,
221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96,
182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252,
140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37,
90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189,
189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247,
132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35,
35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247,
177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247,
233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45,
139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247,
179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177,
119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247,
27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121,
6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79,
191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167,
154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19,
44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245,
192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247,
21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21,
251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247,
9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21,
82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19,
69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80,
117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248,
180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247,
7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96,
83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215,
139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117,
201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26,
207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145,
111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180,
169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247,
26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86,
10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70,
251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37,
199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212,
248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139,
8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248,
7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194,
141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21,
116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10,
217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19,
0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1,
104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3,
81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74,
4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61,
5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3,
5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240,
7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6,
11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7,
11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139,
251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11,
248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6,
11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139,
218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251,
106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247,
12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251,
52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102,
139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181,
112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3,
139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166,
8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204,
86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251,
7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74,
252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91,
7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137,
135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,
76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,
181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78,
114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,
115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108,
98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157,
143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45,
251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6,
116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146,
236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52,
221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140,
122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195,
209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39,
50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251,
43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217,
232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100,
247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139,
101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139,
247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161,
139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251,
189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30,
11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247,
69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64,
7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181,
8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139,
139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249,
109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11,
251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71,
57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98,
98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139,
5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43,
202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8,
11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158,
120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199,
139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5,
11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40,
200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251,
40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251,
42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,
251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128,
128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139,
169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124,
138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105,
109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30,
139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139,
46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139,
8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251,
158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97,
247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65,
247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247,
66,247,68,247,33,247,36,247,65,31,11,0,};
#endif
 
#ifdef HAVE_INCBIN
extern const unsigned char pdf_font_NimbusRomNo9L_Medi[15788];
asm(".globl pdf_font_NimbusRomNo9L_Medi");
asm(".balign 8");
asm("pdf_font_NimbusRomNo9L_Medi:");
asm(".incbin \"fonts/NimbusRomNo9L-Medi.cff\"");
#else
static const unsigned char pdf_font_NimbusRomNo9L_Medi[15788] = {
1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0,
1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251,
66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28,
55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111,
109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112,
97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,
43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,
85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,
112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101,
103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1,
0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,
18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,
0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,
0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,
0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,
0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,
0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,
106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,
0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0,
131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143,
0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0,
177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187,
0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0,
202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211,
0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0,
223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161,
0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0,
160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170,
2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195,
5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175,
9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11,
232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14,
71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15,
253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18,
205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134,
20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24,
169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25,
230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27,
173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29,
183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33,
222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36,
68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38,
63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124,
40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175,
42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209,
44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100,
47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50,
55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223,
56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247,
115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21,
32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62,
139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71,
247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247,
103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170,
247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66,
5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70,
69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94,
145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247,
33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139,
210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140,
66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178,
139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139,
100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247,
93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19,
191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236,
64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194,
31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46,
62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69,
4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116,
217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226,
21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231,
71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89,
139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154,
177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199,
8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90,
30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67,
139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3,
204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39,
251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247,
35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89,
159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247,
50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51,
90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33,
177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169,
120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3,
248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132,
211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3,
247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21,
251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229,
247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251,
23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117,
231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41,
46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247,
151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76,
7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171,
176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97,
177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142,
187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83,
106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217,
248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140,
5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102,
156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104,
189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139,
251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163,
194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138,
8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160,
251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82,
5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247,
226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220,
139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178,
118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239,
243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247,
187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3,
248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119,
52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236,
239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235,
240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74,
58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156,
249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125,
8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247,
115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183,
163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103,
211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229,
247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73,
90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83,
56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217,
247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0,
139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215,
97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31,
206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247,
20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31,
14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160,
4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21,
35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125,
251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247,
183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130,
159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53,
139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247,
222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247,
9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158,
176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139,
139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102,
251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229,
248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251,
26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223,
148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139,
247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251,
26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166,
8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247,
74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159,
163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180,
97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191,
205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110,
247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124,
221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158,
178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174,
193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232,
251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99,
139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143,
247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104,
127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1,
187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85,
79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139,
247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105,
61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121,
169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232,
248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247,
30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78,
251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232,
3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229,
232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253,
109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221,
3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139,
72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247,
3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116,
82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238,
139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247,
187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232,
249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124,
139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247,
99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149,
7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186,
44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10,
139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252,
10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139,
248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65,
249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159,
1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139,
249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227,
139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248,
30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109,
227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221,
1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139,
159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247,
121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251,
36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86,
91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138,
21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251,
102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155,
198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139,
8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251,
71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232,
232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139,
94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175,
60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109,
232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106,
139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247,
246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221,
249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251,
9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7,
251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159,
249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248,
253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247,
77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251,
29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5,
14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139,
251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247,
5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69,
159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221,
1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247,
142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249,
89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211,
249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253,
177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192,
247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21,
252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10,
14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,
247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191,
226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139,
8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8,
247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247,
15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107,
247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251,
4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125,
55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149,
66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188,
248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251,
59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251,
122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14,
247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126,
21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222,
3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18,
168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72,
139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194,
139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121,
88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216,
80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28,
248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216,
247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222,
247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166,
139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76,
194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244,
18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109,
4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160,
21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144,
138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99,
139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222,
247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32,
139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109,
21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223,
247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206,
215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200,
175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108,
195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212,
104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247,
181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110,
159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193,
251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,
247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6,
19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31,
247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165,
226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194,
80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189,
165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51,
47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159,
18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158,
188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139,
85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226,
247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222,
3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204,
30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149,
176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222,
64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159,
248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61,
45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46,
248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247,
44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159,
1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44,
139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236,
139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99,
139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204,
1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120,
106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185,
204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180,
139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3,
239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1,
216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196,
151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155,
6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8,
251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248,
47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149,
120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149,
161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164,
139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19,
160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192,
138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200,
134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27,
125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8,
145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91,
211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194,
247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132,
152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88,
142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35,
46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114,
139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160,
132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110,
119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139,
96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247,
28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190,
216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93,
247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247,
251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144,
251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217,
248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171,
183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99,
139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247,
5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55,
5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209,
8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218,
121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159,
5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108,
94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139,
88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6,
139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139,
182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191,
8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177,
99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179,
158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113,
102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247,
82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194,
82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83,
86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82,
190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251,
45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31,
14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139,
247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247,
143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119,
21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239,
244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207,
21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72,
207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50,
10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247,
204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138,
21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6,
14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51,
251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247,
86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247,
103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203,
221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169,
70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249,
222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195,
206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81,
124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1,
186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188,
232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10,
247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243,
3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35,
35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148,
198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249,
108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4,
190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247,
226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79,
4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243,
1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114,
95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134,
111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192,
186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229,
243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159,
1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14,
179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139,
127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128,
72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10,
14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233,
208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195,
139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134,
183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179,
248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21,
35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134,
21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22,
97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108,
31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215,
186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179,
249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52,
159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161,
131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139,
92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247,
102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67,
250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232,
3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244,
247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221,
21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191,
247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247,
169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7,
202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182,
163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123,
119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76,
145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97,
108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145,
8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59,
83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139,
247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154,
232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247,
34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77,
193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189,
69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139,
204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251,
12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221,
247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220,
221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66,
139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79,
213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7,
19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204,
139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179,
58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206,
247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191,
76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87,
87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247,
52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94,
163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105,
224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117,
104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180,
112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93,
139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132,
144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19,
184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101,
171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21,
73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160,
223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251,
244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203,
5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21,
107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154,
80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227,
244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95,
139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176,
139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116,
216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72,
139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,
187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139,
8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179,
73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233,
195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247,
130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247,
131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126,
173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156,
139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166,
174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107,
123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82,
93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243,
197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35,
36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159,
1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248,
10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21,
38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248,
110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139,
159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37,
10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112,
146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159,
247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247,
111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248,
65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116,
21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77,
105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194,
121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41,
139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182,
109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156,
125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200,
112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126,
137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228,
247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247,
30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133,
247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139,
221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247,
224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,
10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,
76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3,
247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142,
221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251,
42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214,
242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6,
19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,
249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66,
10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,
6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,
21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206,
110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17,
248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251,
71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156,
131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150,
139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208,
8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247,
18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247,
54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116,
221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,
108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221,
248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121,
21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146,
115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139,
188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249,
30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78,
10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,
79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62,
247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247,
102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188,
249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1,
247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247,
251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63,
21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107,
247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232,
247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54,
219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7,
226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247,
100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21,
35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181,
226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139,
8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100,
115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31,
117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108,
92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193,
139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248,
92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216,
247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21,
47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247,
152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65,
10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21,
46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216,
213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38,
247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108,
103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44,
80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165,
222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10,
95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214,
3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139,
8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135,
190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66,
139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146,
141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8,
130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89,
31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247,
45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49,
21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216,
247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66,
10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10,
141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116,
216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21,
49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142,
243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19,
116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248,
120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249,
120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248,
160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247,
89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10,
14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222,
19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89,
109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95,
139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130,
8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248,
44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52,
10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14,
116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21,
52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247,
170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247,
164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44,
216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251,
39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243,
251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139,
95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163,
130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130,
226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120,
159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22,
55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6,
19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159,
18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,
57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18,
204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,
10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204,
222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251,
72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24,
248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247,
89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44,
214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129,
174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251,
9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217,
101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8,
95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62,
251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110,
159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247,
165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251,
28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251,
17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110,
221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251,
153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198,
205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151,
71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58,
91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138,
139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198,
251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219,
5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139,
117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248,
216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234,
21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,
139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,
153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,
81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192,
18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124,
247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14,
179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196,
247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70,
221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96,
182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252,
140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37,
90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189,
189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247,
132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35,
35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247,
177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247,
233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45,
139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247,
179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177,
119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247,
27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121,
6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79,
191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167,
154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19,
44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245,
192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247,
21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21,
251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247,
9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21,
82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19,
69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80,
117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248,
180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247,
7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96,
83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215,
139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117,
201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26,
207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145,
111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180,
169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247,
26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86,
10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70,
251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37,
199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212,
248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139,
8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248,
7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194,
141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21,
116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10,
217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19,
0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1,
104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3,
81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74,
4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61,
5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3,
5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240,
7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6,
11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7,
11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139,
251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11,
248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6,
11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139,
218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251,
106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247,
12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251,
52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102,
139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181,
112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3,
139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166,
8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204,
86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251,
7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74,
252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91,
7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137,
135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,
76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,
181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78,
114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,
115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108,
98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157,
143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45,
251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6,
116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146,
236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52,
221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140,
122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195,
209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39,
50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251,
43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217,
232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100,
247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139,
101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139,
247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161,
139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251,
189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30,
11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247,
69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64,
7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181,
8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139,
139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249,
109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11,
251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71,
57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98,
98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139,
5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43,
202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8,
11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158,
120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199,
139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5,
11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40,
200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251,
40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251,
42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,
251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128,
128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139,
169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124,
138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105,
109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30,
139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139,
46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139,
8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251,
158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97,
247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65,
247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247,
66,247,68,247,33,247,36,247,65,31,11,0,};
#endif
 
#ifdef HAVE_INCBIN
extern const unsigned char pdf_font_NimbusRomNo9L_MediItal[15788];
asm(".globl pdf_font_NimbusRomNo9L_MediItal");
asm(".balign 8");
asm("pdf_font_NimbusRomNo9L_MediItal:");
asm(".incbin \"fonts/NimbusRomNo9L-MediItal.cff\"");
#else
static const unsigned char pdf_font_NimbusRomNo9L_MediItal[15788] = {
1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0,
1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251,
66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28,
55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111,
109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112,
97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,
43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,
85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,
112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101,
103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1,
0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,
18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,
0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,
0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,
0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,
0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,
0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,
106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,
0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0,
131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143,
0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0,
177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187,
0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0,
202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211,
0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0,
223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161,
0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0,
160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170,
2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195,
5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175,
9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11,
232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14,
71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15,
253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18,
205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134,
20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24,
169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25,
230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27,
173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29,
183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33,
222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36,
68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38,
63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124,
40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175,
42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209,
44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100,
47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50,
55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223,
56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247,
115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21,
32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62,
139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71,
247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247,
103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170,
247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66,
5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70,
69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94,
145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247,
33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139,
210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140,
66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178,
139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139,
100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247,
93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19,
191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236,
64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194,
31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46,
62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69,
4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116,
217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226,
21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231,
71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89,
139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154,
177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199,
8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90,
30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67,
139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3,
204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39,
251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247,
35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89,
159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247,
50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51,
90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33,
177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169,
120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3,
248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132,
211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3,
247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21,
251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229,
247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251,
23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117,
231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41,
46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247,
151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76,
7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171,
176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97,
177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142,
187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83,
106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217,
248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140,
5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102,
156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104,
189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139,
251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163,
194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138,
8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160,
251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82,
5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247,
226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220,
139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178,
118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239,
243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247,
187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3,
248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119,
52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236,
239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235,
240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74,
58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156,
249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125,
8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247,
115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183,
163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103,
211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229,
247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73,
90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83,
56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217,
247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0,
139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215,
97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31,
206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247,
20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31,
14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160,
4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21,
35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125,
251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247,
183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130,
159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53,
139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247,
222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247,
9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158,
176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139,
139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102,
251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229,
248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251,
26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223,
148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139,
247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251,
26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166,
8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247,
74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159,
163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180,
97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191,
205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110,
247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124,
221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158,
178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174,
193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232,
251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99,
139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143,
247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104,
127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1,
187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85,
79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139,
247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105,
61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121,
169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232,
248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247,
30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78,
251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232,
3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229,
232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253,
109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221,
3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139,
72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247,
3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116,
82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238,
139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247,
187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232,
249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124,
139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247,
99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149,
7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186,
44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10,
139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252,
10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139,
248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65,
249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159,
1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139,
249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227,
139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248,
30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109,
227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221,
1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139,
159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247,
121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251,
36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86,
91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138,
21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251,
102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155,
198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139,
8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251,
71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232,
232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139,
94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175,
60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109,
232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106,
139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247,
246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221,
249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251,
9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7,
251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159,
249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248,
253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247,
77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251,
29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5,
14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139,
251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247,
5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69,
159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221,
1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247,
142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249,
89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211,
249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253,
177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192,
247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21,
252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10,
14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,
247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191,
226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139,
8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8,
247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247,
15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107,
247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251,
4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125,
55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149,
66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188,
248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251,
59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251,
122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14,
247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126,
21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222,
3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18,
168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72,
139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194,
139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121,
88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216,
80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28,
248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216,
247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222,
247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166,
139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76,
194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244,
18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109,
4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160,
21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144,
138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99,
139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222,
247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32,
139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109,
21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223,
247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206,
215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200,
175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108,
195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212,
104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247,
181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110,
159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193,
251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,
247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6,
19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31,
247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165,
226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194,
80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189,
165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51,
47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159,
18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158,
188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139,
85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226,
247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222,
3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204,
30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149,
176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222,
64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159,
248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61,
45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46,
248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247,
44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159,
1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44,
139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236,
139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99,
139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204,
1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120,
106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185,
204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180,
139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3,
239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1,
216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196,
151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155,
6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8,
251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248,
47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149,
120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149,
161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164,
139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19,
160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192,
138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200,
134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27,
125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8,
145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91,
211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194,
247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132,
152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88,
142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35,
46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114,
139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160,
132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110,
119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139,
96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247,
28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190,
216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93,
247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247,
251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144,
251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217,
248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171,
183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99,
139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247,
5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55,
5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209,
8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218,
121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159,
5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108,
94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139,
88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6,
139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139,
182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191,
8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177,
99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179,
158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113,
102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247,
82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194,
82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83,
86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82,
190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251,
45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31,
14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139,
247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247,
143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119,
21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239,
244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207,
21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72,
207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50,
10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247,
204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138,
21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6,
14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51,
251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247,
86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247,
103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203,
221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169,
70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249,
222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195,
206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81,
124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1,
186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188,
232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10,
247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243,
3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35,
35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148,
198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249,
108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4,
190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247,
226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79,
4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243,
1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114,
95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134,
111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192,
186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229,
243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159,
1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14,
179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139,
127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128,
72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10,
14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233,
208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195,
139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134,
183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179,
248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21,
35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134,
21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22,
97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108,
31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215,
186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179,
249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52,
159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161,
131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139,
92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247,
102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67,
250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232,
3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244,
247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221,
21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191,
247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247,
169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7,
202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182,
163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123,
119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76,
145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97,
108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145,
8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59,
83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139,
247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154,
232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247,
34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77,
193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189,
69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139,
204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251,
12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221,
247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220,
221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66,
139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79,
213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7,
19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204,
139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179,
58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206,
247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191,
76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87,
87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247,
52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94,
163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105,
224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117,
104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180,
112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93,
139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132,
144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19,
184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101,
171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21,
73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160,
223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251,
244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203,
5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21,
107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154,
80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227,
244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95,
139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176,
139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116,
216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72,
139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,
187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139,
8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179,
73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233,
195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247,
130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247,
131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126,
173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156,
139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166,
174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107,
123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82,
93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243,
197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35,
36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159,
1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248,
10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21,
38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248,
110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139,
159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37,
10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112,
146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159,
247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247,
111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248,
65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116,
21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77,
105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194,
121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41,
139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182,
109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156,
125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200,
112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126,
137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228,
247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247,
30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133,
247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139,
221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247,
224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,
10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,
76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3,
247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142,
221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251,
42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214,
242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6,
19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,
249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66,
10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,
6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,
21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206,
110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17,
248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251,
71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156,
131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150,
139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208,
8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247,
18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247,
54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116,
221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,
108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221,
248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121,
21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146,
115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139,
188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249,
30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78,
10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,
79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62,
247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247,
102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188,
249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1,
247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247,
251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63,
21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107,
247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232,
247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54,
219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7,
226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247,
100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21,
35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181,
226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139,
8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100,
115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31,
117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108,
92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193,
139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248,
92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216,
247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21,
47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247,
152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65,
10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21,
46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216,
213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38,
247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108,
103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44,
80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165,
222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10,
95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214,
3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139,
8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135,
190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66,
139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146,
141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8,
130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89,
31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247,
45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49,
21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216,
247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66,
10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10,
141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116,
216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21,
49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142,
243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19,
116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248,
120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249,
120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248,
160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247,
89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10,
14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222,
19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89,
109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95,
139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130,
8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248,
44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52,
10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14,
116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21,
52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247,
170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247,
164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44,
216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251,
39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243,
251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139,
95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163,
130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130,
226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120,
159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22,
55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6,
19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159,
18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,
57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18,
204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,
10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204,
222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251,
72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24,
248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247,
89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44,
214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129,
174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251,
9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217,
101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8,
95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62,
251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110,
159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247,
165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251,
28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251,
17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110,
221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251,
153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198,
205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151,
71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58,
91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138,
139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198,
251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219,
5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139,
117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248,
216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234,
21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,
139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,
153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,
81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192,
18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124,
247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14,
179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196,
247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70,
221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96,
182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252,
140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37,
90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189,
189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247,
132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35,
35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247,
177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247,
233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45,
139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247,
179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177,
119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247,
27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121,
6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79,
191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167,
154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19,
44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245,
192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247,
21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21,
251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247,
9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21,
82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19,
69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80,
117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248,
180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247,
7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96,
83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215,
139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117,
201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26,
207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145,
111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180,
169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247,
26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86,
10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70,
251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37,
199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212,
248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139,
8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248,
7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194,
141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21,
116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10,
217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19,
0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1,
104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3,
81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74,
4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61,
5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3,
5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240,
7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6,
11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7,
11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139,
251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11,
248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6,
11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139,
218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251,
106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247,
12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251,
52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102,
139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181,
112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3,
139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166,
8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204,
86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251,
7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74,
252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91,
7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137,
135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,
76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,
181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78,
114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,
115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108,
98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157,
143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45,
251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6,
116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146,
236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52,
221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140,
122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195,
209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39,
50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251,
43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217,
232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100,
247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139,
101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139,
247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161,
139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251,
189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30,
11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247,
69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64,
7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181,
8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139,
139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249,
109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11,
251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71,
57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98,
98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139,
5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43,
202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8,
11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158,
120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199,
139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5,
11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40,
200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251,
40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251,
42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,
251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128,
128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139,
169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124,
138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105,
109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30,
139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139,
46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139,
8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251,
158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97,
247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65,
247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247,
66,247,68,247,33,247,36,247,65,31,11,0,};
#endif
 
#ifdef HAVE_INCBIN
extern const unsigned char pdf_font_NimbusRomNo9L_Regu[15788];
asm(".globl pdf_font_NimbusRomNo9L_Regu");
asm(".balign 8");
asm("pdf_font_NimbusRomNo9L_Regu:");
asm(".incbin \"fonts/NimbusRomNo9L-Regu.cff\"");
#else
static const unsigned char pdf_font_NimbusRomNo9L_Regu[15788] = {
1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0,
1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251,
66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28,
55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111,
109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112,
97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,
43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,
85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,
112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101,
103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1,
0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,
18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,
0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,
0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,
0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,
0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,
0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,
106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,
0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0,
131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143,
0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0,
177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187,
0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0,
202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211,
0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0,
223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161,
0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0,
160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170,
2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195,
5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175,
9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11,
232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14,
71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15,
253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18,
205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134,
20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24,
169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25,
230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27,
173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29,
183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33,
222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36,
68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38,
63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124,
40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175,
42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209,
44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100,
47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50,
55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223,
56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247,
115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21,
32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62,
139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71,
247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247,
103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170,
247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66,
5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70,
69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94,
145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247,
33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139,
210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140,
66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178,
139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139,
100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247,
93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19,
191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236,
64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194,
31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46,
62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69,
4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116,
217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226,
21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231,
71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89,
139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154,
177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199,
8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90,
30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67,
139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3,
204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39,
251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247,
35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89,
159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247,
50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51,
90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33,
177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169,
120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3,
248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132,
211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3,
247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21,
251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229,
247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251,
23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117,
231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41,
46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247,
151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76,
7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171,
176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97,
177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142,
187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83,
106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217,
248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140,
5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102,
156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104,
189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139,
251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163,
194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138,
8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160,
251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82,
5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247,
226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220,
139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178,
118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239,
243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247,
187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3,
248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119,
52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236,
239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235,
240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74,
58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156,
249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125,
8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247,
115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183,
163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103,
211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229,
247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73,
90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83,
56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217,
247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0,
139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215,
97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31,
206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247,
20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31,
14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160,
4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21,
35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125,
251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247,
183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130,
159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53,
139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247,
222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247,
9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158,
176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139,
139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102,
251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229,
248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251,
26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223,
148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139,
247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251,
26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166,
8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247,
74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159,
163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180,
97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191,
205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110,
247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124,
221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158,
178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174,
193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232,
251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99,
139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143,
247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104,
127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1,
187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85,
79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139,
247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105,
61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121,
169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232,
248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247,
30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78,
251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232,
3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229,
232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253,
109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221,
3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139,
72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247,
3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116,
82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238,
139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247,
187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232,
249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124,
139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247,
99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149,
7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186,
44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10,
139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252,
10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139,
248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65,
249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159,
1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139,
249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227,
139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248,
30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109,
227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221,
1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139,
159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247,
121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251,
36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86,
91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138,
21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251,
102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155,
198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139,
8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251,
71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232,
232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139,
94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175,
60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109,
232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106,
139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247,
246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221,
249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251,
9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7,
251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159,
249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248,
253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247,
77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251,
29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5,
14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139,
251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247,
5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69,
159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221,
1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247,
142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249,
89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211,
249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253,
177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192,
247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21,
252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10,
14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,
247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191,
226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139,
8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8,
247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247,
15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107,
247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251,
4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125,
55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149,
66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188,
248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251,
59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251,
122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14,
247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126,
21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222,
3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18,
168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72,
139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194,
139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121,
88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216,
80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28,
248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216,
247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222,
247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166,
139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76,
194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244,
18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109,
4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160,
21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144,
138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99,
139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222,
247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32,
139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109,
21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223,
247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206,
215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200,
175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108,
195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212,
104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247,
181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110,
159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193,
251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,
247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6,
19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31,
247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165,
226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194,
80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189,
165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51,
47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159,
18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158,
188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139,
85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226,
247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222,
3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204,
30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149,
176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222,
64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159,
248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61,
45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46,
248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247,
44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159,
1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44,
139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236,
139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99,
139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204,
1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120,
106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185,
204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180,
139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3,
239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1,
216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196,
151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155,
6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8,
251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248,
47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149,
120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149,
161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164,
139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19,
160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192,
138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200,
134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27,
125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8,
145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91,
211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194,
247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132,
152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88,
142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35,
46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114,
139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160,
132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110,
119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139,
96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247,
28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190,
216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93,
247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247,
251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144,
251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217,
248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171,
183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99,
139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247,
5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55,
5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209,
8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218,
121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159,
5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108,
94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139,
88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6,
139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139,
182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191,
8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177,
99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179,
158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113,
102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247,
82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194,
82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83,
86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82,
190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251,
45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31,
14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139,
247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247,
143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119,
21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239,
244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207,
21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72,
207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50,
10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247,
204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138,
21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6,
14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51,
251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247,
86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247,
103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203,
221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169,
70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249,
222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195,
206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81,
124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1,
186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188,
232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10,
247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243,
3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35,
35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148,
198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249,
108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4,
190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247,
226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79,
4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243,
1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114,
95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134,
111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192,
186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229,
243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159,
1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14,
179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139,
127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128,
72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10,
14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233,
208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195,
139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134,
183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179,
248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21,
35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134,
21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22,
97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108,
31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215,
186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179,
249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52,
159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161,
131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139,
92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247,
102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67,
250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232,
3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244,
247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221,
21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191,
247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247,
169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7,
202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182,
163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123,
119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76,
145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97,
108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145,
8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59,
83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139,
247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154,
232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247,
34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77,
193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189,
69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139,
204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251,
12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221,
247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220,
221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66,
139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79,
213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7,
19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204,
139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179,
58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206,
247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191,
76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87,
87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247,
52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94,
163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105,
224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117,
104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180,
112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93,
139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132,
144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19,
184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101,
171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21,
73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160,
223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251,
244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203,
5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21,
107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154,
80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227,
244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95,
139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176,
139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116,
216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72,
139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,
187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139,
8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179,
73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233,
195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247,
130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247,
131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126,
173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156,
139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166,
174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107,
123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82,
93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243,
197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35,
36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159,
1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248,
10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21,
38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248,
110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139,
159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37,
10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112,
146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159,
247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247,
111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248,
65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116,
21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77,
105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194,
121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41,
139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182,
109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156,
125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200,
112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126,
137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228,
247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247,
30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133,
247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139,
221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247,
224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,
10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,
76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3,
247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142,
221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251,
42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214,
242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6,
19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,
249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66,
10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,
6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,
21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206,
110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17,
248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251,
71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156,
131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150,
139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208,
8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247,
18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247,
54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116,
221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,
108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221,
248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121,
21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146,
115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139,
188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249,
30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78,
10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,
79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62,
247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247,
102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188,
249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1,
247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247,
251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63,
21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107,
247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232,
247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54,
219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7,
226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247,
100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21,
35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181,
226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139,
8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100,
115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31,
117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108,
92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193,
139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248,
92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216,
247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21,
47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247,
152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65,
10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21,
46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216,
213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38,
247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108,
103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44,
80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165,
222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10,
95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214,
3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139,
8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135,
190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66,
139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146,
141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8,
130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89,
31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247,
45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49,
21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216,
247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66,
10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10,
141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116,
216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21,
49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142,
243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19,
116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248,
120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249,
120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248,
160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247,
89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10,
14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222,
19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89,
109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95,
139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130,
8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248,
44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52,
10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14,
116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21,
52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247,
170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247,
164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44,
216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251,
39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243,
251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139,
95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163,
130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130,
226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120,
159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22,
55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6,
19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159,
18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,
57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18,
204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,
10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204,
222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251,
72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24,
248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247,
89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44,
214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129,
174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251,
9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217,
101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8,
95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62,
251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110,
159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247,
165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251,
28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251,
17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110,
221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251,
153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198,
205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151,
71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58,
91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138,
139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198,
251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219,
5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139,
117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248,
216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234,
21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,
139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,
153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,
81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192,
18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124,
247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14,
179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196,
247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70,
221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96,
182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252,
140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37,
90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189,
189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247,
132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35,
35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247,
177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247,
233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45,
139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247,
179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177,
119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247,
27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121,
6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79,
191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167,
154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19,
44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245,
192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247,
21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21,
251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247,
9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21,
82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19,
69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80,
117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248,
180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247,
7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96,
83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215,
139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117,
201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26,
207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145,
111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180,
169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247,
26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86,
10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70,
251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37,
199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212,
248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139,
8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248,
7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194,
141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21,
116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10,
217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19,
0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1,
104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3,
81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74,
4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61,
5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3,
5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240,
7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6,
11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7,
11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139,
251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11,
248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6,
11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139,
218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251,
106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247,
12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251,
52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102,
139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181,
112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3,
139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166,
8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204,
86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251,
7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74,
252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91,
7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137,
135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,
76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,
181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78,
114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,
115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108,
98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157,
143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45,
251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6,
116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146,
236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52,
221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140,
122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195,
209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39,
50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251,
43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217,
232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100,
247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139,
101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139,
247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161,
139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251,
189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30,
11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247,
69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64,
7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181,
8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139,
139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249,
109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11,
251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71,
57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98,
98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139,
5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43,
202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8,
11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158,
120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199,
139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5,
11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40,
200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251,
40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251,
42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,
251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128,
128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139,
169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124,
138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105,
109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30,
139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139,
46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139,
8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251,
158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97,
247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65,
247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247,
66,247,68,247,33,247,36,247,65,31,11,0,};
#endif
 
#ifdef HAVE_INCBIN
extern const unsigned char pdf_font_NimbusRomNo9L_ReguItal[15788];
asm(".globl pdf_font_NimbusRomNo9L_ReguItal");
asm(".balign 8");
asm("pdf_font_NimbusRomNo9L_ReguItal:");
asm(".incbin \"fonts/NimbusRomNo9L-ReguItal.cff\"");
#else
static const unsigned char pdf_font_NimbusRomNo9L_ReguItal[15788] = {
1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0,
1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251,
66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28,
55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111,
109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112,
97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,
43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,
85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,
112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101,
103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1,
0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,
18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,
0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,
0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,
0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,
0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,
0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,
106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,
0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0,
131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143,
0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0,
177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187,
0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0,
202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211,
0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0,
223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161,
0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0,
160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170,
2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195,
5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175,
9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11,
232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14,
71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15,
253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18,
205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134,
20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24,
169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25,
230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27,
173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29,
183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33,
222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36,
68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38,
63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124,
40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175,
42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209,
44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100,
47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50,
55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223,
56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247,
115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21,
32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62,
139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71,
247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247,
103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170,
247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66,
5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70,
69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94,
145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247,
33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139,
210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140,
66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178,
139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139,
100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247,
93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19,
191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236,
64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194,
31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46,
62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69,
4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116,
217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226,
21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231,
71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89,
139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154,
177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199,
8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90,
30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67,
139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3,
204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39,
251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247,
35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89,
159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247,
50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51,
90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33,
177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169,
120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3,
248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132,
211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3,
247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21,
251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229,
247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251,
23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117,
231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41,
46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247,
151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76,
7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171,
176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97,
177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142,
187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83,
106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217,
248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140,
5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102,
156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104,
189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139,
251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163,
194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138,
8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160,
251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82,
5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247,
226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220,
139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178,
118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239,
243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247,
187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3,
248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119,
52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236,
239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235,
240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74,
58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156,
249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125,
8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247,
115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183,
163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103,
211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229,
247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73,
90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83,
56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217,
247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0,
139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215,
97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31,
206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247,
20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31,
14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160,
4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21,
35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125,
251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247,
183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130,
159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53,
139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247,
222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247,
9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158,
176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139,
139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102,
251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229,
248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251,
26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223,
148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139,
247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251,
26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166,
8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247,
74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159,
163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180,
97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191,
205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110,
247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124,
221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158,
178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174,
193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232,
251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99,
139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143,
247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104,
127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1,
187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85,
79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139,
247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105,
61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121,
169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232,
248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247,
30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78,
251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232,
3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229,
232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253,
109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221,
3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139,
72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247,
3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116,
82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238,
139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247,
187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232,
249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124,
139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247,
99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149,
7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186,
44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10,
139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252,
10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139,
248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65,
249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159,
1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139,
249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227,
139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248,
30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109,
227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221,
1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139,
159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247,
121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251,
36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86,
91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138,
21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251,
102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155,
198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139,
8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251,
71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232,
232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139,
94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175,
60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109,
232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106,
139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247,
246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221,
249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251,
9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7,
251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159,
249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248,
253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247,
77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251,
29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5,
14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139,
251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247,
5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69,
159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221,
1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247,
142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249,
89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211,
249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253,
177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192,
247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21,
252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10,
14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,
247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191,
226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139,
8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8,
247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247,
15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107,
247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251,
4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125,
55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149,
66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188,
248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251,
59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251,
122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14,
247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126,
21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222,
3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18,
168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72,
139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194,
139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121,
88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216,
80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28,
248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216,
247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222,
247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166,
139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76,
194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244,
18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109,
4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160,
21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144,
138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99,
139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222,
247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32,
139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109,
21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223,
247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206,
215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200,
175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108,
195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212,
104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247,
181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110,
159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193,
251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,
247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6,
19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31,
247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165,
226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194,
80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189,
165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51,
47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159,
18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158,
188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139,
85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226,
247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222,
3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204,
30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149,
176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222,
64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159,
248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61,
45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46,
248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247,
44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159,
1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44,
139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236,
139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99,
139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204,
1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120,
106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185,
204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180,
139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3,
239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1,
216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196,
151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155,
6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8,
251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248,
47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149,
120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149,
161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164,
139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19,
160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192,
138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200,
134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27,
125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8,
145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91,
211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194,
247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132,
152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88,
142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35,
46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114,
139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160,
132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110,
119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139,
96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247,
28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190,
216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93,
247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247,
251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144,
251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217,
248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171,
183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99,
139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247,
5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55,
5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209,
8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218,
121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159,
5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108,
94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139,
88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6,
139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139,
182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191,
8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177,
99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179,
158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113,
102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247,
82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194,
82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83,
86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82,
190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251,
45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31,
14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139,
247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247,
143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119,
21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239,
244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207,
21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72,
207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50,
10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247,
204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138,
21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6,
14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51,
251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247,
86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247,
103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203,
221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169,
70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249,
222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195,
206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81,
124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1,
186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188,
232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10,
247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243,
3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35,
35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148,
198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249,
108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4,
190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247,
226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79,
4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243,
1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114,
95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134,
111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192,
186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229,
243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159,
1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14,
179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139,
127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128,
72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10,
14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233,
208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195,
139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134,
183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179,
248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21,
35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134,
21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22,
97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108,
31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215,
186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179,
249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52,
159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161,
131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139,
92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247,
102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67,
250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232,
3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244,
247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221,
21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191,
247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247,
169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7,
202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182,
163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123,
119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76,
145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97,
108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145,
8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59,
83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139,
247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154,
232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247,
34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77,
193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189,
69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139,
204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251,
12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221,
247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220,
221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66,
139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79,
213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7,
19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204,
139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179,
58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206,
247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191,
76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87,
87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247,
52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94,
163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105,
224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117,
104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180,
112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93,
139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132,
144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19,
184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101,
171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21,
73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160,
223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251,
244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203,
5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21,
107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154,
80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227,
244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95,
139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176,
139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116,
216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72,
139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,
187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139,
8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179,
73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233,
195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247,
130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247,
131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126,
173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156,
139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166,
174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107,
123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82,
93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243,
197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35,
36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159,
1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248,
10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21,
38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248,
110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139,
159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37,
10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112,
146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159,
247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247,
111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248,
65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116,
21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77,
105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194,
121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41,
139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182,
109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156,
125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200,
112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126,
137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228,
247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247,
30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133,
247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139,
221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247,
224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,
10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,
76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3,
247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142,
221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251,
42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214,
242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6,
19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,
249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66,
10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,
6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,
21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206,
110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17,
248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251,
71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156,
131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150,
139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208,
8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247,
18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247,
54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116,
221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,
108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221,
248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121,
21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146,
115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139,
188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249,
30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78,
10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,
79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62,
247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247,
102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188,
249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1,
247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247,
251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63,
21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107,
247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232,
247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54,
219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7,
226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247,
100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21,
35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181,
226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139,
8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100,
115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31,
117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108,
92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193,
139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248,
92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216,
247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21,
47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247,
152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65,
10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21,
46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216,
213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38,
247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108,
103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44,
80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165,
222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10,
95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214,
3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139,
8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135,
190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66,
139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146,
141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8,
130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89,
31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247,
45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49,
21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216,
247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66,
10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10,
141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116,
216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21,
49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142,
243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19,
116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248,
120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249,
120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248,
160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247,
89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10,
14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222,
19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89,
109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95,
139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130,
8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248,
44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52,
10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14,
116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21,
52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247,
170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247,
164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44,
216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251,
39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243,
251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139,
95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163,
130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130,
226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120,
159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22,
55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6,
19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159,
18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,
57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18,
204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,
10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204,
222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251,
72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24,
248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247,
89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44,
214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129,
174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251,
9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217,
101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8,
95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62,
251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110,
159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247,
165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251,
28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251,
17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110,
221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251,
153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198,
205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151,
71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58,
91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138,
139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198,
251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219,
5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139,
117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248,
216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234,
21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,
139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,
153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,
81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192,
18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124,
247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14,
179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196,
247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70,
221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96,
182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252,
140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37,
90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189,
189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247,
132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35,
35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247,
177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247,
233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45,
139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247,
179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177,
119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247,
27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121,
6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79,
191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167,
154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19,
44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245,
192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247,
21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21,
251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247,
9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21,
82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19,
69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80,
117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248,
180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247,
7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96,
83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215,
139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117,
201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26,
207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145,
111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180,
169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247,
26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86,
10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70,
251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37,
199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212,
248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139,
8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248,
7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194,
141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21,
116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10,
217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19,
0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1,
104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3,
81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74,
4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61,
5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3,
5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240,
7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6,
11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7,
11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139,
251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11,
248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6,
11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139,
218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251,
106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247,
12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251,
52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102,
139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181,
112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3,
139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166,
8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204,
86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251,
7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74,
252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91,
7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137,
135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,
76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,
181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78,
114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,
115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108,
98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157,
143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45,
251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6,
116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146,
236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52,
221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140,
122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195,
209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39,
50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251,
43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217,
232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100,
247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139,
101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139,
247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161,
139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251,
189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30,
11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247,
69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64,
7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181,
8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139,
139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249,
109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11,
251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71,
57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98,
98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139,
5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43,
202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8,
11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158,
120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199,
139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5,
11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40,
200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251,
40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251,
42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,
251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128,
128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139,
169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124,
138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105,
109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30,
139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139,
46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139,
8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251,
158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97,
247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65,
247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247,
66,247,68,247,33,247,36,247,65,31,11,0,};
#endif
 
#ifdef HAVE_INCBIN
extern const unsigned char pdf_font_NimbusSanL_Bold[15788];
asm(".globl pdf_font_NimbusSanL_Bold");
asm(".balign 8");
asm("pdf_font_NimbusSanL_Bold:");
asm(".incbin \"fonts/NimbusSanL-Bold.cff\"");
#else
static const unsigned char pdf_font_NimbusSanL_Bold[15788] = {
1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0,
1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251,
66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28,
55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111,
109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112,
97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,
43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,
85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,
112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101,
103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1,
0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,
18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,
0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,
0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,
0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,
0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,
0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,
106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,
0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0,
131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143,
0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0,
177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187,
0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0,
202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211,
0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0,
223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161,
0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0,
160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170,
2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195,
5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175,
9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11,
232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14,
71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15,
253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18,
205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134,
20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24,
169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25,
230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27,
173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29,
183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33,
222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36,
68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38,
63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124,
40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175,
42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209,
44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100,
47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50,
55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223,
56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247,
115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21,
32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62,
139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71,
247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247,
103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170,
247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66,
5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70,
69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94,
145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247,
33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139,
210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140,
66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178,
139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139,
100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247,
93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19,
191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236,
64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194,
31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46,
62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69,
4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116,
217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226,
21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231,
71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89,
139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154,
177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199,
8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90,
30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67,
139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3,
204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39,
251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247,
35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89,
159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247,
50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51,
90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33,
177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169,
120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3,
248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132,
211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3,
247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21,
251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229,
247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251,
23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117,
231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41,
46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247,
151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76,
7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171,
176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97,
177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142,
187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83,
106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217,
248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140,
5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102,
156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104,
189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139,
251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163,
194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138,
8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160,
251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82,
5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247,
226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220,
139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178,
118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239,
243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247,
187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3,
248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119,
52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236,
239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235,
240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74,
58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156,
249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125,
8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247,
115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183,
163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103,
211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229,
247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73,
90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83,
56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217,
247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0,
139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215,
97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31,
206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247,
20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31,
14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160,
4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21,
35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125,
251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247,
183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130,
159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53,
139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247,
222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247,
9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158,
176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139,
139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102,
251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229,
248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251,
26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223,
148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139,
247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251,
26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166,
8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247,
74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159,
163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180,
97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191,
205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110,
247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124,
221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158,
178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174,
193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232,
251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99,
139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143,
247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104,
127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1,
187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85,
79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139,
247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105,
61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121,
169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232,
248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247,
30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78,
251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232,
3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229,
232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253,
109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221,
3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139,
72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247,
3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116,
82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238,
139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247,
187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232,
249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124,
139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247,
99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149,
7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186,
44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10,
139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252,
10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139,
248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65,
249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159,
1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139,
249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227,
139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248,
30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109,
227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221,
1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139,
159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247,
121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251,
36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86,
91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138,
21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251,
102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155,
198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139,
8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251,
71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232,
232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139,
94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175,
60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109,
232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106,
139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247,
246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221,
249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251,
9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7,
251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159,
249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248,
253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247,
77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251,
29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5,
14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139,
251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247,
5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69,
159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221,
1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247,
142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249,
89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211,
249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253,
177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192,
247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21,
252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10,
14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,
247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191,
226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139,
8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8,
247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247,
15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107,
247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251,
4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125,
55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149,
66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188,
248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251,
59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251,
122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14,
247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126,
21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222,
3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18,
168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72,
139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194,
139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121,
88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216,
80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28,
248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216,
247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222,
247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166,
139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76,
194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244,
18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109,
4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160,
21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144,
138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99,
139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222,
247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32,
139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109,
21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223,
247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206,
215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200,
175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108,
195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212,
104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247,
181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110,
159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193,
251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,
247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6,
19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31,
247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165,
226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194,
80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189,
165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51,
47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159,
18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158,
188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139,
85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226,
247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222,
3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204,
30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149,
176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222,
64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159,
248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61,
45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46,
248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247,
44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159,
1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44,
139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236,
139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99,
139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204,
1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120,
106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185,
204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180,
139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3,
239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1,
216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196,
151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155,
6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8,
251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248,
47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149,
120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149,
161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164,
139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19,
160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192,
138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200,
134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27,
125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8,
145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91,
211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194,
247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132,
152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88,
142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35,
46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114,
139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160,
132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110,
119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139,
96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247,
28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190,
216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93,
247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247,
251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144,
251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217,
248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171,
183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99,
139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247,
5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55,
5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209,
8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218,
121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159,
5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108,
94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139,
88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6,
139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139,
182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191,
8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177,
99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179,
158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113,
102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247,
82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194,
82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83,
86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82,
190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251,
45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31,
14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139,
247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247,
143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119,
21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239,
244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207,
21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72,
207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50,
10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247,
204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138,
21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6,
14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51,
251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247,
86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247,
103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203,
221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169,
70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249,
222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195,
206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81,
124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1,
186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188,
232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10,
247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243,
3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35,
35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148,
198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249,
108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4,
190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247,
226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79,
4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243,
1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114,
95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134,
111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192,
186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229,
243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159,
1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14,
179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139,
127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128,
72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10,
14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233,
208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195,
139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134,
183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179,
248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21,
35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134,
21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22,
97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108,
31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215,
186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179,
249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52,
159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161,
131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139,
92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247,
102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67,
250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232,
3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244,
247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221,
21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191,
247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247,
169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7,
202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182,
163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123,
119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76,
145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97,
108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145,
8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59,
83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139,
247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154,
232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247,
34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77,
193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189,
69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139,
204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251,
12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221,
247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220,
221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66,
139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79,
213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7,
19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204,
139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179,
58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206,
247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191,
76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87,
87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247,
52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94,
163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105,
224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117,
104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180,
112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93,
139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132,
144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19,
184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101,
171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21,
73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160,
223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251,
244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203,
5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21,
107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154,
80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227,
244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95,
139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176,
139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116,
216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72,
139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,
187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139,
8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179,
73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233,
195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247,
130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247,
131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126,
173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156,
139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166,
174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107,
123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82,
93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243,
197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35,
36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159,
1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248,
10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21,
38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248,
110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139,
159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37,
10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112,
146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159,
247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247,
111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248,
65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116,
21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77,
105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194,
121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41,
139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182,
109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156,
125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200,
112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126,
137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228,
247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247,
30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133,
247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139,
221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247,
224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,
10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,
76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3,
247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142,
221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251,
42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214,
242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6,
19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,
249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66,
10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,
6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,
21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206,
110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17,
248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251,
71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156,
131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150,
139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208,
8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247,
18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247,
54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116,
221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,
108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221,
248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121,
21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146,
115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139,
188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249,
30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78,
10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,
79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62,
247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247,
102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188,
249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1,
247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247,
251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63,
21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107,
247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232,
247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54,
219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7,
226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247,
100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21,
35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181,
226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139,
8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100,
115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31,
117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108,
92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193,
139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248,
92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216,
247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21,
47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247,
152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65,
10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21,
46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216,
213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38,
247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108,
103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44,
80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165,
222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10,
95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214,
3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139,
8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135,
190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66,
139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146,
141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8,
130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89,
31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247,
45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49,
21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216,
247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66,
10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10,
141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116,
216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21,
49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142,
243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19,
116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248,
120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249,
120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248,
160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247,
89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10,
14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222,
19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89,
109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95,
139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130,
8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248,
44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52,
10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14,
116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21,
52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247,
170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247,
164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44,
216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251,
39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243,
251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139,
95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163,
130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130,
226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120,
159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22,
55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6,
19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159,
18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,
57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18,
204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,
10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204,
222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251,
72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24,
248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247,
89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44,
214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129,
174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251,
9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217,
101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8,
95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62,
251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110,
159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247,
165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251,
28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251,
17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110,
221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251,
153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198,
205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151,
71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58,
91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138,
139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198,
251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219,
5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139,
117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248,
216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234,
21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,
139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,
153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,
81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192,
18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124,
247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14,
179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196,
247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70,
221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96,
182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252,
140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37,
90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189,
189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247,
132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35,
35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247,
177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247,
233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45,
139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247,
179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177,
119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247,
27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121,
6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79,
191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167,
154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19,
44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245,
192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247,
21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21,
251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247,
9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21,
82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19,
69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80,
117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248,
180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247,
7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96,
83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215,
139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117,
201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26,
207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145,
111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180,
169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247,
26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86,
10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70,
251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37,
199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212,
248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139,
8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248,
7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194,
141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21,
116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10,
217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19,
0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1,
104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3,
81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74,
4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61,
5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3,
5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240,
7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6,
11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7,
11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139,
251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11,
248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6,
11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139,
218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251,
106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247,
12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251,
52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102,
139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181,
112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3,
139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166,
8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204,
86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251,
7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74,
252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91,
7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137,
135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,
76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,
181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78,
114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,
115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108,
98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157,
143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45,
251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6,
116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146,
236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52,
221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140,
122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195,
209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39,
50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251,
43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217,
232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100,
247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139,
101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139,
247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161,
139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251,
189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30,
11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247,
69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64,
7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181,
8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139,
139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249,
109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11,
251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71,
57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98,
98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139,
5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43,
202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8,
11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158,
120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199,
139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5,
11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40,
200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251,
40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251,
42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,
251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128,
128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139,
169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124,
138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105,
109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30,
139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139,
46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139,
8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251,
158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97,
247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65,
247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247,
66,247,68,247,33,247,36,247,65,31,11,0,};
#endif
 
#ifdef HAVE_INCBIN
extern const unsigned char pdf_font_NimbusSanL_BoldItal[15788];
asm(".globl pdf_font_NimbusSanL_BoldItal");
asm(".balign 8");
asm("pdf_font_NimbusSanL_BoldItal:");
asm(".incbin \"fonts/NimbusSanL-BoldItal.cff\"");
#else
static const unsigned char pdf_font_NimbusSanL_BoldItal[15788] = {
1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0,
1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251,
66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28,
55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111,
109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112,
97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,
43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,
85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,
112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101,
103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1,
0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,
18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,
0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,
0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,
0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,
0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,
0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,
106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,
0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0,
131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143,
0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0,
177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187,
0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0,
202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211,
0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0,
223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161,
0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0,
160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170,
2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195,
5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175,
9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11,
232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14,
71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15,
253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18,
205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134,
20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24,
169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25,
230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27,
173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29,
183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33,
222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36,
68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38,
63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124,
40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175,
42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209,
44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100,
47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50,
55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223,
56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247,
115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21,
32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62,
139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71,
247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247,
103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170,
247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66,
5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70,
69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94,
145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247,
33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139,
210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140,
66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178,
139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139,
100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247,
93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19,
191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236,
64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194,
31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46,
62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69,
4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116,
217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226,
21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231,
71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89,
139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154,
177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199,
8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90,
30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67,
139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3,
204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39,
251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247,
35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89,
159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247,
50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51,
90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33,
177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169,
120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3,
248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132,
211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3,
247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21,
251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229,
247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251,
23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117,
231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41,
46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247,
151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76,
7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171,
176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97,
177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142,
187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83,
106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217,
248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140,
5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102,
156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104,
189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139,
251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163,
194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138,
8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160,
251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82,
5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247,
226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220,
139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178,
118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239,
243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247,
187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3,
248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119,
52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236,
239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235,
240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74,
58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156,
249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125,
8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247,
115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183,
163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103,
211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229,
247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73,
90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83,
56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217,
247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0,
139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215,
97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31,
206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247,
20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31,
14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160,
4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21,
35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125,
251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247,
183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130,
159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53,
139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247,
222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247,
9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158,
176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139,
139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102,
251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229,
248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251,
26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223,
148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139,
247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251,
26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166,
8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247,
74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159,
163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180,
97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191,
205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110,
247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124,
221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158,
178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174,
193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232,
251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99,
139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143,
247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104,
127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1,
187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85,
79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139,
247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105,
61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121,
169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232,
248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247,
30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78,
251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232,
3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229,
232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253,
109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221,
3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139,
72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247,
3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116,
82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238,
139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247,
187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232,
249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124,
139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247,
99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149,
7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186,
44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10,
139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252,
10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139,
248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65,
249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159,
1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139,
249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227,
139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248,
30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109,
227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221,
1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139,
159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247,
121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251,
36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86,
91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138,
21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251,
102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155,
198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139,
8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251,
71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232,
232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139,
94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175,
60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109,
232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106,
139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247,
246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221,
249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251,
9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7,
251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159,
249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248,
253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247,
77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251,
29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5,
14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139,
251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247,
5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69,
159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221,
1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247,
142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249,
89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211,
249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253,
177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192,
247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21,
252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10,
14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,
247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191,
226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139,
8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8,
247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247,
15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107,
247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251,
4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125,
55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149,
66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188,
248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251,
59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251,
122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14,
247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126,
21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222,
3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18,
168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72,
139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194,
139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121,
88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216,
80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28,
248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216,
247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222,
247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166,
139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76,
194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244,
18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109,
4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160,
21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144,
138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99,
139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222,
247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32,
139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109,
21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223,
247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206,
215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200,
175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108,
195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212,
104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247,
181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110,
159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193,
251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,
247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6,
19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31,
247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165,
226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194,
80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189,
165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51,
47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159,
18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158,
188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139,
85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226,
247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222,
3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204,
30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149,
176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222,
64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159,
248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61,
45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46,
248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247,
44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159,
1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44,
139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236,
139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99,
139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204,
1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120,
106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185,
204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180,
139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3,
239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1,
216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196,
151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155,
6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8,
251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248,
47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149,
120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149,
161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164,
139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19,
160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192,
138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200,
134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27,
125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8,
145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91,
211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194,
247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132,
152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88,
142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35,
46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114,
139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160,
132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110,
119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139,
96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247,
28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190,
216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93,
247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247,
251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144,
251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217,
248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171,
183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99,
139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247,
5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55,
5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209,
8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218,
121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159,
5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108,
94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139,
88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6,
139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139,
182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191,
8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177,
99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179,
158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113,
102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247,
82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194,
82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83,
86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82,
190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251,
45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31,
14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139,
247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247,
143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119,
21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239,
244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207,
21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72,
207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50,
10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247,
204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138,
21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6,
14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51,
251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247,
86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247,
103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203,
221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169,
70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249,
222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195,
206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81,
124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1,
186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188,
232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10,
247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243,
3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35,
35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148,
198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249,
108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4,
190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247,
226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79,
4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243,
1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114,
95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134,
111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192,
186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229,
243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159,
1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14,
179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139,
127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128,
72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10,
14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233,
208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195,
139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134,
183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179,
248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21,
35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134,
21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22,
97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108,
31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215,
186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179,
249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52,
159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161,
131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139,
92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247,
102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67,
250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232,
3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244,
247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221,
21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191,
247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247,
169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7,
202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182,
163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123,
119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76,
145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97,
108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145,
8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59,
83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139,
247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154,
232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247,
34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77,
193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189,
69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139,
204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251,
12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221,
247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220,
221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66,
139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79,
213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7,
19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204,
139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179,
58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206,
247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191,
76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87,
87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247,
52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94,
163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105,
224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117,
104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180,
112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93,
139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132,
144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19,
184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101,
171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21,
73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160,
223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251,
244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203,
5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21,
107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154,
80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227,
244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95,
139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176,
139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116,
216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72,
139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,
187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139,
8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179,
73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233,
195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247,
130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247,
131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126,
173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156,
139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166,
174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107,
123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82,
93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243,
197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35,
36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159,
1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248,
10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21,
38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248,
110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139,
159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37,
10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112,
146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159,
247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247,
111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248,
65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116,
21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77,
105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194,
121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41,
139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182,
109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156,
125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200,
112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126,
137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228,
247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247,
30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133,
247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139,
221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247,
224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,
10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,
76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3,
247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142,
221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251,
42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214,
242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6,
19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,
249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66,
10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,
6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,
21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206,
110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17,
248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251,
71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156,
131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150,
139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208,
8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247,
18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247,
54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116,
221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,
108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221,
248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121,
21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146,
115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139,
188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249,
30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78,
10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,
79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62,
247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247,
102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188,
249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1,
247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247,
251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63,
21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107,
247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232,
247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54,
219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7,
226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247,
100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21,
35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181,
226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139,
8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100,
115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31,
117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108,
92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193,
139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248,
92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216,
247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21,
47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247,
152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65,
10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21,
46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216,
213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38,
247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108,
103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44,
80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165,
222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10,
95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214,
3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139,
8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135,
190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66,
139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146,
141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8,
130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89,
31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247,
45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49,
21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216,
247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66,
10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10,
141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116,
216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21,
49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142,
243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19,
116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248,
120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249,
120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248,
160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247,
89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10,
14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222,
19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89,
109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95,
139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130,
8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248,
44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52,
10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14,
116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21,
52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247,
170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247,
164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44,
216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251,
39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243,
251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139,
95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163,
130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130,
226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120,
159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22,
55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6,
19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159,
18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,
57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18,
204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,
10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204,
222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251,
72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24,
248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247,
89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44,
214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129,
174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251,
9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217,
101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8,
95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62,
251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110,
159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247,
165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251,
28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251,
17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110,
221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251,
153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198,
205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151,
71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58,
91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138,
139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198,
251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219,
5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139,
117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248,
216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234,
21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,
139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,
153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,
81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192,
18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124,
247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14,
179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196,
247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70,
221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96,
182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252,
140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37,
90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189,
189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247,
132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35,
35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247,
177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247,
233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45,
139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247,
179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177,
119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247,
27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121,
6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79,
191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167,
154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19,
44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245,
192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247,
21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21,
251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247,
9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21,
82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19,
69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80,
117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248,
180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247,
7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96,
83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215,
139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117,
201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26,
207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145,
111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180,
169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247,
26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86,
10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70,
251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37,
199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212,
248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139,
8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248,
7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194,
141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21,
116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10,
217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19,
0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1,
104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3,
81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74,
4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61,
5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3,
5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240,
7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6,
11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7,
11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139,
251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11,
248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6,
11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139,
218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251,
106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247,
12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251,
52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102,
139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181,
112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3,
139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166,
8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204,
86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251,
7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74,
252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91,
7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137,
135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,
76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,
181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78,
114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,
115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108,
98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157,
143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45,
251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6,
116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146,
236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52,
221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140,
122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195,
209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39,
50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251,
43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217,
232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100,
247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139,
101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139,
247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161,
139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251,
189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30,
11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247,
69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64,
7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181,
8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139,
139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249,
109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11,
251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71,
57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98,
98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139,
5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43,
202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8,
11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158,
120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199,
139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5,
11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40,
200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251,
40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251,
42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,
251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128,
128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139,
169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124,
138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105,
109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30,
139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139,
46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139,
8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251,
158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97,
247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65,
247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247,
66,247,68,247,33,247,36,247,65,31,11,0,};
#endif
 
#ifdef HAVE_INCBIN
extern const unsigned char pdf_font_NimbusSanL_Regu[15788];
asm(".globl pdf_font_NimbusSanL_Regu");
asm(".balign 8");
asm("pdf_font_NimbusSanL_Regu:");
asm(".incbin \"fonts/NimbusSanL-Regu.cff\"");
#else
static const unsigned char pdf_font_NimbusSanL_Regu[15788] = {
1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0,
1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251,
66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28,
55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111,
109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112,
97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,
43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,
85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,
112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101,
103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1,
0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,
18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,
0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,
0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,
0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,
0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,
0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,
106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,
0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0,
131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143,
0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0,
177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187,
0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0,
202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211,
0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0,
223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161,
0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0,
160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170,
2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195,
5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175,
9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11,
232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14,
71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15,
253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18,
205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134,
20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24,
169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25,
230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27,
173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29,
183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33,
222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36,
68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38,
63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124,
40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175,
42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209,
44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100,
47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50,
55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223,
56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247,
115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21,
32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62,
139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71,
247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247,
103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170,
247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66,
5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70,
69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94,
145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247,
33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139,
210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140,
66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178,
139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139,
100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247,
93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19,
191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236,
64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194,
31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46,
62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69,
4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116,
217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226,
21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231,
71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89,
139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154,
177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199,
8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90,
30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67,
139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3,
204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39,
251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247,
35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89,
159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247,
50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51,
90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33,
177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169,
120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3,
248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132,
211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3,
247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21,
251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229,
247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251,
23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117,
231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41,
46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247,
151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76,
7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171,
176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97,
177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142,
187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83,
106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217,
248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140,
5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102,
156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104,
189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139,
251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163,
194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138,
8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160,
251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82,
5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247,
226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220,
139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178,
118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239,
243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247,
187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3,
248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119,
52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236,
239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235,
240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74,
58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156,
249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125,
8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247,
115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183,
163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103,
211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229,
247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73,
90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83,
56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217,
247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0,
139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215,
97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31,
206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247,
20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31,
14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160,
4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21,
35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125,
251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247,
183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130,
159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53,
139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247,
222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247,
9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158,
176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139,
139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102,
251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229,
248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251,
26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223,
148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139,
247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251,
26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166,
8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247,
74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159,
163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180,
97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191,
205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110,
247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124,
221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158,
178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174,
193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232,
251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99,
139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143,
247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104,
127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1,
187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85,
79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139,
247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105,
61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121,
169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232,
248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247,
30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78,
251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232,
3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229,
232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253,
109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221,
3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139,
72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247,
3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116,
82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238,
139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247,
187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232,
249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124,
139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247,
99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149,
7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186,
44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10,
139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252,
10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139,
248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65,
249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159,
1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139,
249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227,
139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248,
30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109,
227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221,
1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139,
159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247,
121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251,
36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86,
91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138,
21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251,
102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155,
198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139,
8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251,
71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232,
232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139,
94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175,
60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109,
232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106,
139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247,
246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221,
249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251,
9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7,
251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159,
249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248,
253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247,
77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251,
29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5,
14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139,
251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247,
5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69,
159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221,
1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247,
142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249,
89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211,
249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253,
177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192,
247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21,
252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10,
14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,
247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191,
226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139,
8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8,
247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247,
15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107,
247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251,
4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125,
55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149,
66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188,
248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251,
59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251,
122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14,
247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126,
21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222,
3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18,
168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72,
139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194,
139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121,
88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216,
80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28,
248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216,
247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222,
247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166,
139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76,
194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244,
18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109,
4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160,
21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144,
138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99,
139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222,
247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32,
139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109,
21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223,
247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206,
215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200,
175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108,
195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212,
104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247,
181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110,
159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193,
251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,
247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6,
19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31,
247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165,
226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194,
80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189,
165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51,
47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159,
18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158,
188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139,
85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226,
247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222,
3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204,
30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149,
176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222,
64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159,
248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61,
45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46,
248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247,
44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159,
1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44,
139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236,
139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99,
139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204,
1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120,
106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185,
204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180,
139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3,
239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1,
216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196,
151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155,
6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8,
251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248,
47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149,
120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149,
161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164,
139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19,
160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192,
138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200,
134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27,
125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8,
145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91,
211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194,
247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132,
152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88,
142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35,
46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114,
139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160,
132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110,
119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139,
96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247,
28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190,
216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93,
247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247,
251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144,
251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217,
248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171,
183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99,
139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247,
5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55,
5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209,
8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218,
121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159,
5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108,
94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139,
88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6,
139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139,
182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191,
8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177,
99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179,
158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113,
102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247,
82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194,
82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83,
86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82,
190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251,
45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31,
14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139,
247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247,
143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119,
21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239,
244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207,
21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72,
207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50,
10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247,
204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138,
21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6,
14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51,
251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247,
86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247,
103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203,
221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169,
70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249,
222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195,
206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81,
124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1,
186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188,
232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10,
247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243,
3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35,
35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148,
198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249,
108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4,
190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247,
226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79,
4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243,
1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114,
95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134,
111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192,
186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229,
243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159,
1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14,
179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139,
127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128,
72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10,
14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233,
208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195,
139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134,
183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179,
248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21,
35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134,
21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22,
97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108,
31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215,
186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179,
249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52,
159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161,
131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139,
92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247,
102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67,
250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232,
3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244,
247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221,
21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191,
247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247,
169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7,
202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182,
163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123,
119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76,
145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97,
108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145,
8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59,
83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139,
247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154,
232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247,
34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77,
193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189,
69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139,
204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251,
12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221,
247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220,
221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66,
139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79,
213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7,
19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204,
139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179,
58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206,
247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191,
76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87,
87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247,
52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94,
163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105,
224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117,
104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180,
112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93,
139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132,
144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19,
184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101,
171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21,
73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160,
223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251,
244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203,
5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21,
107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154,
80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227,
244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95,
139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176,
139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116,
216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72,
139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,
187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139,
8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179,
73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233,
195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247,
130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247,
131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126,
173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156,
139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166,
174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107,
123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82,
93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243,
197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35,
36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159,
1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248,
10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21,
38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248,
110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139,
159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37,
10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112,
146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159,
247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247,
111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248,
65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116,
21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77,
105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194,
121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41,
139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182,
109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156,
125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200,
112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126,
137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228,
247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247,
30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133,
247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139,
221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247,
224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,
10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,
76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3,
247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142,
221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251,
42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214,
242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6,
19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,
249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66,
10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,
6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,
21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206,
110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17,
248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251,
71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156,
131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150,
139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208,
8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247,
18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247,
54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116,
221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,
108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221,
248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121,
21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146,
115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139,
188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249,
30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78,
10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,
79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62,
247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247,
102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188,
249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1,
247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247,
251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63,
21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107,
247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232,
247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54,
219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7,
226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247,
100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21,
35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181,
226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139,
8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100,
115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31,
117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108,
92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193,
139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248,
92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216,
247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21,
47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247,
152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65,
10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21,
46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216,
213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38,
247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108,
103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44,
80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165,
222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10,
95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214,
3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139,
8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135,
190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66,
139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146,
141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8,
130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89,
31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247,
45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49,
21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216,
247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66,
10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10,
141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116,
216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21,
49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142,
243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19,
116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248,
120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249,
120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248,
160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247,
89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10,
14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222,
19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89,
109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95,
139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130,
8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248,
44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52,
10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14,
116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21,
52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247,
170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247,
164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44,
216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251,
39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243,
251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139,
95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163,
130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130,
226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120,
159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22,
55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6,
19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159,
18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,
57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18,
204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,
10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204,
222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251,
72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24,
248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247,
89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44,
214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129,
174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251,
9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217,
101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8,
95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62,
251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110,
159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247,
165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251,
28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251,
17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110,
221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251,
153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198,
205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151,
71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58,
91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138,
139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198,
251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219,
5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139,
117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248,
216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234,
21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,
139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,
153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,
81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192,
18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124,
247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14,
179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196,
247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70,
221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96,
182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252,
140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37,
90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189,
189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247,
132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35,
35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247,
177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247,
233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45,
139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247,
179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177,
119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247,
27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121,
6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79,
191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167,
154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19,
44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245,
192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247,
21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21,
251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247,
9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21,
82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19,
69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80,
117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248,
180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247,
7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96,
83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215,
139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117,
201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26,
207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145,
111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180,
169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247,
26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86,
10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70,
251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37,
199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212,
248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139,
8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248,
7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194,
141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21,
116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10,
217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19,
0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1,
104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3,
81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74,
4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61,
5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3,
5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240,
7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6,
11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7,
11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139,
251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11,
248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6,
11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139,
218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251,
106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247,
12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251,
52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102,
139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181,
112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3,
139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166,
8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204,
86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251,
7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74,
252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91,
7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137,
135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,
76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,
181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78,
114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,
115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108,
98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157,
143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45,
251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6,
116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146,
236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52,
221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140,
122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195,
209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39,
50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251,
43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217,
232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100,
247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139,
101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139,
247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161,
139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251,
189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30,
11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247,
69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64,
7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181,
8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139,
139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249,
109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11,
251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71,
57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98,
98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139,
5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43,
202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8,
11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158,
120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199,
139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5,
11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40,
200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251,
40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251,
42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,
251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128,
128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139,
169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124,
138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105,
109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30,
139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139,
46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139,
8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251,
158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97,
247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65,
247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247,
66,247,68,247,33,247,36,247,65,31,11,0,};
#endif
 
#ifdef HAVE_INCBIN
extern const unsigned char pdf_font_NimbusSanL_ReguItal[15788];
asm(".globl pdf_font_NimbusSanL_ReguItal");
asm(".balign 8");
asm("pdf_font_NimbusSanL_ReguItal:");
asm(".incbin \"fonts/NimbusSanL-ReguItal.cff\"");
#else
static const unsigned char pdf_font_NimbusSanL_ReguItal[15788] = {
1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0,
1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251,
66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28,
55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111,
109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112,
97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,
43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,
85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,
112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101,
103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1,
0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,
18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,
0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,
0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,
0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,
0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,
0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,
106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,
0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0,
131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143,
0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0,
177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187,
0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0,
202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211,
0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0,
223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161,
0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0,
160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170,
2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195,
5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175,
9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11,
232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14,
71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15,
253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18,
205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134,
20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24,
169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25,
230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27,
173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29,
183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33,
222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36,
68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38,
63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124,
40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175,
42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209,
44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100,
47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50,
55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223,
56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247,
115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21,
32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62,
139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71,
247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247,
103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170,
247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66,
5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70,
69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94,
145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247,
33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139,
210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140,
66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178,
139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139,
100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247,
93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19,
191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236,
64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194,
31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46,
62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69,
4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116,
217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226,
21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231,
71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89,
139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154,
177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199,
8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90,
30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67,
139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3,
204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39,
251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247,
35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89,
159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247,
50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51,
90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33,
177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169,
120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3,
248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132,
211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3,
247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21,
251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229,
247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251,
23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117,
231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41,
46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247,
151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76,
7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171,
176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97,
177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142,
187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83,
106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217,
248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140,
5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102,
156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104,
189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139,
251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163,
194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138,
8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160,
251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82,
5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247,
226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220,
139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178,
118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239,
243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247,
187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3,
248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119,
52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236,
239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235,
240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74,
58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156,
249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125,
8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247,
115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183,
163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103,
211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229,
247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73,
90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83,
56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217,
247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0,
139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215,
97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31,
206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247,
20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31,
14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160,
4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21,
35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125,
251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247,
183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130,
159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53,
139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247,
222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247,
9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158,
176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139,
139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102,
251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229,
248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251,
26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223,
148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139,
247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251,
26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166,
8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247,
74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159,
163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180,
97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191,
205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110,
247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124,
221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158,
178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174,
193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232,
251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99,
139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143,
247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104,
127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1,
187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85,
79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139,
247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105,
61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121,
169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232,
248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247,
30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78,
251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232,
3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229,
232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253,
109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221,
3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139,
72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247,
3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116,
82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238,
139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247,
187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232,
249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124,
139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247,
99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149,
7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186,
44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10,
139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252,
10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139,
248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65,
249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159,
1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139,
249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227,
139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248,
30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109,
227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221,
1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139,
159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247,
121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251,
36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86,
91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138,
21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251,
102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155,
198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139,
8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251,
71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232,
232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139,
94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175,
60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109,
232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106,
139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247,
246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221,
249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251,
9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7,
251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159,
249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248,
253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247,
77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251,
29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5,
14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139,
251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247,
5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69,
159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221,
1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247,
142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249,
89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211,
249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253,
177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192,
247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21,
252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10,
14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,
247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191,
226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139,
8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8,
247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247,
15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107,
247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251,
4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125,
55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149,
66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188,
248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251,
59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251,
122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14,
247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126,
21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222,
3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18,
168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72,
139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194,
139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121,
88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216,
80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28,
248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216,
247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222,
247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166,
139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76,
194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244,
18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109,
4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160,
21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144,
138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99,
139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222,
247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32,
139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109,
21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223,
247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206,
215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200,
175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108,
195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212,
104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247,
181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110,
159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193,
251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,
247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6,
19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31,
247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165,
226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194,
80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189,
165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51,
47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159,
18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158,
188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139,
85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226,
247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222,
3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204,
30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149,
176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222,
64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159,
248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61,
45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46,
248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247,
44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159,
1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44,
139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236,
139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99,
139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204,
1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120,
106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185,
204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180,
139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3,
239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1,
216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196,
151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155,
6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8,
251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248,
47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149,
120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149,
161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164,
139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19,
160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192,
138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200,
134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27,
125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8,
145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91,
211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194,
247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132,
152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88,
142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35,
46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114,
139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160,
132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110,
119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139,
96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247,
28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190,
216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93,
247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247,
251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144,
251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217,
248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171,
183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99,
139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247,
5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55,
5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209,
8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218,
121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159,
5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108,
94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139,
88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6,
139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139,
182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191,
8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177,
99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179,
158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113,
102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247,
82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194,
82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83,
86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82,
190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251,
45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31,
14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139,
247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247,
143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119,
21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239,
244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207,
21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72,
207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50,
10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247,
204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138,
21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6,
14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51,
251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247,
86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247,
103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203,
221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169,
70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249,
222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195,
206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81,
124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1,
186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188,
232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10,
247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243,
3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35,
35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148,
198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249,
108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4,
190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247,
226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79,
4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243,
1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114,
95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134,
111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192,
186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229,
243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159,
1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14,
179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139,
127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128,
72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10,
14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233,
208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195,
139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134,
183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179,
248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21,
35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134,
21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22,
97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108,
31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215,
186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179,
249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52,
159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161,
131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139,
92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247,
102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67,
250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232,
3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244,
247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221,
21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191,
247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247,
169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7,
202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182,
163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123,
119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76,
145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97,
108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145,
8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59,
83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139,
247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154,
232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247,
34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77,
193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189,
69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139,
204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251,
12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221,
247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220,
221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66,
139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79,
213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7,
19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204,
139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179,
58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206,
247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191,
76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87,
87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247,
52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94,
163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105,
224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117,
104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180,
112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93,
139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132,
144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19,
184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101,
171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21,
73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160,
223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251,
244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203,
5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21,
107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154,
80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227,
244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95,
139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176,
139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116,
216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72,
139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,
187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139,
8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179,
73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233,
195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247,
130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247,
131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126,
173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156,
139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166,
174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107,
123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82,
93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243,
197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35,
36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159,
1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248,
10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21,
38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248,
110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139,
159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37,
10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112,
146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159,
247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247,
111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248,
65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116,
21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77,
105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194,
121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41,
139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182,
109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156,
125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200,
112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126,
137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228,
247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247,
30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133,
247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139,
221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247,
224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,
10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,
76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3,
247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142,
221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251,
42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214,
242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6,
19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,
249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66,
10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,
6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,
21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206,
110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17,
248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251,
71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156,
131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150,
139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208,
8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247,
18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247,
54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116,
221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,
108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221,
248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121,
21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146,
115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139,
188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249,
30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78,
10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,
79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62,
247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247,
102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188,
249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1,
247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247,
251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63,
21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107,
247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232,
247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54,
219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7,
226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247,
100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21,
35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181,
226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139,
8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100,
115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31,
117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108,
92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193,
139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248,
92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216,
247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21,
47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247,
152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65,
10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21,
46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216,
213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38,
247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108,
103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44,
80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165,
222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10,
95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214,
3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139,
8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135,
190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66,
139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146,
141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8,
130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89,
31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247,
45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49,
21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216,
247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66,
10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10,
141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116,
216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21,
49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142,
243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19,
116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248,
120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249,
120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248,
160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247,
89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10,
14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222,
19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89,
109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95,
139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130,
8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248,
44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52,
10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14,
116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21,
52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247,
170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247,
164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44,
216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251,
39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243,
251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139,
95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163,
130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130,
226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120,
159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22,
55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6,
19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159,
18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,
57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18,
204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,
10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204,
222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251,
72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24,
248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247,
89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44,
214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129,
174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251,
9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217,
101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8,
95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62,
251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110,
159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247,
165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251,
28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251,
17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110,
221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251,
153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198,
205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151,
71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58,
91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138,
139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198,
251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219,
5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139,
117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248,
216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234,
21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,
139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,
153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,
81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192,
18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124,
247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14,
179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196,
247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70,
221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96,
182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252,
140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37,
90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189,
189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247,
132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35,
35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247,
177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247,
233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45,
139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247,
179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177,
119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247,
27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121,
6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79,
191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167,
154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19,
44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245,
192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247,
21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21,
251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247,
9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21,
82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19,
69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80,
117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248,
180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247,
7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96,
83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215,
139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117,
201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26,
207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145,
111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180,
169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247,
26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86,
10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70,
251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37,
199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212,
248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139,
8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248,
7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194,
141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21,
116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10,
217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19,
0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1,
104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3,
81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74,
4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61,
5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3,
5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240,
7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6,
11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7,
11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139,
251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11,
248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6,
11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139,
218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251,
106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247,
12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251,
52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102,
139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181,
112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3,
139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166,
8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204,
86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251,
7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74,
252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91,
7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137,
135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,
76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,
181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78,
114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,
115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108,
98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157,
143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45,
251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6,
116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146,
236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52,
221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140,
122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195,
209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39,
50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251,
43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217,
232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100,
247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139,
101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139,
247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161,
139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251,
189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30,
11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247,
69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64,
7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181,
8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139,
139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249,
109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11,
251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71,
57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98,
98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139,
5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43,
202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8,
11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158,
120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199,
139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5,
11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40,
200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251,
40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251,
42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,
251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128,
128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139,
169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124,
138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105,
109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30,
139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139,
46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139,
8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251,
158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97,
247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65,
247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247,
66,247,68,247,33,247,36,247,65,31,11,0,};
#endif
 
#ifdef HAVE_INCBIN
extern const unsigned char pdf_font_StandardSymL[15788];
asm(".globl pdf_font_StandardSymL");
asm(".balign 8");
asm("pdf_font_StandardSymL:");
asm(".incbin \"fonts/StandardSymL.cff\"");
#else
static const unsigned char pdf_font_StandardSymL[15788] = {
1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0,
1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251,
66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28,
55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111,
109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112,
97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,
43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,
85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,
112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101,
103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1,
0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,
18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,
0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,
0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,
0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,
0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,
0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,
106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,
0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0,
131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143,
0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0,
177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187,
0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0,
202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211,
0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0,
223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161,
0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0,
160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170,
2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195,
5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175,
9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11,
232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14,
71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15,
253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18,
205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134,
20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24,
169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25,
230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27,
173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29,
183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33,
222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36,
68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38,
63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124,
40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175,
42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209,
44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100,
47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50,
55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223,
56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247,
115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21,
32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62,
139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71,
247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247,
103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170,
247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66,
5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70,
69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94,
145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247,
33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139,
210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140,
66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178,
139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139,
100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247,
93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19,
191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236,
64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194,
31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46,
62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69,
4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116,
217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226,
21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231,
71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89,
139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154,
177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199,
8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90,
30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67,
139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3,
204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39,
251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247,
35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89,
159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247,
50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51,
90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33,
177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169,
120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3,
248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132,
211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3,
247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21,
251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229,
247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251,
23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117,
231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41,
46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247,
151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76,
7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171,
176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97,
177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142,
187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83,
106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217,
248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140,
5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102,
156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104,
189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139,
251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163,
194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138,
8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160,
251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82,
5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247,
226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220,
139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178,
118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239,
243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247,
187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3,
248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119,
52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236,
239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235,
240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74,
58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156,
249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125,
8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247,
115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183,
163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103,
211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229,
247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73,
90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83,
56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217,
247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0,
139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215,
97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31,
206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247,
20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31,
14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160,
4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21,
35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125,
251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247,
183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130,
159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53,
139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247,
222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247,
9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158,
176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139,
139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102,
251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229,
248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251,
26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223,
148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139,
247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251,
26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166,
8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247,
74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159,
163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180,
97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191,
205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110,
247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124,
221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158,
178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174,
193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232,
251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99,
139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143,
247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104,
127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1,
187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85,
79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139,
247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105,
61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121,
169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232,
248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247,
30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78,
251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232,
3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229,
232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253,
109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221,
3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139,
72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247,
3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116,
82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238,
139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247,
187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232,
249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124,
139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247,
99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149,
7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186,
44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10,
139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252,
10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139,
248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65,
249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159,
1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139,
249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227,
139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248,
30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109,
227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221,
1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139,
159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247,
121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251,
36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86,
91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138,
21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251,
102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155,
198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139,
8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251,
71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232,
232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139,
94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175,
60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109,
232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106,
139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247,
246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221,
249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251,
9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7,
251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159,
249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248,
253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247,
77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251,
29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5,
14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139,
251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247,
5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69,
159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221,
1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247,
142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249,
89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211,
249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253,
177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192,
247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21,
252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10,
14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,
247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191,
226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139,
8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8,
247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247,
15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107,
247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251,
4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125,
55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149,
66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188,
248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251,
59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251,
122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14,
247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126,
21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222,
3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18,
168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72,
139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194,
139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121,
88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216,
80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28,
248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216,
247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222,
247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166,
139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76,
194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244,
18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109,
4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160,
21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144,
138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99,
139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222,
247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32,
139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109,
21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223,
247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206,
215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200,
175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108,
195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212,
104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247,
181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110,
159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193,
251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,
247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6,
19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31,
247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165,
226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194,
80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189,
165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51,
47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159,
18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158,
188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139,
85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226,
247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222,
3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204,
30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149,
176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222,
64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159,
248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61,
45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46,
248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247,
44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159,
1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44,
139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236,
139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99,
139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204,
1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120,
106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185,
204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180,
139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3,
239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1,
216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196,
151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155,
6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8,
251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248,
47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149,
120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149,
161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164,
139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19,
160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192,
138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200,
134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27,
125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8,
145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91,
211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194,
247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132,
152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88,
142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35,
46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114,
139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160,
132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110,
119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139,
96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247,
28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190,
216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93,
247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247,
251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144,
251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217,
248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171,
183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99,
139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247,
5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55,
5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209,
8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218,
121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159,
5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108,
94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139,
88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6,
139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139,
182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191,
8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177,
99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179,
158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113,
102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247,
82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194,
82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83,
86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82,
190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251,
45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31,
14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139,
247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247,
143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119,
21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239,
244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207,
21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72,
207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50,
10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247,
204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138,
21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6,
14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51,
251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247,
86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247,
103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203,
221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169,
70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249,
222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195,
206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81,
124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1,
186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188,
232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10,
247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243,
3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35,
35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148,
198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249,
108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4,
190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247,
226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79,
4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243,
1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114,
95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134,
111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192,
186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229,
243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159,
1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14,
179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139,
127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128,
72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10,
14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233,
208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195,
139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134,
183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179,
248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21,
35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134,
21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22,
97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108,
31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215,
186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179,
249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52,
159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161,
131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139,
92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247,
102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67,
250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232,
3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244,
247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221,
21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191,
247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247,
169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7,
202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182,
163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123,
119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76,
145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97,
108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145,
8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59,
83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139,
247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154,
232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247,
34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77,
193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189,
69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139,
204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251,
12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221,
247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220,
221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66,
139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79,
213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7,
19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204,
139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179,
58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206,
247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191,
76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87,
87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247,
52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94,
163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105,
224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117,
104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180,
112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93,
139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132,
144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19,
184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101,
171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21,
73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160,
223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251,
244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203,
5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21,
107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154,
80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227,
244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95,
139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176,
139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116,
216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72,
139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,
187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139,
8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179,
73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233,
195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247,
130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247,
131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126,
173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156,
139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166,
174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107,
123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82,
93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243,
197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35,
36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159,
1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248,
10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21,
38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248,
110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139,
159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37,
10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112,
146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159,
247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247,
111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248,
65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116,
21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77,
105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194,
121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41,
139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182,
109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156,
125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200,
112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126,
137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228,
247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247,
30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133,
247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139,
221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247,
224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,
10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,
76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3,
247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142,
221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251,
42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214,
242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6,
19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,
249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66,
10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,
6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,
21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206,
110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17,
248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251,
71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156,
131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150,
139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208,
8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247,
18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247,
54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116,
221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,
108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232,
3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221,
248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121,
21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146,
115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145,
162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139,
188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232,
3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249,
30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78,
10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,
79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62,
247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116,
221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247,
102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188,
249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1,
247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247,
251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63,
21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107,
247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232,
247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54,
219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7,
226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247,
100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21,
35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181,
226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139,
8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100,
115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31,
117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108,
92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193,
139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248,
92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216,
247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21,
47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247,
152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65,
10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21,
46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216,
213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38,
247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108,
103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44,
80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165,
222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10,
95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214,
3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139,
8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135,
190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66,
139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146,
141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8,
130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89,
31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247,
45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49,
21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216,
247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66,
10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10,
141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116,
216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21,
49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142,
243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19,
116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248,
120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249,
120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248,
160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247,
89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10,
14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222,
19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89,
109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95,
139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130,
8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248,
44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52,
10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14,
116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21,
52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159,
1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247,
170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247,
164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44,
216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251,
39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243,
251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139,
95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163,
130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130,
226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120,
159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22,
55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6,
19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159,
18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,
57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18,
204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,
10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204,
222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251,
72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24,
248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247,
89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44,
214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129,
174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251,
9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217,
101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8,
95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62,
251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110,
159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247,
165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251,
28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251,
17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110,
221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251,
153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198,
205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151,
71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58,
91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138,
139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198,
251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219,
5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139,
117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248,
216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234,
21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,
139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,
153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,
81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192,
18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124,
247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14,
179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196,
247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70,
221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96,
182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252,
140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37,
90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189,
189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247,
132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35,
35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247,
177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247,
233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45,
139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247,
179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177,
119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247,
27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121,
6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79,
191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167,
154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19,
44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245,
192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247,
21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21,
251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247,
9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21,
82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19,
69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80,
117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248,
180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247,
7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96,
83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215,
139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117,
201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26,
207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145,
111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180,
169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247,
26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86,
10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70,
251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37,
199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212,
248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139,
8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248,
7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194,
141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21,
116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10,
217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19,
0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1,
104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3,
81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74,
4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61,
5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3,
5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240,
7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6,
11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7,
11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139,
251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11,
248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6,
11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139,
218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251,
106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247,
12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251,
52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102,
139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181,
112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3,
139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166,
8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204,
86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251,
7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74,
252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91,
7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137,
135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,
76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,
181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78,
114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,
115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108,
98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157,
143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45,
251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6,
116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146,
236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52,
221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140,
122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195,
209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39,
50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251,
43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217,
232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100,
247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139,
101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139,
247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161,
139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251,
189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30,
11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247,
69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64,
7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181,
8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139,
139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249,
109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11,
251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71,
57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98,
98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139,
5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43,
202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8,
11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158,
120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199,
139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5,
11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40,
200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251,
40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251,
42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,
251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128,
128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139,
169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124,
138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105,
109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30,
139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139,
46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139,
8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251,
158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97,
247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65,
247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247,
66,247,68,247,33,247,36,247,65,31,11,0,};
#endif
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/generated/font_cjk.h
0,0 → 1,5631
#ifndef __STRICT_ANSI__
#if defined(__linux__) || defined(__FreeBSD__)
#define HAVE_INCBIN
#endif
#endif
 
#ifdef HAVE_INCBIN
extern const unsigned char pdf_font_DroidSansFallback[139280];
asm(".globl pdf_font_DroidSansFallback");
asm(".balign 8");
asm("pdf_font_DroidSansFallback:");
asm(".incbin \"fonts/droid/DroidSansFallback.ttf\"");
#else
static const unsigned char pdf_font_DroidSansFallback[139280] = {
0,1,0,0,0,19,1,0,0,4,0,48,70,70,84,77,75,29,224,116,0,2,31,244,0,0,0,28,71,
68,69,70,2,201,0,4,0,2,14,208,0,0,0,32,71,80,79,83,236,144,228,222,0,2,15,
64,0,0,16,180,71,83,85,66,147,60,130,75,0,2,14,240,0,0,0,80,79,83,47,50,247,
26,134,136,0,0,1,184,0,0,0,96,99,109,97,112,29,150,101,90,0,0,12,136,0,0,
6,242,99,118,116,32,65,244,67,234,0,0,29,92,0,0,2,20,102,112,103,109,115,
211,35,176,0,0,19,124,0,0,7,5,103,97,115,112,0,24,0,9,0,2,14,192,0,0,0,16,
103,108,121,102,155,28,79,66,0,0,36,172,0,1,184,160,104,101,97,100,248,253,
254,54,0,0,1,60,0,0,0,54,104,104,101,97,14,75,8,159,0,0,1,116,0,0,0,36,104,
109,116,120,38,164,8,117,0,0,2,24,0,0,10,112,107,101,114,110,174,170,185,
111,0,1,221,76,0,0,21,90,108,111,99,97,120,114,13,144,0,0,31,112,0,0,5,58,
109,97,120,112,7,1,7,208,0,0,1,152,0,0,0,32,110,97,109,101,35,87,171,194,
0,1,242,168,0,0,7,251,112,111,115,116,26,213,54,16,0,1,250,164,0,0,20,25,
112,114,101,112,122,200,94,246,0,0,26,132,0,0,2,213,0,1,0,0,0,1,5,30,235,
107,75,224,95,15,60,245,0,31,8,0,0,0,0,0,201,129,215,160,0,0,0,0,201,129,
215,160,254,96,253,147,8,103,7,72,0,0,0,8,0,2,0,0,0,0,0,0,0,1,0,0,7,62,254,
78,0,67,8,192,254,96,254,244,8,103,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,156,
0,1,0,0,2,156,1,82,0,84,0,140,0,5,0,2,0,16,0,47,0,90,0,0,3,158,5,192,0,3,
0,1,0,3,4,185,1,144,0,5,0,8,5,154,5,51,0,0,1,27,5,154,5,51,0,0,3,209,0,102,
2,18,8,5,2,11,6,4,2,2,2,2,2,4,160,0,2,175,80,0,120,251,0,0,0,0,0,0,0,0,49,
65,83,67,0,64,0,33,251,2,5,211,254,81,1,51,7,62,1,178,96,0,0,159,223,215,
0,0,4,58,5,129,0,0,0,32,0,2,2,236,0,68,0,0,0,0,2,170,0,0,2,57,0,0,2,57,0,
185,2,215,0,87,4,115,0,9,4,115,0,22,7,29,0,73,5,86,0,72,1,135,0,104,2,170,
0,127,2,170,0,12,3,29,0,33,4,172,0,100,2,57,0,184,2,170,0,91,2,57,0,187,2,
57,0,0,4,115,0,80,4,115,0,156,4,115,0,103,4,115,0,78,4,115,0,47,4,115,0,82,
4,115,0,104,4,115,0,105,4,115,0,89,4,115,0,96,2,57,0,187,2,57,0,184,4,172,
0,101,4,172,0,100,4,172,0,101,4,115,0,84,8,31,0,161,5,86,0,4,5,86,0,168,5,
199,0,104,5,199,0,168,5,86,0,168,4,227,0,168,6,57,0,103,5,199,0,168,2,57,
0,189,4,0,0,32,5,86,0,168,4,115,0,168,6,170,0,168,5,199,0,168,6,57,0,97,5,
86,0,168,6,57,0,97,5,199,0,168,5,86,0,93,4,227,0,46,5,199,0,158,5,86,0,9,
7,141,0,9,5,86,0,46,5,86,0,45,4,227,0,65,2,57,0,146,2,57,0,0,2,57,0,16,3,
193,0,10,4,115,255,225,2,170,0,106,4,115,0,87,4,115,0,132,4,0,0,87,4,115,
0,86,4,115,0,87,2,57,0,29,4,115,0,86,4,115,0,142,1,199,0,137,1,199,255,206,
4,0,0,138,1,199,0,138,6,170,0,136,4,115,0,136,4,115,0,86,4,115,0,132,4,115,
0,86,2,170,0,136,4,0,0,57,2,57,0,31,4,115,0,133,4,0,0,7,5,199,255,253,4,0,
0,23,4,0,0,5,4,0,0,49,2,172,0,34,2,20,0,183,2,172,0,34,4,172,0,92,2,170,0,
242,4,115,0,135,4,115,0,58,4,115,0,113,4,115,255,254,2,20,0,183,4,115,0,115,
2,170,0,45,5,229,0,31,2,246,0,26,4,115,0,83,4,172,0,100,5,229,0,31,4,107,
255,239,3,51,0,122,4,100,0,65,2,170,0,41,2,170,0,27,2,170,0,72,4,156,0,140,
4,76,0,80,2,57,0,187,2,170,0,119,2,170,0,80,2,236,0,27,4,115,0,83,6,172,0,
56,6,172,0,56,6,172,0,73,4,227,0,131,5,86,0,4,5,86,0,4,5,86,0,4,5,86,0,4,
5,86,0,4,5,86,0,4,8,0,0,24,5,199,0,104,5,86,0,168,5,86,0,168,5,86,0,168,5,
86,0,168,2,57,0,9,2,57,0,142,2,57,255,210,2,57,0,7,5,199,0,14,5,199,0,168,
6,57,0,97,6,57,0,97,6,57,0,97,6,57,0,97,6,57,0,97,4,172,0,142,6,57,0,71,5,
199,0,158,5,199,0,158,5,199,0,158,5,199,0,158,5,86,0,45,5,86,0,168,4,227,
0,142,4,115,0,87,4,115,0,87,4,115,0,87,4,115,0,87,4,115,0,87,4,115,0,87,7,
29,0,66,4,0,0,87,4,115,0,87,4,115,0,87,4,115,0,87,4,115,0,87,2,57,0,10,2,
57,0,135,2,57,255,211,2,57,0,8,4,115,0,86,4,115,0,140,4,115,0,86,4,115,0,
86,4,115,0,86,4,115,0,86,4,115,0,86,4,100,0,65,4,227,0,44,4,115,0,139,4,115,
0,139,4,115,0,139,4,115,0,139,4,0,0,5,4,115,0,138,4,0,0,5,5,86,0,4,4,115,
0,87,5,86,0,4,4,115,0,87,5,86,0,4,4,115,0,87,5,199,0,104,4,0,0,87,5,199,0,
104,4,0,0,87,5,199,0,104,4,0,0,87,5,199,0,104,4,0,0,87,5,199,0,168,4,235,
0,86,5,199,0,14,4,115,0,86,5,86,0,168,4,115,0,87,5,86,0,168,4,115,0,87,5,
86,0,168,4,115,0,87,5,86,0,168,4,115,0,87,5,86,0,168,4,115,0,87,6,57,0,103,
4,115,0,86,6,57,0,103,4,115,0,86,6,57,0,103,4,115,0,86,6,57,0,103,4,115,0,
86,5,199,0,168,4,115,0,142,5,199,0,14,4,115,0,10,2,57,255,184,2,57,255,184,
2,57,0,12,2,57,0,12,2,57,255,210,2,57,255,210,2,57,0,92,1,199,0,31,2,57,0,
189,2,57,0,194,5,225,0,170,3,141,0,137,4,0,0,32,1,199,255,153,5,86,0,168,
4,0,0,138,4,0,0,138,4,115,0,168,1,199,0,91,4,115,0,168,1,199,0,126,4,115,
0,168,2,85,0,138,4,115,0,168,2,172,0,138,4,115,0,20,1,199,0,16,5,199,0,168,
4,115,0,140,5,199,0,168,4,115,0,140,5,199,0,168,4,115,0,140,4,213,255,254,
5,201,0,165,4,115,0,140,6,57,0,97,4,115,0,86,6,57,0,97,4,115,0,86,6,57,0,
97,4,115,0,86,8,0,0,97,7,141,0,86,5,199,0,168,2,170,0,136,5,199,0,168,2,170,
0,129,5,199,0,168,2,170,0,56,5,86,0,93,4,0,0,57,5,86,0,93,4,0,0,57,5,86,0,
93,4,0,0,57,5,86,0,93,4,0,0,57,4,227,0,46,2,57,0,31,4,227,0,46,3,0,0,31,4,
227,0,46,2,57,0,31,5,199,0,158,4,115,0,133,5,199,0,158,4,115,0,133,5,199,
0,158,4,115,0,133,5,199,0,158,4,115,0,133,5,199,0,158,4,115,0,133,5,199,0,
158,4,115,0,133,7,141,0,9,5,199,255,253,5,86,0,45,4,0,0,5,5,86,0,45,4,227,
0,65,4,0,0,49,4,227,0,65,4,0,0,49,4,227,0,65,4,0,0,49,1,199,0,138,4,115,0,
192,5,86,0,4,4,115,0,87,8,0,0,24,7,29,0,66,6,57,0,71,4,227,0,44,2,170,0,0,
2,170,0,0,2,170,0,51,2,170,255,221,2,170,0,156,2,170,0,51,2,170,0,80,2,170,
255,233,2,170,0,22,2,170,0,205,2,170,0,29,5,87,0,4,2,57,0,187,6,70,255,245,
6,180,255,242,3,18,255,232,6,50,255,187,6,216,0,65,6,5,255,187,1,199,255,
176,5,86,0,4,5,86,0,168,4,104,0,168,5,88,0,61,5,86,0,168,4,227,0,65,5,199,
0,168,6,57,0,97,2,57,0,189,5,86,0,168,5,88,0,10,6,170,0,168,5,199,0,168,5,
51,0,90,6,57,0,97,5,199,0,168,5,86,0,168,4,242,0,108,4,227,0,46,5,86,0,45,
6,98,0,117,5,86,0,46,6,175,0,145,5,251,0,87,2,57,0,7,5,86,0,45,4,160,0,86,
3,145,0,70,4,115,0,106,1,199,0,137,4,96,0,133,4,160,0,86,4,154,0,142,4,0,
0,7,4,116,0,86,3,145,0,70,3,135,0,86,4,115,0,106,4,115,0,106,1,199,0,137,
4,0,0,138,4,0,0,14,4,156,0,138,4,0,0,0,3,149,0,86,4,115,0,86,5,133,0,79,4,
141,0,132,3,219,0,86,4,240,0,86,3,41,0,29,4,96,0,133,5,48,0,85,4,51,0,21,
5,180,0,135,6,63,0,83,1,199,255,205,4,96,0,133,4,115,0,86,4,96,0,133,6,63,
0,83,5,87,0,168,6,235,0,46,4,85,0,168,5,192,0,104,5,86,0,93,2,57,0,189,2,
57,0,7,4,0,0,32,8,117,0,18,8,21,0,168,6,213,0,46,4,169,0,168,5,21,0,55,5,
192,0,168,5,86,0,4,5,64,0,168,5,86,0,168,4,85,0,168,5,107,0,15,5,86,0,168,
7,99,0,28,4,213,0,67,5,192,0,168,5,192,0,168,4,169,0,168,5,64,0,18,6,170,
0,168,5,199,0,168,6,57,0,97,5,192,0,166,5,86,0,168,5,199,0,104,4,227,0,46,
5,21,0,55,6,21,0,118,5,86,0,46,5,235,0,168,5,85,0,160,7,85,0,168,7,128,0,
168,6,85,0,46,7,21,0,168,5,64,0,168,5,192,0,105,8,21,0,168,5,199,0,96,4,115,
0,87,4,149,0,120,4,64,0,142,2,235,0,142,4,171,0,20,4,115,0,87,5,90,0,7,3,
171,0,49,4,120,0,142,4,120,0,142,3,128,0,138,4,171,0,11,5,128,0,142,4,107,
0,142,4,115,0,86,4,85,0,142,4,115,0,132,4,0,0,87,3,170,0,35,4,0,0,5,6,149,
0,86,4,0,0,23,4,149,0,142,4,43,0,122,6,107,0,142,6,149,0,142,5,0,0,45,5,192,
0,142,4,43,0,142,4,21,0,55,6,0,0,142,4,85,0,17,4,115,0,87,4,115,0,10,2,235,
0,142,4,21,0,87,4,0,0,57,1,199,0,137,2,57,255,248,1,199,255,206,7,64,0,11,
6,128,0,142,4,115,0,10,3,128,0,138,4,0,0,5,4,107,0,142,3,233,0,168,3,74,0,
142,7,141,0,9,5,199,255,253,7,141,0,9,5,199,255,253,7,141,0,9,5,199,255,253,
5,86,0,45,4,0,0,5,4,115,0,0,8,0,0,0,8,0,0,0,4,107,255,225,1,199,0,127,1,199,
0,127,1,199,0,127,1,199,0,126,2,170,0,75,2,170,0,75,2,170,0,75,4,115,0,138,
4,115,0,136,2,205,0,81,8,0,1,22,8,0,0,55,1,128,0,85,2,213,0,85,2,170,0,88,
2,170,0,89,4,0,0,185,2,170,255,192,1,86,254,96,2,235,0,101,4,115,0,4,4,115,
0,58,8,192,0,158,4,115,0,16,7,21,0,69,2,150,0,19,8,149,0,188,8,0,0,188,6,
37,0,108,4,205,0,88,6,172,0,80,6,172,0,61,6,172,0,93,6,172,0,145,8,0,1,162,
4,0,1,16,8,0,1,162,4,0,1,16,8,0,1,162,4,0,1,16,4,0,1,16,3,244,0,56,4,229,
0,4,6,150,0,235,5,180,0,154,4,172,0,101,4,100,0,51,5,180,0,87,7,213,1,152,
5,192,1,22,2,49,255,158,4,100,0,56,4,100,0,65,4,171,0,100,4,100,0,63,4,100,
0,65,4,213,0,157,4,172,0,100,4,213,2,34,4,213,1,5,5,171,255,246,5,0,1,216,
5,171,2,141,5,171,255,246,5,171,2,141,5,171,255,246,5,171,2,141,5,171,255,
246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,1,217,5,
171,2,141,5,171,1,217,5,171,1,217,5,171,255,246,5,171,255,246,5,171,255,246,
5,171,2,141,5,171,1,217,5,171,1,217,5,171,255,246,5,171,255,246,5,171,255,
246,5,171,2,141,5,171,1,217,5,171,1,217,5,171,255,246,5,171,255,246,5,171,
255,246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,255,
246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,0,0,5,171,
0,0,5,171,0,0,5,171,0,0,5,171,2,213,5,171,0,103,5,171,0,0,5,213,0,0,4,213,
0,123,4,213,0,6,2,214,0,109,2,214,0,109,8,0,0,0,7,235,1,158,7,235,1,145,7,
235,1,158,7,235,1,145,3,244,0,8,4,213,0,167,4,213,0,178,4,213,0,41,4,213,
0,41,2,214,0,115,8,43,1,177,8,107,1,209,7,85,1,70,6,0,1,218,6,0,1,81,4,64,
0,59,5,64,0,60,4,192,0,102,4,21,0,66,4,0,0,196,6,0,1,16,4,0,0,29,4,0,0,29,
2,170,0,119,2,170,0,243,2,170,0,127,2,170,0,14,2,170,0,53,2,170,0,43,2,170,
0,45,2,170,255,229,1,199,0,124,1,199,0,130,2,90,0,106,2,90,0,72,2,152,0,0,
2,152,0,0,2,135,0,45,2,160,255,233,3,47,0,32,2,72,255,232,0,0,0,3,0,0,0,3,
0,0,0,28,0,1,0,0,0,0,4,232,0,3,0,1,0,0,0,28,0,4,4,204,0,0,0,190,0,128,0,6,
0,62,0,126,1,127,1,146,1,255,2,199,2,201,2,221,3,126,3,138,3,140,3,161,3,
206,4,12,4,79,4,92,4,95,4,145,30,133,30,243,32,21,32,30,32,34,32,38,32,48,
32,51,32,58,32,60,32,62,32,68,32,127,32,164,32,167,32,172,33,5,33,19,33,22,
33,34,33,38,33,46,33,94,33,149,33,168,34,2,34,6,34,15,34,18,34,21,34,26,34,
31,34,41,34,43,34,72,34,97,34,101,35,2,35,16,35,33,37,0,37,2,37,12,37,16,
37,20,37,24,37,28,37,36,37,44,37,52,37,60,37,108,37,128,37,132,37,136,37,
140,37,147,37,161,37,172,37,178,37,186,37,188,37,196,37,203,37,207,37,217,
37,230,38,60,38,64,38,66,38,96,38,99,38,102,38,107,240,2,240,5,251,2,255,
255,0,0,0,32,0,160,1,146,1,250,2,198,2,201,2,216,3,126,3,132,3,140,3,142,
3,163,4,1,4,14,4,81,4,94,4,144,30,128,30,242,32,19,32,23,32,32,32,38,32,48,
32,50,32,57,32,60,32,62,32,68,32,127,32,163,32,167,32,172,33,5,33,19,33,22,
33,34,33,38,33,46,33,91,33,144,33,168,34,2,34,6,34,15,34,17,34,21,34,25,34,
30,34,41,34,43,34,72,34,96,34,100,35,2,35,16,35,32,37,0,37,2,37,12,37,16,
37,20,37,24,37,28,37,36,37,44,37,52,37,60,37,80,37,128,37,132,37,136,37,140,
37,144,37,160,37,170,37,178,37,186,37,188,37,196,37,202,37,207,37,216,37,
230,38,58,38,64,38,66,38,96,38,99,38,101,38,106,240,1,240,5,251,1,255,255,
255,227,0,0,255,174,255,71,254,129,254,128,254,114,252,160,253,204,253,203,
253,202,253,201,253,151,253,150,253,149,253,148,253,100,227,118,227,10,225,
235,225,234,225,233,225,230,225,221,225,220,225,215,225,214,225,213,225,208,
225,150,225,115,225,113,225,109,225,21,225,8,225,6,224,251,224,248,224,241,
224,197,224,148,224,130,224,41,224,38,224,30,224,29,223,255,0,0,224,19,224,
10,224,9,223,237,223,214,223,212,223,56,223,43,223,28,221,62,221,61,221,52,
221,49,221,46,221,43,221,40,221,33,221,26,221,19,221,12,220,249,220,230,220,
227,220,224,220,221,220,218,220,206,220,198,220,193,220,186,220,185,220,178,
220,173,220,170,220,162,220,150,220,67,220,64,220,63,220,34,220,32,220,31,
220,28,18,135,18,133,7,135,0,1,0,0,0,188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,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,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
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,0,98,0,99,0,100,0,101,0,
102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,16,0,110,0,111,0,112,0,113,
0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,
126,0,127,0,128,0,129,0,130,0,131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,
0,139,0,140,0,141,0,142,0,143,0,144,0,145,0,146,0,147,0,148,0,149,0,150,0,
151,0,152,0,153,0,154,0,155,0,156,0,157,0,158,0,159,0,160,0,161,0,162,0,163,
0,164,0,165,0,166,0,167,0,168,0,169,0,170,0,171,0,172,0,173,0,174,0,175,0,
176,0,177,0,178,0,179,0,180,0,181,0,182,0,183,0,184,0,185,0,186,0,187,0,188,
0,189,0,190,0,191,0,192,0,193,0,194,0,195,0,196,0,197,0,198,0,199,0,200,0,
201,0,202,0,203,0,204,0,205,0,206,0,207,0,208,0,209,0,210,0,211,0,212,0,213,
0,214,0,215,0,216,0,217,0,218,0,219,0,220,0,221,0,222,0,223,0,224,0,225,0,
226,0,227,0,228,0,229,0,230,0,231,0,232,0,233,0,234,0,235,0,236,0,237,0,238,
0,239,0,240,0,241,0,242,0,243,0,244,0,245,0,246,0,247,0,248,0,249,0,250,0,
251,0,252,0,253,0,254,0,255,1,0,1,1,1,2,1,3,1,4,1,5,1,6,1,7,1,8,1,9,1,10,
1,11,1,12,1,13,1,14,1,15,1,16,1,17,1,18,1,19,1,20,1,21,1,22,1,23,1,24,1,25,
1,26,1,27,1,28,1,29,1,30,1,31,1,32,1,33,1,34,1,35,1,36,1,37,1,38,1,39,1,40,
1,41,1,42,1,43,1,44,1,45,1,46,1,47,1,48,1,49,1,50,1,51,1,52,1,53,1,54,1,55,
1,56,1,57,1,58,1,59,1,60,1,61,1,62,1,63,0,119,2,48,0,6,2,10,0,0,0,0,1,0,0,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,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,1,0,0,0,0,0,3,0,4,0,5,0,6,0,7,0,
8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,
23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,
0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,
0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,
0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,
0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,
0,0,0,132,0,133,0,135,0,137,0,145,0,150,0,156,0,161,0,160,0,162,0,164,0,163,
0,165,0,167,0,169,0,168,0,170,0,171,0,173,0,172,0,174,0,175,0,177,0,179,0,
178,0,180,0,182,0,181,0,186,0,185,0,187,0,188,2,9,0,112,0,99,0,100,0,104,
2,11,0,118,0,159,0,110,0,106,2,29,0,116,0,105,2,54,0,134,0,152,2,49,0,113,
2,56,2,57,0,102,0,117,2,43,2,46,2,45,1,137,2,52,0,107,0,122,1,114,0,166,0,
184,0,127,0,98,0,109,2,48,1,64,2,53,2,44,0,108,0,123,2,12,0,3,0,128,0,131,
0,149,1,18,1,19,1,254,1,255,2,6,2,7,2,2,2,3,0,183,2,119,0,191,1,56,2,20,2,
25,2,16,2,17,2,136,2,137,2,10,0,119,2,4,2,8,2,13,0,130,0,138,0,129,0,139,
0,136,0,141,0,142,0,143,0,140,0,147,0,148,0,0,0,146,0,154,0,155,0,153,0,241,
1,71,1,78,0,111,1,74,1,75,1,76,0,120,1,79,1,77,1,72,0,0,64,69,89,88,85,84,
83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,
58,57,56,55,54,53,49,48,47,46,45,44,40,39,38,37,36,35,34,33,31,24,20,17,16,
15,14,13,11,10,9,8,7,6,5,4,3,2,1,0,44,69,35,70,96,32,176,38,96,176,4,38,35,
72,72,45,44,69,35,70,35,97,32,176,38,97,176,4,38,35,72,72,45,44,69,35,70,
96,176,32,97,32,176,70,96,176,4,38,35,72,72,45,44,69,35,70,35,97,176,32,96,
32,176,38,97,176,32,97,176,4,38,35,72,72,45,44,69,35,70,96,176,64,97,32,176,
102,96,176,4,38,35,72,72,45,44,69,35,70,35,97,176,64,96,32,176,38,97,176,
64,97,176,4,38,35,72,72,45,44,1,16,32,60,0,60,45,44,32,69,35,32,176,205,68,
35,32,184,1,90,81,88,35,32,176,141,68,35,89,32,176,237,81,88,35,32,176,77,
68,35,89,32,176,4,38,81,88,35,32,176,13,68,35,89,33,33,45,44,32,32,69,24,
104,68,32,176,1,96,32,69,176,70,118,104,138,69,96,68,45,44,1,177,11,10,67,
35,67,101,10,45,44,0,177,10,11,67,35,67,11,45,44,0,176,40,35,112,177,1,40,
62,1,176,40,35,112,177,2,40,69,58,177,2,0,8,13,45,44,32,69,176,3,37,69,97,
100,176,80,81,88,69,68,27,33,33,89,45,44,73,176,14,35,68,45,44,32,69,176,
0,67,96,68,45,44,1,176,6,67,176,7,67,101,10,45,44,32,105,176,64,97,176,0,
139,32,177,44,192,138,140,184,16,0,98,96,43,12,100,35,100,97,92,88,176,3,
97,89,45,44,138,3,69,138,138,135,176,17,43,176,41,35,68,176,41,122,228,24,
45,44,69,101,176,44,35,68,69,176,43,35,68,45,44,75,82,88,69,68,27,33,33,89,
45,44,75,81,88,69,68,27,33,33,89,45,44,1,176,5,37,16,35,32,138,245,0,176,
1,96,35,237,236,45,44,1,176,5,37,16,35,32,138,245,0,176,1,97,35,237,236,45,
44,1,176,6,37,16,245,0,237,236,45,44,70,35,70,96,138,138,70,35,32,70,138,
96,138,97,184,255,128,98,35,32,16,35,138,177,12,12,138,112,69,96,32,176,0,
80,88,176,1,97,184,255,186,139,27,176,70,140,89,176,16,96,104,1,58,45,44,
32,69,176,3,37,70,82,75,176,19,81,91,88,176,2,37,70,32,104,97,176,3,37,176,
3,37,63,35,33,56,27,33,17,89,45,44,32,69,176,3,37,70,80,88,176,2,37,70,32,
104,97,176,3,37,176,3,37,63,35,33,56,27,33,17,89,45,44,0,176,7,67,176,6,67,
11,45,44,33,33,12,100,35,100,139,184,64,0,98,45,44,33,176,128,81,88,12,100,
35,100,139,184,32,0,98,27,178,0,64,47,43,89,176,2,96,45,44,33,176,192,81,
88,12,100,35,100,139,184,21,85,98,27,178,0,128,47,43,89,176,2,96,45,44,12,
100,35,100,139,184,64,0,98,96,35,33,45,44,75,83,88,138,176,4,37,73,100,35,
69,105,176,64,139,97,176,128,98,176,32,97,106,176,14,35,68,35,16,176,14,246,
27,33,35,138,18,17,32,57,47,89,45,44,75,83,88,32,176,3,37,73,100,105,32,176,
5,38,176,6,37,73,100,35,97,176,128,98,176,32,97,106,176,14,35,68,176,4,38,
16,176,14,246,138,16,176,14,35,68,176,14,246,176,14,35,68,176,14,237,27,138,
176,4,38,17,18,32,57,35,32,57,47,47,89,45,44,69,35,69,96,35,69,96,35,69,96,
35,118,104,24,176,128,98,32,45,44,176,72,43,45,44,32,69,176,0,84,88,176,64,
68,32,69,176,64,97,68,27,33,33,89,45,44,69,177,48,47,69,35,69,97,96,176,1,
96,105,68,45,44,75,81,88,176,47,35,112,176,20,35,66,27,33,33,89,45,44,75,
81,88,32,176,3,37,69,105,83,88,68,27,33,33,89,27,33,33,89,45,44,69,176,20,
67,176,0,96,99,176,1,96,105,68,45,44,176,47,69,68,45,44,69,35,32,69,138,96,
68,45,44,69,35,69,96,68,45,44,75,35,81,88,185,0,51,255,224,177,52,32,27,179,
51,0,52,0,89,68,68,45,44,176,22,67,88,176,3,38,69,138,88,100,102,176,31,96,
27,100,176,32,96,102,32,88,27,33,176,64,89,176,1,97,89,35,88,101,89,176,41,
35,68,35,16,176,41,224,27,33,33,33,33,33,89,45,44,176,2,67,84,88,75,83,35,
75,81,90,88,56,27,33,33,89,27,33,33,33,33,89,45,44,176,22,67,88,176,4,37,
69,100,176,32,96,102,32,88,27,33,176,64,89,176,1,97,35,88,27,101,89,176,41,
35,68,176,5,37,176,8,37,8,32,88,2,27,3,89,176,4,37,16,176,5,37,32,70,176,
4,37,35,66,60,176,4,37,176,7,37,8,176,7,37,16,176,6,37,32,70,176,4,37,176,
1,96,35,66,60,32,88,1,27,0,89,176,4,37,16,176,5,37,176,41,224,176,41,32,69,
101,68,176,7,37,16,176,6,37,176,41,224,176,5,37,176,8,37,8,32,88,2,27,3,89,
176,5,37,176,3,37,67,72,176,4,37,176,7,37,8,176,6,37,176,3,37,176,1,96,67,
72,27,33,89,33,33,33,33,33,33,33,45,44,2,176,4,37,32,32,70,176,4,37,35,66,
176,5,37,8,176,3,37,69,72,33,33,33,33,45,44,2,176,3,37,32,176,4,37,8,176,
2,37,67,72,33,33,33,45,44,69,35,32,69,24,32,176,0,80,32,88,35,101,35,89,35,
104,32,176,64,80,88,33,176,64,89,35,88,101,89,138,96,68,45,44,75,83,35,75,
81,90,88,32,69,138,96,68,27,33,33,89,45,44,75,84,88,32,69,138,96,68,27,33,
33,89,45,44,75,83,35,75,81,90,88,56,27,33,33,89,45,44,176,0,33,75,84,88,56,
27,33,33,89,45,44,176,2,67,84,88,176,70,43,27,33,33,33,33,89,45,44,176,2,
67,84,88,176,71,43,27,33,33,33,89,45,44,176,2,67,84,88,176,72,43,27,33,33,
33,33,89,45,44,176,2,67,84,88,176,73,43,27,33,33,33,89,45,44,32,138,8,35,
75,83,138,75,81,90,88,35,56,27,33,33,89,45,44,0,176,2,37,73,176,0,83,88,32,
176,64,56,17,27,33,89,45,44,1,70,35,70,96,35,70,97,35,32,16,32,70,138,97,
184,255,128,98,138,177,64,64,138,112,69,96,104,58,45,44,32,138,35,73,100,
138,35,83,88,60,27,33,89,45,44,75,82,88,125,27,122,89,45,44,176,18,0,75,1,
75,84,66,45,44,177,2,0,66,177,35,1,136,81,177,64,1,136,83,90,88,185,16,0,
0,32,136,84,88,178,2,1,2,67,96,66,89,177,36,1,136,81,88,185,32,0,0,64,136,
84,88,178,2,2,2,67,96,66,177,36,1,136,84,88,178,2,32,2,67,96,66,0,75,1,75,
82,88,178,2,8,2,67,96,66,89,27,185,64,0,0,128,136,84,88,178,2,4,2,67,96,66,
89,185,64,0,0,128,99,184,1,0,136,84,88,178,2,8,2,67,96,66,89,185,64,0,1,0,
99,184,2,0,136,84,88,178,2,16,2,67,96,66,89,185,64,0,2,0,99,184,4,0,136,84,
88,178,2,64,2,67,96,66,89,89,89,89,89,45,44,69,24,104,35,75,81,88,35,32,69,
32,100,176,64,80,88,124,89,104,138,96,89,68,45,44,176,0,22,176,2,37,176,2,
37,1,176,1,35,62,0,176,2,35,62,177,1,2,6,12,176,10,35,101,66,176,11,35,66,
1,176,1,35,63,0,176,2,35,63,177,1,2,6,12,176,6,35,101,66,176,7,35,66,176,
1,22,1,45,44,122,138,16,69,35,245,24,45,0,0,0,177,9,64,190,1,7,0,1,0,31,1,
7,0,1,0,159,1,4,64,142,1,192,253,1,175,253,1,0,253,1,10,79,251,1,32,251,1,
245,80,40,31,242,70,40,31,241,70,42,31,240,70,43,31,95,239,127,239,2,15,239,
79,239,95,239,143,239,175,239,5,11,229,228,30,31,227,226,70,31,15,226,1,64,
226,70,22,31,225,224,70,31,207,224,223,224,239,224,3,64,224,51,54,70,224,
70,24,31,221,61,223,85,222,61,3,85,223,1,3,85,220,3,255,31,15,213,31,213,
2,15,213,31,213,2,64,202,24,27,70,207,194,1,189,192,60,31,193,80,38,31,188,
190,40,31,255,185,1,80,184,112,184,128,184,3,184,255,192,64,255,184,18,50,
70,31,183,63,183,79,183,111,183,127,183,159,183,175,183,7,112,178,160,178,
176,178,3,15,178,1,144,181,1,176,181,1,15,181,1,8,15,179,63,179,239,179,3,
128,176,144,176,2,176,176,192,176,208,176,3,47,175,63,175,2,160,173,176,173,
2,192,173,208,173,2,47,172,63,172,2,159,171,1,192,170,208,170,2,79,169,143,
169,2,47,169,111,169,191,169,255,169,4,156,155,36,31,80,155,1,111,150,1,191,
150,1,150,70,29,31,149,148,23,31,127,148,143,148,255,148,3,48,145,64,145,
2,128,145,1,112,143,128,143,2,144,143,1,192,143,208,143,2,79,140,95,140,111,
140,3,134,70,255,31,159,133,1,132,131,49,31,116,115,63,31,115,80,38,31,111,
110,60,31,110,70,53,31,26,1,24,85,25,51,24,85,7,51,3,85,6,3,255,31,96,80,
38,31,95,80,38,31,92,70,49,31,91,90,72,31,90,70,49,31,19,50,18,85,5,1,3,85,
4,50,3,85,111,3,1,15,3,63,3,2,239,81,255,81,2,64,81,53,56,70,64,81,37,40,
70,207,64,84,80,1,73,70,32,31,72,70,53,31,71,70,53,31,175,70,1,223,70,239,
70,2,128,70,1,22,50,21,85,17,1,15,85,16,50,15,85,2,1,0,85,1,0,1,31,31,15,
63,15,95,15,127,15,4,15,15,47,15,79,15,111,15,143,15,223,15,255,15,7,63,15,
127,15,239,15,3,111,0,1,128,22,1,5,1,184,1,144,177,84,83,43,43,75,184,7,255,
82,75,176,7,80,91,176,1,136,176,37,83,176,1,136,176,64,81,90,176,6,136,176,
0,85,90,91,88,177,1,1,142,89,133,141,141,0,66,29,75,176,50,83,88,176,96,29,
89,75,176,100,83,88,176,64,29,89,75,176,128,83,88,176,16,29,177,22,0,66,89,
116,115,116,117,43,43,43,43,43,1,115,116,117,43,43,43,0,116,43,43,115,115,
117,43,43,43,1,43,43,43,0,43,43,43,43,43,43,1,43,43,0,43,43,1,43,115,43,0,
116,115,116,117,115,116,115,43,1,43,116,117,0,115,43,115,116,1,115,115,116,
0,115,116,116,115,116,115,1,94,115,115,116,115,115,0,115,43,115,115,1,43,
0,43,1,43,0,115,43,116,117,43,43,43,43,1,43,43,116,43,43,94,115,43,0,43,94,
115,116,1,43,43,43,0,43,115,115,94,115,115,115,1,115,115,115,24,94,0,0,0,
5,204,5,204,0,125,5,129,0,21,0,121,5,129,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
4,58,0,20,0,119,0,0,255,236,0,0,0,0,255,236,0,0,0,0,255,236,0,0,254,87,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,8,0,0,0,0,0,0,180,0,189,0,175,0,160,0,0,0,0,0,0,0,0,0,0,0,0,0,136,0,
126,0,0,0,172,0,0,0,0,0,0,0,0,0,0,0,0,0,191,0,195,0,171,0,0,0,0,0,155,0,141,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,185,0,170,0,0,0,0,0,
0,0,148,0,153,0,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,
0,131,0,141,0,164,0,180,0,0,0,0,0,0,0,0,0,0,0,96,0,106,0,121,0,152,0,172,
0,184,0,167,0,0,1,34,1,51,0,195,0,107,0,0,0,0,0,0,0,219,0,201,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,225,1,201,0,146,0,168,0,107,0,146,0,183,
0,107,0,155,0,0,2,123,2,242,0,146,2,82,0,110,2,215,3,129,0,130,0,137,0,160,
0,159,1,105,0,143,0,0,1,96,0,164,1,91,0,94,0,130,0,0,0,0,0,0,0,94,0,101,0,
111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,0,144,0,165,0,122,0,128,0,0,0,0,0,0,
0,0,0,0,5,129,255,243,0,13,252,167,0,131,0,137,0,143,0,150,0,105,0,113,0,
0,0,0,0,0,0,0,0,0,0,168,1,249,0,0,0,0,3,31,0,167,0,174,0,181,0,0,0,0,0,129,
0,0,0,0,0,0,0,0,7,72,3,106,2,182,2,2,253,147,0,0,0,145,0,103,0,145,0,97,1,
217,0,0,2,141,3,65,0,68,5,17,0,0,0,44,0,44,0,44,0,44,1,22,1,96,2,4,3,4,3,
230,4,240,5,14,5,84,5,158,5,246,6,50,6,114,6,144,6,178,6,218,7,80,7,150,8,
32,8,222,9,68,9,226,10,140,10,206,11,158,12,80,12,126,12,200,13,18,13,74,
13,146,14,20,15,100,16,22,16,172,17,64,17,160,17,222,18,40,18,202,19,22,19,
96,19,194,20,44,20,88,21,184,22,64,22,182,23,26,23,192,24,94,25,40,26,38,
26,146,27,42,29,162,30,254,32,64,32,148,32,190,32,242,33,28,34,172,34,202,
34,244,35,160,36,54,36,172,37,54,37,166,38,32,38,238,39,88,39,166,40,102,
41,0,41,68,42,246,43,100,43,212,44,112,45,20,45,98,46,16,46,114,46,230,48,
52,50,86,51,226,53,124,54,24,54,136,55,126,55,240,56,112,57,142,58,18,58,
196,59,100,59,234,60,238,62,28,62,144,63,134,64,72,64,168,64,210,65,178,65,
200,66,36,66,110,66,232,67,126,67,170,68,42,68,106,68,138,68,244,69,48,69,
166,70,14,70,48,70,90,70,124,71,8,71,32,71,56,71,80,71,104,71,130,71,154,
72,14,72,34,72,58,72,82,72,106,72,132,72,156,72,178,72,200,72,224,73,80,73,
104,73,128,73,152,73,176,73,200,73,226,74,68,74,252,75,20,75,44,75,68,75,
94,75,118,75,212,76,154,76,178,76,202,76,226,76,250,77,20,77,46,78,38,78,
58,78,82,78,106,78,130,78,156,78,180,78,202,78,224,78,248,79,172,79,196,79,
220,79,244,80,12,80,36,80,62,80,126,81,26,81,50,81,74,81,98,81,124,81,148,
82,24,82,50,82,74,82,98,82,122,82,146,82,166,82,186,82,210,82,234,83,2,83,
26,83,50,83,70,83,94,83,118,83,142,83,164,83,172,84,74,84,98,84,122,84,146,
84,170,84,194,84,214,84,234,84,254,85,22,85,46,85,70,85,94,85,118,85,142,
85,166,85,186,85,206,85,230,85,254,86,22,86,142,87,20,87,42,87,64,87,88,87,
110,87,132,87,154,87,172,87,192,87,216,88,170,88,182,88,210,88,234,89,228,
89,248,90,12,90,124,90,148,90,170,90,190,90,210,90,232,91,22,91,42,91,62,
91,150,91,224,91,248,92,16,92,36,92,56,92,80,92,104,92,116,93,20,93,164,93,
188,93,212,93,236,94,4,94,30,94,56,94,216,95,154,95,178,95,202,95,222,95,
242,96,10,96,34,96,58,96,82,96,106,96,130,96,150,96,170,96,194,96,218,96,
238,98,112,98,136,98,158,98,238,99,96,99,120,99,144,99,168,99,192,99,216,
99,240,100,10,100,36,100,62,100,88,100,122,100,142,100,166,100,190,100,214,
100,238,101,8,101,32,101,56,101,80,101,100,101,124,101,148,101,244,102,108,
103,104,103,140,103,164,103,188,103,212,103,236,104,34,104,88,104,142,104,
214,104,238,105,86,105,162,106,244,107,70,107,118,107,188,107,248,109,10,
109,50,109,112,109,172,109,206,112,188,112,236,114,22,114,30,114,38,114,82,
114,208,114,216,114,224,114,232,115,138,115,146,115,154,116,34,116,42,116,
50,116,116,116,124,116,182,116,190,117,56,117,64,117,72,117,234,117,242,118,
140,119,78,119,102,120,194,120,218,120,242,121,10,121,36,121,64,122,30,122,
212,123,118,124,16,124,186,125,114,125,218,126,124,127,28,127,136,128,94,
128,208,130,6,130,234,130,242,131,112,131,246,132,174,133,52,133,156,134,
4,134,138,135,74,135,188,136,108,136,134,136,160,136,184,136,208,136,232,
137,66,137,198,137,222,138,142,138,150,138,158,138,182,138,190,139,116,139,
224,140,78,140,102,140,126,140,198,140,206,141,66,141,74,141,82,141,224,141,
232,142,210,143,168,144,10,144,34,144,152,145,30,145,38,145,46,145,54,145,
108,145,116,145,124,145,132,146,12,146,156,146,164,146,226,147,78,147,158,
147,250,148,88,148,206,149,44,149,214,150,112,151,26,151,34,151,198,152,86,
152,130,152,254,153,6,153,250,154,160,155,34,155,58,155,200,156,80,157,2,
157,96,157,104,157,178,157,186,157,194,157,250,158,2,158,250,159,2,159,72,
159,160,159,242,160,86,160,184,161,28,161,134,162,24,162,150,163,6,163,32,
163,192,163,216,164,106,164,114,164,232,165,2,165,10,165,228,166,90,166,222,
166,246,167,14,167,100,167,148,167,194,167,218,167,242,168,10,168,34,168,
60,168,86,168,110,168,134,168,168,168,202,168,236,168,248,169,40,169,90,169,
140,169,188,170,18,170,114,170,208,171,12,171,102,171,172,171,238,174,134,
174,168,174,186,174,246,175,46,175,70,175,90,175,126,175,232,176,60,176,252,
178,100,179,50,180,4,180,178,181,136,182,32,182,224,183,78,183,128,183,178,
183,228,184,14,184,60,184,106,184,152,184,198,185,14,185,86,185,166,186,118,
187,22,187,70,187,184,187,214,188,72,188,226,188,250,189,52,190,108,191,92,
191,212,192,8,192,96,192,184,192,230,193,0,193,54,193,116,193,140,193,166,
193,200,193,234,194,12,194,46,194,84,194,122,194,160,194,198,194,248,195,
30,195,72,195,118,195,166,195,224,196,14,196,62,196,120,196,166,196,214,197,
16,197,62,197,110,197,168,197,220,198,18,198,86,198,138,198,194,199,8,199,
62,199,114,199,184,199,238,200,34,200,106,200,178,200,252,201,88,201,112,
201,136,201,160,201,184,201,208,203,232,205,196,207,132,207,146,207,178,207,
206,207,246,208,4,208,18,208,32,208,46,208,60,208,106,208,188,208,238,209,
32,209,114,209,180,210,100,210,228,211,148,212,14,212,166,213,6,213,140,213,
224,214,26,214,102,214,220,215,70,215,164,215,246,216,8,216,68,216,164,217,
34,217,88,218,12,218,74,218,114,218,160,218,200,218,242,219,40,219,94,219,
130,219,208,220,20,220,80,0,0,0,2,0,68,0,0,2,100,5,85,0,3,0,7,0,46,177,1,
0,47,60,178,7,4,8,237,50,177,6,5,220,60,178,3,2,8,237,50,0,177,3,0,47,60,
178,5,4,8,237,50,178,7,6,9,252,60,178,1,2,8,237,50,51,17,33,17,37,33,17,33,
68,2,32,254,36,1,152,254,104,5,85,250,171,68,4,205,0,0,0,2,0,185,0,0,1,127,
5,129,0,3,0,7,1,172,64,158,3,91,2,2,150,7,166,7,2,7,150,57,4,73,4,89,4,3,
4,64,23,27,72,6,4,1,11,4,38,9,1,201,9,217,9,2,118,9,166,9,2,25,9,41,9,2,6,
9,1,215,73,9,1,38,9,1,217,9,1,118,9,1,41,9,1,6,9,1,121,9,1,86,9,1,9,9,1,163,
169,9,1,130,9,1,84,9,100,9,116,9,3,137,9,1,98,9,114,9,2,68,9,84,9,2,34,9,
50,9,2,20,9,1,2,9,1,242,9,1,212,9,228,9,2,178,9,194,9,2,148,9,164,9,2,114,
9,130,9,2,84,9,100,9,2,66,9,1,20,9,36,9,52,9,3,2,9,1,110,9,184,255,128,64,
17,102,109,72,73,9,1,9,64,94,98,72,45,9,61,9,2,9,184,1,0,64,153,85,88,72,
9,128,81,84,72,125,9,141,9,157,9,3,95,9,111,9,2,9,128,71,75,72,9,192,67,70,
72,9,128,63,66,72,125,9,1,91,9,107,9,2,61,9,77,9,2,25,9,41,9,2,11,9,1,55,
235,9,251,9,2,205,9,221,9,2,171,9,187,9,2,9,64,45,48,72,59,9,75,9,91,9,3,
29,9,45,9,2,1,203,9,219,9,235,9,3,159,9,175,9,191,9,3,27,9,43,9,59,9,107,
9,123,9,5,15,9,1,2,127,9,143,9,159,9,191,9,207,9,5,64,9,96,9,2,15,9,31,9,
2,7,112,1,1,95,1,1,1,5,156,4,2,3,0,63,47,253,206,93,93,1,94,93,93,93,95,113,
113,113,113,95,114,114,43,114,114,114,94,93,93,93,93,93,43,43,43,113,113,
43,43,114,43,114,43,94,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,
114,114,114,94,93,93,93,113,113,113,113,114,114,94,93,93,93,93,113,47,94,
93,43,93,237,113,51,47,237,49,48,1,35,3,51,3,53,51,21,1,103,148,24,196,198,
194,1,141,3,244,250,127,201,201,0,0,2,0,87,3,198,2,128,5,129,0,3,0,7,0,104,
64,33,48,3,1,128,3,1,3,16,2,32,2,96,2,112,2,128,2,5,96,2,112,2,2,80,2,96,
2,176,2,192,2,4,2,184,255,192,179,37,40,72,2,184,255,192,64,32,25,28,72,2,
48,7,1,128,7,1,7,111,6,127,6,143,6,3,47,6,63,6,2,6,5,32,0,1,0,6,2,3,0,63,
51,205,93,50,1,47,113,114,205,93,113,220,43,43,93,113,114,205,93,113,49,48,
1,35,3,51,1,35,3,51,2,106,142,20,184,254,121,141,21,184,3,198,1,187,254,69,
1,187,0,0,0,2,0,9,0,0,4,105,5,121,0,27,0,31,0,214,64,134,90,25,1,90,21,1,
68,14,1,68,19,1,54,19,1,68,30,1,38,30,54,30,2,68,23,1,38,23,54,23,2,3,16,
1,8,29,28,21,20,9,20,20,11,14,15,18,19,10,9,19,12,16,4,10,4,1,0,25,24,5,24,
24,27,3,3,7,30,31,22,23,6,23,5,6,4,7,8,11,4,12,13,1,14,29,30,4,13,0,15,28,
31,4,16,17,18,21,22,25,4,17,16,13,1,208,13,1,79,17,143,17,159,17,3,63,17,
79,17,2,13,17,13,17,5,20,23,24,3,19,3,6,9,10,3,5,0,47,23,51,63,23,51,18,57,
57,47,47,93,113,93,113,17,23,51,16,205,23,50,17,23,51,16,205,23,50,1,47,51,
51,135,192,192,192,192,1,23,51,16,135,192,192,192,192,1,47,23,51,135,192,
192,192,192,1,51,16,135,192,192,192,192,49,48,1,93,93,93,93,93,93,93,93,93,
93,1,3,33,21,33,3,35,19,33,3,35,19,35,53,51,19,35,53,33,19,51,3,33,19,51,
3,51,21,33,3,33,19,3,128,78,1,4,254,229,88,110,86,254,149,84,110,84,201,225,
78,252,1,18,89,110,88,1,107,88,110,88,211,253,64,80,1,106,78,3,117,254,143,
108,254,104,1,152,254,104,1,152,108,1,113,108,1,152,254,104,1,152,254,104,
108,254,143,1,113,0,3,0,22,255,114,4,82,5,236,0,48,0,59,0,70,1,46,64,92,154,
14,1,154,13,1,150,68,1,133,39,1,138,57,154,57,2,137,53,153,53,2,132,37,1,
118,6,134,6,150,6,3,70,63,86,63,134,63,3,52,38,100,38,116,38,3,37,2,1,25,
27,1,24,34,55,3,47,9,21,65,3,32,48,1,48,48,16,49,30,111,29,41,111,0,49,32,
49,2,0,49,32,49,48,49,80,49,112,49,5,8,3,49,184,255,192,179,29,35,72,49,184,
255,192,64,117,17,22,72,49,4,111,3,64,16,24,72,3,60,111,16,33,66,115,207,
54,1,157,54,1,5,136,54,1,120,10,216,10,2,199,34,215,34,2,182,34,1,135,34,
167,34,2,215,65,1,166,65,1,119,65,1,60,16,65,34,10,54,41,49,8,0,125,30,141,
30,2,26,30,1,30,24,22,64,19,23,72,22,15,21,47,21,63,21,95,21,4,21,55,9,115,
47,148,4,164,4,2,112,4,128,4,2,5,4,21,4,85,4,101,4,4,46,4,0,0,47,50,50,93,
93,93,205,237,50,47,93,205,43,51,51,93,93,18,23,57,93,93,93,93,93,93,93,93,
95,93,93,237,50,1,47,237,214,43,237,47,43,43,95,94,93,113,253,212,237,17,
18,57,47,114,23,51,205,23,50,49,48,93,0,93,93,93,93,93,93,1,93,93,93,0,93,
1,93,37,46,1,39,55,30,3,23,17,39,46,3,53,52,62,2,55,53,51,21,30,3,23,7,46,
1,39,17,30,5,21,20,14,2,7,21,35,1,52,46,2,39,17,62,3,1,20,30,2,23,17,14,3,
2,6,217,245,34,170,11,46,78,113,78,20,77,148,116,71,64,115,158,95,124,100,
145,102,66,20,174,20,122,117,59,114,103,88,64,36,56,114,175,119,124,1,160,
47,81,106,58,65,108,77,42,253,92,40,70,95,55,72,100,61,27,20,9,185,165,37,
53,87,64,39,5,1,240,5,18,50,83,128,98,84,124,83,44,4,131,131,5,45,80,115,
75,33,94,105,11,254,67,14,30,41,56,79,109,72,77,131,100,62,6,162,2,24,63,
80,51,32,15,254,44,4,31,56,81,2,197,54,74,50,33,14,1,165,4,33,52,68,0,0,0,
0,5,0,73,255,244,6,212,5,141,0,19,0,23,0,43,0,63,0,83,0,212,64,11,118,20,
134,20,2,121,22,137,22,2,42,184,255,232,64,14,8,12,72,37,24,8,12,72,32,24,
8,12,72,26,184,255,232,179,8,12,72,17,184,255,232,179,8,12,72,13,184,255,
232,64,18,8,12,72,7,24,8,12,72,3,24,8,12,72,22,23,20,21,21,184,255,240,64,
84,23,16,23,21,23,21,0,39,54,180,10,178,0,180,0,44,16,44,32,44,3,0,44,64,
44,2,0,44,16,44,32,44,80,44,96,44,112,44,224,44,240,44,8,44,64,180,29,178,
74,180,15,39,1,239,39,255,39,2,39,64,10,13,72,39,79,182,34,184,69,182,24,
4,22,3,21,18,49,182,15,184,59,182,5,19,0,63,237,244,237,63,63,63,237,244,
237,1,47,43,113,114,237,244,237,47,93,113,114,253,244,237,17,18,57,57,47,
47,56,56,17,51,17,51,49,48,0,43,43,43,43,43,43,43,43,1,93,93,1,20,14,2,35,
34,46,2,53,52,62,2,51,50,30,2,1,35,1,51,37,50,30,2,21,20,14,2,35,34,46,2,
53,52,62,2,1,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,52,46,2,35,34,14,
2,21,20,30,2,51,50,62,2,6,212,51,87,116,66,66,115,85,49,48,86,117,68,66,115,
85,50,251,59,155,3,154,157,251,223,64,114,86,49,50,85,116,66,67,116,85,49,
49,86,118,4,250,22,43,63,40,42,64,44,22,23,43,63,41,39,63,44,24,251,240,22,
42,62,40,43,65,44,22,23,43,64,42,38,62,44,24,1,178,125,171,105,45,45,104,
171,126,133,174,103,41,41,103,174,253,201,5,129,12,41,102,172,131,126,172,
107,46,46,106,172,127,131,172,102,41,252,37,99,131,78,32,33,78,131,98,95,
128,79,34,34,79,128,2,124,98,130,78,32,33,78,130,97,95,130,79,34,34,79,130,
0,0,3,0,72,255,236,5,54,5,137,0,57,0,73,0,89,1,20,64,73,137,1,1,140,36,1,
123,42,139,42,2,98,82,114,82,130,82,3,102,71,1,127,78,1,91,78,1,73,43,89,
43,105,43,3,54,48,134,48,2,37,40,1,44,35,124,35,140,35,3,28,5,44,5,60,5,92,
5,4,10,10,26,10,42,10,3,10,2,26,2,42,2,3,31,184,255,232,64,56,9,13,72,10,
25,26,25,42,25,3,48,41,38,69,4,54,66,73,23,33,73,58,45,44,140,74,1,74,77,
18,3,23,3,58,44,80,23,1,3,44,1,23,58,44,44,58,23,3,13,15,54,1,175,54,1,54,
184,255,192,64,61,9,12,72,54,80,72,63,13,79,13,2,13,143,3,1,141,77,1,98,69,
114,69,2,54,69,70,69,2,3,74,48,41,77,44,38,18,69,9,8,63,81,144,28,1,192,28,
1,15,28,63,28,2,28,85,81,8,22,51,80,0,22,0,63,237,63,237,47,93,93,113,237,
18,23,57,93,93,93,93,1,47,93,237,47,43,93,113,18,23,57,47,47,47,0,93,1,93,
17,18,57,17,23,57,93,16,205,16,237,16,237,17,23,57,49,48,93,43,0,93,93,93,
93,1,93,93,93,0,93,93,93,93,1,93,0,93,93,5,34,38,39,14,3,35,34,46,2,53,52,
62,2,55,46,3,53,52,62,2,51,50,30,2,21,20,14,2,7,30,1,23,62,1,55,23,14,1,7,
30,1,51,50,54,55,21,14,1,1,52,46,2,35,34,6,21,20,22,23,62,3,3,46,1,39,14,
1,21,20,30,2,51,50,62,2,4,169,96,144,58,30,76,93,109,64,117,171,110,53,51,
91,126,75,18,29,22,12,40,85,133,93,73,123,90,50,66,112,148,83,62,146,85,61,
81,29,145,35,107,70,53,106,49,32,59,26,28,75,254,150,27,48,69,42,96,100,37,
28,65,116,86,50,74,89,164,66,113,123,35,72,109,73,44,79,68,55,12,66,61,26,
48,38,23,60,105,143,83,79,129,105,83,33,34,77,78,78,35,66,115,85,49,38,72,
106,68,75,117,92,75,33,114,201,97,90,199,121,43,139,227,103,54,44,7,9,135,
11,11,4,121,37,60,43,23,103,91,59,129,56,26,55,65,79,252,158,105,230,122,
48,148,105,55,95,71,41,19,30,38,0,0,1,0,104,3,198,1,32,5,129,0,3,0,33,64,
19,48,3,1,128,3,1,3,16,2,32,2,2,2,32,0,1,0,2,3,0,63,205,93,1,47,93,205,93,
113,49,48,1,35,3,51,1,10,141,21,184,3,198,1,187,0,1,0,127,254,88,2,158,5,
204,0,22,0,66,64,45,135,13,1,135,9,1,88,20,1,88,2,1,17,24,14,17,72,5,24,14,
17,72,16,6,16,16,6,128,6,2,6,11,242,0,0,16,0,32,0,3,0,16,27,5,0,0,63,63,1,
47,93,237,204,93,56,50,49,48,43,43,93,93,93,93,19,52,62,2,55,51,14,3,21,20,
30,2,23,35,46,3,53,127,42,90,140,97,174,94,137,88,43,43,88,137,94,174,97,
140,90,42,2,20,139,254,234,220,105,105,221,235,254,139,139,254,236,220,105,
105,220,234,253,140,0,0,0,1,0,12,254,88,2,43,5,204,0,22,0,72,64,13,136,13,
1,136,9,1,87,20,1,87,2,1,17,184,255,232,179,14,17,72,5,184,255,232,180,14,
17,72,16,6,184,255,240,64,16,31,6,143,6,2,6,0,242,143,11,1,11,16,0,5,27,0,
63,63,1,47,93,253,204,93,56,50,49,48,43,43,93,93,93,93,1,20,14,2,7,35,62,
3,53,52,46,2,39,51,30,3,21,2,43,42,90,140,97,174,94,137,88,43,43,88,137,94,
174,97,140,90,42,2,16,140,253,234,220,105,105,220,236,254,139,139,254,235,
221,105,105,220,234,254,139,0,0,0,0,1,0,33,2,178,2,253,5,129,0,14,0,107,64,
75,77,5,93,5,109,5,3,75,4,91,4,107,4,3,66,8,82,8,2,67,7,83,7,2,0,6,12,3,13,
95,4,1,15,4,1,4,3,32,2,48,2,2,2,14,47,10,63,10,2,10,9,8,191,13,207,13,2,16,
13,32,13,2,13,240,5,1,223,5,1,0,5,1,5,14,3,0,63,204,93,93,93,1,47,93,93,204,
51,204,93,221,204,93,51,204,113,114,18,23,57,49,48,93,93,93,93,1,37,23,5,
23,7,11,1,39,55,37,55,5,3,51,1,200,1,8,45,254,230,185,119,150,156,119,189,
254,232,45,1,11,12,136,4,90,103,132,73,250,72,1,2,255,0,72,248,73,134,107,
1,41,0,0,0,1,0,100,0,180,4,71,4,158,0,11,0,71,64,46,211,11,1,133,11,1,220,
4,1,138,4,1,9,1,170,6,16,2,32,2,2,2,217,2,1,56,2,136,2,2,2,0,4,173,9,214,
7,1,55,7,135,7,2,7,5,179,0,63,51,93,93,51,237,50,50,93,93,1,47,93,51,237,
50,49,48,93,93,93,93,1,17,35,17,33,53,33,17,51,17,33,21,2,159,147,254,88,
1,168,147,1,168,2,96,254,84,1,172,146,1,172,254,84,146,0,0,1,0,184,254,250,
1,129,0,219,0,12,0,78,185,0,4,255,224,183,11,17,72,10,151,0,150,7,184,255,
192,64,22,9,17,72,7,128,12,144,12,2,64,12,80,12,176,12,3,144,12,160,12,2,
12,184,255,192,64,14,38,41,72,12,64,13,16,72,12,7,168,0,155,11,0,47,253,228,
1,47,43,43,93,113,114,51,43,253,237,49,48,43,37,21,20,14,2,7,35,62,1,53,35,
53,1,129,9,20,29,20,123,45,49,88,219,168,53,87,75,66,32,65,132,65,219,0,0,
0,0,1,0,91,1,208,2,79,2,112,0,3,0,33,64,20,0,2,64,2,112,2,3,2,0,0,187,159,
1,207,1,2,47,1,1,1,0,47,93,113,237,1,47,47,93,49,48,19,53,33,21,91,1,244,
1,208,160,160,0,0,0,1,0,187,0,0,1,126,0,219,0,3,0,46,64,32,3,150,0,0,144,
0,2,64,0,80,0,176,0,224,0,240,0,5,144,0,160,0,2,0,64,13,16,72,0,1,155,0,0,
47,237,1,47,43,93,113,114,237,49,48,51,53,51,21,187,195,219,219,0,1,0,0,255,
236,2,57,5,204,0,3,0,51,64,26,121,0,137,0,2,1,24,13,17,72,41,2,1,2,16,0,2,
16,2,32,2,128,2,4,2,0,184,255,240,180,0,1,0,0,19,0,63,63,1,47,56,205,93,56,
49,48,93,43,93,21,1,51,1,1,155,158,254,105,20,5,224,250,32,0,0,2,0,80,255,
236,4,35,5,150,0,19,0,39,0,112,64,80,89,37,105,37,2,70,33,86,33,102,33,3,
86,27,102,27,2,89,23,105,23,2,4,18,1,118,17,134,17,2,121,13,137,13,2,11,12,
1,11,8,1,121,7,137,7,2,118,3,134,3,2,4,2,1,7,0,110,64,144,20,160,20,2,20,
41,128,30,110,63,10,1,10,25,115,15,7,35,115,5,25,0,63,237,63,237,1,47,93,
237,26,16,220,93,26,237,49,48,94,93,93,93,93,93,93,93,93,93,93,93,93,1,20,
2,14,1,35,34,46,1,2,53,52,18,62,1,51,50,30,1,18,7,52,46,2,35,34,14,2,21,20,
30,2,51,50,62,2,4,35,77,133,180,102,103,178,131,75,75,132,180,106,101,177,
132,76,183,40,78,113,72,76,116,79,40,41,79,114,73,71,114,79,43,2,193,203,
254,235,171,74,74,170,1,21,204,213,1,23,166,67,67,166,254,233,213,168,223,
133,55,56,133,223,167,162,222,135,59,59,135,222,0,1,0,156,0,0,4,15,5,129,
0,10,0,94,64,32,32,9,128,9,2,9,9,8,110,2,144,4,1,4,47,1,143,1,2,1,1,4,6,3,
0,2,16,2,2,7,2,5,184,255,240,64,26,16,22,72,68,5,84,5,100,5,3,5,4,3,16,16,
22,72,4,3,6,6,8,1,116,0,24,0,63,237,50,63,51,51,43,47,51,93,43,1,47,94,93,
23,51,47,93,47,93,16,237,50,47,93,49,48,51,53,33,17,5,53,37,51,17,33,21,156,
1,103,254,194,1,77,166,1,87,153,4,60,227,170,229,251,24,153,0,0,0,1,0,103,
0,0,4,12,5,150,0,40,0,161,64,77,117,4,1,117,26,133,26,2,122,16,138,16,2,101,
37,1,86,37,1,41,33,89,33,105,33,3,105,35,1,28,35,1,25,21,1,117,27,133,27,
2,6,27,1,39,29,110,64,8,64,38,42,72,64,8,1,143,8,1,8,42,128,18,110,19,116,
38,132,38,2,19,38,16,0,32,0,2,0,184,255,192,64,31,30,38,72,0,8,38,142,18,
1,92,18,108,18,124,18,3,10,18,26,18,2,18,13,115,24,7,1,38,116,0,24,0,63,237,
57,63,237,51,93,93,93,18,57,1,47,43,93,51,51,93,47,237,26,16,220,93,113,43,
26,237,50,49,48,93,93,0,93,93,93,93,1,93,93,0,93,93,93,51,53,62,5,53,52,46,
2,35,34,14,2,7,39,62,3,51,50,30,2,21,20,14,6,7,33,21,103,51,147,162,159,128,
79,36,68,95,58,54,95,74,47,7,184,9,66,116,163,107,105,164,113,60,51,85,112,
122,124,109,86,24,2,223,127,117,179,145,124,124,136,86,60,91,62,31,30,60,
89,59,17,76,134,101,58,50,98,144,94,71,128,116,108,103,101,102,105,57,153,
0,0,0,0,1,0,78,255,236,4,25,5,150,0,59,0,216,64,149,122,3,138,3,2,117,2,133,
2,2,117,58,133,58,2,117,51,133,51,2,117,47,133,47,2,117,13,133,13,2,122,37,
138,37,2,91,17,107,17,2,26,41,1,21,8,1,118,46,134,46,2,7,46,1,73,39,1,38,
110,54,25,49,95,25,111,25,2,39,25,39,25,10,19,32,110,49,49,0,110,64,31,19,
47,19,159,19,3,144,19,1,19,61,128,11,110,239,10,1,63,10,1,10,54,25,116,26,
26,16,141,38,1,92,38,108,38,124,38,3,10,38,26,38,2,38,35,115,44,7,16,115,
129,11,1,83,11,99,11,115,11,3,20,11,1,5,11,1,11,5,25,0,63,51,93,93,93,93,
237,63,237,51,93,93,93,18,57,47,237,57,1,47,93,113,237,26,16,220,93,113,26,
237,50,47,237,17,18,57,57,47,47,93,17,18,57,237,113,49,48,0,93,93,93,93,1,
93,0,93,93,1,93,93,93,93,0,93,1,20,14,2,35,34,46,2,39,55,30,3,51,50,54,53,
52,46,2,43,1,53,51,50,62,2,53,52,38,35,34,6,7,39,62,3,51,50,30,2,21,20,14,
2,7,21,30,3,4,25,63,121,179,115,131,179,116,58,9,186,8,43,74,108,74,136,155,
69,103,121,51,102,98,51,110,91,59,133,131,119,147,12,181,11,80,123,158,89,
118,170,108,51,34,72,111,78,85,126,82,41,1,133,97,152,105,55,65,107,137,73,
17,56,92,66,36,134,132,78,95,53,18,156,21,55,94,73,113,131,122,111,14,93,
138,91,45,59,101,136,77,62,108,86,62,16,4,9,59,88,112,0,0,2,0,47,0,0,4,55,
5,129,0,10,0,23,0,117,64,80,154,15,1,153,6,1,136,6,1,133,16,149,16,2,118,
16,1,24,22,1,118,22,134,22,150,22,3,22,5,64,12,21,72,5,91,10,107,10,123,10,
3,10,8,1,111,23,6,31,2,1,112,2,224,2,2,0,2,16,2,48,2,80,2,224,2,5,8,2,0,4,
115,8,22,22,1,11,6,6,1,24,0,63,63,51,18,57,47,51,237,50,1,47,94,93,113,114,
51,51,237,50,50,93,47,43,51,93,113,49,48,93,93,93,93,0,93,1,17,35,17,33,53,
1,51,17,51,21,1,14,3,7,1,14,3,7,33,3,113,170,253,104,2,133,189,198,254,144,
2,16,20,21,8,254,151,5,19,20,20,6,1,242,1,63,254,193,1,63,140,3,182,252,76,
142,3,119,5,29,36,37,12,253,236,8,26,27,26,7,0,1,0,82,255,236,4,29,5,129,
0,44,0,181,64,28,86,13,102,13,134,13,3,85,2,101,2,2,90,3,106,3,2,85,43,101,
43,2,85,42,101,42,2,38,184,255,216,64,89,14,17,72,21,8,1,6,10,1,25,36,153,
36,2,137,36,217,36,2,3,68,33,1,6,35,32,14,17,72,35,11,0,110,64,31,21,1,47,
21,159,21,2,144,21,1,21,46,128,36,31,37,110,33,32,32,11,110,208,10,1,63,10,
1,10,26,115,40,40,16,36,116,33,6,16,115,115,11,131,11,2,103,11,1,22,11,1,
11,5,25,0,63,51,93,93,93,237,63,237,18,57,47,237,1,47,93,113,237,51,47,51,
237,50,50,26,16,220,93,113,114,26,237,17,57,43,49,48,95,113,95,113,114,0,
93,1,93,0,43,93,1,93,0,93,1,93,0,93,1,20,14,2,35,34,46,2,39,55,30,3,51,50,
62,2,53,52,46,2,35,34,14,2,7,35,19,33,21,33,3,62,1,51,50,30,2,4,29,64,126,
187,123,111,165,114,67,14,182,11,40,69,101,72,70,114,81,44,42,78,113,72,45,
76,65,53,23,176,47,3,33,253,131,27,48,144,99,105,168,118,64,1,203,106,176,
127,70,52,91,122,70,21,40,75,59,35,43,84,122,79,65,109,79,44,16,28,37,20,
2,246,153,254,65,37,53,64,117,162,0,0,0,0,2,0,104,255,236,4,25,5,150,0,36,
0,56,0,175,64,48,140,21,1,122,22,138,22,2,89,7,105,7,2,90,3,106,3,122,3,3,
84,2,100,2,2,84,35,100,35,116,35,3,84,34,100,34,116,34,3,53,30,69,30,2,133,
50,1,50,184,255,240,64,45,10,13,72,132,26,1,37,26,53,26,69,26,117,26,4,22,
26,1,21,111,20,20,0,110,64,47,37,159,37,2,144,37,1,37,58,128,47,29,110,16,
10,32,10,2,10,184,255,192,64,24,30,38,72,10,29,42,117,32,32,52,24,115,25,
21,153,21,2,21,15,7,52,115,5,25,0,63,237,63,51,93,237,18,57,47,237,50,1,47,
43,93,237,50,26,16,220,93,113,26,237,50,47,237,49,48,93,93,93,43,93,0,93,
93,1,93,93,0,93,93,93,93,1,20,14,2,35,34,46,1,2,53,52,18,62,1,51,50,30,2,
23,7,46,1,35,34,14,2,21,62,1,51,50,30,2,7,52,46,2,35,34,14,2,21,20,30,2,51,
50,62,2,4,25,59,115,170,111,123,184,122,61,69,130,187,118,72,126,103,78,23,
172,28,123,81,74,120,84,45,49,178,115,96,156,111,61,183,36,72,106,70,49,100,
81,51,40,75,106,66,65,103,72,38,1,205,106,177,127,71,94,177,1,1,164,188,1,
28,190,96,30,67,110,80,31,91,81,70,139,210,140,91,95,62,117,167,112,73,118,
83,45,29,65,106,76,78,135,100,58,45,85,122,0,0,1,0,105,0,0,4,12,5,129,0,14,
0,68,64,45,122,11,138,11,2,105,11,1,5,110,6,6,0,80,12,1,16,12,32,12,2,12,
11,95,0,1,0,0,32,0,64,0,96,0,128,0,5,0,0,12,116,13,6,5,24,0,63,63,237,50,
1,47,93,113,51,47,93,113,18,57,47,237,49,48,93,93,1,6,10,2,21,35,52,26,2,
55,33,53,33,4,12,106,178,128,71,188,80,136,180,101,253,11,3,163,4,239,162,
254,213,254,209,254,193,180,169,1,69,1,57,1,46,147,153,0,0,0,0,3,0,89,255,
236,4,26,5,150,0,41,0,61,0,81,0,191,64,132,117,40,133,40,2,117,33,133,33,
2,117,29,133,29,2,117,28,133,28,2,117,24,133,24,2,122,23,138,23,2,122,19,
138,19,2,122,12,1,122,8,138,8,2,122,7,138,7,2,122,3,138,3,2,117,2,133,2,2,
85,69,101,69,2,85,75,101,75,2,90,65,106,65,2,52,110,21,42,110,31,15,36,31,
79,21,1,21,31,21,31,10,0,110,64,15,62,31,62,2,31,62,47,62,159,62,3,144,62,
1,62,83,128,72,110,208,10,1,10,36,15,67,117,57,57,77,47,117,26,7,77,117,5,
25,0,63,237,63,237,18,57,47,237,57,57,1,47,113,237,26,16,220,93,113,114,26,
237,17,57,57,47,47,113,18,57,57,16,237,16,237,49,48,93,93,93,93,0,93,93,1,
93,93,93,93,0,93,93,1,93,93,93,1,20,14,2,35,34,46,2,53,52,62,2,55,53,46,3,
53,52,62,2,51,50,30,2,21,20,14,2,7,21,30,3,3,52,46,2,35,34,14,2,21,20,30,
2,51,50,62,2,19,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,4,26,57,117,182,
124,124,181,119,57,47,79,101,54,59,93,63,33,57,112,166,109,115,169,111,54,
33,63,93,61,61,104,76,44,222,27,62,100,73,71,98,63,28,22,58,102,80,85,103,
55,17,35,28,68,115,86,79,111,69,32,32,70,114,81,82,112,68,29,1,137,90,151,
110,62,62,109,151,89,77,120,87,53,9,4,14,62,87,106,59,74,131,99,57,58,99,
132,74,58,106,87,61,12,4,10,53,87,120,2,76,53,88,63,35,35,63,88,53,42,88,
72,46,46,72,88,253,163,51,95,73,45,45,74,97,52,65,107,77,42,42,77,109,0,0,
0,2,0,96,255,236,4,18,5,150,0,36,0,56,0,190,64,105,169,39,1,163,11,1,149,
12,165,12,2,170,17,1,153,17,1,116,35,132,35,2,116,32,132,32,148,32,3,122,
31,138,31,154,31,3,122,27,138,27,154,27,3,123,26,139,26,155,26,3,90,40,106,
40,2,89,2,105,2,2,16,24,10,13,72,54,8,1,37,0,110,47,19,63,19,2,79,19,191,
19,2,0,19,32,19,48,19,64,19,176,19,5,7,19,58,11,111,10,10,47,110,32,29,1,
29,184,255,192,64,27,32,38,72,29,19,52,115,95,24,111,24,2,24,24,5,42,115,
34,7,14,115,23,11,1,11,5,25,0,63,51,93,237,63,237,17,57,47,93,237,50,1,47,
43,93,237,51,47,237,16,220,94,93,113,114,237,51,49,48,93,43,93,93,0,93,1,
93,93,0,93,93,1,93,93,0,93,93,1,93,1,20,2,14,1,35,34,46,2,39,55,30,1,51,50,
62,2,55,14,3,35,34,46,2,53,52,62,2,51,50,18,7,52,46,2,35,34,14,2,21,20,30,
2,51,50,62,2,4,18,71,132,189,118,81,130,102,72,22,172,28,119,91,73,121,85,
48,2,21,73,93,108,55,96,155,108,59,63,120,175,111,235,242,196,37,73,107,70,
65,104,72,39,35,70,104,69,50,103,83,53,2,221,188,254,229,188,94,33,70,112,
79,27,91,85,69,138,208,140,47,74,51,27,69,124,175,107,109,176,123,66,254,
164,175,78,138,102,59,46,85,122,75,71,122,89,51,34,70,107,0,0,0,0,2,0,187,
0,0,1,126,4,58,0,3,0,7,0,54,64,36,3,7,150,0,0,4,144,4,2,64,4,80,4,224,4,240,
4,4,144,4,160,4,2,4,64,13,16,72,4,5,156,4,0,156,1,15,0,63,237,47,237,1,47,
43,93,113,114,51,237,50,49,48,19,53,51,21,3,53,51,21,187,195,195,195,3,107,
207,207,252,149,207,207,0,0,0,2,0,184,254,250,1,129,4,58,0,12,0,16,0,89,185,
0,4,255,224,64,10,11,17,72,16,10,151,0,150,13,7,184,255,192,64,22,9,17,72,
7,128,12,144,12,2,64,12,80,12,176,12,3,144,12,160,12,2,12,184,255,192,64,
18,38,41,72,12,64,13,16,72,12,13,156,14,15,7,168,0,156,11,0,47,253,228,63,
237,1,47,43,43,93,113,114,51,43,51,253,237,51,49,48,43,37,21,20,14,2,7,35,
62,1,53,35,53,17,53,51,21,1,129,9,20,29,20,123,45,49,88,195,207,156,53,87,
75,66,32,65,132,65,207,2,156,207,207,0,0,1,0,101,0,154,4,72,4,170,0,6,0,106,
185,0,5,255,216,64,17,18,22,72,3,40,18,22,72,0,40,18,22,72,137,0,1,1,184,
255,216,64,51,18,22,72,134,1,1,6,0,2,32,2,80,2,112,2,4,2,32,0,1,0,63,6,127,
6,143,6,3,6,48,2,112,2,128,2,3,2,1,0,15,4,63,4,111,4,159,4,207,4,5,4,0,25,
47,93,51,51,205,93,205,93,1,24,47,93,47,93,51,49,48,0,93,43,93,43,43,43,19,
53,1,21,9,1,21,101,3,227,252,166,3,90,2,59,205,1,162,154,254,146,254,145,
153,0,0,0,0,2,0,100,1,88,4,71,3,236,0,3,0,7,0,70,64,49,7,64,2,96,2,2,0,2,
32,2,112,2,208,2,4,2,4,223,0,1,32,0,1,0,4,173,31,5,47,5,95,5,111,5,223,5,
5,5,0,173,80,1,208,1,2,15,1,1,1,0,47,93,93,237,222,93,237,1,47,93,93,51,47,
93,113,51,49,48,19,53,33,21,1,53,33,21,100,3,227,252,29,3,227,3,88,148,148,
254,0,148,148,0,0,0,0,1,0,101,0,154,4,72,4,170,0,6,0,106,185,0,1,255,216,
64,17,18,22,72,3,40,18,22,72,6,40,18,22,72,137,6,1,5,184,255,216,64,51,18,
22,72,134,5,1,0,6,32,6,80,6,112,6,4,6,3,32,0,1,0,6,5,48,4,112,4,128,4,3,4,
63,0,127,0,143,0,3,0,15,2,63,2,111,2,159,2,207,2,5,2,0,25,47,93,205,93,205,
93,51,51,1,24,47,93,51,47,93,49,48,0,93,43,93,43,43,43,55,53,9,1,53,1,21,
101,3,90,252,166,3,227,154,153,1,111,1,110,154,254,94,205,0,2,0,84,0,0,4,
39,5,150,0,37,0,41,0,137,64,68,117,36,133,36,2,117,35,133,35,2,90,26,106,
26,2,90,21,1,90,14,122,14,138,14,3,90,13,122,13,138,13,3,58,6,74,6,2,9,72,
10,10,176,41,192,41,2,41,150,38,38,19,27,70,28,0,70,0,19,32,19,64,19,144,
19,176,19,5,19,184,255,192,64,23,38,44,72,19,19,33,95,10,143,10,2,10,39,156,
38,76,27,1,27,24,95,33,4,0,63,237,51,93,47,253,198,93,17,57,1,47,43,93,237,
47,237,18,57,47,237,113,51,47,237,49,48,0,93,1,93,93,0,93,93,93,1,93,1,20,
14,6,7,35,62,7,53,52,46,2,35,34,6,7,39,62,3,51,50,30,2,1,53,51,21,4,39,37,
62,79,82,79,63,39,1,175,2,39,62,78,80,77,60,37,42,77,109,67,140,164,14,184,
11,67,121,179,122,114,178,123,64,253,143,195,4,8,71,108,85,67,60,58,68,83,
55,69,104,80,63,57,57,70,88,59,59,92,63,32,140,122,12,84,149,112,65,56,103,
148,251,157,201,201,0,0,0,0,2,0,161,254,229,7,110,5,204,0,93,0,114,1,101,
64,255,122,17,138,17,2,117,15,133,15,2,117,27,133,27,2,121,47,137,47,2,116,
38,132,38,2,102,38,1,99,70,1,86,69,102,69,2,123,26,139,26,2,73,26,1,74,56,
90,56,106,56,3,59,102,1,82,63,1,54,63,70,63,2,82,64,1,38,64,54,64,70,64,3,
131,3,1,37,3,53,3,69,3,3,37,2,53,2,69,2,133,2,4,25,8,57,8,2,11,8,1,11,8,27,
8,2,8,32,12,17,72,22,92,102,92,134,92,3,80,58,96,58,2,5,58,21,58,53,58,69,
58,4,137,57,1,93,57,1,10,57,26,57,2,9,7,1,125,52,141,52,2,11,52,75,52,2,10,
22,26,22,42,22,3,104,212,24,37,41,211,10,112,34,132,72,1,72,10,49,80,24,1,
80,24,1,24,10,24,10,82,0,210,64,95,49,111,49,2,143,49,159,49,2,49,116,128,
61,210,0,82,16,82,32,82,3,82,44,213,5,5,107,214,19,99,214,29,36,29,47,19,
63,19,79,19,3,32,29,48,29,64,29,3,19,29,19,29,77,54,214,89,0,149,71,1,71,
66,214,77,0,47,237,51,93,63,237,18,57,57,47,47,93,93,17,51,16,237,16,237,
51,47,237,1,47,93,237,26,16,220,93,113,26,237,18,57,57,47,47,93,114,17,18,
57,93,50,50,16,237,50,16,237,49,48,93,93,93,93,0,93,93,93,1,93,93,93,43,93,
0,93,93,1,93,93,93,0,93,93,1,93,93,0,93,93,1,93,93,0,93,93,1,93,93,93,0,93,
1,93,0,93,1,20,14,2,35,34,46,2,53,52,54,55,35,14,3,35,34,46,2,53,52,62,2,
51,50,30,2,23,51,55,51,3,14,1,21,20,22,51,50,62,2,53,52,46,2,35,34,14,4,21,
20,30,2,51,50,62,2,55,23,14,3,35,34,36,38,2,53,52,18,62,2,36,51,50,4,22,18,
5,52,46,2,35,34,14,2,21,20,22,51,50,62,2,55,62,1,7,110,67,118,165,97,56,79,
50,22,2,1,6,24,69,93,117,71,84,125,81,40,71,132,185,114,60,96,73,54,18,6,
39,156,116,19,18,43,38,62,107,79,45,83,161,238,156,134,227,184,139,94,48,
86,165,243,158,105,182,152,120,44,55,50,135,166,196,111,190,254,217,203,105,
63,118,170,215,0,255,144,201,1,36,191,92,253,162,34,63,89,56,86,130,87,45,
95,99,69,120,96,70,18,9,14,2,243,144,239,172,96,27,47,64,38,15,43,12,45,89,
69,43,58,103,141,83,120,221,169,102,27,48,67,40,160,254,6,84,120,49,48,46,
81,142,192,112,129,222,162,92,64,116,161,192,219,115,141,238,171,96,33,48,
57,24,112,30,63,52,33,115,206,1,28,169,139,1,0,220,180,128,70,118,200,254,
248,155,50,84,60,33,85,138,173,87,120,136,62,102,132,71,36,80,0,0,0,0,2,0,
4,0,0,5,82,5,129,0,7,0,20,1,18,64,206,102,2,118,2,134,2,3,102,19,118,19,134,
19,3,105,1,121,1,137,1,3,105,20,121,20,137,20,3,115,6,131,6,2,101,6,1,124,
5,140,5,2,106,5,1,122,0,138,0,2,57,0,89,0,105,0,3,117,3,133,3,2,54,3,86,3,
102,3,3,90,4,1,72,4,1,85,7,1,71,7,1,19,2,3,1,20,0,21,6,37,6,53,6,3,6,6,1,
230,6,246,6,2,26,5,42,5,58,5,3,9,5,1,233,5,249,5,2,6,5,13,13,4,26,0,42,0,
58,0,3,9,0,1,233,0,249,0,2,0,16,7,32,7,48,7,3,32,7,1,7,7,22,21,3,37,3,53,
3,3,6,3,1,230,3,246,3,2,3,175,4,191,4,2,4,80,22,176,22,2,48,22,96,22,144,
22,192,22,240,22,5,47,22,1,1,2,95,20,19,19,118,13,1,13,5,3,4,0,18,0,63,50,
63,51,93,57,47,51,237,50,1,93,93,113,47,93,51,93,113,113,17,51,47,93,113,
51,93,113,113,18,57,61,47,51,51,93,113,113,93,113,113,18,57,57,18,57,57,49,
48,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,33,3,33,3,35,1,51,9,1,
46,3,39,14,3,7,3,33,4,143,161,253,126,162,198,2,63,217,2,54,253,174,16,29,
22,15,1,2,14,23,29,15,180,2,15,1,156,254,100,5,129,250,127,4,2,40,82,67,45,
5,5,46,68,82,40,254,49,0,3,0,168,0,0,4,234,5,129,0,22,0,33,0,46,0,155,64,
108,155,24,171,24,2,147,32,1,133,32,1,147,45,1,117,45,133,45,2,122,36,138,
36,154,36,3,5,11,21,11,37,11,3,6,2,22,2,38,2,3,171,18,1,159,18,1,107,18,123,
18,139,18,3,18,28,13,90,23,64,13,17,72,23,23,41,0,90,64,31,34,47,34,2,175,
34,1,34,48,128,28,41,90,0,6,16,6,64,6,3,7,6,18,40,95,127,28,1,28,28,41,27,
95,7,3,41,95,6,18,0,63,237,63,237,18,57,47,113,237,57,1,47,94,93,237,50,26,
16,220,93,113,26,237,18,57,47,43,237,17,57,93,93,93,49,48,93,93,0,93,93,93,
93,93,93,1,20,14,2,35,33,17,33,50,30,2,21,20,14,2,7,30,3,1,52,38,35,33,17,
33,50,62,2,19,52,46,2,35,33,17,33,50,62,2,4,234,84,142,188,104,253,196,2,
0,117,184,128,67,33,67,101,67,85,131,88,46,254,238,156,148,254,191,1,65,84,
116,72,32,81,49,92,129,80,254,156,1,115,73,123,89,50,1,141,107,151,95,44,
5,129,39,84,129,90,59,104,85,61,15,10,58,90,119,2,66,114,98,254,66,33,61,
86,253,190,67,94,60,28,254,4,24,60,100,0,1,0,104,255,236,5,121,5,150,0,39,
0,173,64,79,121,14,137,14,2,117,13,133,13,2,123,37,139,37,2,106,38,1,124,
36,140,36,2,106,36,1,106,28,1,85,7,1,90,3,1,42,29,106,29,2,134,23,1,42,23,
106,23,2,5,8,21,8,2,5,2,21,2,2,5,91,80,26,96,26,2,175,26,191,26,2,32,26,1,
15,26,1,26,34,16,184,255,192,64,42,7,13,72,16,16,41,32,41,1,79,35,1,35,35,
0,95,31,4,0,15,16,15,2,48,15,64,15,112,15,128,15,192,15,208,15,6,15,15,10,
95,21,19,0,63,237,51,47,93,113,63,237,51,47,93,1,93,17,51,47,43,51,47,93,
93,93,113,237,49,48,93,93,93,93,93,0,93,93,1,93,93,93,93,0,93,93,1,93,1,34,
14,2,21,20,30,2,51,50,62,2,55,23,14,3,35,34,36,38,2,53,52,18,54,36,51,50,
4,23,7,46,3,3,24,120,185,125,64,69,129,187,117,82,135,109,86,33,156,38,112,
151,191,118,171,254,255,173,86,91,175,1,0,164,225,1,46,71,181,20,68,102,137,
4,250,80,148,208,127,127,211,152,84,43,78,107,65,78,79,136,100,57,109,195,
1,12,159,165,1,10,187,101,176,173,60,50,91,70,42,0,2,0,168,0,0,5,101,5,129,
0,12,0,25,0,100,64,70,169,24,1,123,24,1,172,23,1,27,23,43,23,59,23,123,23,
4,169,16,1,27,16,43,16,59,16,123,16,4,123,15,1,153,3,1,121,2,1,0,90,64,47,
13,1,13,27,128,64,27,1,20,90,0,6,16,6,64,6,3,7,6,19,95,7,3,20,95,6,18,0,63,
237,63,237,1,47,94,93,237,93,26,16,220,113,26,237,49,48,93,93,93,93,93,93,
93,93,93,1,20,2,14,1,35,33,17,33,50,4,22,18,7,52,46,2,35,33,17,33,50,62,2,
5,101,106,184,251,145,253,241,1,210,163,1,19,198,111,192,82,148,206,123,254,
241,1,58,111,189,138,78,2,207,176,254,243,181,93,5,129,81,169,254,252,180,
143,203,130,61,251,177,72,142,212,0,0,1,0,168,0,0,4,254,5,129,0,11,0,77,181,
7,3,7,3,0,10,184,255,192,64,37,7,11,72,10,10,13,5,9,90,0,0,16,0,64,0,3,7,
0,32,13,1,8,95,127,5,1,5,5,9,4,95,1,3,9,95,0,18,0,63,237,63,237,18,57,47,
113,237,1,93,47,94,93,237,50,17,51,47,43,18,57,57,47,47,49,48,51,17,33,21,
33,17,33,21,33,17,33,21,168,4,45,252,146,3,50,252,206,3,151,5,129,156,254,
60,154,254,21,156,0,0,1,0,168,0,0,4,145,5,129,0,9,0,105,185,0,2,255,192,182,
13,24,72,2,2,6,8,184,255,192,64,58,7,12,72,8,8,11,1,5,90,0,6,16,6,64,6,3,
7,6,48,11,1,4,95,239,1,1,15,1,63,1,111,1,127,1,159,1,175,1,207,1,223,1,8,
8,1,64,23,30,72,1,1,5,0,95,7,3,5,18,0,63,63,237,18,57,47,43,94,93,113,237,
1,93,47,94,93,237,50,17,51,47,43,18,57,47,43,49,48,1,17,33,21,33,17,35,17,
33,21,1,103,3,18,252,238,191,3,233,4,229,253,244,158,253,197,5,129,156,0,
1,0,103,255,236,5,160,5,150,0,45,0,185,64,130,134,43,1,106,43,1,66,37,82,
37,2,5,24,21,24,85,24,3,86,23,1,86,19,1,5,18,21,18,85,18,3,122,12,138,12,
2,89,12,105,12,2,106,3,1,106,2,1,73,37,89,37,2,53,29,1,123,13,139,13,2,64,
10,1,10,10,36,92,31,64,33,33,0,127,31,143,31,2,31,47,128,32,47,96,47,128,
47,3,21,91,175,0,191,0,2,32,0,1,15,0,1,0,33,95,240,34,1,34,34,5,26,95,41,
19,16,95,5,48,11,64,11,2,144,11,224,11,2,11,11,5,4,0,63,51,47,93,113,16,237,
63,237,17,57,47,93,237,1,47,93,93,93,237,93,26,16,204,93,17,57,47,26,16,237,
50,47,93,49,48,0,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,19,52,18,54,
36,51,50,30,2,23,7,46,3,35,34,14,2,21,20,30,2,51,50,62,2,55,53,33,53,33,17,
14,3,35,34,36,38,2,103,89,177,1,6,173,130,196,144,100,35,182,26,73,104,137,
88,128,189,124,61,66,130,193,127,83,140,113,86,29,254,91,2,85,47,127,158,
188,107,178,254,246,177,89,2,199,165,1,10,187,101,46,86,123,77,54,52,85,60,
33,80,148,208,127,127,211,153,85,28,45,55,28,254,160,254,26,48,87,66,38,109,
195,1,12,0,0,0,0,1,0,168,0,0,5,32,5,129,0,11,0,103,64,29,11,90,64,8,143,0,
159,0,175,0,223,0,4,0,13,128,64,13,1,64,13,192,13,208,13,224,13,4,13,184,
255,192,64,37,14,17,72,7,3,90,0,4,16,4,64,4,3,7,4,2,95,80,7,1,176,7,224,7,
2,15,7,1,8,7,7,9,5,3,4,0,18,0,63,50,63,51,57,47,94,93,93,113,237,1,47,94,
93,237,50,43,93,113,26,16,220,93,50,26,237,49,48,33,17,33,17,35,17,51,17,
33,17,51,17,4,97,253,6,191,191,2,250,191,2,141,253,115,5,129,253,172,2,84,
250,127,0,0,0,1,0,189,0,0,1,124,5,129,0,3,0,122,64,70,3,90,15,0,1,12,0,0,
1,61,16,0,32,0,208,0,3,96,0,112,0,2,0,0,16,0,64,0,80,0,176,0,5,7,0,175,5,
1,0,5,160,5,176,5,3,0,5,16,5,64,5,80,5,160,5,176,5,192,5,240,5,8,32,5,144,
5,240,5,3,5,184,255,192,179,56,61,72,5,184,255,192,179,45,48,72,5,184,255,
192,182,13,16,72,1,3,0,18,0,63,63,1,43,43,43,93,113,114,93,47,94,93,113,114,
94,93,94,93,237,49,48,51,17,51,17,189,191,5,129,250,127,0,0,0,1,0,32,255,
236,3,104,5,129,0,21,0,124,64,15,137,2,1,130,5,1,123,10,1,100,6,116,6,2,6,
184,255,224,64,66,14,17,72,0,14,32,14,2,128,14,144,14,224,14,240,14,4,14,
14,3,17,90,64,64,12,80,12,96,12,3,111,12,1,12,23,128,15,3,1,3,32,23,1,32,
23,64,23,80,23,96,23,4,14,95,15,3,9,95,0,64,4,1,4,4,0,19,0,63,50,47,93,16,
237,63,237,1,93,113,47,113,26,16,220,93,113,26,237,18,57,47,93,113,49,48,
0,43,1,93,93,93,0,93,5,34,38,39,55,30,3,51,50,54,53,17,33,53,33,17,20,14,
2,1,201,171,219,35,187,10,46,64,78,41,104,120,254,241,1,205,56,107,154,20,
178,192,31,65,93,60,28,143,138,3,69,156,252,35,101,162,115,62,0,1,0,168,0,
0,5,63,5,129,0,11,0,154,64,103,171,1,1,157,1,1,138,8,154,8,2,138,1,154,1,
170,1,3,102,2,1,131,7,147,7,2,100,7,1,157,0,173,0,2,107,0,123,0,139,0,3,89,
0,1,86,10,1,155,10,1,36,10,1,1,10,106,8,250,8,2,8,10,144,9,160,9,2,9,9,0,
11,16,0,11,1,11,11,13,7,2,3,90,0,4,16,4,64,4,3,7,4,7,10,1,2,4,4,8,5,3,0,4,
18,0,63,51,63,51,18,23,57,1,47,94,93,237,50,50,17,51,47,93,56,51,57,47,93,
57,51,113,17,51,49,48,0,93,93,1,93,93,93,93,0,93,93,93,1,93,93,0,93,93,33,
1,7,17,35,17,51,17,1,51,9,1,4,82,253,205,184,191,191,2,167,225,253,168,2,
168,2,168,140,253,228,5,129,253,62,2,194,253,156,252,227,0,0,0,0,1,0,168,
0,0,4,47,5,129,0,5,0,56,64,40,16,4,48,4,2,0,4,16,4,32,4,64,4,96,4,128,4,160,
4,240,4,8,4,3,90,0,0,16,0,64,0,3,7,0,1,3,3,95,0,18,0,63,237,63,1,47,94,93,
237,47,93,113,49,48,51,17,51,17,33,21,168,191,2,200,5,129,251,27,156,0,0,
0,0,1,0,168,0,0,6,2,5,129,0,44,2,44,64,12,152,41,1,151,31,1,12,16,18,24,72,
12,184,255,240,179,13,17,72,13,184,255,240,64,27,18,24,72,40,13,1,13,16,13,
17,72,42,32,33,37,72,42,32,18,28,72,42,32,9,17,72,30,184,255,224,179,33,37,
72,30,184,255,224,179,18,28,72,30,184,255,224,64,255,9,17,72,13,12,36,36,
27,44,92,42,36,0,52,0,2,212,0,1,139,0,155,0,2,4,0,1,8,0,46,139,46,1,116,46,
1,59,46,1,203,46,1,180,46,1,11,46,1,207,171,46,1,52,46,1,32,46,1,20,46,1,
0,46,1,244,46,1,208,46,1,196,46,1,176,46,1,116,46,132,46,164,46,3,96,46,1,
84,46,1,64,46,1,52,46,1,16,46,1,4,46,1,151,240,46,1,180,46,196,46,228,46,
3,160,46,1,116,46,148,46,2,80,46,1,68,46,1,48,46,1,4,46,36,46,2,244,46,1,
224,46,1,180,46,212,46,2,144,46,1,132,46,1,112,46,1,52,46,68,46,100,46,3,
32,46,1,20,46,1,244,46,1,208,46,1,116,46,132,46,164,46,196,46,4,96,46,1,52,
46,84,46,2,16,46,1,4,46,1,103,116,46,148,46,180,46,196,46,228,46,5,80,46,
1,4,46,36,46,68,46,3,20,46,52,46,68,46,100,46,132,46,180,46,212,46,244,46,
8,164,46,196,46,244,46,3,139,46,1,4,46,52,46,84,46,116,46,4,55,64,83,228,
46,1,203,46,1,36,46,68,46,116,46,148,46,180,46,5,11,46,1,212,46,244,46,2,
187,46,1,100,46,132,46,2,75,46,1,20,46,52,46,2,251,46,1,164,46,196,46,228,
46,3,128,46,1,2,64,46,80,46,112,46,3,63,46,1,0,46,32,46,2,30,27,92,0,28,64,
28,2,7,28,6,21,21,184,255,192,64,16,18,37,72,42,21,29,3,75,36,1,0,13,36,3,
28,18,0,63,23,51,93,63,51,51,43,17,51,1,47,94,93,237,50,93,93,93,95,93,93,
93,113,113,113,113,113,114,114,114,114,94,93,93,93,113,114,114,114,94,93,
93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,114,114,114,114,114,
114,114,114,94,93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,94,93,
93,93,113,113,113,16,220,94,93,93,93,113,50,237,18,57,61,47,51,51,49,48,43,
43,43,43,43,43,43,93,43,43,43,93,93,33,17,52,54,55,54,55,6,7,14,1,7,1,35,
1,46,3,39,38,39,22,23,30,1,21,17,35,17,51,1,30,3,23,62,3,55,1,51,17,5,86,
2,2,2,3,14,15,13,31,15,254,148,134,254,143,6,13,15,15,7,17,16,1,2,2,2,170,
251,1,119,7,20,18,15,3,3,16,21,20,8,1,112,245,3,172,51,106,44,51,48,51,50,
43,97,39,252,64,3,192,15,40,45,47,23,53,57,56,55,47,103,39,252,84,5,129,252,
47,20,63,66,59,16,16,60,66,62,20,3,209,250,127,0,0,0,0,1,0,168,0,0,5,32,5,
129,0,19,0,196,185,0,10,255,224,64,39,12,43,72,54,10,70,10,2,0,32,12,43,72,
41,0,57,0,73,0,3,11,16,29,33,72,11,32,18,28,72,150,11,166,11,2,41,11,1,1,
184,255,240,179,29,33,72,1,184,255,224,64,53,18,28,72,154,1,170,1,2,3,38,
1,1,19,92,0,68,16,84,16,148,16,3,224,16,1,2,0,16,48,16,64,16,112,16,192,16,
208,16,6,16,64,21,1,64,21,192,21,208,21,224,21,4,21,184,255,192,64,16,14,
17,72,10,7,92,0,8,16,8,64,8,3,7,8,1,184,255,192,64,16,29,43,72,17,1,9,3,11,
64,29,43,72,11,0,8,18,0,63,51,51,43,63,51,51,43,1,47,94,93,237,50,43,93,113,
47,93,95,93,113,51,237,49,48,0,93,95,93,43,43,93,93,43,43,1,93,43,93,43,33,
1,22,23,30,1,21,17,35,17,51,1,38,39,46,1,53,17,51,17,4,58,253,14,2,3,2,3,
170,222,2,250,3,3,2,4,172,4,176,49,48,41,91,35,252,88,5,129,251,72,49,49,
42,99,45,3,156,250,127,0,0,0,0,2,0,97,255,236,5,215,5,150,0,19,0,39,0,108,
64,74,91,37,1,26,37,1,9,37,1,82,33,1,21,33,1,7,33,1,84,27,1,21,27,1,91,23,
1,25,23,1,102,17,1,104,12,1,0,91,64,15,20,1,20,41,128,32,41,128,41,2,30,91,
175,10,191,10,2,32,10,1,15,10,31,10,2,10,25,95,15,4,35,95,5,19,0,63,237,63,
237,1,47,93,93,93,237,93,26,16,220,113,26,237,49,48,93,93,93,93,93,93,93,
93,93,93,93,93,1,20,2,6,4,35,34,36,38,2,53,52,18,54,36,51,50,4,22,18,7,52,
46,2,35,34,14,2,21,20,30,2,51,50,62,2,5,215,95,180,254,252,165,174,254,250,
174,88,92,178,1,5,169,168,1,5,177,92,195,65,127,188,123,126,190,127,63,65,
127,189,123,132,191,123,59,2,199,165,254,242,192,104,109,195,1,12,159,165,
1,10,187,101,102,188,254,246,163,127,208,148,80,80,148,208,127,127,211,153,
85,86,153,212,0,2,0,168,0,0,4,234,5,129,0,14,0,23,0,117,64,83,169,2,1,147,
23,1,155,16,171,16,2,10,3,26,3,42,3,3,5,12,21,12,37,12,3,0,90,64,15,25,128,
64,25,1,64,25,1,20,7,90,0,8,16,8,64,8,3,8,6,95,31,20,47,20,79,20,95,20,127,
20,5,15,20,207,20,255,20,3,7,20,64,9,17,72,20,20,7,19,95,9,3,7,18,0,63,63,
237,18,57,47,43,94,93,113,237,1,47,93,237,50,93,113,26,16,220,26,237,49,48,
0,93,93,93,93,93,1,20,14,2,35,33,17,35,17,33,50,30,2,7,52,38,35,33,17,33,
50,54,4,234,61,121,182,121,254,98,191,2,81,125,186,124,62,192,164,164,254,
133,1,131,165,155,3,217,92,159,117,68,253,219,5,129,61,111,157,97,134,139,
253,212,146,0,0,0,2,0,97,254,125,5,215,5,150,0,36,0,56,0,162,64,113,108,20,
124,20,140,20,3,104,24,1,104,29,1,101,34,1,87,6,1,85,49,1,90,39,1,90,45,1,
108,19,124,19,140,19,3,26,19,90,19,2,26,40,90,40,2,21,44,85,44,2,26,54,90,
54,2,8,54,1,21,50,85,50,2,7,50,1,13,13,22,5,27,0,91,64,15,37,1,37,58,128,
47,91,175,27,191,27,2,32,27,1,15,27,31,27,2,27,32,58,128,58,2,42,95,32,4,
52,95,5,22,19,10,95,17,0,47,237,63,51,237,63,237,1,93,47,93,93,93,237,26,
16,220,113,26,237,17,57,57,50,47,49,48,93,93,93,93,93,93,0,93,93,93,93,93,
1,93,93,93,0,93,93,1,20,14,2,7,30,3,51,50,54,55,21,14,1,35,34,46,2,39,46,
2,2,53,52,18,54,36,51,50,4,22,18,7,52,46,2,35,34,14,2,21,20,30,2,51,50,62,
2,5,215,77,145,211,134,21,53,68,83,51,28,64,23,38,91,49,86,128,97,70,27,158,
239,159,80,92,178,1,5,169,168,1,5,177,92,195,65,127,188,123,126,190,127,63,
65,127,189,123,132,191,123,59,2,199,149,247,186,117,18,64,90,57,27,8,5,134,
9,13,51,95,138,87,8,115,193,1,3,152,165,1,10,187,101,102,188,254,246,163,
127,208,148,80,80,148,208,127,127,211,153,85,86,153,212,0,0,0,2,0,168,0,0,
5,104,5,129,0,17,0,30,0,210,64,62,169,13,1,138,20,154,20,170,20,3,148,29,
1,117,29,133,29,2,174,0,1,157,0,1,124,0,140,0,2,74,0,90,0,106,0,3,3,160,1,
1,114,1,130,1,146,1,3,2,99,1,1,64,1,1,51,1,1,37,1,1,3,16,184,255,112,64,87,
17,73,112,16,128,16,144,16,3,84,16,100,16,2,66,16,1,2,35,16,51,16,2,1,16,
16,25,18,90,11,11,0,0,17,48,17,64,17,96,17,144,17,160,17,6,17,64,32,144,32,
160,32,3,25,3,90,0,4,16,4,64,4,3,7,4,16,2,95,47,25,95,25,111,25,143,25,4,
25,25,0,24,95,5,3,4,0,18,0,63,50,63,237,18,57,47,93,237,50,1,47,94,93,237,
50,93,47,93,51,57,47,237,18,57,17,51,49,48,93,95,93,93,93,43,95,93,93,93,
93,95,93,93,95,93,93,93,93,0,93,93,93,93,33,1,33,17,35,17,33,50,30,2,21,20,
14,2,7,1,3,52,46,2,35,33,17,33,50,62,2,4,140,254,146,254,73,191,2,151,120,
185,126,66,39,84,130,91,1,144,248,44,84,120,76,254,59,1,205,82,120,77,37,
2,73,253,183,5,129,55,104,150,94,67,130,108,78,16,253,161,3,236,64,94,63,
31,253,248,41,72,98,0,0,0,0,1,0,93,255,236,4,248,5,150,0,63,0,226,64,110,
150,62,1,68,62,1,166,59,1,134,54,1,132,49,1,151,40,1,169,33,1,11,33,27,33,
43,33,155,33,4,89,29,169,29,2,139,17,1,139,7,1,150,2,1,4,2,20,2,2,132,58,
1,96,54,1,105,21,1,118,17,1,42,90,41,41,0,90,64,176,19,1,19,65,128,9,90,8,
64,16,19,72,8,8,52,90,0,31,16,31,64,31,3,7,31,19,16,19,22,72,120,19,136,19,
152,19,3,59,19,1,52,184,255,240,64,47,19,22,72,119,52,135,52,151,52,3,58,
52,1,19,52,5,47,95,111,42,1,89,42,1,75,42,1,6,42,1,42,36,4,14,95,96,9,1,82,
9,1,68,9,1,9,5,19,0,63,51,93,93,93,237,63,51,93,93,93,93,237,18,57,57,93,
93,43,93,93,43,1,47,94,93,237,51,47,43,237,26,16,220,93,26,237,50,47,237,
49,48,0,93,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93,93,1,20,14,2,35,
32,36,39,55,30,3,51,50,62,2,53,52,46,2,39,46,5,53,52,62,2,51,50,30,2,23,7,
46,3,35,34,14,2,21,20,30,2,23,30,5,4,248,69,144,219,150,254,249,254,218,40,
185,14,58,99,146,102,85,142,102,57,63,114,158,96,59,119,109,96,70,40,81,144,
196,114,131,186,128,77,23,188,14,53,86,123,83,98,133,81,35,63,108,142,80,
65,129,118,103,76,43,1,133,89,150,109,61,184,174,37,55,90,65,36,29,60,95,
66,69,86,56,38,22,13,31,43,58,81,107,70,100,143,92,42,41,82,121,80,33,51,
80,54,28,35,60,81,47,63,81,54,36,18,15,31,43,58,84,114,0,0,0,1,0,46,0,0,4,
180,5,129,0,7,1,212,64,255,9,9,1,201,9,217,9,249,9,3,187,9,1,73,9,89,9,121,
9,137,9,4,59,9,1,9,9,25,9,2,246,9,1,153,9,201,9,2,139,9,1,9,9,25,9,73,9,105,
9,4,199,217,9,233,9,2,203,9,1,182,9,1,41,9,89,9,105,9,137,9,153,9,5,27,9,
1,6,9,1,25,9,41,9,89,9,121,9,153,9,169,9,217,9,7,233,9,249,9,2,219,9,1,169,
9,1,150,9,1,57,9,105,9,2,45,9,1,1,11,9,1,151,107,9,123,9,139,9,171,9,187,
9,235,9,251,9,7,84,9,1,11,9,43,9,59,9,3,187,9,251,9,2,164,9,1,59,9,75,9,123,
9,3,36,9,1,139,9,155,9,187,9,203,9,251,9,5,127,9,1,2,79,9,95,9,2,48,9,1,15,
9,1,103,207,9,223,9,2,176,9,1,15,9,79,9,95,9,143,9,4,240,9,1,159,9,175,9,
207,9,223,9,4,112,9,1,95,9,1,64,9,1,31,9,1,31,9,63,9,95,9,111,9,159,9,223,
9,239,9,7,0,9,1,55,239,9,1,128,64,93,9,144,9,208,9,3,111,9,1,80,9,1,47,9,
1,0,9,1,208,9,1,175,9,1,144,9,1,111,9,127,9,2,16,9,32,9,64,9,80,9,4,255,9,
1,224,9,1,191,9,1,64,9,96,9,144,9,160,9,4,63,9,1,32,9,1,15,9,1,7,3,5,4,14,
1,90,2,64,2,7,14,112,7,160,7,176,7,3,32,7,128,7,2,7,184,255,192,64,15,23,
28,72,7,32,2,1,2,0,4,95,5,3,1,18,0,63,63,237,50,1,47,93,204,43,93,113,43,
1,26,24,16,77,253,228,50,95,94,93,93,93,93,93,93,93,113,113,113,113,113,114,
114,114,114,114,114,94,93,93,113,113,113,113,113,113,114,114,114,94,93,93,
93,95,93,93,113,113,113,113,114,114,114,94,93,95,93,93,93,93,93,93,113,114,
114,114,114,114,114,94,93,93,93,93,113,113,113,113,113,114,49,48,1,17,35,
17,33,53,33,21,2,208,190,254,28,4,134,4,229,251,27,4,229,156,156,0,0,0,0,
1,0,158,255,236,5,41,5,129,0,25,0,136,64,61,89,23,105,23,2,89,3,105,3,2,89,
2,105,2,2,69,16,1,69,10,1,21,90,64,64,18,80,18,160,18,3,48,18,144,18,240,
18,3,143,18,159,18,175,18,3,18,27,128,64,27,1,64,27,192,27,208,27,224,27,
4,27,184,255,192,64,36,14,17,72,8,90,79,5,95,5,111,5,3,143,5,159,5,2,207,
5,1,0,5,16,5,64,5,3,7,5,19,6,3,13,95,0,19,0,63,237,63,51,1,47,94,93,93,113,
114,237,43,93,113,26,16,220,93,113,114,26,237,49,48,0,93,93,93,93,93,5,34,
46,2,53,17,51,17,20,30,2,51,50,62,2,53,17,51,17,20,14,2,2,219,116,208,157,
92,191,57,102,139,83,82,146,110,63,190,93,160,215,20,62,131,201,138,3,129,
252,143,107,149,94,43,44,96,155,111,3,100,252,145,141,207,136,66,0,1,0,9,
0,0,5,77,5,129,0,16,0,235,64,181,74,14,90,14,106,14,3,69,4,85,4,101,4,3,140,
15,1,58,15,90,15,106,15,122,15,4,131,3,1,53,3,85,3,101,3,117,3,4,116,0,132,
0,2,9,0,1,140,1,1,123,1,1,6,1,1,26,1,42,1,58,1,3,9,1,1,233,1,249,1,2,21,0,
37,0,53,0,3,6,0,1,230,0,246,0,2,1,0,9,9,2,26,15,42,15,58,15,3,3,8,15,1,232,
15,248,15,2,15,52,16,84,16,2,32,16,1,2,16,16,1,48,16,96,16,144,16,192,16,
240,16,5,16,21,3,37,3,53,3,3,6,3,1,230,3,246,3,2,3,175,2,191,2,2,2,32,18,
80,18,2,48,18,96,18,144,18,192,18,240,18,5,47,18,1,15,2,3,121,9,1,9,1,18,
0,63,51,93,63,51,1,93,93,113,47,93,51,93,113,113,47,93,113,95,113,113,51,
93,113,95,113,18,57,61,47,51,51,93,113,113,93,113,113,49,48,93,93,93,93,93,
93,93,93,93,93,93,33,35,1,51,1,30,1,23,22,23,54,55,62,1,55,1,51,3,14,198,
253,193,201,1,134,15,30,12,14,13,12,14,12,29,17,1,132,201,5,129,252,32,45,
89,35,41,39,37,41,35,88,48,3,224,0,0,1,0,9,0,0,7,134,5,129,0,46,4,87,64,73,
121,44,1,117,17,1,123,2,139,2,2,73,2,1,116,12,132,12,2,70,12,1,122,30,138,
30,2,73,30,89,30,105,30,3,117,31,133,31,2,71,31,87,31,103,31,3,142,45,1,91,
45,107,45,123,45,3,129,16,1,100,16,116,16,2,85,16,1,1,32,13,17,72,13,184,
255,224,64,255,13,17,72,131,0,1,117,0,1,68,0,84,0,100,0,3,54,0,1,140,14,1,
122,14,1,75,14,91,14,107,14,3,14,16,9,12,72,26,14,42,14,58,14,3,9,14,1,233,
14,249,14,2,21,13,37,13,53,13,3,6,13,1,230,13,246,13,2,14,13,22,26,30,42,
30,58,30,3,9,30,1,233,30,249,30,2,21,31,37,31,53,31,3,6,31,1,230,31,246,31,
2,31,30,7,26,1,42,1,58,1,3,9,1,1,233,1,249,1,2,21,0,37,0,53,0,3,6,0,1,230,
0,246,0,2,1,0,39,123,39,1,116,22,132,22,2,22,7,39,39,7,22,3,15,26,45,42,45,
58,45,3,3,8,45,1,232,45,248,45,2,45,219,46,1,207,46,1,187,46,1,175,46,1,155,
46,1,143,46,1,123,46,1,111,46,1,91,46,1,79,46,1,2,79,46,143,46,175,46,3,46,
64,25,28,72,32,46,48,46,2,15,46,1,9,46,5,16,1,229,16,245,16,2,182,16,198,
16,214,16,3,3,16,8,15,56,15,120,15,136,15,152,15,184,15,6,12,15,64,64,255,
25,38,72,15,119,48,151,48,215,48,3,54,48,70,48,86,48,3,23,48,39,48,2,6,48,
1,55,48,103,48,119,48,167,48,183,48,199,48,231,48,247,48,8,38,48,1,7,48,23,
48,2,201,199,48,215,48,231,48,3,120,48,152,48,168,48,184,48,4,105,48,1,40,
48,56,48,88,48,3,25,48,1,7,48,1,232,48,1,217,48,1,168,48,200,48,2,153,48,
1,138,48,1,88,48,104,48,2,73,48,1,55,48,1,8,48,24,48,2,231,48,1,200,48,1,
167,48,1,8,48,24,48,40,48,72,48,136,48,5,153,199,48,1,88,48,104,48,136,48,
152,48,168,48,5,73,48,1,40,48,1,9,48,25,48,2,216,48,232,48,2,203,48,1,154,
48,170,48,186,48,3,139,48,1,48,192,124,127,72,57,48,1,42,48,1,25,48,1,10,
48,1,249,48,1,234,48,1,217,48,1,202,48,1,184,48,1,137,48,153,48,169,48,3,
120,48,1,105,48,1,58,48,74,48,90,48,3,41,48,1,26,48,1,12,48,1,104,253,48,
1,236,48,1,221,48,1,204,48,1,64,255,189,48,1,171,48,1,156,48,1,139,48,1,124,
48,1,107,48,1,92,48,1,75,48,1,60,48,1,43,48,1,28,48,1,11,48,1,252,48,1,235,
48,1,220,48,1,203,48,1,188,48,1,171,48,1,156,48,1,0,141,48,1,127,48,1,109,
48,1,95,48,1,77,48,1,47,48,63,48,2,29,48,1,15,48,1,253,48,1,239,48,1,221,
48,1,207,48,1,189,48,1,175,48,1,157,48,1,143,48,1,109,48,125,48,2,91,48,1,
77,48,1,59,48,1,45,48,1,27,48,1,13,48,1,56,251,48,1,237,48,1,219,48,1,205,
48,1,187,48,1,173,48,1,155,48,1,141,48,1,123,48,1,109,48,1,75,48,91,48,2,
57,48,1,43,48,1,25,48,1,11,48,1,249,48,1,235,48,1,221,48,1,203,48,1,189,48,
1,171,48,1,157,48,1,139,48,1,125,48,1,107,48,1,93,48,1,75,48,1,61,48,1,1,
43,48,1,31,48,1,2,95,48,127,48,159,48,191,48,223,48,255,48,6,0,48,1,8,68,
7,84,7,2,7,30,45,3,15,3,39,64,15,22,123,22,139,22,2,22,32,9,14,72,22,1,14,
18,0,63,51,51,43,93,17,51,63,23,51,93,1,94,93,93,95,113,113,95,113,113,113,
113,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114,
114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,113,
113,113,113,113,113,113,113,95,113,113,113,113,113,113,113,114,114,114,114,
114,114,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,
93,93,93,93,113,113,113,113,43,113,113,113,113,114,114,114,114,114,94,93,
93,93,93,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,94,93,
93,93,113,113,113,113,47,43,94,93,51,95,93,93,113,47,94,93,93,43,93,95,113,
113,113,113,113,113,113,113,113,113,51,93,113,95,113,18,23,57,61,47,47,47,
93,93,17,51,51,93,113,113,93,113,113,17,51,51,93,113,113,93,113,113,17,51,
51,93,113,113,93,113,113,49,48,43,93,93,93,93,93,93,93,43,43,93,93,93,93,
93,93,93,93,93,93,93,93,93,93,93,33,35,3,46,1,39,38,39,6,7,14,1,7,3,35,1,
51,19,30,1,23,22,23,54,55,62,3,55,19,51,19,30,3,23,22,23,50,62,2,55,19,51,
5,231,228,244,11,25,10,12,12,13,12,11,24,11,246,228,254,97,199,253,17,31,
11,13,11,15,16,7,14,15,15,6,245,183,245,6,15,15,14,7,16,15,1,16,24,29,15,
249,199,3,127,38,104,47,55,57,58,55,48,102,38,252,129,5,129,252,129,63,124,
49,58,52,69,67,28,62,60,55,23,3,109,252,147,23,55,59,62,28,67,70,69,104,121,
52,3,127,0,0,1,0,46,0,0,5,43,5,129,0,11,2,119,64,255,92,4,1,73,4,1,59,4,1,
38,11,1,75,0,91,0,2,41,0,57,0,2,68,2,84,2,2,38,2,54,2,2,9,3,25,3,41,3,3,81,
10,1,69,10,1,51,10,1,6,10,22,10,2,93,8,1,76,8,1,43,8,59,8,2,9,8,25,8,2,82,
6,1,67,6,1,3,38,6,54,6,2,7,6,23,6,2,12,219,13,1,196,13,1,171,13,1,144,13,
1,132,13,1,96,13,1,84,13,1,48,13,1,36,13,1,0,13,1,244,13,1,208,13,1,196,13,
1,160,13,1,148,13,1,112,13,1,100,13,1,64,13,1,52,13,1,16,13,1,4,13,1,204,
224,13,1,212,13,1,176,13,1,164,13,1,128,13,1,116,13,1,80,13,1,68,13,1,32,
13,1,20,13,1,36,13,84,13,132,13,180,13,228,13,5,4,13,52,13,100,13,148,13,
196,13,244,13,6,156,52,13,100,13,148,13,196,13,244,13,5,11,13,1,27,13,75,
13,123,13,171,13,219,13,5,139,13,187,13,235,13,3,4,13,20,13,52,13,68,13,4,
106,84,13,100,13,132,13,148,64,156,13,180,13,196,13,228,13,244,13,8,59,13,
1,36,13,1,11,13,1,244,13,1,219,13,1,196,13,1,171,13,1,148,13,1,123,13,1,100,
13,1,48,13,1,36,13,1,0,13,1,244,13,1,208,13,1,196,13,1,160,13,1,148,13,1,
112,13,1,100,13,1,64,13,1,52,13,1,16,13,1,4,13,1,57,224,13,1,212,13,1,176,
13,1,164,13,1,128,13,1,20,13,68,13,116,13,3,36,13,84,13,132,13,180,13,228,
13,5,84,13,100,13,148,13,244,13,4,64,13,1,2,0,13,48,13,2,6,8,10,7,1,4,4,9,
5,9,5,9,3,0,11,16,192,11,240,11,2,11,184,255,192,64,16,26,30,72,175,11,1,
144,11,1,127,11,1,0,11,1,11,184,255,192,181,11,15,72,11,2,3,184,255,240,64,
41,16,3,32,3,2,224,3,240,3,2,31,3,175,3,191,3,207,3,4,3,114,7,1,52,7,68,7,
84,7,3,4,7,10,1,4,8,5,3,3,0,18,0,63,50,63,51,23,57,93,93,1,47,93,93,113,56,
51,47,43,93,93,93,93,43,93,56,51,18,57,57,47,47,18,23,57,50,51,93,95,93,93,
113,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,93,93,93,113,113,113,
113,113,113,113,113,113,113,114,114,114,114,94,93,93,113,114,114,94,93,113,
114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,93,93,
93,113,113,113,113,113,113,113,113,113,113,49,48,94,93,93,95,93,93,93,93,
93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,33,9,1,35,9,1,51,9,1,51,9,1,
4,88,254,89,254,80,211,2,24,254,17,211,1,136,1,125,211,254,30,2,11,2,104,
253,152,2,220,2,165,253,215,2,41,253,98,253,29,0,0,0,1,0,45,0,0,5,41,5,129,
0,8,2,83,64,20,30,7,1,12,7,1,7,24,12,15,72,17,5,1,3,5,1,16,3,5,184,255,232,
64,255,12,15,72,5,4,14,2,1,8,14,7,105,8,169,8,2,6,8,22,8,54,8,70,8,4,14,8,
6,1,90,38,2,86,2,150,2,3,118,2,230,2,2,57,2,73,2,2,6,2,1,16,2,153,10,169,
10,201,10,3,86,10,1,9,10,57,10,2,25,10,89,10,137,10,249,10,4,6,10,1,202,249,
10,1,230,10,1,9,10,25,10,185,10,201,10,4,198,10,1,89,10,121,10,169,10,3,54,
10,1,41,10,57,10,185,10,233,10,4,11,10,1,153,249,10,1,198,10,214,10,2,178,
10,1,164,10,1,150,10,1,130,10,1,116,10,1,86,10,102,10,2,66,10,1,36,10,52,
10,2,18,10,1,4,10,1,244,10,1,230,10,1,196,10,212,10,2,166,10,182,10,2,146,
10,1,132,10,1,118,10,1,98,10,1,84,10,1,54,10,70,10,2,36,10,1,22,10,1,4,10,
1,242,10,1,1,208,10,224,10,2,196,10,1,160,10,176,10,2,148,10,1,112,10,1,100,
10,1,64,10,1,20,10,36,10,52,10,3,0,10,1,105,228,10,244,10,2,208,10,64,182,
1,164,10,180,10,196,10,3,128,10,144,10,2,116,10,1,80,10,96,10,2,68,10,1,32,
10,1,4,10,20,10,2,244,10,1,224,10,1,196,10,212,10,2,176,10,1,84,10,100,10,
116,10,148,10,164,10,5,48,10,64,10,2,36,10,1,0,10,1,196,10,244,10,2,144,10,
1,4,10,20,10,36,10,68,10,84,10,116,10,132,10,7,57,224,10,1,132,10,164,10,
212,10,3,112,10,1,4,10,36,10,52,10,84,10,100,10,5,228,10,244,10,2,192,10,
1,180,10,1,144,10,1,4,10,20,10,52,10,84,10,132,10,5,212,10,228,10,2,187,10,
1,164,10,1,112,10,1,2,48,10,96,10,2,15,10,47,10,2,0,3,59,3,75,3,123,3,3,3,
1,8,4,3,1,18,0,63,63,51,18,57,93,17,51,1,93,93,95,93,93,93,93,113,113,113,
113,113,114,114,114,114,94,93,93,93,113,113,113,113,113,113,113,113,114,114,
114,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,93,95,93,113,113,113,
113,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114,
114,114,114,94,93,93,113,113,113,114,114,114,94,93,93,113,113,113,47,94,93,
93,93,113,253,57,206,94,93,93,50,43,1,24,16,77,230,50,49,48,43,95,94,93,93,
43,93,93,1,17,35,17,1,51,9,1,51,3,9,190,253,226,210,1,173,1,171,210,2,72,
253,184,2,72,3,57,253,97,2,159,0,0,0,0,1,0,65,0,0,4,163,5,129,0,9,0,122,64,
35,100,4,116,4,132,4,3,109,3,125,3,141,3,3,91,3,1,41,3,57,3,73,3,3,114,8,
130,8,2,84,8,100,8,2,8,184,255,240,64,9,10,13,72,9,3,16,7,1,7,184,255,192,
64,18,12,17,72,7,8,4,15,2,31,2,2,2,64,12,15,72,2,11,184,255,192,64,14,13,
17,72,7,3,4,95,5,3,2,8,95,1,18,0,63,237,50,63,237,50,50,1,43,47,43,93,51,
51,47,43,93,51,51,49,48,43,93,93,93,93,93,93,41,1,53,1,33,53,33,21,1,33,4,
163,251,158,3,90,252,239,3,234,252,166,3,137,143,4,86,156,139,251,166,0,0,
1,0,146,254,87,2,41,5,204,0,7,0,49,64,30,7,48,2,1,224,2,1,2,4,241,63,1,1,
143,1,191,1,2,32,1,1,1,4,245,1,0,5,245,0,27,0,63,237,63,237,1,47,93,93,113,
237,205,93,113,50,49,48,19,17,33,21,35,17,51,21,146,1,151,233,233,254,87,
7,117,129,249,141,129,0,1,0,0,255,236,2,57,5,204,0,3,0,71,64,40,120,1,136,
1,2,0,24,13,17,72,9,3,25,3,73,3,3,70,2,1,10,2,26,2,42,2,3,3,16,0,3,16,3,32,
3,128,3,4,3,1,184,255,240,183,143,1,1,1,1,0,0,19,0,63,63,1,47,93,56,205,93,
56,49,48,93,93,93,43,93,5,1,51,1,1,151,254,105,158,1,155,20,5,224,250,32,
0,0,0,0,1,0,16,254,87,1,167,5,204,0,7,0,49,64,31,4,63,0,1,239,0,1,0,7,241,
64,2,80,2,2,192,2,208,2,224,2,3,2,4,245,5,0,1,245,0,27,0,63,237,63,237,1,
47,93,113,253,205,93,113,50,49,48,19,53,51,17,35,53,33,17,16,233,233,1,151,
254,87,129,6,115,129,248,139,0,1,0,10,2,161,3,183,5,129,0,6,2,243,181,0,24,
18,22,72,2,184,255,232,179,18,22,72,5,184,255,232,64,47,18,22,72,118,5,134,
5,2,4,24,18,22,72,121,4,137,4,2,3,54,6,70,6,2,102,6,118,6,134,6,230,6,4,6,
6,22,6,38,6,70,6,86,6,102,6,6,6,184,255,192,179,48,65,72,6,184,255,192,64,
57,18,22,72,6,5,4,57,3,73,3,2,105,3,121,3,137,3,3,9,3,25,3,41,3,89,3,105,
3,5,9,3,64,18,22,72,3,6,1,22,1,134,1,3,57,38,1,54,1,70,1,246,1,4,230,1,1,
1,184,255,192,182,60,63,72,153,1,1,1,184,255,224,64,255,30,33,72,56,1,72,
1,2,39,1,1,22,1,1,183,1,199,1,2,6,1,70,1,86,1,102,1,150,1,166,1,6,9,1,6,8,
1,246,8,1,164,8,1,121,8,1,6,8,1,246,8,1,201,8,217,8,2,187,8,1,9,8,25,8,41,
8,169,8,4,201,201,8,217,8,2,54,8,118,8,134,8,150,8,4,153,8,233,8,2,102,8,
118,8,2,9,8,25,8,57,8,3,198,8,1,139,8,1,57,8,73,8,121,8,3,43,8,1,4,8,1,152,
228,8,244,8,2,208,8,1,162,8,178,8,194,8,3,132,8,148,8,2,82,8,98,8,114,8,3,
64,8,1,50,8,1,36,8,1,2,8,18,8,2,228,8,244,8,2,214,8,1,196,8,1,146,8,162,8,
178,8,3,116,8,132,8,2,102,8,1,50,8,66,8,82,8,3,20,8,36,8,2,6,8,1,242,8,1,
212,8,228,8,2,166,8,182,8,2,130,8,146,8,2,100,8,116,8,2,86,8,1,52,8,68,8,
2,32,8,1,4,8,20,8,2,104,230,8,246,8,2,192,8,1,146,8,162,8,64,24,178,8,3,116,
8,132,8,2,82,8,98,8,2,52,8,68,8,2,22,8,38,8,2,8,184,255,128,64,24,85,88,72,
182,8,198,8,2,132,8,148,8,164,8,3,102,8,118,8,2,68,8,1,8,184,255,192,182,
72,75,72,228,8,1,8,184,255,192,64,12,66,69,72,148,8,1,114,8,130,8,2,8,184,
255,128,64,120,59,62,72,18,8,34,8,2,1,0,8,1,56,240,8,1,212,8,228,8,2,176,
8,1,100,8,132,8,148,8,164,8,4,64,8,80,8,2,36,8,52,8,2,228,8,244,8,2,171,8,
187,8,2,116,8,132,8,148,8,3,75,8,1,52,8,1,11,8,1,235,8,251,8,2,208,8,1,196,
8,1,176,8,1,132,8,148,8,164,8,3,96,8,112,8,2,2,0,8,16,8,64,8,80,8,4,8,34,
1,1,3,1,19,1,2,1,4,3,3,3,0,0,47,50,47,63,51,93,93,1,94,93,95,93,93,93,93,
93,93,113,113,113,113,113,113,114,114,114,114,114,114,94,93,95,93,43,93,93,
43,93,43,113,113,113,113,43,114,114,114,114,114,114,114,94,93,93,93,93,93,
93,93,93,93,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,
114,114,94,93,93,93,93,93,113,113,113,114,114,94,93,93,93,93,113,113,113,
113,114,25,47,94,93,93,113,113,113,43,113,43,113,114,94,93,205,43,94,93,113,
114,51,51,205,43,43,93,113,114,49,48,95,93,43,93,43,43,43,9,2,35,1,51,1,3,
19,254,203,254,206,162,1,112,203,1,114,2,161,2,121,253,135,2,224,253,32,0,
0,0,0,1,255,225,254,105,4,138,254,235,0,3,0,35,64,23,16,2,96,2,128,2,160,
2,208,2,5,96,2,128,2,240,2,3,2,0,0,186,1,0,47,237,1,47,47,93,113,49,48,3,
53,33,21,31,4,169,254,105,130,130,0,1,0,106,4,177,2,18,5,228,0,5,0,47,64,
31,117,3,133,3,2,64,4,128,4,2,4,64,16,1,1,1,2,149,128,15,0,47,0,63,0,127,
0,239,0,5,0,0,47,93,26,237,1,47,93,26,205,93,49,48,93,9,1,53,51,19,21,1,180,
254,182,207,217,4,177,1,22,29,254,225,20,0,0,0,0,2,0,87,255,236,4,115,4,78,
0,50,0,65,0,161,64,50,121,61,137,61,2,121,12,137,12,2,2,40,9,13,72,10,5,26,
5,2,43,24,9,17,72,5,28,21,28,2,37,37,30,70,64,46,9,111,56,127,56,143,56,3,
56,67,128,20,71,21,184,255,192,64,20,21,28,72,21,21,63,71,31,3,1,3,48,67,
192,67,2,160,67,1,67,184,255,192,64,32,30,35,72,33,81,40,22,57,81,9,9,26,
51,95,20,1,47,20,143,20,2,20,20,15,80,26,16,46,51,80,0,22,0,63,237,50,63,
237,51,47,93,113,17,18,57,47,237,63,237,1,43,93,113,47,93,237,51,47,43,237,
26,16,220,93,50,50,26,237,50,47,49,48,93,43,93,43,0,93,93,5,34,38,53,52,62,
2,63,1,53,52,46,2,35,34,14,2,7,39,62,3,51,50,22,21,17,20,22,51,50,54,55,21,
14,1,35,34,46,2,39,35,14,3,39,50,62,2,61,1,7,14,3,21,20,22,1,158,163,164,
81,131,168,87,243,28,58,87,59,52,84,62,38,6,188,10,56,103,155,110,204,206,
42,59,15,30,14,34,67,38,51,73,46,24,3,6,29,69,92,117,35,86,129,85,42,197,
66,119,90,53,95,20,172,150,107,137,78,30,2,4,59,67,94,58,27,15,39,67,51,17,
64,107,78,43,187,177,254,46,80,81,4,3,112,8,8,27,55,81,54,52,84,59,32,135,
63,98,116,53,89,4,1,17,50,90,73,88,96,0,0,2,0,132,255,236,4,29,5,204,0,31,
0,51,0,146,64,9,105,49,121,49,2,121,35,1,31,184,255,224,64,24,7,10,72,134,
30,150,30,2,73,27,89,27,2,73,4,89,4,2,134,1,150,1,2,1,184,255,224,64,63,7,
10,72,0,71,64,160,32,1,32,53,128,42,5,19,70,0,18,16,18,48,18,240,18,4,8,18,
176,53,1,63,53,1,112,53,144,53,2,31,53,1,255,53,1,192,53,224,53,2,25,37,80,
29,16,18,0,12,21,5,47,80,2,22,0,63,237,50,63,63,63,237,50,1,93,93,113,113,
114,114,47,94,93,237,50,50,26,16,220,93,26,237,49,48,43,93,93,93,93,43,93,
93,1,16,33,34,38,39,35,20,14,2,7,35,62,3,53,17,51,17,20,6,7,6,7,51,62,1,51,
50,18,3,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,4,29,254,114,123,163,51,
2,3,3,3,1,174,1,2,2,1,180,1,1,1,1,4,50,165,122,205,193,189,28,62,96,69,71,
109,73,38,38,73,108,70,66,96,64,31,2,34,253,202,89,99,26,56,48,34,4,9,43,
60,72,39,4,237,254,89,30,55,21,25,22,104,90,254,236,254,226,112,160,103,48,
46,102,166,120,116,158,99,43,46,102,163,0,0,0,1,0,87,255,236,3,202,4,78,0,
39,0,117,64,81,121,16,1,121,23,1,99,37,1,99,3,1,32,70,31,31,8,70,160,9,1,
9,9,41,0,71,31,19,1,19,35,80,26,31,32,127,32,143,32,223,32,4,32,32,26,16,
32,8,112,8,128,8,208,8,224,8,5,0,8,16,8,96,8,112,8,128,8,192,8,208,8,7,8,
8,5,80,14,22,31,41,1,93,0,63,237,51,47,93,113,63,51,47,93,16,237,1,47,93,
237,17,51,125,47,113,24,237,51,47,237,49,48,93,93,93,93,1,20,30,2,51,50,54,
55,23,14,3,35,34,46,2,53,52,62,4,51,50,30,2,23,7,46,1,35,34,14,2,1,19,27,
64,105,77,96,129,15,182,9,60,103,148,97,127,178,111,50,36,65,88,103,114,58,
91,142,103,64,13,185,14,114,105,77,103,64,27,2,34,93,156,113,62,104,108,12,
67,124,94,57,86,151,205,120,109,167,125,85,51,23,50,87,118,68,14,90,106,51,
103,156,0,0,0,0,2,0,86,255,236,3,239,5,204,0,31,0,51,0,123,64,87,85,34,101,
34,2,90,50,106,50,2,57,1,73,1,2,54,10,70,10,2,9,4,25,4,121,4,137,4,4,6,7,
22,7,118,7,134,7,4,19,70,64,42,0,143,18,239,18,2,18,53,128,32,71,31,6,1,6,
112,53,144,53,2,31,53,1,255,53,1,192,53,224,53,2,25,21,18,0,11,47,80,8,16,
0,37,80,3,22,0,63,237,50,63,237,50,63,63,1,93,93,113,113,47,93,237,26,16,
220,93,50,50,26,237,49,48,0,93,93,93,93,93,93,37,14,1,35,34,2,17,16,33,50,
22,23,51,52,46,1,52,53,17,51,17,20,30,2,23,35,46,3,53,1,20,30,2,51,50,62,
2,53,52,46,2,35,34,14,2,3,53,50,165,122,205,193,1,142,123,164,50,2,1,1,180,
1,2,2,1,172,2,3,3,2,253,218,28,62,96,69,71,109,73,38,38,74,107,70,66,96,64,
31,174,104,90,1,20,1,24,2,54,90,98,10,43,47,42,9,1,163,251,19,39,72,60,43,
9,10,37,48,53,26,1,112,112,160,103,48,46,103,166,120,115,159,98,43,46,102,
163,0,0,0,2,0,87,255,236,4,24,4,78,0,28,0,37,0,107,64,46,90,35,106,35,2,90,
30,106,30,2,85,3,101,3,2,8,73,9,9,27,71,64,31,29,1,144,29,1,29,39,128,37,
0,71,31,17,1,17,48,39,192,39,208,39,3,39,184,255,192,64,19,30,35,72,8,8,5,
0,80,37,37,5,32,80,22,16,5,80,14,22,0,63,237,63,237,18,57,47,237,17,57,47,
1,43,113,47,93,237,50,26,16,220,93,113,26,237,50,47,237,49,48,93,0,93,93,
1,20,30,2,51,50,54,55,23,14,3,35,34,2,17,52,62,2,51,50,30,2,29,1,39,46,1,
35,34,14,2,7,1,20,35,73,114,80,117,141,25,158,17,61,102,153,108,240,251,76,
132,176,100,136,183,111,47,186,15,144,135,45,99,84,58,4,1,247,85,143,103,
57,94,72,45,45,91,73,47,1,30,1,26,152,211,132,59,88,155,210,122,24,138,171,
157,29,74,127,98,0,0,0,1,0,29,0,0,2,60,5,202,0,27,0,161,64,11,3,10,19,10,
51,10,67,10,4,13,10,184,255,224,64,106,8,12,72,26,15,16,1,14,16,25,16,1,70,
5,0,2,1,18,2,31,29,47,29,79,29,95,29,127,29,143,29,159,29,7,15,29,63,29,127,
29,175,29,191,29,223,29,239,29,7,59,95,29,191,29,2,127,29,143,29,159,29,3,
29,64,86,100,72,29,64,39,44,72,32,29,48,29,96,29,3,175,29,223,29,239,29,3,
64,29,1,15,29,47,29,2,19,80,12,0,0,3,80,25,6,15,1,21,0,63,63,51,237,50,63,
237,1,93,93,93,113,43,43,113,114,94,93,113,47,94,93,51,237,50,50,47,94,93,
51,49,48,0,43,94,93,1,17,35,17,35,53,51,53,52,62,2,51,50,22,23,21,46,1,35,
34,14,2,29,1,51,21,1,105,180,152,152,22,59,102,81,32,69,26,17,45,18,40,51,
29,11,211,3,183,252,73,3,183,131,122,59,101,75,43,6,6,137,3,5,22,41,60,39,
97,131,0,2,0,86,254,87,3,239,4,75,0,49,0,69,0,217,64,72,122,49,138,49,2,118,
7,134,7,2,101,62,1,85,12,101,12,2,90,58,106,58,2,38,3,54,3,2,38,18,1,41,33,
1,9,23,25,23,121,23,137,23,4,6,29,22,29,118,29,134,29,4,9,47,70,64,50,34,
48,14,1,127,14,223,14,2,14,71,128,6,70,5,184,255,192,64,81,23,28,72,5,5,60,
71,15,26,1,10,26,32,71,64,71,2,207,71,1,0,71,32,71,144,71,176,71,4,80,223,
71,1,192,71,1,79,71,1,128,71,160,71,2,15,71,47,71,2,208,71,240,71,2,15,71,
1,8,41,15,34,55,80,31,16,15,65,80,21,22,9,80,53,6,1,38,6,1,6,0,27,0,63,50,
93,93,237,63,237,50,63,237,50,63,1,94,93,93,113,113,114,114,114,94,93,93,
113,47,94,93,237,51,47,43,237,26,16,220,93,113,50,50,26,237,49,48,0,94,93,
93,93,93,93,93,93,93,93,93,1,34,46,2,39,55,30,1,51,50,62,2,61,1,35,14,3,35,
34,46,2,53,52,62,2,51,50,22,23,51,52,62,2,55,51,14,3,21,17,20,6,19,52,46,
2,35,34,14,2,21,20,30,2,51,50,62,2,2,36,93,144,102,64,14,181,18,123,100,61,
100,70,38,2,20,59,85,112,72,103,147,93,43,43,97,155,111,115,169,46,2,3,3,
4,2,171,1,2,2,1,223,44,49,80,103,54,69,99,65,31,31,64,98,68,54,103,82,50,
254,87,38,71,98,60,26,75,81,34,75,120,86,174,41,75,58,35,69,138,205,135,130,
208,145,77,105,97,25,62,55,40,3,9,43,60,73,39,252,197,227,229,3,198,113,161,
102,48,48,103,161,112,117,159,98,42,46,100,158,0,0,0,0,1,0,142,0,0,3,238,
5,204,0,33,0,109,185,0,8,255,192,64,36,7,11,72,11,70,64,80,12,1,159,12,255,
12,2,12,35,128,0,35,192,35,208,35,224,35,4,192,35,1,15,35,1,128,35,1,35,184,
255,192,64,32,19,23,72,28,24,70,192,25,1,0,25,16,25,48,25,224,25,240,25,5,
8,25,26,0,25,11,21,0,18,80,5,16,0,63,237,50,63,51,63,1,47,94,93,113,237,50,
43,93,113,113,114,26,16,220,93,113,26,237,49,48,43,1,62,3,51,50,30,2,21,17,
35,17,52,46,2,35,34,14,2,21,17,35,17,51,17,20,14,2,7,1,61,30,70,84,100,62,
104,133,77,29,181,17,48,88,70,64,103,73,40,180,180,2,3,2,1,3,129,55,77,50,
23,56,101,140,84,253,47,2,174,69,104,69,35,46,84,120,75,253,130,5,204,254,
126,33,66,56,39,7,0,0,0,2,0,137,0,0,1,61,5,204,0,3,0,7,0,115,64,13,3,7,70,
0,0,4,16,4,48,4,3,8,4,184,255,192,64,42,21,24,72,4,4,8,9,255,9,1,224,9,1,
223,9,1,176,9,192,9,2,159,9,1,112,9,128,9,2,31,9,1,0,9,1,240,9,1,223,9,1,
9,184,255,192,64,17,34,37,72,79,9,1,31,9,1,5,15,4,21,0,83,1,0,0,63,237,63,
63,1,93,113,43,113,113,114,114,114,114,114,114,114,114,17,18,57,47,43,94,
93,51,237,50,49,48,19,53,51,21,3,17,51,17,137,180,180,180,5,32,172,172,250,
224,4,58,251,198,0,0,0,0,2,255,206,254,87,1,61,5,204,0,3,0,23,1,51,64,151,
7,24,12,16,72,7,40,8,11,72,3,4,70,21,12,12,0,0,21,16,21,32,21,64,21,4,7,21,
21,24,25,144,25,1,63,25,1,0,25,16,25,2,219,25,64,210,213,72,208,25,224,25,
2,143,25,1,64,25,80,25,2,15,25,31,25,95,25,111,25,255,25,5,144,25,160,25,
224,25,240,25,4,79,25,1,0,25,1,160,63,25,175,25,191,25,207,25,4,239,25,1,
176,25,192,25,208,25,3,63,25,79,25,95,25,3,32,25,1,143,25,191,25,207,25,3,
0,25,1,111,239,25,1,208,25,1,63,25,143,25,2,111,25,143,25,159,25,175,25,255,
25,5,25,184,255,192,64,84,79,82,72,223,25,1,144,25,160,25,176,25,3,47,25,
63,25,79,25,3,0,25,1,61,25,64,53,56,72,112,25,128,25,144,25,176,25,4,15,25,
31,25,2,255,25,1,25,64,35,38,72,144,25,1,79,25,1,255,25,1,112,25,128,25,192,
25,208,25,224,25,5,31,25,1,22,15,16,80,9,27,0,83,1,0,0,63,237,63,237,63,1,
93,93,93,113,113,43,113,114,114,43,94,93,93,93,93,43,113,114,114,114,94,93,
93,113,113,113,113,114,94,93,93,93,113,114,114,114,43,94,93,93,93,17,18,57,
47,94,93,51,51,47,16,237,50,49,48,0,43,43,19,53,51,21,17,20,14,2,35,34,38,
39,53,30,1,51,50,62,2,53,17,51,137,180,21,54,93,72,34,65,28,13,36,13,38,49,
28,10,180,5,32,172,172,250,90,62,106,78,45,4,5,139,2,4,20,43,67,46,4,165,
0,0,1,0,138,0,0,4,3,5,204,0,11,0,251,64,84,124,2,1,122,8,1,118,7,1,86,9,102,
9,134,9,150,9,4,139,0,155,0,2,89,0,105,0,121,0,3,116,10,132,10,148,10,3,68,
10,1,1,10,10,11,42,8,1,3,8,9,16,116,9,1,9,9,0,11,16,84,11,116,11,148,11,3,
116,11,148,11,180,11,212,11,228,11,244,11,6,48,11,1,2,11,184,255,192,64,105,
7,10,72,11,7,3,70,0,4,16,4,48,4,240,4,4,8,4,31,13,63,13,2,31,13,63,13,95,
13,255,13,4,15,13,31,13,63,13,95,13,127,13,5,57,13,64,83,86,72,96,13,128,
13,160,13,192,13,208,13,5,223,13,1,0,13,96,13,128,13,160,13,4,0,13,16,13,
48,13,64,13,128,13,160,13,192,13,224,13,240,13,9,7,2,1,7,10,4,8,15,5,0,4,
21,0,21,0,63,63,63,63,23,57,1,94,93,113,113,114,43,94,93,113,114,47,94,93,
237,50,47,43,95,93,93,113,56,51,51,47,93,56,51,95,114,17,57,17,51,49,48,93,
93,93,93,93,0,93,1,93,0,93,33,1,7,17,35,17,51,17,1,51,9,1,3,48,254,146,132,
180,180,1,219,211,254,73,1,206,1,238,109,254,127,5,204,252,97,2,13,254,47,
253,151,0,0,0,1,0,138,0,0,1,62,5,204,0,3,0,111,64,52,3,70,192,0,1,208,0,1,
0,0,16,0,48,0,240,0,4,8,0,224,5,240,5,2,223,5,1,176,5,192,5,2,159,5,1,112,
5,128,5,2,15,5,31,5,2,240,5,1,223,5,1,5,184,255,192,64,27,34,37,72,79,5,1,
255,5,1,112,5,128,5,192,5,208,5,224,5,5,31,5,1,1,0,0,21,0,63,63,1,93,93,93,
113,43,113,113,114,114,114,114,114,114,47,94,93,113,114,237,49,48,51,17,51,
17,138,180,5,204,250,52,0,0,1,0,136,0,0,6,35,4,78,0,59,2,194,185,0,42,255,
224,179,8,11,72,32,184,255,224,64,255,8,11,72,34,59,70,0,0,13,46,70,217,47,
249,47,2,182,47,1,41,47,89,47,137,47,3,6,47,1,166,47,182,47,214,47,230,47,
4,137,47,1,118,47,1,89,47,1,6,47,22,47,70,47,3,7,47,25,12,70,198,13,1,6,13,
22,13,54,13,230,13,246,13,5,8,13,251,61,1,201,61,217,61,233,61,3,187,61,1,
153,61,1,139,61,1,105,61,121,61,2,91,61,1,73,61,1,43,61,59,61,2,249,61,1,
235,61,1,217,61,1,203,61,1,189,61,1,153,61,1,139,61,1,105,61,1,91,61,1,41,
61,57,61,2,27,61,1,9,61,1,202,235,61,251,61,2,105,61,137,61,153,61,185,61,
201,61,5,91,61,1,77,61,1,41,61,57,61,2,27,61,1,249,61,1,235,61,1,201,61,217,
61,2,187,61,1,153,61,1,139,61,1,125,61,1,1,43,61,75,61,91,61,107,61,4,31,
61,1,4,61,1,203,61,235,61,2,175,61,191,61,2,139,61,1,127,61,1,43,61,75,61,
91,61,107,61,4,31,61,1,11,61,1,154,255,61,1,235,61,64,255,1,223,61,1,187,
61,1,175,61,1,139,61,155,61,2,127,61,1,91,61,107,61,2,79,61,1,59,61,1,36,
61,1,11,61,1,235,61,1,223,61,1,187,61,1,175,61,1,155,61,1,127,61,143,61,2,
100,61,1,75,61,1,63,61,1,43,61,1,15,61,31,61,2,235,61,1,223,61,1,123,61,139,
61,171,61,187,61,4,111,61,1,59,61,1,31,61,1,11,61,1,106,187,61,203,61,235,
61,3,175,61,1,139,61,1,127,61,1,91,61,1,79,61,1,27,61,1,251,61,1,223,61,239,
61,2,187,61,203,61,2,175,61,1,100,61,148,61,2,27,61,43,61,75,61,3,4,61,1,
244,61,1,139,61,171,61,219,61,3,127,61,1,107,61,1,52,61,1,27,61,1,15,61,1,
57,187,61,219,61,251,61,3,160,61,1,116,61,148,61,2,43,61,75,61,91,61,3,31,
61,1,11,61,1,203,61,235,61,251,61,3,164,61,1,27,61,75,61,91,61,123,61,4,244,
61,1,208,61,1,2,96,61,144,61,160,61,192,61,4,79,61,1,48,61,1,47,61,1,0,64,
19,61,1,8,34,53,80,40,16,25,6,80,31,16,19,15,47,13,0,21,0,63,50,50,63,63,
237,50,63,237,50,1,94,93,93,93,93,93,95,93,93,113,113,113,114,114,114,114,
114,114,94,93,93,93,93,93,93,93,113,113,113,113,113,113,113,114,114,114,114,
114,114,114,94,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,113,
113,114,114,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93,
93,113,113,113,95,113,113,113,113,113,113,113,114,114,114,114,114,114,94,
93,93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,47,
94,93,113,237,50,47,94,93,93,93,93,93,113,113,113,113,237,18,57,47,237,57,
49,48,0,43,43,33,17,52,46,2,35,34,14,2,21,17,35,17,52,46,2,39,51,30,3,21,
51,62,3,51,50,22,23,51,62,3,51,50,30,2,21,17,35,17,52,46,2,35,34,14,2,21,
17,3,0,20,47,76,55,57,92,65,35,179,1,2,2,1,170,1,2,3,2,3,24,56,75,97,64,123,
143,28,3,24,60,80,100,64,82,119,76,36,178,20,47,76,55,57,92,65,35,2,174,79,
106,65,27,45,85,125,81,253,141,3,83,34,75,67,48,7,5,44,57,59,20,47,76,53,
29,98,107,47,76,53,29,44,92,145,100,253,47,2,174,79,106,65,27,43,84,126,83,
253,141,0,1,0,136,0,0,3,238,4,78,0,37,0,109,185,0,34,255,224,64,36,7,11,72,
37,70,64,80,0,1,159,0,255,0,2,0,39,128,0,39,192,39,208,39,224,39,4,192,39,
1,15,39,1,128,39,1,39,184,255,192,64,32,19,23,72,25,12,70,192,13,1,0,13,16,
13,48,13,224,13,240,13,5,8,13,25,6,80,31,16,19,15,13,0,21,0,63,50,63,63,237,
50,1,47,94,93,113,237,50,43,93,113,113,114,26,16,220,93,113,26,237,49,48,
43,33,17,52,46,2,35,34,14,2,21,17,35,17,52,46,2,39,51,30,3,21,51,62,3,51,
50,30,2,21,17,3,57,23,52,85,63,64,103,73,40,180,1,2,2,1,170,1,2,3,2,3,26,
62,82,106,70,90,130,84,39,2,174,79,106,65,27,45,85,125,81,253,141,3,83,34,
75,67,48,7,5,44,57,59,20,47,76,53,29,44,92,145,100,253,47,0,0,0,0,2,0,86,
255,236,4,29,4,78,0,14,0,34,0,116,64,59,121,32,137,32,2,116,28,132,28,2,118,
22,134,22,2,121,18,137,18,2,150,12,166,12,2,4,12,20,12,2,11,9,27,9,2,11,5,
27,5,2,4,2,20,2,2,7,0,71,64,144,15,1,15,36,128,48,36,1,36,184,255,192,64,
20,30,35,72,223,36,1,25,71,31,8,1,8,20,80,10,16,30,80,3,22,0,63,237,63,237,
1,47,93,237,93,43,113,26,16,220,93,26,237,49,48,94,93,93,93,93,93,93,93,93,
93,1,16,2,35,34,46,2,53,16,33,50,30,2,7,52,46,2,35,34,14,2,21,20,30,2,51,
50,62,2,4,29,250,238,113,178,123,65,1,229,126,183,117,56,189,39,75,108,68,
69,111,78,41,44,77,105,62,69,112,78,42,2,30,254,228,254,234,68,140,211,143,
2,48,70,140,210,140,126,164,98,39,41,99,164,123,126,165,98,40,39,98,166,0,
0,2,0,132,254,87,4,29,4,77,0,38,0,58,0,148,64,16,105,56,121,56,2,105,42,121,
42,2,134,36,150,36,2,36,184,255,224,64,19,7,10,72,73,31,89,31,2,73,7,89,7,
2,134,3,150,3,2,3,184,255,224,64,63,7,10,72,0,71,64,160,39,1,39,60,128,49,
28,15,70,0,16,16,16,48,16,240,16,4,8,16,176,60,1,63,60,1,112,60,144,60,2,
31,60,1,255,60,1,192,60,224,60,2,28,44,80,34,16,22,15,15,27,8,54,80,5,22,
0,63,237,50,63,63,63,237,50,1,93,93,113,113,114,114,47,94,93,237,50,50,26,
16,220,93,26,237,49,48,43,93,93,93,43,93,93,93,1,20,14,2,35,34,38,39,35,30,
3,21,17,35,17,52,46,2,39,51,30,3,21,51,62,3,51,50,30,2,7,52,46,2,35,34,14,
2,21,20,30,2,51,50,62,2,4,29,40,93,153,112,116,174,46,5,1,1,1,1,180,1,2,2,
1,174,1,3,3,3,4,25,64,82,101,63,112,153,93,40,189,24,59,98,74,60,106,79,46,
38,73,108,70,75,99,59,24,2,34,123,208,150,85,88,100,2,32,48,59,29,254,89,
5,6,39,72,59,42,9,3,36,51,58,26,52,73,47,21,80,145,205,129,100,156,108,56,
34,96,169,135,115,159,98,43,58,110,159,0,0,2,0,86,254,87,3,240,4,78,0,34,
0,54,0,165,64,119,85,47,101,47,2,90,43,106,43,2,57,32,73,32,2,54,9,70,9,2,
9,1,25,1,121,1,137,1,4,6,5,22,5,118,5,134,5,4,9,22,70,64,35,11,127,23,223,
23,2,23,56,128,45,71,15,3,1,10,3,32,56,64,56,2,207,56,1,0,56,32,56,144,56,
176,56,4,80,223,56,1,192,56,1,79,56,1,128,56,160,56,2,15,56,47,56,2,208,56,
240,56,2,15,56,1,8,22,27,17,16,11,40,80,6,16,29,50,80,0,22,0,63,237,50,63,
237,50,63,63,1,94,93,93,113,113,114,114,114,94,93,93,113,47,94,93,237,26,
16,220,93,50,50,26,237,49,48,0,94,93,93,93,93,93,93,5,34,2,17,16,18,51,50,
30,2,23,51,52,62,2,55,51,14,1,21,17,35,17,52,54,55,54,55,35,14,3,1,52,46,
2,35,34,14,2,21,20,30,2,51,50,62,2,1,228,206,192,197,201,67,103,81,61,25,
2,3,3,4,2,173,2,5,180,1,1,1,1,2,26,63,82,103,1,16,41,75,107,66,69,98,61,29,
27,61,97,70,60,106,79,46,20,1,22,1,22,1,26,1,28,24,47,70,47,25,61,54,39,3,
17,144,134,251,54,1,183,26,56,25,28,29,51,75,49,23,2,62,118,160,96,41,51,
105,161,110,108,160,104,51,37,97,169,0,0,0,1,0,136,0,0,2,136,4,78,0,31,0,
62,64,40,16,21,48,21,2,21,21,33,12,31,70,192,0,1,0,0,16,0,48,0,224,0,240,
0,5,8,0,25,40,19,22,72,25,12,18,16,7,15,0,21,0,63,63,63,51,205,43,1,47,94,
93,113,237,50,17,51,47,93,49,48,51,17,52,46,2,39,51,30,3,21,51,62,3,51,50,
22,23,21,46,1,35,34,14,2,21,17,142,1,2,2,1,170,1,3,3,1,4,19,43,58,80,57,22,
40,11,18,48,30,62,87,55,26,3,62,34,71,66,58,23,23,59,62,57,20,62,91,59,29,
7,3,165,5,5,56,99,137,81,253,204,0,0,1,0,57,255,236,3,182,4,75,0,55,0,189,
64,85,116,46,132,46,2,111,21,127,21,143,21,3,107,22,1,37,54,1,42,27,1,21,
52,1,5,2,21,2,2,11,30,27,30,2,36,73,35,35,0,72,64,32,19,48,19,2,144,19,160,
19,176,19,3,19,57,128,11,73,10,64,25,30,72,10,10,44,72,79,29,95,29,2,32,29,
1,29,96,57,192,57,2,128,57,1,57,184,255,192,64,42,39,42,72,63,57,1,16,57,
1,19,44,5,41,80,32,0,36,1,144,36,240,36,2,36,36,32,16,14,80,5,96,11,112,11,
2,128,11,1,11,11,5,22,0,63,51,47,93,113,16,237,63,51,47,93,113,16,237,18,
57,57,1,93,93,43,93,113,47,93,113,237,51,47,43,237,26,16,220,93,113,26,237,
50,47,237,49,48,93,93,0,93,1,93,93,0,93,93,93,1,20,14,2,35,34,46,2,39,55,
30,1,51,50,62,2,53,52,46,2,39,46,3,53,52,54,51,50,22,23,7,46,3,35,34,6,21,
20,30,2,23,30,5,3,182,59,112,163,105,94,151,114,77,18,159,23,144,128,58,97,
70,39,46,82,117,70,65,128,103,64,211,202,179,211,28,162,9,48,68,85,46,122,
116,43,77,108,65,43,90,85,75,56,33,1,43,76,119,81,43,29,64,105,76,31,87,81,
16,39,65,48,49,63,42,31,19,17,42,69,102,77,148,155,126,139,20,42,57,35,15,
74,75,44,57,39,29,16,11,25,35,47,66,88,0,0,0,0,1,0,31,255,240,2,42,5,44,0,
22,0,123,64,87,40,14,1,105,14,121,14,137,14,3,40,13,1,105,13,121,13,137,13,
3,139,4,1,4,32,9,13,72,108,4,124,4,156,4,172,4,4,4,32,9,12,72,111,22,127,
22,2,22,12,13,22,3,16,70,9,8,143,5,1,0,5,16,5,32,5,64,5,4,7,5,128,24,1,15,
6,80,12,63,10,1,10,9,15,19,80,3,22,0,63,237,63,205,93,51,237,50,1,93,47,94,
93,113,51,51,237,23,50,47,93,49,48,0,43,93,1,43,93,93,113,93,113,37,14,1,
35,34,53,17,35,53,51,55,51,21,51,21,35,17,20,22,51,50,54,55,2,42,41,85,56,
216,125,132,53,120,200,200,51,63,26,49,29,8,11,13,245,2,210,131,242,242,131,
253,85,78,63,8,6,0,0,0,0,1,0,133,255,236,3,235,4,58,0,37,0,121,64,69,150,
3,1,26,33,42,33,58,33,3,25,14,70,64,47,11,143,11,2,191,11,1,143,11,159,11,
255,11,3,11,39,128,1,70,223,36,239,36,2,0,36,16,36,48,36,240,36,4,8,36,176,
39,192,39,208,39,3,176,39,240,39,2,255,39,1,112,39,1,39,184,255,192,64,13,
19,23,72,25,6,80,31,22,19,21,12,0,15,0,63,50,63,63,237,50,1,43,93,93,113,
114,47,94,93,113,237,26,16,220,93,113,114,26,237,51,49,48,0,93,93,1,17,20,
30,2,51,50,62,2,53,17,51,17,20,30,2,23,35,46,3,53,35,14,3,35,34,46,2,53,17,
1,58,23,52,85,63,64,103,73,40,180,1,2,2,1,170,1,2,3,2,3,26,62,82,106,70,90,
130,84,39,4,58,253,82,79,106,65,27,45,85,125,81,2,115,252,173,34,75,67,48,
7,5,44,57,59,20,47,76,53,29,44,92,144,101,2,209,0,0,1,0,7,0,0,3,249,4,58,
0,16,2,91,64,55,57,1,73,1,2,153,1,1,54,0,70,0,2,134,0,150,0,2,58,15,74,15,
2,154,15,1,105,15,121,15,137,15,3,53,3,69,3,2,149,3,1,3,103,3,119,3,135,3,
3,14,16,13,17,72,4,184,255,240,64,62,13,17,72,1,0,9,9,2,15,16,16,43,16,123,
16,2,4,16,20,16,2,4,16,20,16,68,16,84,16,132,16,148,16,196,16,212,16,8,219,
16,1,68,16,84,16,132,16,148,16,196,16,5,27,16,1,4,16,1,8,16,3,2,184,255,240,
64,255,11,2,91,2,2,42,2,11,18,27,18,2,11,18,27,18,75,18,91,18,139,18,155,
18,203,18,219,18,8,255,18,1,196,18,212,18,2,160,18,1,132,18,148,18,2,96,18,
1,68,18,84,18,2,32,18,1,4,18,20,18,2,199,224,18,1,196,18,212,18,2,160,18,
1,4,18,20,18,68,18,84,18,132,18,148,18,6,68,18,84,18,132,18,148,18,196,18,
212,18,6,27,18,1,4,18,1,219,18,1,196,18,1,155,18,1,132,18,1,91,18,1,68,18,
1,27,18,1,4,18,1,151,11,18,27,18,75,18,91,18,139,18,155,18,203,18,219,18,
8,155,18,203,18,219,18,3,132,18,1,96,18,1,68,18,84,18,2,32,18,1,4,18,20,18,
2,224,18,1,196,18,212,18,2,160,18,1,132,18,148,18,2,96,18,1,4,18,20,18,68,
18,84,18,4,103,4,18,20,18,68,18,84,18,132,18,148,18,196,18,212,18,8,219,18,
1,196,18,1,155,18,1,132,18,1,91,18,1,68,18,1,27,18,1,4,18,1,219,18,1,196,
18,1,11,18,27,18,75,18,64,99,91,18,139,18,155,18,6,55,75,18,91,18,139,18,
155,18,203,18,219,18,6,63,18,1,32,18,1,4,18,20,18,2,224,18,1,196,18,212,18,
2,160,18,1,132,18,148,18,2,96,18,1,68,18,84,18,2,32,18,1,4,18,20,18,2,196,
18,212,18,2,160,18,1,132,18,148,18,2,96,18,1,2,80,18,1,47,18,1,0,18,16,18,
2,7,15,2,15,9,1,21,0,63,51,63,51,1,94,93,93,93,95,93,93,93,93,113,113,113,
113,113,113,113,113,114,114,114,114,94,93,93,93,113,113,113,113,113,113,113,
113,114,94,93,93,93,93,93,93,113,113,113,113,113,113,114,94,93,93,93,93,93,
93,93,93,113,113,113,114,114,114,114,94,93,93,93,93,93,93,93,93,113,114,47,
94,93,56,51,47,94,93,93,93,93,113,114,114,56,51,18,57,61,47,51,51,49,48,43,
43,93,95,93,113,93,93,113,93,113,93,113,33,35,1,51,19,30,3,23,62,3,55,19,
51,2,101,213,254,119,192,238,7,19,20,17,6,6,19,20,21,8,246,191,4,58,253,64,
22,63,68,63,21,21,63,66,63,22,2,194,0,0,0,0,1,255,253,0,0,5,204,4,58,0,42,
3,177,64,36,229,23,1,58,41,74,41,2,122,41,138,41,154,41,3,53,16,69,16,2,117,
16,133,16,149,16,3,54,29,70,29,2,54,29,1,29,184,255,240,64,22,13,17,72,57,
28,73,28,2,57,28,1,28,16,13,17,72,54,0,70,0,2,0,184,255,240,64,9,11,17,72,
54,13,70,13,2,13,184,255,240,64,51,11,17,72,57,1,73,1,2,1,16,11,17,72,57,
14,73,14,2,3,14,16,9,17,72,14,13,22,29,28,7,1,0,35,40,35,1,88,35,1,22,7,35,
35,7,22,3,15,41,42,16,42,184,255,192,64,73,47,50,72,73,42,1,52,42,1,38,42,
1,249,42,1,198,42,230,42,2,164,42,1,150,42,1,121,42,1,54,42,70,42,102,42,
3,25,42,1,244,42,1,182,42,230,42,2,132,42,148,42,2,102,42,118,42,2,57,42,
1,38,42,1,20,42,1,6,42,1,8,42,16,15,184,255,240,64,255,9,15,89,15,105,15,
121,15,4,10,15,198,44,230,44,246,44,3,164,44,1,150,44,1,121,44,1,102,44,1,
84,44,1,54,44,70,44,2,25,44,1,244,44,1,230,44,1,196,44,1,182,44,1,153,44,
1,134,44,1,116,44,1,102,44,1,57,44,1,20,44,36,44,2,6,44,1,202,249,44,1,150,
44,182,44,198,44,230,44,4,105,44,1,54,44,70,44,2,9,44,25,44,2,230,44,1,185,
44,1,86,44,102,44,134,44,3,57,44,1,43,44,1,20,44,1,6,44,1,228,44,1,214,44,
1,196,44,1,182,44,1,162,44,1,148,44,1,134,44,1,114,44,1,100,44,1,86,44,1,
52,44,68,44,2,34,44,1,20,44,1,6,44,1,153,246,44,1,194,44,210,44,2,180,44,
1,166,44,1,132,44,1,118,44,1,84,44,100,44,2,66,44,1,52,44,1,22,44,38,44,2,
4,44,1,226,44,242,44,2,212,44,1,198,44,1,164,44,1,146,44,1,132,44,1,102,44,
118,44,2,84,44,1,54,44,70,44,2,36,44,1,22,44,1,4,44,1,244,44,64,213,1,230,
44,1,196,44,1,178,44,1,164,44,1,102,44,134,44,150,44,3,68,44,84,44,2,54,44,
1,20,44,1,6,44,1,105,246,44,1,226,44,1,212,44,1,150,44,182,44,198,44,3,116,
44,132,44,2,54,44,70,44,102,44,3,36,44,1,6,44,22,44,2,244,44,1,182,44,230,
44,2,148,44,164,44,2,134,44,1,105,44,1,86,44,1,68,44,1,6,44,54,44,2,228,44,
1,214,44,1,196,44,1,166,44,182,44,2,137,44,1,114,44,1,1,96,44,1,4,44,36,44,
84,44,3,56,164,44,196,44,212,44,244,44,4,128,44,1,116,44,1,75,44,1,48,44,
1,20,44,36,44,2,251,44,1,196,44,1,160,44,1,148,44,1,123,44,1,52,44,68,44,
100,44,3,27,44,1,240,44,1,228,44,1,203,44,1,100,44,132,44,148,44,180,44,4,
63,44,1,2,0,44,16,44,2,8,7,184,255,224,64,40,14,17,72,66,7,1,52,7,1,34,7,
1,7,28,41,3,15,15,35,40,12,17,72,45,35,1,22,40,12,17,72,45,22,1,1,22,35,3,
14,21,0,63,23,51,93,43,93,43,63,23,51,93,93,93,43,1,94,93,95,93,93,93,93,
93,113,113,113,113,113,113,113,114,114,114,114,114,114,94,93,93,95,93,93,
93,93,93,93,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,
94,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,113,
113,113,114,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93,
93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,114,114,114,114,114,94,
93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,47,94,93,
56,51,47,94,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,114,114,114,
43,56,51,18,23,57,61,47,47,47,113,114,17,51,51,17,51,51,17,51,51,49,48,43,
95,113,43,113,43,113,43,113,43,93,113,43,93,113,93,113,93,113,113,33,35,3,
46,1,39,38,39,6,7,14,1,7,3,35,1,51,19,30,1,23,22,23,54,55,62,1,55,19,51,19,
30,1,23,22,23,54,55,62,1,55,19,51,4,150,209,173,8,17,8,10,9,9,10,8,19,8,178,
208,254,209,178,183,7,14,7,7,8,8,9,8,16,6,196,193,189,7,16,7,8,8,8,8,7,15,
7,191,176,2,186,27,80,38,44,47,45,44,38,82,31,253,74,4,58,253,33,23,67,32,
37,39,38,36,31,64,21,2,231,253,25,26,66,29,34,35,38,36,31,67,26,2,223,0,0,
1,0,23,0,0,3,234,4,58,0,11,2,214,64,72,148,2,1,134,2,1,141,8,157,8,2,121,
8,1,130,6,146,6,2,118,6,1,141,0,157,0,2,121,0,1,55,10,119,10,2,28,10,1,122,
4,1,19,4,1,3,24,1,120,1,136,1,152,1,4,23,7,135,7,151,7,3,6,8,10,1,7,4,4,9,
9,16,5,184,255,240,64,59,5,9,5,9,3,0,11,16,41,11,57,11,2,4,11,20,11,2,214,
11,230,11,246,11,3,196,11,1,150,11,166,11,182,11,3,132,11,1,6,11,38,11,70,
11,102,11,134,11,150,11,166,11,198,11,230,11,9,8,11,184,255,192,181,24,31,
72,11,2,3,184,255,240,64,11,9,3,1,9,3,57,3,2,10,3,13,184,255,128,64,116,223,
233,72,118,13,1,100,13,1,86,13,1,68,13,1,54,13,1,36,13,1,22,13,1,4,13,1,230,
13,246,13,2,210,13,1,192,13,1,178,13,1,132,13,148,13,164,13,3,118,13,1,100,
13,1,86,13,1,68,13,1,54,13,1,36,13,1,22,13,1,4,13,1,199,246,13,1,228,13,1,
214,13,1,196,13,1,182,13,1,164,13,1,6,13,70,13,86,13,134,13,150,13,166,13,
198,13,214,13,230,13,9,150,13,198,13,2,13,184,255,192,64,187,183,192,72,132,
13,1,86,13,102,13,118,13,3,68,13,1,38,13,54,13,2,4,13,1,151,38,13,54,13,102,
13,118,13,166,13,182,13,198,13,230,13,246,13,9,230,13,1,132,13,1,118,13,1,
68,13,84,13,100,13,3,54,13,1,36,13,1,22,13,1,4,13,1,246,13,1,228,13,1,214,
13,1,196,13,1,182,13,1,164,13,1,118,13,134,13,150,13,3,100,13,1,6,13,22,13,
38,13,70,13,86,13,5,103,6,13,70,13,86,13,134,13,150,13,198,13,214,13,230,
13,8,153,13,217,13,2,100,13,1,86,13,1,68,13,1,54,13,1,36,13,1,22,13,1,4,13,
1,214,13,230,13,246,13,3,196,13,1,6,13,38,13,54,13,70,13,4,55,102,13,166,
13,182,13,230,13,246,13,5,13,184,255,192,64,54,61,66,72,57,13,1,34,13,1,1,
0,13,16,13,2,244,13,1,192,13,208,13,224,13,3,180,13,1,128,13,144,13,160,13,
3,116,13,1,96,13,1,84,13,1,64,13,1,52,13,1,32,13,1,13,184,255,192,64,34,18,
24,72,160,13,1,2,0,13,16,13,80,13,112,13,128,13,144,13,6,7,10,4,4,7,1,3,2,
8,6,15,0,2,21,0,63,51,63,51,18,23,57,17,1,51,94,93,95,93,43,113,113,113,113,
113,113,113,113,113,113,114,95,114,114,43,114,94,93,93,93,113,113,113,113,
113,113,113,113,114,94,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,
113,113,114,94,93,93,93,93,93,43,93,113,114,114,114,114,114,114,94,93,93,
93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,43,47,94,
93,114,56,51,47,43,94,93,113,113,113,113,114,114,56,51,18,57,57,47,47,56,
56,18,23,57,50,51,49,48,0,93,93,1,95,93,93,93,93,93,93,93,93,93,93,93,93,
33,9,1,35,9,1,51,9,1,51,9,1,3,33,254,221,254,219,194,1,129,254,145,199,1,
14,1,12,201,254,145,1,134,1,188,254,68,2,44,2,14,254,91,1,165,253,244,253,
210,0,0,0,0,1,0,5,254,87,3,252,4,58,0,31,2,207,64,59,147,3,1,147,2,1,153,
16,1,150,0,1,141,16,157,16,2,141,0,157,0,2,122,29,138,29,154,29,3,105,29,
1,157,30,1,30,16,13,16,72,146,19,1,134,19,1,114,19,1,86,19,102,19,2,146,18,
1,3,18,184,255,240,64,36,13,16,72,16,0,24,8,24,8,24,17,30,31,16,153,31,1,
134,31,1,89,31,1,70,31,1,25,31,1,6,31,1,8,31,18,17,184,255,240,64,36,17,6,
33,1,6,33,38,33,54,33,70,33,102,33,118,33,134,33,166,33,182,33,198,33,230,
33,246,33,12,199,230,33,246,33,2,33,184,255,192,64,255,217,233,72,196,33,
1,166,33,182,33,2,132,33,1,6,33,38,33,54,33,70,33,102,33,118,33,6,6,33,38,
33,54,33,70,33,102,33,118,33,134,33,166,33,182,33,198,33,230,33,246,33,12,
6,33,22,33,38,33,70,33,86,33,102,33,134,33,166,33,198,33,230,33,246,33,11,
151,244,33,1,224,33,1,194,33,210,33,2,180,33,1,160,33,1,130,33,146,33,2,116,
33,1,96,33,1,66,33,82,33,2,52,33,1,32,33,1,2,33,18,33,2,228,33,244,33,2,194,
33,210,33,2,164,33,180,33,2,130,33,146,33,2,100,33,116,33,2,66,33,82,33,2,
36,33,52,33,2,2,33,18,33,2,228,33,244,33,2,194,33,210,33,2,164,33,180,33,
2,130,33,146,33,2,100,33,116,33,2,86,33,1,66,33,1,36,33,52,33,2,22,33,1,2,
33,1,103,228,33,244,33,2,214,33,1,194,33,1,164,33,180,33,2,150,33,1,130,33,
1,100,33,116,33,2,86,33,1,66,33,1,36,33,52,33,2,22,33,1,2,33,1,228,33,244,
33,2,214,33,1,64,166,194,33,1,1,160,33,176,33,2,132,33,148,33,2,96,33,112,
33,2,68,33,84,33,2,32,33,48,33,2,4,33,20,33,2,224,33,240,33,2,196,33,212,
33,2,160,33,176,33,2,132,33,148,33,2,96,33,112,33,2,68,33,84,33,2,32,33,48,
33,2,4,33,20,33,2,55,224,33,1,196,33,212,33,2,160,33,1,132,33,148,33,2,96,
33,1,68,33,84,33,2,32,33,1,4,33,20,33,2,224,33,1,196,33,212,33,2,160,33,1,
132,33,148,33,2,96,33,1,2,0,33,32,33,48,33,80,33,4,80,33,128,33,144,33,192,
33,4,47,33,1,0,33,16,33,2,7,16,0,24,0,32,30,17,15,12,80,5,27,0,63,237,63,
51,17,51,51,17,51,1,94,93,93,93,113,95,113,113,113,113,113,114,114,114,114,
114,114,114,114,94,93,93,93,93,93,93,93,93,113,113,113,113,113,113,95,113,
113,113,114,114,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,
93,93,93,93,93,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,
114,114,114,114,114,94,93,113,114,114,114,114,43,114,94,93,113,47,56,51,47,
94,93,93,93,93,93,93,56,51,18,57,57,61,47,24,47,17,51,51,49,48,43,95,93,93,
93,93,93,43,93,93,93,0,93,93,1,93,93,93,93,33,14,3,35,34,38,39,53,30,1,51,
50,54,63,1,1,51,19,30,3,23,62,3,55,19,51,2,92,38,79,98,120,78,34,58,32,19,
48,17,79,136,51,17,254,83,192,228,10,31,31,24,2,3,23,29,30,10,212,190,98,
157,111,59,4,7,135,3,3,118,129,43,4,53,253,170,27,90,90,72,9,11,65,80,82,
30,2,106,0,1,0,49,0,0,3,182,4,58,0,9,1,11,64,78,157,2,173,2,2,139,2,1,89,
2,105,2,2,146,7,162,7,2,116,7,132,7,2,70,7,86,7,102,7,3,40,8,1,3,8,2,123,
6,1,4,6,20,6,36,6,164,6,180,6,212,6,228,6,7,7,6,7,3,11,1,59,1,91,1,3,10,1,
64,39,55,72,1,64,17,20,72,1,11,184,255,192,64,40,92,100,72,192,11,1,180,11,
1,160,11,1,148,11,1,128,11,1,116,11,1,96,11,1,84,11,1,64,11,1,52,11,68,11,
100,11,132,11,4,11,184,255,192,64,32,73,82,72,32,11,1,20,11,1,0,11,1,63,68,
11,100,11,132,11,164,11,4,4,11,36,11,68,11,100,11,4,11,184,255,192,179,51,
62,72,11,184,255,192,64,18,31,39,72,224,11,1,2,0,11,32,11,80,11,112,11,4,
7,11,184,255,192,64,13,16,20,72,6,3,80,4,15,1,7,80,0,21,0,63,237,50,63,237,
50,1,43,94,93,95,93,43,43,113,114,94,93,93,93,43,93,113,113,113,113,113,113,
113,113,113,43,47,43,43,94,93,51,51,47,94,93,113,51,51,95,113,49,48,93,93,
93,93,93,93,51,53,1,33,53,33,21,1,33,21,49,2,149,253,147,3,56,253,106,2,187,
137,3,38,139,137,252,218,139,0,0,0,1,0,34,254,87,2,136,5,204,0,45,0,96,64,
65,3,32,9,12,72,19,32,9,13,72,23,45,33,28,40,240,17,11,31,5,63,5,2,143,5,
1,64,5,1,5,33,11,245,47,12,111,12,2,15,12,79,12,223,12,239,12,4,47,12,79,
12,111,12,3,12,12,0,24,245,21,0,43,245,0,27,0,63,237,63,237,18,57,47,93,113,
114,237,57,1,47,93,93,113,51,51,237,50,50,205,50,49,48,43,43,1,34,46,2,53,
17,52,46,2,39,53,62,3,53,17,52,54,59,1,21,35,34,6,21,17,20,14,2,7,21,30,3,
21,17,20,22,59,1,21,2,1,65,99,66,34,29,55,80,51,51,80,55,29,133,131,135,63,
91,77,30,52,71,41,43,71,51,29,77,91,63,254,87,41,76,108,68,1,105,63,88,56,
28,2,127,2,28,56,88,62,1,106,141,152,129,107,108,254,156,50,84,64,44,10,2,
10,44,65,84,51,254,155,106,109,129,0,1,0,183,254,78,1,93,5,204,0,3,1,207,
64,21,3,171,6,0,1,11,0,0,4,5,214,5,230,5,246,5,3,194,5,1,5,184,255,128,179,
226,229,72,5,184,255,192,64,10,222,225,72,2,5,18,5,2,218,5,184,255,128,179,
214,217,72,5,184,255,192,64,20,210,213,72,180,5,196,5,2,162,5,1,1,112,5,128,
5,144,5,3,5,184,255,192,64,20,199,202,72,0,5,1,240,5,1,212,5,228,5,2,176,
5,192,5,2,5,184,255,192,64,43,187,190,72,48,5,64,5,80,5,3,4,5,20,5,36,5,3,
240,5,1,196,5,212,5,228,5,3,128,5,144,5,160,5,3,4,5,20,5,36,5,3,164,5,184,
255,192,179,168,171,72,5,184,255,128,179,160,163,72,5,184,255,192,64,14,156,
159,72,112,5,128,5,144,5,3,228,5,1,5,184,255,192,64,11,145,148,72,176,5,192,
5,208,5,3,5,184,255,192,64,15,133,136,72,48,5,1,20,5,36,5,2,0,5,1,5,184,255,
192,64,15,122,125,72,128,5,1,4,5,20,5,36,5,3,110,5,184,255,192,64,10,114,
117,72,192,5,1,84,5,1,5,184,255,192,182,102,105,72,16,5,1,5,184,255,192,64,
9,91,94,72,80,5,96,5,2,5,184,255,192,64,15,79,82,72,203,5,219,5,2,160,5,176,
5,2,2,5,184,255,192,64,10,68,71,72,15,5,31,5,2,62,5,184,255,192,64,29,56,
61,72,207,5,1,96,5,112,5,160,5,176,5,4,31,5,1,0,5,1,160,5,224,5,240,5,3,5,
184,255,192,64,28,25,28,72,5,64,17,21,72,64,5,112,5,128,5,144,5,4,15,5,31,
5,47,5,3,7,1,0,0,0,47,63,1,94,93,93,43,43,113,114,114,114,114,43,94,93,43,
95,93,93,43,113,43,114,43,114,114,43,94,93,93,43,113,113,113,43,113,43,113,
114,43,43,43,94,93,93,93,93,113,113,43,113,113,113,114,43,114,95,114,114,
43,43,94,93,43,43,93,93,17,18,57,47,94,93,237,49,48,19,17,51,17,183,166,254,
78,7,126,248,130,0,0,0,0,1,0,34,254,87,2,135,5,204,0,45,0,98,185,0,40,255,
224,179,9,12,72,24,184,255,224,64,55,9,13,72,20,44,32,26,38,240,15,9,48,3,
1,192,3,208,3,2,3,9,32,245,47,31,111,31,2,15,31,79,31,223,31,239,31,4,47,
31,79,31,111,31,3,31,31,21,45,245,44,27,20,245,21,0,0,63,237,63,237,18,57,
47,93,113,114,237,57,1,47,93,113,51,51,253,50,50,205,50,49,48,43,43,19,50,
54,53,17,52,62,2,55,53,46,3,53,17,52,38,43,1,53,51,50,22,21,17,20,30,2,23,
21,14,3,21,17,20,14,2,43,1,53,94,91,79,28,51,71,43,42,70,52,29,79,91,60,132,
131,133,29,55,81,52,52,81,55,29,34,66,99,65,132,254,216,109,106,1,101,51,
84,65,44,10,2,10,44,64,84,50,1,100,108,107,129,152,141,254,150,62,88,56,28,
2,127,2,28,56,88,63,254,151,68,108,76,41,129,0,0,0,0,1,0,92,2,41,4,80,3,39,
0,32,0,154,64,26,90,3,138,3,2,25,2,41,2,57,2,3,30,48,10,16,72,13,31,1,25,
48,9,12,72,13,184,255,208,179,9,13,72,7,184,255,208,64,19,9,13,72,0,27,32,
27,112,27,3,27,32,10,1,10,24,173,64,10,184,255,192,180,38,60,72,10,0,184,
255,192,179,23,28,72,0,184,255,192,64,41,14,20,72,0,128,27,64,41,60,72,27,
5,173,31,14,79,14,159,14,3,111,14,127,14,159,14,175,14,207,14,239,14,255,
14,7,14,64,9,13,72,14,0,47,43,93,113,237,196,43,26,221,43,43,196,43,26,237,
1,47,93,47,93,49,48,0,43,43,43,93,43,93,93,1,34,38,39,38,35,34,14,2,7,53,
62,1,51,50,30,2,23,30,3,51,50,54,55,21,14,3,3,76,69,145,73,129,88,38,65,60,
56,29,50,132,81,40,80,77,75,37,21,50,51,51,23,69,123,52,32,59,61,68,2,41,
44,26,45,12,23,32,21,143,38,46,13,20,26,13,8,15,14,8,50,42,149,23,30,19,8,
0,0,0,2,0,242,254,185,1,184,4,58,0,3,0,7,2,19,64,133,2,91,3,3,166,5,182,5,
2,5,150,105,6,185,6,2,70,6,86,6,2,57,6,1,6,64,23,27,72,182,6,198,6,2,73,6,
89,6,105,6,3,22,6,54,6,2,9,6,1,10,6,121,9,137,9,153,9,201,9,4,70,9,1,9,9,
57,9,2,249,9,1,182,9,1,105,9,121,9,169,9,3,38,9,1,9,9,1,204,217,9,233,9,2,
150,9,1,73,9,89,9,121,9,3,6,9,1,185,9,201,9,2,134,9,1,116,9,1,86,9,102,9,
2,68,9,1,22,9,38,9,54,9,3,9,184,255,192,64,14,168,171,72,180,9,1,134,9,150,
9,166,9,3,9,184,255,192,64,22,159,162,72,36,9,1,6,9,22,9,2,156,182,9,198,
9,214,9,246,9,4,9,184,255,64,64,14,147,150,72,102,9,1,150,9,166,9,182,9,3,
9,184,255,192,64,24,137,144,72,98,9,114,9,130,9,3,64,9,80,9,2,34,9,50,9,2,
16,9,1,9,184,255,64,182,117,124,72,128,9,1,9,184,255,64,64,10,110,115,72,
4,9,20,9,2,108,9,184,255,64,64,62,101,107,72,180,9,196,9,212,9,3,150,9,166,
9,2,132,9,1,118,9,1,82,9,98,9,2,36,9,52,9,68,9,3,6,9,22,9,2,246,9,1,194,9,
210,9,2,1,144,9,160,9,176,9,3,100,9,116,9,132,9,3,9,184,255,128,64,16,71,
75,72,212,9,228,9,244,9,3,160,9,176,9,2,9,184,255,192,64,61,59,64,72,16,9,
32,9,2,4,9,1,55,180,9,228,9,244,9,3,128,9,144,9,2,84,9,100,9,116,9,3,27,9,
1,0,9,1,240,9,1,196,9,212,9,228,9,3,84,9,100,9,164,9,212,9,228,9,244,9,6,
9,184,255,192,64,20,26,31,72,64,9,1,2,15,9,1,7,0,6,156,7,15,0,3,1,3,0,47,
93,63,253,206,1,94,93,95,93,43,93,113,113,114,114,114,114,114,94,93,93,43,
93,93,43,113,113,95,113,113,114,114,114,114,114,114,114,43,94,93,43,93,43,
113,113,113,113,43,113,114,43,114,94,93,93,43,93,93,43,113,113,113,113,113,
113,114,114,114,114,94,93,93,93,93,93,113,113,113,47,94,93,93,93,93,43,113,
113,113,237,113,51,47,237,49,48,1,51,19,35,19,21,35,53,1,10,148,24,196,198,
194,2,173,252,12,5,129,201,201,0,0,0,1,0,135,255,225,3,250,5,129,0,43,0,137,
64,31,88,14,104,14,2,87,20,103,20,2,26,28,1,21,6,1,6,3,1,25,10,22,0,11,1,
11,11,3,39,71,17,184,255,192,64,56,8,11,72,17,31,70,30,30,3,70,4,34,80,217,
31,1,124,31,140,31,2,25,31,1,31,22,96,25,112,25,2,160,25,1,25,23,3,12,213,
3,1,112,3,128,3,2,21,3,101,3,2,3,0,80,9,10,0,47,221,237,51,93,93,93,51,63,
221,93,113,50,50,93,93,93,237,1,47,237,51,47,237,47,43,237,18,57,47,113,51,
205,50,49,48,0,93,93,93,93,93,1,50,54,55,23,14,3,7,21,35,53,46,3,53,52,62,
2,55,53,51,21,30,3,23,7,46,1,35,34,14,2,21,20,30,2,2,84,96,129,15,182,8,51,
88,126,83,124,111,154,95,43,66,111,146,80,124,78,120,86,54,12,185,14,114,
105,77,103,64,27,27,64,105,1,21,104,108,12,62,116,92,62,8,168,168,10,93,149,
195,113,150,206,131,63,7,155,155,8,55,85,109,63,14,90,106,51,103,156,105,
93,156,113,62,0,0,1,0,58,0,0,4,80,5,150,0,50,0,210,64,83,70,23,1,54,2,70,
2,2,21,18,37,18,53,18,3,36,0,39,13,6,26,111,25,25,39,0,44,110,6,35,39,110,
14,95,10,1,10,10,0,79,6,95,6,111,6,3,6,50,111,0,0,32,0,2,0,0,32,0,48,0,80,
0,112,0,144,0,176,0,208,0,8,0,0,16,0,48,0,192,0,224,0,5,0,184,255,192,64,
64,14,18,72,0,38,11,81,35,15,14,31,14,175,14,3,15,14,63,14,111,14,127,14,
159,14,175,14,207,14,223,14,8,8,14,64,37,42,72,14,64,27,32,72,14,14,44,31,
115,26,20,7,7,44,116,22,50,118,50,134,50,3,50,6,24,0,63,51,93,237,50,63,51,
237,18,57,47,43,43,94,93,113,51,237,50,1,47,43,93,113,114,237,47,93,18,57,
47,113,51,237,50,16,237,17,18,57,47,237,17,51,17,18,57,49,48,0,93,1,93,0,
93,1,14,3,35,33,53,62,1,61,1,35,53,51,17,52,62,2,51,50,30,2,23,7,46,3,35,
34,6,21,17,33,21,33,21,20,14,2,7,33,50,62,2,55,4,80,9,57,89,115,67,253,70,
89,86,186,186,48,99,152,103,70,123,99,71,18,174,10,39,53,65,36,114,112,1,
152,254,104,22,44,63,40,1,227,38,67,53,37,8,1,55,80,117,77,37,154,46,160,
121,144,129,1,24,92,147,102,55,29,58,86,57,57,31,52,36,20,115,125,254,224,
129,126,56,106,92,71,21,19,42,67,48,0,0,0,2,0,113,0,225,4,2,4,115,0,35,0,
55,0,153,64,119,74,29,90,29,106,29,3,44,29,60,29,2,74,25,90,25,106,25,3,44,
25,60,25,2,69,11,85,11,101,11,3,35,11,51,11,2,69,7,85,7,101,7,3,35,7,51,7,
2,74,34,90,34,106,34,3,45,34,61,34,2,69,20,85,20,101,20,3,35,20,51,20,2,69,
16,85,16,101,16,3,35,16,51,16,2,74,2,90,2,106,2,3,45,2,61,2,2,46,176,18,36,
176,207,0,223,0,2,0,0,1,0,47,57,1,41,176,27,51,176,9,0,47,237,220,237,1,93,
47,93,93,237,220,237,49,48,93,93,93,93,93,93,93,93,0,93,93,93,93,93,93,93,
93,19,52,54,55,39,55,23,62,1,51,50,22,23,55,23,7,30,1,21,20,6,7,23,7,39,14,
1,35,34,38,39,7,39,55,46,1,55,20,30,2,51,50,62,2,53,52,46,2,35,34,14,2,137,
41,37,100,104,99,54,127,73,71,126,54,97,104,96,37,43,44,38,100,102,101,54,
126,71,72,128,52,105,102,102,37,41,154,44,77,102,58,57,102,77,44,44,77,102,
57,58,102,77,44,2,172,71,127,54,100,103,101,39,43,42,38,97,105,96,54,127,
71,71,128,53,100,105,101,37,41,42,38,105,105,102,54,127,73,58,102,76,44,44,
76,102,58,58,102,76,45,45,76,102,0,1,255,254,0,0,4,118,5,129,0,22,0,185,64,
134,151,0,167,0,2,152,17,168,17,2,73,22,1,70,18,1,155,21,171,21,2,74,21,106,
21,122,21,138,21,4,148,19,164,19,2,69,19,101,19,117,19,133,19,4,19,15,18,
31,18,79,18,143,18,4,18,9,21,0,22,16,22,64,22,128,22,4,22,20,4,0,8,92,17,
13,0,9,16,9,64,9,128,9,4,7,9,3,15,81,16,7,11,81,4,47,12,159,12,175,12,3,12,
64,41,45,72,0,12,16,12,32,12,160,12,4,12,20,0,0,16,1,15,16,175,16,2,8,16,
16,8,21,18,3,8,18,0,63,63,51,18,57,47,94,93,113,51,51,222,93,43,113,50,237,
50,16,237,50,1,47,94,93,51,51,253,50,50,57,204,93,50,16,204,93,50,49,48,93,
93,93,93,93,93,93,93,1,33,21,33,21,33,21,33,17,35,17,33,53,33,55,33,53,33,
1,51,9,1,51,2,208,1,65,254,129,1,127,254,129,178,254,131,1,125,2,254,129,
1,64,254,91,199,1,115,1,119,199,2,197,125,154,127,254,209,1,47,127,154,125,
2,188,253,121,2,135,0,2,0,183,254,78,1,93,5,204,0,3,0,7,1,221,64,23,3,7,171,
0,6,4,1,11,4,4,8,9,214,9,230,9,246,9,3,194,9,1,9,184,255,128,179,226,229,
72,9,184,255,192,64,10,222,225,72,2,9,18,9,2,218,9,184,255,128,179,214,217,
72,9,184,255,192,64,20,210,213,72,180,9,196,9,2,162,9,1,1,112,9,128,9,144,
9,3,9,184,255,192,64,20,199,202,72,0,9,1,240,9,1,212,9,228,9,2,176,9,192,
9,2,9,184,255,192,64,43,187,190,72,48,9,64,9,80,9,3,4,9,20,9,36,9,3,240,9,
1,196,9,212,9,228,9,3,128,9,144,9,160,9,3,4,9,20,9,36,9,3,164,9,184,255,192,
179,168,171,72,9,184,255,128,179,160,163,72,9,184,255,192,64,14,156,159,72,
112,9,128,9,144,9,3,228,9,1,9,184,255,192,64,11,145,148,72,176,9,192,9,208,
9,3,9,184,255,192,64,15,133,136,72,48,9,1,20,9,36,9,2,0,9,1,9,184,255,192,
64,15,122,125,72,128,9,1,4,9,20,9,36,9,3,110,9,184,255,192,64,10,114,117,
72,192,9,1,84,9,1,9,184,255,192,182,102,105,72,16,9,1,9,184,255,192,64,9,
91,94,72,80,9,96,9,2,9,184,255,192,64,15,79,82,72,203,9,219,9,2,160,9,176,
9,2,2,9,184,255,192,64,10,68,71,72,15,9,31,9,2,62,9,184,255,192,64,29,56,
61,72,207,9,1,96,9,112,9,160,9,176,9,4,31,9,1,0,9,1,160,9,224,9,240,9,3,9,
184,255,192,64,33,25,28,72,9,64,17,21,72,64,9,112,9,128,9,144,9,4,15,9,31,
9,47,9,3,7,5,0,5,0,1,4,1,0,0,63,47,18,57,57,47,47,1,94,93,93,43,43,113,114,
114,114,114,43,94,93,43,95,93,93,43,113,43,114,43,114,114,43,94,93,93,43,
113,113,113,43,113,43,113,114,43,43,43,94,93,93,93,93,113,113,43,113,113,
113,114,43,114,95,114,114,43,43,94,93,43,43,93,93,17,18,57,47,94,93,51,237,
50,49,48,19,17,51,17,3,17,51,17,183,166,166,166,2,194,3,10,252,246,251,140,
3,11,252,245,0,0,0,0,2,0,115,255,84,4,0,5,204,0,77,0,97,1,79,64,144,117,47,
133,47,2,122,8,138,8,2,100,85,1,43,85,107,85,2,45,81,109,81,2,45,57,109,57,
125,57,141,57,4,85,96,117,96,133,96,3,83,62,115,62,131,62,3,83,90,115,90,
131,90,3,121,80,137,80,2,111,80,1,90,80,1,45,80,1,116,16,132,16,2,54,16,70,
16,2,42,73,1,37,42,1,37,45,1,43,3,1,25,3,1,5,31,21,31,2,5,36,21,36,2,11,76,
27,76,2,14,73,75,34,73,55,144,75,1,75,55,75,55,78,70,29,65,24,6,73,5,5,24,
73,160,78,1,0,78,32,78,64,78,144,78,4,78,184,255,192,179,29,33,72,78,184,
255,192,64,18,21,26,72,78,45,73,44,44,88,73,0,65,32,65,176,65,3,65,184,255,
192,64,68,34,38,72,65,217,55,1,203,55,1,188,55,1,152,55,1,245,3,1,230,3,1,
149,3,1,121,83,1,106,83,1,218,83,1,155,83,1,228,14,244,14,2,166,14,1,119,
14,135,14,2,104,14,1,14,83,93,55,4,0,50,81,45,39,11,81,6,0,0,0,63,50,237,
47,51,237,18,23,57,93,93,93,93,93,93,113,113,93,93,93,93,93,93,93,1,47,43,
93,237,51,47,237,47,43,43,93,113,237,50,16,237,17,18,57,57,17,57,57,47,47,
114,16,237,16,237,49,48,93,93,93,93,93,0,93,93,1,93,0,93,93,93,93,93,93,93,
93,93,93,93,93,1,93,93,93,1,50,30,2,23,7,46,3,35,34,6,21,20,30,2,23,30,3,
21,20,14,2,7,30,3,21,20,14,2,35,34,46,2,39,55,30,3,51,50,62,2,53,52,46,2,
39,46,3,53,52,62,2,55,46,3,53,52,54,1,52,46,2,39,14,3,21,20,30,2,23,62,3,
2,76,79,138,108,73,15,161,8,46,68,84,46,125,129,50,83,109,59,68,139,112,70,
28,55,82,54,49,79,55,30,58,112,164,107,93,154,117,79,19,161,12,54,78,100,
57,58,102,76,45,57,95,123,65,65,131,104,65,32,59,84,53,42,75,57,33,211,1,
225,53,88,113,61,58,89,60,31,49,82,108,60,54,93,68,39,5,204,30,63,98,69,20,
45,58,34,13,79,71,45,64,46,32,14,16,46,73,106,76,45,87,73,55,13,21,51,64,
81,51,73,117,83,44,27,64,104,77,31,55,67,37,13,18,40,65,47,54,72,51,36,16,
15,46,73,105,74,45,83,71,53,15,14,46,64,80,48,139,155,252,203,48,69,51,35,
14,3,33,52,69,39,46,66,48,34,15,1,24,47,70,0,0,0,0,2,0,45,4,195,2,90,5,123,
0,3,0,7,0,193,178,3,133,0,184,255,192,179,19,22,72,0,184,255,192,64,131,13,
16,72,0,7,133,4,64,19,22,72,4,64,14,17,72,4,1,5,145,0,59,4,1,45,4,1,11,4,
27,4,2,57,253,4,1,235,4,1,219,4,1,201,4,1,171,4,187,4,2,153,4,1,141,4,1,1,
4,128,44,48,72,27,4,43,4,2,15,4,1,235,4,251,4,2,191,4,207,4,223,4,3,171,4,
1,159,4,1,123,4,139,4,2,111,4,1,91,4,1,79,4,1,59,4,1,31,4,47,4,2,2,15,4,63,
4,175,4,191,4,4,4,64,22,25,72,4,64,14,17,72,4,0,47,43,43,93,95,113,113,113,
113,113,113,113,113,113,113,114,114,43,95,114,114,114,114,114,114,114,94,
93,93,93,51,237,50,1,47,43,43,237,220,43,43,237,49,48,1,53,51,21,33,53,51,
21,1,183,163,253,211,165,4,195,184,184,184,184,0,0,0,0,3,0,31,255,240,5,197,
5,150,0,25,0,49,0,91,0,245,64,111,138,81,1,10,73,26,73,42,73,3,10,69,26,69,
42,69,3,76,60,1,57,47,73,47,2,54,40,70,40,2,54,36,70,36,2,57,29,73,29,2,138,
90,154,90,2,53,81,69,81,2,58,61,1,133,52,149,52,2,54,46,70,46,2,54,41,70,
41,2,57,35,73,35,2,57,30,73,30,2,50,196,81,61,95,71,111,71,2,71,61,71,61,
14,0,195,0,26,16,26,48,26,64,26,4,16,26,32,26,64,26,3,26,184,255,192,64,68,
15,23,72,26,38,195,111,14,127,14,2,14,60,55,201,66,87,201,76,82,76,15,66,
127,66,2,15,66,31,66,127,66,143,66,159,66,255,66,6,0,76,1,0,76,16,76,112,
76,128,76,144,76,240,76,6,66,76,66,76,7,33,200,21,4,43,200,7,19,0,63,237,
63,237,18,57,57,47,47,93,113,93,113,17,51,16,237,16,237,51,1,47,113,237,47,
43,93,113,237,17,57,57,47,47,93,17,51,237,49,48,0,93,93,93,93,93,93,93,93,
1,93,93,93,93,113,93,93,113,1,20,14,4,35,34,46,4,53,52,62,4,51,50,4,22,18,
7,52,46,4,35,34,14,2,21,20,30,2,51,50,62,4,37,20,30,2,51,50,62,2,55,23,14,
3,35,34,46,2,53,52,62,2,51,50,30,2,23,7,46,3,35,34,14,2,5,197,52,94,131,161,
185,100,99,185,160,133,94,52,52,94,132,161,184,100,150,1,7,197,113,92,45,
82,116,140,161,87,130,228,171,99,99,171,228,130,87,161,140,116,82,45,252,
137,33,67,100,67,49,75,56,39,14,115,22,58,82,111,75,101,149,98,48,48,97,146,
98,75,112,80,55,18,114,12,38,55,72,47,69,99,64,30,2,195,100,185,161,131,94,
52,52,94,131,161,185,100,100,184,161,132,94,52,114,196,254,249,150,86,161,
139,115,82,45,99,171,228,130,131,229,171,98,45,81,115,140,161,89,72,120,86,
48,27,45,55,29,35,43,81,63,38,64,114,158,94,97,157,111,59,36,59,75,39,33,
26,50,38,23,46,83,118,0,2,0,26,2,139,2,253,5,152,0,50,0,65,0,203,64,21,45,
40,10,17,72,46,40,10,17,72,3,40,11,17,72,7,24,11,14,72,29,184,255,216,64,
16,9,17,72,23,51,1,39,39,32,226,47,11,212,56,1,56,184,255,192,64,18,19,22,
72,144,56,1,100,56,116,56,132,56,3,80,56,1,2,56,184,255,192,64,20,10,13,72,
56,20,227,21,21,63,227,5,64,22,38,72,5,192,67,1,67,184,255,192,64,51,13,18,
72,26,57,1,11,57,1,57,228,152,20,1,20,8,10,13,72,20,16,11,1,2,11,1,11,11,
26,35,7,51,1,51,228,0,42,42,0,0,32,0,80,0,3,0,0,17,228,26,222,0,63,237,51,
47,93,51,47,16,237,93,50,17,57,47,93,93,51,43,93,237,93,93,1,43,93,47,43,
237,51,47,237,47,43,95,93,93,93,43,113,51,51,237,50,47,0,93,49,48,1,43,43,
43,43,43,1,34,46,2,53,52,62,2,63,1,53,52,46,2,35,34,6,7,39,62,3,51,50,30,
2,21,17,20,22,51,50,54,55,21,14,1,35,34,46,2,39,35,14,1,39,50,62,2,61,1,7,
14,3,21,20,22,1,4,53,86,62,33,51,86,113,62,178,21,39,56,35,67,81,9,149,7,
43,75,108,71,68,109,77,42,28,35,12,22,9,19,42,22,41,57,38,20,2,4,38,132,51,
48,80,57,32,138,41,74,55,32,58,2,139,29,56,82,52,69,92,56,24,1,4,60,46,60,
35,14,59,76,10,47,82,62,35,29,60,95,66,254,204,58,50,5,3,104,5,8,22,39,51,
29,77,70,111,34,55,71,37,65,4,2,11,29,52,43,56,65,0,0,2,0,83,0,141,4,32,3,
172,0,8,0,17,0,113,64,84,106,12,122,12,138,12,3,106,9,122,9,138,9,3,106,3,
122,3,138,3,3,106,0,122,0,138,0,3,17,236,15,235,14,236,95,10,127,10,143,10,
3,64,10,96,10,2,31,10,1,10,7,236,6,235,5,236,176,1,1,95,1,1,32,1,96,1,128,
1,3,1,9,0,239,12,15,3,47,3,111,3,127,3,4,3,0,47,93,51,228,50,1,47,93,113,
113,237,237,237,47,93,93,113,237,237,237,49,48,93,93,93,93,37,1,53,1,51,21,
9,1,21,33,1,53,1,51,21,9,1,21,3,118,254,174,1,82,168,254,174,1,84,253,131,
254,176,1,80,167,254,177,1,81,141,1,109,63,1,115,31,254,140,254,145,29,1,
109,63,1,115,31,254,140,254,145,29,0,1,0,100,0,180,4,71,2,242,0,5,0,51,64,
19,223,2,1,32,2,1,2,5,170,224,0,1,159,0,1,80,0,1,0,184,255,192,64,9,9,12,
72,0,2,173,0,3,179,0,63,204,237,1,47,43,93,93,93,237,47,93,93,49,48,37,17,
33,53,33,17,3,182,252,174,3,227,180,1,172,146,253,194,0,0,4,0,31,255,240,
5,197,5,150,0,25,0,49,0,63,0,72,0,240,183,4,61,20,61,36,61,3,58,184,255,224,
64,94,11,16,72,57,47,73,47,2,54,40,70,40,2,54,36,70,36,2,57,29,73,29,2,61,
32,9,13,72,54,46,70,46,2,54,41,70,41,2,57,35,73,35,2,57,30,73,30,2,6,69,22,
69,2,51,62,62,69,63,69,53,196,54,64,196,59,59,50,63,63,16,54,63,54,63,14,
0,195,0,26,16,26,48,26,64,26,4,16,26,32,26,64,26,3,26,184,255,192,64,60,15,
23,72,26,38,195,111,14,127,14,2,14,50,50,54,62,52,201,69,9,68,25,68,2,68,
201,55,15,54,31,54,127,54,3,223,55,1,0,55,16,55,112,55,3,54,69,55,55,69,54,
3,7,33,200,21,4,43,200,7,19,0,63,237,63,237,18,23,57,47,47,47,93,113,93,16,
237,93,16,237,50,17,51,47,1,47,113,237,47,43,93,113,237,17,57,57,47,47,56,
17,51,51,47,237,16,237,50,17,18,57,17,51,0,93,49,48,93,93,93,93,43,1,93,93,
93,93,43,93,1,20,14,4,35,34,46,4,53,52,62,4,51,50,4,22,18,7,52,46,4,35,34,
14,2,21,20,30,2,51,50,62,4,1,3,35,17,35,17,33,50,22,21,20,6,7,19,3,52,38,
43,1,17,51,50,54,5,197,52,94,131,161,185,100,99,185,160,133,94,52,52,94,132,
161,184,100,150,1,7,197,113,92,45,82,116,140,161,87,130,228,171,99,99,171,
228,130,87,161,140,116,82,45,254,82,199,161,127,1,51,142,151,104,85,221,159,
95,81,170,182,80,84,2,195,100,185,161,131,94,52,52,94,131,161,185,100,100,
184,161,132,94,52,114,196,254,249,150,86,161,139,115,82,45,99,171,228,130,
131,229,171,98,45,81,115,140,161,254,181,1,80,254,176,3,63,126,111,102,123,
19,254,162,2,80,69,72,254,211,85,0,0,1,255,239,5,172,4,124,6,10,0,3,0,14,
180,1,0,2,140,1,0,47,237,1,47,47,49,48,1,33,53,33,4,124,251,115,4,141,5,172,
94,0,0,0,0,2,0,122,3,92,2,184,5,150,0,19,0,39,0,66,185,0,17,255,232,179,9,
12,72,13,184,255,232,64,33,9,12,72,7,24,9,12,72,3,24,9,12,72,20,172,0,30,
172,0,10,16,10,32,10,3,10,35,175,5,25,175,15,4,0,63,237,220,237,1,47,93,237,
220,237,49,48,0,43,43,43,43,1,20,14,2,35,34,46,2,53,52,62,2,51,50,30,2,7,
52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,2,184,45,78,105,59,59,104,78,46,
46,78,104,59,59,105,78,45,109,27,48,65,38,37,65,48,28,28,48,65,37,38,65,48,
27,4,121,59,104,77,45,45,77,104,59,60,104,77,44,44,77,104,60,37,66,49,28,
28,49,66,37,37,65,49,29,29,49,65,0,0,0,2,0,65,0,0,4,36,4,195,0,11,0,15,0,
85,64,53,13,222,4,1,140,4,1,4,2,14,209,11,1,131,11,1,11,9,1,170,6,32,2,1,
2,13,173,12,151,2,1,2,0,4,173,9,152,7,1,7,239,5,1,80,5,128,5,160,5,208,5,
4,5,0,47,93,93,51,93,51,237,50,50,93,47,237,1,47,93,51,253,50,222,93,93,196,
16,222,93,93,196,49,48,1,17,35,17,33,53,33,17,51,17,33,21,1,53,33,21,2,124,
147,254,88,1,168,147,1,168,252,29,3,227,2,168,254,117,1,139,145,1,138,254,
118,145,253,88,145,145,0,0,1,0,41,2,51,2,131,5,141,0,34,0,142,64,56,6,18,
1,6,17,1,6,12,1,106,31,122,31,138,31,3,89,15,105,15,2,106,14,1,73,14,89,14,
2,10,3,26,3,2,10,2,26,2,58,2,74,2,4,58,17,90,17,106,17,3,6,23,22,23,2,23,
184,255,224,64,40,9,15,72,33,25,225,32,8,1,32,8,96,8,160,8,224,8,4,8,14,224,
15,15,32,191,0,1,0,8,32,14,11,228,20,222,1,32,229,0,223,0,63,237,50,63,237,
51,18,57,1,47,93,51,51,47,237,47,93,113,237,50,49,48,43,0,93,93,1,93,93,0,
93,93,93,93,1,113,113,113,19,39,62,5,53,52,38,35,34,6,7,39,62,3,51,50,30,
2,21,20,14,4,7,33,21,43,2,27,88,100,103,82,52,71,74,68,88,8,133,6,46,76,107,
68,65,103,71,37,54,83,102,95,78,18,1,187,2,51,103,61,96,81,72,73,80,49,62,
75,73,68,8,51,87,64,37,33,60,86,54,62,100,86,75,73,74,42,113,0,0,1,0,27,2,
39,2,130,5,141,0,53,0,150,64,17,102,6,1,102,8,1,86,9,102,9,2,89,34,105,34,
2,42,184,255,232,64,80,11,15,72,2,32,9,13,72,48,45,21,21,15,8,28,225,45,45,
0,225,32,15,96,15,2,32,15,96,15,160,15,224,15,4,15,34,225,8,35,1,35,35,9,
225,191,8,1,8,64,24,37,72,8,49,21,228,22,22,12,105,34,1,72,34,88,34,2,34,
31,228,40,222,12,228,71,9,1,9,3,221,0,63,51,93,237,63,237,51,93,93,18,57,
47,237,57,1,47,43,93,237,51,47,113,237,47,93,113,237,50,47,237,17,18,57,47,
18,57,49,48,0,43,43,93,93,93,93,1,20,6,35,34,46,2,39,55,30,1,51,50,54,53,
52,46,2,43,1,53,51,50,62,2,53,52,38,35,34,6,7,39,62,3,51,50,30,2,21,20,6,
7,21,30,3,2,130,155,142,87,116,73,36,6,136,9,88,85,77,83,37,56,67,29,61,57,
29,61,50,32,74,71,68,84,6,135,7,50,79,102,59,69,104,70,35,86,90,52,75,48,
22,3,27,116,128,39,64,81,43,13,67,69,72,76,45,54,29,9,109,13,31,53,40,60,
69,70,65,12,58,86,57,28,33,59,79,46,75,110,20,2,5,37,54,69,0,0,1,0,72,4,177,
1,240,5,228,0,5,0,55,64,37,70,4,1,122,2,138,2,2,128,3,1,3,64,143,0,1,0,64,
9,13,72,0,2,149,128,15,0,47,0,63,0,127,0,239,0,5,0,0,47,93,26,237,1,47,43,
93,26,205,93,49,48,93,93,19,53,19,51,21,1,72,217,207,254,182,4,177,20,1,31,
29,254,234,0,1,0,140,254,87,4,109,4,58,0,39,0,136,64,74,29,32,9,17,72,138,
37,154,37,2,108,37,124,37,2,37,24,14,17,72,22,22,13,70,64,31,79,12,1,127,
12,143,12,159,12,3,12,64,32,35,72,12,64,20,23,72,0,12,1,12,41,128,39,2,70,
0,1,16,1,48,1,224,1,240,1,5,8,1,96,41,128,41,2,41,184,255,192,64,17,20,23,
72,31,8,80,35,22,19,80,26,22,12,1,15,0,27,0,63,63,51,63,237,63,237,50,1,43,
93,47,94,93,237,50,26,16,220,93,43,43,93,113,50,26,237,50,47,49,48,43,0,93,
93,1,43,19,17,51,17,20,30,2,51,50,54,53,17,51,17,20,30,2,51,50,54,55,21,14,
1,35,34,46,2,39,35,14,1,35,34,38,39,17,140,181,32,58,84,52,128,146,180,11,
20,29,18,11,32,11,26,51,36,54,71,44,20,2,3,52,147,100,67,109,31,254,87,5,
227,253,82,78,106,65,28,174,162,2,115,252,208,44,56,32,13,5,3,129,8,12,30,
52,71,41,95,99,41,38,254,28,0,0,0,0,1,0,80,254,248,3,245,5,129,0,19,0,61,
64,39,12,1,15,2,191,2,207,2,3,2,5,95,6,111,6,127,6,175,6,191,6,5,0,6,16,6,
48,6,3,6,7,7,1,0,4,17,3,6,1,0,47,51,63,205,50,18,57,47,1,47,93,93,205,220,
93,205,47,49,48,1,17,35,17,35,17,35,17,34,46,2,53,52,62,2,51,33,21,3,116,
112,217,113,80,133,96,53,50,95,138,87,2,51,5,27,249,221,6,35,249,221,3,190,
45,88,133,89,84,133,93,50,102,0,0,1,0,187,1,190,1,126,2,154,0,3,0,38,64,24,
3,150,0,0,16,0,176,0,3,7,0,0,155,15,1,31,1,2,1,64,15,38,72,1,0,47,43,93,237,
1,47,94,93,237,49,48,19,53,51,21,187,195,1,190,220,220,0,0,0,1,0,119,254,
78,1,227,0,0,0,27,0,126,64,16,24,32,20,23,72,25,32,20,23,72,70,26,86,26,2,
2,184,255,232,179,9,17,72,27,184,255,224,64,62,9,17,72,24,16,25,32,25,48,
25,3,25,131,23,22,22,8,16,131,47,0,1,31,0,1,15,0,111,0,2,8,0,239,8,1,8,19,
25,64,9,13,72,25,25,5,23,11,140,32,5,80,5,96,5,112,5,176,5,192,5,6,5,0,47,
93,237,47,18,57,47,43,205,1,47,93,221,94,93,113,114,237,18,57,47,51,237,93,
50,49,48,43,43,93,43,43,5,20,14,2,35,34,38,39,53,22,51,50,62,2,53,52,38,35,
42,1,7,55,51,7,30,1,1,227,30,65,104,75,20,45,25,49,37,41,56,35,15,61,72,14,
29,14,65,107,39,94,94,253,41,67,48,25,1,3,98,6,12,21,30,18,37,40,2,182,100,
3,81,0,0,1,0,80,2,51,2,125,5,129,0,10,0,75,64,44,32,5,48,5,2,96,9,1,9,9,8,
224,2,32,4,48,4,2,4,111,0,1,0,0,4,6,3,32,2,144,2,2,2,5,4,4,3,6,220,8,1,228,
0,223,0,63,237,50,63,51,51,47,51,1,47,93,23,51,47,93,47,0,93,1,16,237,50,
47,93,49,48,0,93,19,53,51,17,7,53,55,51,17,51,21,80,211,202,210,123,215,2,
51,107,2,108,138,120,137,253,29,107,0,0,0,0,2,0,27,2,139,2,211,5,152,0,15,
0,35,0,130,185,0,13,255,232,179,7,12,72,9,184,255,224,64,43,7,12,72,4,32,
7,12,72,2,32,7,12,72,0,227,4,16,36,16,52,16,100,16,4,148,16,180,16,196,16,
212,16,244,16,5,128,16,1,2,0,16,1,16,184,255,192,64,38,12,16,72,16,26,227,
6,64,22,33,72,6,239,37,1,112,37,128,37,2,47,37,1,31,228,0,3,32,3,80,3,3,3,
3,21,228,11,222,0,63,237,51,47,93,237,1,93,93,93,47,43,237,47,43,93,95,93,
93,113,237,49,48,0,43,43,43,43,1,20,6,35,34,38,53,52,62,2,51,50,30,2,7,52,
46,2,35,34,14,2,21,20,30,2,51,50,62,2,2,211,176,175,168,177,43,87,131,88,
93,131,84,39,149,25,50,72,48,48,75,51,26,28,51,70,43,49,75,52,27,4,18,188,
203,201,190,91,145,101,53,53,100,145,92,83,110,65,27,27,66,110,82,84,110,
66,26,26,66,110,0,2,0,83,0,141,4,32,3,172,0,8,0,17,0,133,64,100,101,15,117,
15,133,15,3,101,9,117,9,133,9,3,101,6,117,6,133,6,3,101,0,117,0,133,0,3,13,
236,10,236,17,235,15,12,1,239,12,1,112,12,128,12,2,208,12,1,63,12,111,12,
127,12,3,0,12,1,12,4,236,1,236,8,235,112,3,128,3,176,3,3,176,3,208,3,2,63,
3,1,0,3,32,3,2,3,10,0,239,14,15,5,47,5,111,5,127,5,4,5,0,47,93,51,228,50,
1,47,93,93,93,113,253,237,237,47,93,93,93,113,113,114,253,237,237,49,48,93,
93,93,93,37,35,53,9,1,53,51,1,21,1,35,53,9,1,53,51,1,21,2,206,168,1,82,254,
176,166,1,82,252,221,170,1,82,254,176,168,1,79,141,29,1,111,1,116,31,254,
141,63,254,147,29,1,111,1,116,31,254,141,63,255,255,0,56,0,0,6,78,5,129,16,
38,0,121,232,0,16,39,2,20,2,249,0,0,17,7,2,141,3,184,253,207,0,31,64,18,1,
191,12,1,112,12,1,96,12,1,16,12,1,12,3,2,17,24,0,63,53,53,1,17,93,93,93,93,
53,0,0,0,255,255,0,56,0,0,6,117,5,129,16,38,0,121,232,0,16,39,2,20,2,249,
0,0,17,7,0,114,3,242,253,207,0,47,64,30,2,111,15,1,47,15,1,15,1,191,12,1,
112,12,1,96,12,1,16,12,1,12,51,64,11,11,72,2,15,24,0,63,53,1,43,17,93,93,
93,93,53,17,93,93,53,0,0,0,255,255,0,73,0,0,6,78,5,141,16,39,2,20,3,13,0,
0,16,39,2,141,3,184,253,207,17,6,0,115,46,0,0,33,64,20,0,112,0,1,96,0,1,16,
0,1,0,83,64,11,11,72,1,2,6,24,0,63,53,53,1,43,17,93,93,93,53,0,0,2,0,131,
254,164,4,86,4,58,0,37,0,41,0,159,64,112,121,4,137,4,2,122,35,138,35,2,122,
36,138,36,2,84,26,100,26,2,58,6,74,6,122,6,138,6,4,10,72,9,9,176,39,192,39,
2,39,150,40,40,0,28,70,95,27,127,27,2,27,64,29,60,72,27,64,23,27,72,32,27,
1,27,19,70,0,64,29,60,72,0,64,23,27,72,0,64,13,17,72,32,0,1,0,32,43,1,19,
33,9,40,156,41,15,67,27,1,27,24,95,47,33,63,33,2,111,33,207,33,2,33,0,47,
93,113,237,51,93,63,253,206,17,57,1,93,47,93,43,43,43,237,47,93,43,43,93,
237,18,57,47,237,113,51,47,237,49,48,93,0,93,1,93,0,93,1,93,55,52,62,6,55,
51,14,7,21,20,30,2,51,50,54,55,23,14,3,35,34,46,2,1,21,35,53,131,37,62,79,
82,79,63,39,1,175,2,39,62,78,80,77,60,37,42,77,109,67,140,164,14,184,11,67,
121,179,122,114,178,123,64,2,113,195,50,71,108,85,67,60,58,68,83,55,69,104,
80,63,57,57,70,88,59,59,92,63,32,140,122,12,84,149,112,65,56,103,147,4,100,
201,201,0,0,0,255,255,0,4,0,0,5,82,6,240,18,38,0,36,0,0,17,7,2,148,1,78,0,
0,0,21,180,2,21,5,38,2,184,255,225,180,22,25,4,7,37,1,43,53,0,43,53,0,255,
255,0,4,0,0,5,82,6,240,18,38,0,36,0,0,17,7,2,149,1,219,0,0,0,19,64,11,2,21,
5,38,2,76,21,24,4,7,37,1,43,53,0,43,53,0,0,0,255,255,0,4,0,0,5,82,6,254,18,
38,0,36,0,0,17,7,2,150,1,96,0,0,0,19,64,11,2,22,5,38,2,0,27,21,4,7,37,1,43,
53,0,43,53,0,0,0,255,255,0,4,0,0,5,82,7,6,18,38,0,36,0,0,17,7,2,153,1,94,
0,0,0,19,64,11,2,21,5,38,2,2,30,44,4,7,37,1,43,53,0,43,53,0,0,0,255,255,0,
4,0,0,5,82,6,178,18,38,0,36,0,0,17,7,2,152,1,108,0,0,0,23,64,13,3,2,21,5,
38,3,2,4,25,23,4,7,37,1,43,53,53,0,43,53,53,0,0,0,255,255,0,4,0,0,5,82,6,
251,18,38,0,36,0,0,17,7,1,76,1,137,0,136,0,22,64,12,3,2,56,3,3,2,3,31,21,
4,7,37,1,43,53,53,0,63,53,53,0,2,0,24,0,0,7,168,5,129,0,15,0,26,0,136,64,
86,116,25,1,114,2,1,86,2,102,2,2,115,3,131,3,2,85,3,101,3,2,127,5,143,5,2,
109,5,1,92,5,1,25,5,41,5,2,0,7,1,11,7,11,7,0,16,14,32,14,2,14,2,25,3,17,3,
4,17,9,13,90,26,5,0,2,95,25,25,5,4,12,95,9,9,13,16,8,95,5,3,4,18,13,95,0,
18,0,63,237,63,63,237,50,18,57,47,237,17,18,57,47,237,1,47,51,51,237,50,51,
47,51,17,18,57,57,47,93,18,57,57,47,47,113,49,48,93,93,93,93,93,93,93,93,
93,33,17,33,3,35,1,33,21,33,17,33,21,33,17,33,21,1,35,14,5,7,3,33,3,201,253,
220,198,199,2,174,4,185,253,9,2,187,253,69,3,32,252,33,151,1,16,22,27,24,
18,2,217,1,222,1,156,254,100,5,129,156,254,60,154,254,21,156,4,238,3,35,50,
58,51,38,5,254,51,0,0,255,255,0,104,254,78,5,121,5,150,18,38,0,38,0,0,17,
7,0,120,1,254,0,0,0,11,182,1,58,48,40,26,16,37,1,43,53,0,0,0,255,255,0,168,
0,0,4,254,6,240,18,38,0,40,0,0,17,7,2,148,1,63,0,0,0,21,180,1,12,5,38,1,184,
255,170,180,13,16,0,10,37,1,43,53,0,43,53,0,255,255,0,168,0,0,4,254,6,240,
18,38,0,40,0,0,17,7,2,149,1,223,0,0,0,19,64,11,1,12,5,38,1,40,12,15,0,10,
37,1,43,53,0,43,53,0,0,0,255,255,0,168,0,0,4,254,6,254,18,38,0,40,0,0,17,
7,2,150,1,119,0,0,0,21,180,1,13,5,38,1,184,255,239,180,18,12,0,10,37,1,43,
53,0,43,53,0,255,255,0,168,0,0,4,254,6,178,18,38,0,40,0,0,17,7,2,152,1,121,
0,0,0,25,182,2,1,12,5,38,2,1,184,255,234,180,16,14,0,10,37,1,43,53,53,0,43,
53,53,0,255,255,0,9,0,0,1,177,6,240,18,38,0,44,0,0,17,6,2,148,159,0,0,21,
180,1,4,5,38,1,184,255,193,180,5,8,0,2,37,1,43,53,0,43,53,0,0,0,255,255,0,
142,0,0,2,54,6,240,18,38,0,44,0,0,17,6,2,149,70,0,0,19,64,11,1,4,5,38,1,69,
4,7,0,2,37,1,43,53,0,43,53,0,255,255,255,210,0,0,2,104,6,254,18,38,0,44,0,
0,17,6,2,150,210,0,0,19,64,11,1,5,5,38,1,0,10,4,0,2,37,1,43,53,0,43,53,0,
255,255,0,7,0,0,2,52,6,178,18,38,0,44,0,0,17,6,2,152,218,0,0,23,64,13,2,1,
4,5,38,2,1,1,8,6,0,2,37,1,43,53,53,0,43,53,53,0,0,2,0,14,0,0,5,101,5,129,
0,16,0,33,0,112,64,69,117,10,1,91,32,139,32,2,91,31,139,31,2,90,20,138,20,
2,91,19,1,10,31,26,31,2,10,20,26,20,2,26,26,28,8,90,64,15,17,1,17,35,128,
24,28,90,14,16,16,1,14,27,16,95,24,127,0,1,0,0,2,28,95,14,18,23,95,2,3,0,
63,237,63,237,17,57,47,113,51,237,50,1,47,51,51,47,16,237,50,26,16,220,113,
26,237,18,57,47,49,48,93,93,93,0,93,1,93,93,0,93,19,51,17,33,50,4,22,18,21,
20,2,14,1,35,33,17,35,37,52,46,2,35,33,17,33,21,33,17,33,50,62,2,14,154,1,
210,163,1,19,198,111,106,184,251,145,253,241,154,4,151,82,148,206,123,254,
241,1,150,254,106,1,58,111,189,138,78,3,33,2,96,81,169,254,252,180,176,254,
243,181,93,2,135,72,143,203,130,61,254,57,154,254,18,72,142,212,0,255,255,
0,168,0,0,5,32,7,6,18,38,0,49,0,0,17,7,2,153,1,161,0,0,0,19,64,11,1,20,5,
38,1,12,29,43,8,18,37,1,43,53,0,43,53,0,0,0,255,255,0,97,255,236,5,215,6,
240,18,38,0,50,0,0,17,7,2,148,1,182,0,0,0,21,180,2,40,5,38,2,184,255,216,
180,41,44,10,0,37,1,43,53,0,43,53,0,255,255,0,97,255,236,5,215,6,240,18,38,
0,50,0,0,17,7,2,149,2,37,0,0,0,19,64,11,2,40,5,38,2,37,40,43,10,0,37,1,43,
53,0,43,53,0,0,0,255,255,0,97,255,236,5,215,6,254,18,38,0,50,0,0,17,7,2,150,
1,213,0,0,0,19,64,11,2,41,5,38,2,4,46,40,10,0,37,1,43,53,0,43,53,0,0,0,255,
255,0,97,255,236,5,215,7,6,18,38,0,50,0,0,17,7,2,153,1,193,0,0,0,21,180,2,
40,5,38,2,184,255,245,180,49,63,10,0,37,1,43,53,0,43,53,0,255,255,0,97,255,
236,5,215,6,178,18,38,0,50,0,0,17,7,2,152,1,215,0,0,0,25,182,3,2,40,5,38,
3,2,184,255,255,180,44,42,10,0,37,1,43,53,53,0,43,53,53,0,0,1,0,142,0,225,
4,31,4,115,0,11,0,129,185,0,5,255,232,179,18,22,72,3,184,255,232,64,14,18,
22,72,11,24,18,22,72,9,24,18,22,72,8,184,255,232,179,18,22,72,6,184,255,232,
64,14,18,22,72,2,24,18,22,72,0,24,18,22,72,7,184,255,232,64,14,18,22,72,1,
24,18,22,72,10,24,18,22,72,4,184,255,232,64,23,18,22,72,212,4,228,4,2,180,
4,196,4,212,4,3,32,4,1,4,0,7,1,7,0,25,47,113,1,47,93,93,113,49,48,0,43,43,
1,43,43,43,43,43,43,0,43,43,43,43,19,9,1,55,9,1,23,9,1,7,9,1,142,1,98,254,
160,104,1,94,1,94,105,254,162,1,96,102,254,159,254,156,1,74,1,98,1,96,103,
254,159,1,95,105,254,164,254,160,105,1,97,254,157,0,3,0,71,255,203,5,244,
5,186,0,27,0,39,0,51,0,196,64,141,89,44,1,8,37,1,84,33,1,5,26,21,26,101,26,
3,139,23,1,123,22,139,22,2,108,22,1,90,22,1,105,16,1,10,12,26,12,2,132,9,
1,116,8,132,8,2,99,8,1,85,8,1,27,50,91,50,2,114,43,130,43,2,84,43,1,20,38,
84,38,2,85,37,1,140,31,1,74,31,90,31,122,31,3,4,21,20,21,100,21,3,11,7,27,
7,107,7,3,32,44,40,0,91,64,15,28,1,28,53,128,32,53,1,40,91,175,14,191,14,
2,32,14,1,15,14,31,14,2,14,43,31,35,47,95,23,19,4,35,95,9,5,19,0,63,51,237,
63,51,237,17,57,57,1,47,93,93,93,237,93,26,16,220,113,26,237,18,57,57,49,
48,0,93,93,93,93,93,93,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93,93,
93,1,20,2,6,4,35,34,38,39,7,35,55,38,2,53,52,18,54,36,51,50,22,23,55,51,7,
22,18,7,52,38,39,1,30,1,51,50,62,2,37,20,22,23,1,46,1,35,34,14,2,5,215,95,
180,254,252,165,127,206,81,120,190,200,88,86,92,178,1,5,169,125,207,82,121,
192,201,85,87,195,49,49,253,59,59,150,93,132,191,123,59,252,15,50,51,2,195,
59,151,92,126,190,127,63,2,199,165,254,242,192,104,58,54,145,241,97,1,10,
160,165,1,10,187,101,56,54,146,242,94,254,253,160,112,184,72,252,171,44,47,
86,153,212,125,113,190,75,3,85,42,46,80,148,208,0,0,255,255,0,158,255,236,
5,41,6,240,18,38,0,56,0,0,17,7,2,148,1,141,0,0,0,21,180,1,26,5,38,1,184,255,
232,180,27,30,5,20,37,1,43,53,0,43,53,0,255,255,0,158,255,236,5,41,6,240,
18,38,0,56,0,0,17,7,2,149,1,237,0,0,0,19,64,11,1,26,5,38,1,37,26,29,5,20,
37,1,43,53,0,43,53,0,0,0,255,255,0,158,255,236,5,41,6,254,18,38,0,56,0,0,
17,7,2,150,1,152,0,0,0,19,64,11,1,27,5,38,1,0,32,26,5,20,37,1,43,53,0,43,
53,0,0,0,255,255,0,158,255,236,5,41,6,178,18,38,0,56,0,0,17,7,2,152,1,158,
0,0,0,25,182,2,1,26,5,38,2,1,184,255,254,180,30,28,5,20,37,1,43,53,53,0,43,
53,53,0,255,255,0,45,0,0,5,41,6,240,18,38,0,60,0,0,17,7,2,149,1,208,0,0,0,
19,64,11,1,9,5,38,1,65,9,12,4,8,37,1,43,53,0,43,53,0,0,0,0,2,0,168,0,0,4,
234,5,129,0,16,0,27,0,95,64,63,150,15,1,116,26,132,26,2,123,18,139,18,2,0,
90,16,17,48,17,144,17,3,255,17,1,0,17,16,17,32,17,64,17,4,17,22,11,7,90,0,
8,16,8,64,8,3,7,8,22,95,6,21,95,11,6,11,6,11,7,9,3,7,18,0,63,63,18,57,57,
47,47,16,237,16,237,1,47,94,93,237,50,50,47,93,93,113,237,49,48,0,93,93,93,
1,20,14,2,35,33,17,35,17,51,21,33,50,30,2,7,52,38,35,33,17,33,50,62,2,4,234,
59,121,182,123,254,98,191,191,1,146,125,186,124,62,192,164,164,254,133,1,
131,82,121,79,38,2,223,88,159,120,71,254,215,5,129,252,60,111,156,99,134,
149,253,192,44,79,107,0,0,0,0,1,0,142,255,236,4,143,5,204,0,67,0,214,64,150,
149,51,1,133,63,149,63,2,133,47,149,47,2,133,46,149,46,2,118,65,1,118,56,
1,83,26,131,26,147,26,3,92,39,108,39,124,39,3,107,22,1,58,22,1,145,52,1,21,
52,37,52,2,22,66,38,66,118,66,3,26,3,42,3,2,61,72,24,54,72,31,32,24,1,31,
31,1,9,24,31,31,24,9,3,43,0,72,64,48,17,160,17,2,160,17,176,17,2,17,69,128,
42,70,0,43,16,43,48,43,3,8,43,112,69,1,63,69,79,69,2,212,31,1,197,31,1,182,
31,1,219,17,1,202,17,1,185,17,1,31,17,5,36,80,49,0,43,21,14,80,5,22,0,63,
237,63,63,237,18,57,57,93,93,93,93,93,93,1,93,93,47,94,93,237,26,16,220,93,
113,26,237,18,23,57,47,47,47,93,93,16,237,16,237,49,48,0,93,1,93,93,93,93,
93,0,93,93,1,93,93,0,93,93,93,93,1,20,14,2,35,34,38,47,1,30,3,51,50,54,53,
52,46,4,53,52,62,4,53,52,46,2,35,34,14,2,21,17,35,17,52,62,2,51,50,30,2,21,
20,14,4,21,20,30,4,4,143,41,87,136,94,80,148,55,2,25,67,74,78,37,92,98,54,
81,95,81,54,33,49,58,49,33,33,63,90,57,68,107,73,39,180,63,120,174,110,102,
155,105,53,33,51,58,51,33,55,82,95,82,55,1,39,66,115,85,49,25,24,164,14,25,
19,11,86,79,56,77,62,57,73,98,73,51,73,58,48,52,63,43,37,62,45,26,35,77,122,
88,252,3,4,3,118,173,112,54,46,80,109,62,61,90,69,53,47,48,28,38,59,57,64,
85,114,0,0,0,255,255,0,87,255,236,4,115,5,228,18,38,0,68,0,0,17,7,0,67,0,
188,0,0,0,21,180,2,66,17,38,2,184,255,149,180,67,70,3,36,37,1,43,53,0,43,
53,0,255,255,0,87,255,236,4,115,5,228,18,38,0,68,0,0,17,7,0,116,1,84,0,0,
0,19,64,11,2,66,17,38,2,11,66,69,3,36,37,1,43,53,0,43,53,0,0,0,255,255,0,
87,255,236,4,115,5,211,18,38,0,68,0,0,17,7,1,71,0,218,0,0,0,21,180,2,67,17,
38,2,184,255,192,180,72,66,3,36,37,1,43,53,0,43,53,0,255,255,0,87,255,236,
4,115,5,189,18,38,0,68,0,0,17,7,1,78,0,245,0,0,0,21,180,2,66,17,38,2,184,
255,224,180,75,89,3,36,37,1,43,53,0,43,53,0,255,255,0,87,255,236,4,115,5,
123,18,38,0,68,0,0,17,7,0,105,0,235,0,0,0,25,182,3,2,66,17,38,3,2,184,255,
202,180,70,68,3,36,37,1,43,53,53,0,43,53,53,0,255,255,0,87,255,236,4,115,
6,115,18,38,0,68,0,0,17,7,1,76,1,8,0,0,0,25,182,3,2,71,17,38,3,2,184,255,
200,180,76,66,3,36,37,1,43,53,53,0,43,53,53,0,0,3,0,66,255,236,6,194,4,78,
0,62,0,79,0,88,0,251,64,96,134,54,1,122,36,1,123,58,1,117,8,133,8,2,101,68,
117,68,133,68,3,124,86,1,106,86,1,126,81,1,106,81,1,101,4,117,4,2,41,47,1,
41,44,1,24,40,9,13,72,10,28,26,28,2,17,53,88,1,70,33,31,79,79,79,95,79,127,
79,4,79,79,80,25,9,73,10,10,61,71,64,31,80,47,80,63,80,3,144,80,1,80,90,128,
44,71,45,184,255,192,64,19,21,28,72,45,45,71,71,25,64,12,15,72,25,62,80,80,
80,6,53,184,255,184,64,43,17,73,53,83,80,56,16,63,81,33,33,74,50,143,44,1,
43,44,1,44,44,39,80,50,16,17,74,80,22,22,6,80,15,239,9,1,128,9,1,9,9,15,22,
0,63,51,47,93,93,16,237,63,237,50,63,237,51,47,93,93,17,18,57,47,237,63,237,
50,43,18,57,47,237,1,47,43,237,51,47,43,237,26,16,220,93,113,26,237,50,47,
237,17,18,57,47,93,51,237,50,57,57,49,48,93,43,0,93,93,1,93,0,93,93,93,93,
1,93,0,93,1,93,0,93,93,1,21,30,3,51,50,54,55,23,14,3,35,32,3,14,3,35,34,38,
53,52,62,4,63,1,53,52,46,2,35,34,14,2,7,39,62,3,51,50,22,23,62,1,51,50,30,
2,29,1,37,7,14,5,21,20,22,51,50,62,2,53,37,46,1,35,34,14,2,7,3,200,1,34,70,
109,78,117,141,25,158,17,61,102,153,108,254,191,102,29,74,102,137,93,167,
169,38,67,91,107,117,60,240,26,57,88,61,54,88,64,39,7,188,10,58,105,159,112,
128,172,49,63,177,106,136,183,111,47,252,80,195,40,81,76,66,49,28,100,93,
90,129,83,40,2,246,15,144,135,45,96,81,54,4,1,247,17,82,136,98,55,94,72,45,
45,91,73,47,1,1,51,93,71,42,172,150,71,108,78,51,32,13,1,4,59,67,94,58,27,
15,39,67,51,17,64,107,78,43,70,69,74,65,88,155,210,122,24,31,4,1,6,18,31,
51,73,51,87,97,63,98,116,53,196,171,157,29,74,127,98,255,255,0,87,254,78,
3,202,4,78,18,38,0,70,0,0,17,7,0,120,1,12,0,0,0,11,182,1,40,48,40,19,9,37,
1,43,53,0,0,0,255,255,0,87,255,236,4,24,5,228,18,38,0,72,0,0,17,7,0,67,0,
221,0,0,0,21,180,2,38,17,38,2,184,255,228,180,39,42,17,27,37,1,43,53,0,43,
53,0,255,255,0,87,255,236,4,24,5,228,18,38,0,72,0,0,17,7,0,116,1,112,0,0,
0,19,64,11,2,38,17,38,2,84,38,41,17,27,37,1,43,53,0,43,53,0,0,0,255,255,0,
87,255,236,4,24,5,211,18,38,0,72,0,0,17,7,1,71,0,245,0,0,0,19,64,11,2,39,
17,38,2,8,44,38,17,27,37,1,43,53,0,43,53,0,0,0,255,255,0,87,255,236,4,24,
5,123,18,38,0,72,0,0,17,7,0,105,0,248,0,0,0,23,64,13,3,2,38,17,38,3,2,4,42,
40,17,27,37,1,43,53,53,0,43,53,53,0,0,0,255,255,0,10,0,0,1,178,5,228,18,38,
0,241,0,0,17,6,0,67,160,0,0,21,180,1,4,17,38,1,184,255,194,180,5,8,0,2,37,
1,43,53,0,43,53,0,0,0,255,255,0,135,0,0,2,47,5,228,18,38,0,241,0,0,17,6,0,
116,63,0,0,19,64,11,1,4,17,38,1,63,4,7,0,2,37,1,43,53,0,43,53,0,255,255,255,
211,0,0,2,105,5,211,18,38,0,241,0,0,17,6,1,71,211,0,0,19,64,11,1,5,17,38,
1,2,10,4,0,2,37,1,43,53,0,43,53,0,255,255,0,8,0,0,2,53,5,123,18,38,0,241,
0,0,17,6,0,105,219,0,0,23,64,13,2,1,4,17,38,2,1,2,8,6,0,2,37,1,43,53,53,0,
43,53,53,0,0,2,0,86,255,236,4,39,5,234,0,39,0,57,0,190,64,94,100,51,1,100,
56,1,107,42,1,107,48,1,10,14,26,14,2,37,17,53,17,69,17,3,6,8,22,8,2,23,26,
29,3,50,15,28,31,28,2,28,28,50,35,71,40,64,19,16,13,3,40,17,64,14,19,72,22,
5,17,17,5,144,40,1,144,40,160,40,2,40,59,128,50,71,31,5,1,5,26,19,29,16,4,
17,27,27,22,45,80,13,80,10,1,10,184,255,192,64,28,7,10,72,82,17,1,36,17,52,
17,68,17,3,2,17,18,17,2,10,17,10,17,22,0,53,80,0,22,0,63,237,63,57,57,47,
47,93,93,93,43,93,51,237,17,51,47,18,23,57,1,47,93,237,26,16,204,93,113,17,
57,47,18,57,43,18,23,57,26,16,237,17,57,47,93,18,23,57,49,48,0,93,93,1,93,
0,93,93,93,93,5,34,46,2,53,52,62,2,51,50,22,23,46,1,39,5,53,55,46,1,39,51,
30,1,23,37,15,1,30,3,29,1,20,14,2,19,52,46,2,35,34,14,2,21,20,22,51,50,62,
2,2,54,125,181,118,56,52,116,186,133,71,117,43,43,115,76,254,211,218,56,120,
66,209,45,83,42,1,50,1,211,81,129,88,47,57,120,188,176,33,71,113,80,81,115,
73,33,144,145,81,118,75,36,20,73,132,185,111,107,182,134,75,32,27,86,176,
69,133,114,94,45,78,35,20,51,31,132,112,92,74,176,200,223,121,6,122,196,138,
74,1,245,94,137,90,44,45,92,137,91,190,178,44,90,139,0,255,255,0,140,0,0,
3,242,5,189,18,38,0,81,4,0,17,7,1,78,0,245,0,0,0,19,64,11,1,38,17,38,1,5,
47,61,19,36,37,1,43,53,0,43,53,0,0,0,255,255,0,86,255,236,4,29,5,228,18,38,
0,82,0,0,17,7,0,67,0,223,0,0,0,21,180,2,35,17,38,2,184,255,228,180,36,39,
8,0,37,1,43,53,0,43,53,0,255,255,0,86,255,236,4,29,5,228,18,38,0,82,0,0,17,
7,0,116,1,103,0,0,0,19,64,11,2,35,17,38,2,73,35,38,8,0,37,1,43,53,0,43,53,
0,0,0,255,255,0,86,255,236,4,29,5,211,18,38,0,82,0,0,17,7,1,71,0,240,0,0,
0,19,64,11,2,36,17,38,2,1,41,35,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,86,
255,236,4,29,5,189,18,38,0,82,0,0,17,7,1,78,0,247,0,0,0,19,64,11,2,35,17,
38,2,13,44,58,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,86,255,236,4,29,5,123,
18,38,0,82,0,0,17,7,0,105,0,250,0,0,0,23,64,13,3,2,35,17,38,3,2,4,39,37,8,
0,37,1,43,53,53,0,43,53,53,0,0,0,0,3,0,65,0,223,4,36,4,117,0,3,0,7,0,11,0,
75,64,48,3,11,171,0,8,8,4,128,6,160,6,2,95,6,1,32,6,1,6,63,4,95,4,111,4,3,
4,9,174,64,8,144,8,2,8,4,173,5,0,174,79,1,159,1,2,1,5,179,0,63,222,93,237,
16,253,222,93,237,1,47,93,47,93,93,93,18,57,47,51,237,50,49,48,1,53,51,21,
1,53,33,21,1,53,51,21,1,222,168,253,187,3,227,253,186,168,3,190,183,183,254,
162,146,146,254,127,183,183,0,0,3,0,44,255,218,4,180,4,92,0,22,0,34,0,45,
0,161,64,93,117,33,133,33,2,117,27,133,27,2,122,38,138,38,2,122,44,138,44,
2,150,16,1,66,16,1,77,5,1,68,21,1,75,10,1,27,38,35,0,71,64,15,23,207,23,2,
159,23,175,23,255,23,3,23,47,128,35,71,0,12,1,0,12,16,12,32,12,64,12,240,
12,5,7,12,144,47,160,47,240,47,3,224,47,1,223,47,1,0,47,32,47,2,47,184,255,
192,64,16,13,21,72,37,26,30,41,80,18,14,16,30,80,7,3,22,0,63,51,237,63,51,
237,17,57,57,1,43,93,93,93,113,47,94,93,113,237,26,16,220,93,113,26,237,18,
57,57,49,48,93,93,0,93,93,93,93,1,93,93,0,93,1,16,2,35,34,38,39,7,35,55,46,
1,53,16,33,50,22,23,55,51,7,30,1,7,52,38,39,1,30,1,51,50,62,2,37,20,23,1,
46,1,35,34,14,2,4,88,250,238,97,156,60,100,167,184,41,42,1,229,103,156,57,
91,167,173,42,39,189,12,11,254,29,38,105,62,69,112,78,42,253,179,24,1,226,
37,104,66,69,111,78,41,2,30,254,228,254,234,48,50,116,214,68,182,116,2,48,
46,45,105,201,69,185,119,68,109,44,253,206,49,39,39,98,166,126,130,85,2,49,
45,36,41,99,164,0,255,255,0,139,255,236,3,241,5,228,18,38,0,88,6,0,17,7,0,
67,0,236,0,0,0,21,180,1,38,17,38,1,184,255,236,180,39,42,36,19,37,1,43,53,
0,43,53,0,255,255,0,139,255,236,3,241,5,228,18,38,0,88,6,0,17,7,0,116,1,87,
0,0,0,19,64,11,1,38,17,38,1,53,38,41,36,19,37,1,43,53,0,43,53,0,0,0,255,255,
0,139,255,236,3,241,5,211,18,38,0,88,6,0,17,7,1,71,0,239,0,0,0,21,180,1,39,
17,38,1,184,255,252,180,44,38,36,19,37,1,43,53,0,43,53,0,255,255,0,139,255,
236,3,241,5,123,18,38,0,88,6,0,17,7,0,105,0,237,0,0,0,25,182,2,1,38,17,38,
2,1,184,255,243,180,42,40,36,19,37,1,43,53,53,0,43,53,53,0,255,255,0,5,254,
87,3,252,5,228,18,38,0,92,0,0,17,7,0,116,1,27,0,0,0,19,64,11,1,32,17,38,1,
54,32,35,17,31,37,1,43,53,0,43,53,0,0,0,0,2,0,138,254,87,4,29,5,204,0,34,
0,54,0,109,64,76,102,52,118,52,2,105,38,121,38,2,73,25,89,25,2,70,10,86,10,
2,25,21,41,21,137,21,153,21,4,22,15,38,15,134,15,150,15,4,18,71,64,160,35,
1,35,56,128,45,7,33,70,0,34,16,34,48,34,240,34,4,8,34,33,27,26,50,80,23,22,
7,40,80,13,16,0,0,0,63,63,237,50,63,237,50,63,1,47,94,93,237,50,50,26,16,
220,93,26,237,49,48,0,93,93,93,93,93,93,19,51,17,20,6,7,6,7,51,62,3,51,50,
30,2,21,20,14,2,35,34,38,39,35,30,3,21,17,35,1,52,46,2,35,34,14,2,21,20,30,
2,51,50,62,2,138,180,1,1,1,1,6,25,64,82,101,63,112,153,93,40,40,93,153,112,
116,174,46,5,1,1,1,1,180,2,214,24,59,98,74,60,106,79,46,38,73,108,70,75,99,
59,24,5,204,254,89,30,55,21,25,22,52,73,47,21,80,145,205,125,123,208,150,
85,88,100,2,32,48,59,29,254,89,3,199,100,156,108,56,34,96,169,135,115,159,
98,43,58,110,159,255,255,0,5,254,87,3,252,5,123,18,38,0,92,0,0,17,7,0,105,
0,187,0,0,0,25,182,2,1,32,17,38,2,1,184,255,254,180,36,34,17,31,37,1,43,53,
53,0,43,53,53,0,255,255,0,4,0,0,5,82,6,161,18,38,0,36,0,0,17,7,1,73,1,104,
1,78,0,19,64,11,2,21,5,38,2,2,22,21,4,7,37,1,43,53,0,43,53,0,0,0,255,255,
0,87,255,236,4,115,5,83,18,38,0,68,0,0,17,7,1,73,0,233,0,0,0,21,180,2,66,
17,38,2,184,255,202,180,67,66,3,36,37,1,43,53,0,43,53,0,255,255,0,4,0,0,5,
82,6,243,18,38,0,36,0,0,17,7,2,155,1,121,0,0,0,19,64,11,2,21,5,38,2,3,26,
34,4,7,37,1,43,53,0,43,53,0,0,0,255,255,0,87,255,236,4,115,5,230,18,38,0,
68,0,0,17,7,1,74,1,7,0,0,0,21,180,2,66,17,38,2,184,255,204,180,71,83,3,36,
37,1,43,53,0,43,53,0,255,255,0,4,254,96,5,99,5,129,18,38,0,36,0,0,17,7,1,
77,3,181,0,11,0,13,185,0,2,255,207,180,33,33,7,7,37,43,53,0,255,255,0,87,
254,85,4,115,4,78,18,38,0,68,0,0,17,7,1,77,2,197,0,0,0,13,185,0,2,255,194,
180,78,78,36,36,37,43,53,0,255,255,0,104,255,236,5,121,6,240,18,38,0,38,0,
0,17,7,2,149,2,83,0,0,0,19,64,11,1,40,5,38,1,126,40,43,26,16,37,1,43,53,0,
43,53,0,0,0,255,255,0,87,255,236,3,202,5,228,18,38,0,70,0,0,17,7,0,116,1,
103,0,0,0,19,64,11,1,40,17,38,1,114,40,43,19,9,37,1,43,53,0,43,53,0,0,0,255,
255,0,104,255,236,5,121,6,254,18,38,0,38,0,0,17,7,2,150,1,204,0,0,0,19,64,
11,1,41,5,38,1,38,46,40,26,16,37,1,43,53,0,43,53,0,0,0,255,255,0,87,255,236,
3,202,5,211,18,38,0,70,0,0,17,7,1,71,0,208,0,0,0,19,64,11,1,41,17,38,1,10,
46,40,19,9,37,1,43,53,0,43,53,0,0,0,255,255,0,104,255,236,5,121,6,241,18,
38,0,38,0,0,17,7,1,75,2,34,1,37,0,19,64,11,1,40,5,38,1,39,40,42,26,16,37,
1,43,53,0,43,53,0,0,0,255,255,0,87,255,236,3,202,5,204,18,38,0,70,0,0,17,
7,1,75,1,44,0,0,0,11,182,1,17,40,42,19,9,37,1,43,53,0,0,0,255,255,0,104,255,
236,5,121,6,254,18,38,0,38,0,0,17,7,2,151,1,204,0,0,0,19,64,11,1,40,5,38,
1,38,42,48,26,16,37,1,43,53,0,43,53,0,0,0,255,255,0,87,255,236,3,202,5,211,
18,38,0,70,0,0,17,7,1,72,0,214,0,0,0,19,64,11,1,40,17,38,1,16,42,48,19,9,
37,1,43,53,0,43,53,0,0,0,255,255,0,168,0,0,5,101,6,254,18,38,0,39,0,0,17,
7,2,151,1,102,0,0,0,21,180,2,26,5,38,2,184,255,171,180,28,34,6,0,37,1,43,
53,0,43,53,0,255,255,0,86,255,236,4,255,5,204,16,38,0,71,0,0,17,7,2,146,3,
186,0,75,0,18,64,10,2,61,0,2,83,61,61,19,19,37,1,43,53,0,63,53,255,255,0,
14,0,0,5,101,5,129,18,6,0,144,0,0,0,2,0,86,255,236,4,109,5,204,0,39,0,59,
0,146,64,86,85,42,101,42,2,90,58,106,58,2,57,1,73,1,2,54,10,70,10,2,9,4,25,
4,121,4,137,4,4,6,7,22,7,118,7,134,7,4,25,27,70,64,20,6,0,21,50,3,18,61,128,
40,71,31,6,1,6,63,61,1,143,61,1,33,21,27,19,81,24,15,20,1,239,20,255,20,2,
20,20,8,22,0,11,55,80,8,184,255,192,64,10,9,13,72,8,16,0,45,80,3,22,0,63,
237,50,63,43,237,50,63,18,57,47,93,113,51,237,50,63,1,93,114,47,93,237,26,
16,220,23,50,17,57,26,237,50,49,48,0,93,93,93,93,93,93,37,14,1,35,34,2,17,
16,33,50,22,23,51,52,46,1,52,61,1,33,53,33,53,51,21,51,21,35,17,20,30,2,23,
35,46,3,53,1,20,30,2,51,50,62,2,53,52,46,2,35,34,14,2,3,53,50,165,122,205,
193,1,142,123,164,50,2,1,1,254,212,1,44,180,132,132,1,2,2,1,172,2,3,3,2,253,
218,28,62,96,69,71,109,73,38,38,74,107,70,66,96,64,31,174,104,90,1,20,1,24,
2,54,90,98,10,43,47,42,9,141,131,147,147,131,252,41,39,72,60,43,9,10,37,48,
53,26,1,112,112,160,103,48,46,103,166,120,115,159,98,43,46,102,163,0,0,255,
255,0,168,0,0,4,254,6,161,18,38,0,40,0,0,17,7,1,73,1,122,1,78,0,21,180,1,
12,5,38,1,184,255,237,180,13,12,0,10,37,1,43,53,0,43,53,0,255,255,0,87,255,
236,4,24,5,83,18,38,0,72,0,0,17,7,1,73,0,245,0,0,0,19,64,11,2,38,17,38,2,
3,39,38,17,27,37,1,43,53,0,43,53,0,0,0,255,255,0,168,0,0,4,254,6,243,18,38,
0,40,0,0,17,7,2,155,1,137,0,0,0,21,180,1,12,5,38,1,184,255,235,180,17,25,
0,10,37,1,43,53,0,43,53,0,255,255,0,87,255,236,4,24,5,230,18,38,0,72,0,0,
17,7,1,74,1,16,0,0,0,19,64,11,2,38,17,38,2,2,43,55,17,27,37,1,43,53,0,43,
53,0,0,0,255,255,0,168,0,0,4,254,6,241,18,38,0,40,0,0,17,7,1,75,1,201,1,37,
0,21,180,1,12,5,38,1,184,255,236,180,12,14,0,10,37,1,43,53,0,43,53,0,255,
255,0,87,255,236,4,24,5,204,18,38,0,72,0,0,17,7,1,75,1,68,0,0,0,12,182,2,
2,38,40,17,27,37,1,43,53,0,0,0,255,255,0,168,254,85,4,254,5,129,18,38,0,40,
0,0,17,7,1,77,3,80,0,0,0,13,185,0,1,255,194,180,24,24,11,11,37,43,53,0,255,
255,0,87,254,85,4,24,4,78,18,38,0,72,0,0,17,7,1,77,1,125,0,0,0,13,185,0,2,
254,242,180,50,50,9,9,37,43,53,0,255,255,0,168,0,0,4,254,6,254,18,38,0,40,
0,0,17,7,2,151,1,111,0,0,0,21,180,1,12,5,38,1,184,255,231,180,14,20,0,10,
37,1,43,53,0,43,53,0,255,255,0,87,255,236,4,24,5,211,18,38,0,72,0,0,17,7,
1,72,0,234,0,0,0,21,180,2,38,17,38,2,184,255,254,180,40,46,17,27,37,1,43,
53,0,43,53,0,255,255,0,103,255,236,5,160,6,254,18,38,0,42,0,0,17,7,2,150,
1,219,0,0,0,19,64,11,1,47,5,38,1,34,52,46,0,35,37,1,43,53,0,43,53,0,0,0,255,
255,0,86,254,87,3,239,5,211,18,38,0,74,0,0,17,7,1,71,0,216,0,0,0,19,64,11,
2,71,17,38,2,0,76,70,26,41,37,1,43,53,0,43,53,0,0,0,255,255,0,103,255,236,
5,160,6,243,18,38,0,42,0,0,17,7,2,155,1,246,0,0,0,19,64,11,1,46,5,38,1,39,
51,59,0,35,37,1,43,53,0,43,53,0,0,0,255,255,0,86,254,87,3,239,5,230,18,38,
0,74,0,0,17,7,1,74,0,249,0,0,0,19,64,11,2,70,17,38,2,0,75,87,26,41,37,1,43,
53,0,43,53,0,0,0,255,255,0,103,255,236,5,160,6,241,18,38,0,42,0,0,17,7,1,
75,2,53,1,37,0,19,64,11,1,46,5,38,1,39,46,48,0,35,37,1,43,53,0,43,53,0,0,
0,255,255,0,86,254,87,3,239,5,204,18,38,0,74,0,0,17,7,1,75,1,45,0,0,0,11,
182,2,0,70,72,26,41,37,1,43,53,0,0,0,255,255,0,103,254,78,5,160,5,150,18,
38,0,42,0,0,17,7,2,140,2,78,0,0,0,11,182,1,46,50,46,0,35,37,1,43,53,0,0,0,
255,255,0,86,254,87,3,239,6,32,16,38,0,74,0,0,17,7,2,147,1,56,0,0,0,21,180,
2,79,17,38,2,184,255,252,180,70,74,26,41,37,1,43,53,0,43,53,0,255,255,0,168,
0,0,5,32,6,254,18,38,0,43,0,0,17,7,2,150,1,153,0,0,0,19,64,11,1,13,5,38,1,
0,18,12,4,10,37,1,43,53,0,43,53,0,0,0,255,255,0,142,0,0,3,238,7,62,18,38,
0,75,0,0,17,7,2,150,0,242,0,64,0,21,180,1,35,2,38,1,184,255,255,180,40,34,
25,10,37,1,43,53,0,43,53,0,0,2,0,14,0,0,5,185,5,129,0,19,0,23,0,166,64,72,
23,11,3,90,8,7,4,4,20,4,2,7,4,16,15,19,90,20,12,59,0,1,4,0,1,56,164,0,1,155,
0,1,68,0,1,244,0,1,235,0,1,68,0,148,0,2,224,0,1,2,0,0,48,0,112,0,208,0,4,
7,0,32,25,1,160,25,176,25,192,25,3,25,184,255,192,64,36,14,17,72,47,25,1,
22,18,6,95,15,11,80,7,96,7,2,7,2,95,64,23,1,160,23,208,23,2,23,23,13,9,3,
4,0,18,0,63,50,63,51,57,47,93,113,237,220,93,50,50,237,50,50,1,93,43,93,113,
47,94,93,95,93,113,113,113,114,114,114,94,93,93,51,51,237,50,50,47,94,93,
51,51,237,50,50,49,48,33,17,33,17,35,17,35,53,51,53,51,21,33,53,51,21,51,
21,35,17,3,53,33,21,4,102,253,1,191,154,154,191,2,255,186,153,153,186,253,
1,2,141,253,115,4,1,154,230,230,230,230,154,251,255,3,45,212,212,0,1,0,10,
0,0,3,238,5,204,0,41,0,150,185,0,7,255,232,64,66,9,13,72,0,7,16,7,2,7,33,
24,11,70,64,80,12,1,159,12,255,12,2,12,43,128,32,36,24,70,29,28,192,25,1,
0,25,16,25,48,25,224,25,240,25,5,8,25,176,43,192,43,208,43,3,176,43,240,43,
2,255,43,1,112,43,1,43,184,255,192,64,19,19,23,72,35,27,81,32,28,28,5,30,
0,25,11,21,0,18,80,5,184,255,192,180,9,13,72,5,15,0,63,43,237,50,63,51,63,
18,57,47,51,237,50,1,43,93,93,113,114,47,94,93,113,51,51,237,50,50,26,16,
220,93,113,26,237,18,57,49,48,0,94,93,43,1,62,3,51,50,30,2,21,17,35,17,52,
46,2,35,34,14,2,21,17,35,17,35,53,51,53,51,21,33,21,33,21,20,14,2,7,1,61,
30,70,84,100,62,104,133,77,29,181,17,48,88,70,64,103,73,40,180,132,132,180,
1,44,254,212,2,3,2,1,3,89,55,77,50,23,56,101,140,84,253,87,2,134,69,104,69,
35,46,84,120,75,253,170,4,182,131,147,147,131,148,33,66,56,39,7,255,255,255,
184,0,0,2,133,7,6,18,38,0,44,0,0,17,6,2,153,207,0,0,19,64,11,1,4,5,38,1,2,
13,27,0,2,37,1,43,53,0,43,53,0,255,255,255,184,0,0,2,133,5,189,18,38,0,241,
0,0,17,6,1,78,207,0,0,19,64,11,1,4,17,38,1,2,13,27,0,2,37,1,43,53,0,43,53,
0,255,255,0,12,0,0,2,49,6,161,18,38,0,44,0,0,17,7,1,73,255,217,1,78,0,19,
64,11,1,4,5,38,1,2,5,4,0,2,37,1,43,53,0,43,53,0,0,0,255,255,0,12,0,0,2,49,
5,83,18,38,0,241,0,0,17,6,1,73,217,0,0,19,64,11,1,4,17,38,1,2,5,4,0,2,37,
1,43,53,0,43,53,0,255,255,255,210,0,0,2,108,6,243,18,38,0,44,0,0,17,6,2,155,
234,0,0,19,64,11,1,4,5,38,1,2,9,17,0,2,37,1,43,53,0,43,53,0,255,255,255,210,
0,0,2,108,5,230,18,38,0,241,0,0,17,6,1,74,245,0,0,19,64,11,1,4,17,38,1,3,
9,21,0,2,37,1,43,53,0,43,53,0,255,255,0,92,254,85,1,186,5,129,18,38,0,44,
0,0,17,6,1,77,12,0,0,10,182,1,0,16,16,3,3,37,43,53,0,0,255,255,0,31,254,85,
1,125,5,204,18,38,0,76,0,0,17,6,1,77,207,0,0,15,64,10,23,22,1,2,0,20,20,7,
7,37,43,53,93,0,255,255,0,189,0,0,1,124,6,241,18,38,0,44,0,0,17,7,1,75,0,
39,1,37,0,19,64,11,1,4,5,38,1,0,4,6,0,2,37,1,43,53,0,43,53,0,0,0,0,1,0,194,
0,0,1,118,4,58,0,3,1,137,64,24,3,70,4,0,36,0,2,9,0,0,4,5,52,5,1,0,5,16,5,
32,5,3,229,5,184,255,192,64,55,225,228,72,240,5,1,228,5,1,176,5,192,5,208,
5,3,132,5,148,5,164,5,3,64,5,1,52,5,1,0,5,16,5,32,5,3,212,5,228,5,244,5,3,
144,5,1,116,5,132,5,2,96,5,1,5,184,255,192,64,22,193,196,72,224,5,1,196,5,
212,5,2,176,5,1,20,5,36,5,52,5,3,5,184,255,192,183,182,185,72,0,5,1,175,5,
184,255,192,179,171,174,72,5,184,255,192,182,161,167,72,128,5,1,5,184,255,
192,64,38,150,156,72,208,5,1,100,5,116,5,164,5,180,5,196,5,5,32,5,1,4,5,20,
5,2,4,5,20,5,180,5,196,5,244,5,5,117,5,184,255,192,179,121,124,72,5,184,255,
192,179,110,113,72,5,184,255,192,64,24,99,102,72,224,5,1,180,5,196,5,212,
5,3,48,5,1,4,5,20,5,36,5,3,5,184,255,192,183,67,70,72,11,5,1,62,5,184,255,
192,64,9,56,59,72,203,5,219,5,2,5,184,255,192,64,42,45,48,72,27,5,43,5,2,
196,5,212,5,228,5,3,107,5,123,5,2,64,5,1,2,16,5,32,5,48,5,3,191,5,207,5,2,
32,5,64,5,2,5,184,255,192,64,13,13,16,72,15,5,31,5,2,7,1,15,0,21,0,63,63,
1,94,93,43,93,93,113,95,113,113,113,114,43,114,43,94,93,43,113,113,113,113,
43,43,43,94,93,113,113,113,113,43,114,43,43,94,93,43,93,93,93,93,43,113,113,
113,113,114,114,114,114,114,114,114,43,94,93,93,17,18,57,47,94,93,237,49,
48,51,17,51,17,194,180,4,58,251,198,0,0,0,255,255,0,170,255,236,5,73,5,129,
16,38,0,44,237,0,16,7,0,45,1,225,0,0,255,255,0,137,254,87,3,3,5,204,16,38,
0,76,0,0,17,7,0,77,1,198,0,0,0,30,64,18,3,2,111,8,1,48,8,1,16,8,1,8,1,0,16,
0,1,0,17,93,53,53,17,93,93,93,53,53,255,255,0,32,255,236,3,205,6,254,18,38,
0,45,0,0,17,7,2,150,1,55,0,0,0,19,64,11,1,23,5,38,1,190,28,22,3,16,37,1,43,
53,0,43,53,0,0,0,0,2,255,153,254,87,2,47,5,211,0,19,0,29,1,148,64,25,150,
29,166,29,2,152,28,168,28,2,3,18,24,12,16,72,18,40,8,11,72,164,21,1,21,184,
255,192,64,49,11,15,72,21,251,26,1,59,26,1,26,64,12,15,72,36,26,1,26,15,70,
12,3,3,4,12,20,12,36,12,68,12,4,7,12,12,31,30,144,31,1,2,0,31,16,31,2,219,
31,184,255,192,64,9,223,227,72,31,64,210,213,72,31,184,255,192,64,51,205,
209,72,143,31,1,64,31,80,31,2,95,31,111,31,239,31,255,31,4,32,31,48,31,64,
31,3,144,31,160,31,224,31,240,31,4,79,31,1,0,31,1,160,175,31,191,31,207,31,
3,31,184,255,192,64,57,147,150,72,239,31,1,176,31,192,31,208,31,3,95,31,1,
32,31,1,31,31,47,31,63,31,143,31,191,31,207,31,6,0,31,1,111,239,31,1,208,
31,1,63,31,1,111,31,143,31,159,31,175,31,255,31,5,31,184,255,192,64,101,79,
82,72,223,31,1,144,31,160,31,176,31,3,47,31,63,31,79,31,3,0,31,1,61,31,64,
53,56,72,112,31,128,31,144,31,176,31,4,15,31,31,31,2,255,31,1,31,64,35,38,
72,144,31,1,79,31,1,255,31,1,112,31,128,31,192,31,208,31,224,31,5,31,31,1,
24,142,64,28,148,26,128,22,22,15,26,47,26,63,26,127,26,239,26,5,26,13,15,
7,80,0,27,0,63,237,63,47,93,51,47,26,16,253,26,237,1,93,93,93,113,113,43,
113,114,114,43,94,93,93,93,93,43,113,114,114,114,94,93,93,113,113,113,113,
43,114,94,93,93,93,113,113,114,114,43,43,43,94,93,95,93,17,18,57,47,94,93,
51,47,16,237,47,93,43,93,113,204,43,93,49,48,0,43,43,1,95,93,93,19,34,38,
39,53,30,1,51,50,62,2,53,17,51,17,20,14,2,1,21,35,39,35,7,35,53,19,51,77,
34,65,28,13,36,13,38,49,28,10,180,21,54,93,1,154,105,219,2,232,104,234,204,
254,87,4,5,139,2,4,20,43,67,46,4,165,251,64,62,106,78,45,6,110,20,169,169,
20,1,14,0,255,255,0,168,254,78,5,63,5,129,18,38,0,46,0,0,17,7,2,140,1,221,
0,0,0,14,185,0,1,255,205,180,16,12,4,11,37,1,43,53,255,255,0,138,254,78,4,
3,5,204,18,38,0,78,0,0,17,7,2,140,1,78,0,0,0,14,185,0,1,255,235,180,16,12,
4,11,37,1,43,53,0,1,0,138,0,0,4,3,4,58,0,11,0,166,64,72,123,1,1,116,7,1,86,
9,102,9,2,123,0,139,0,155,0,3,89,0,105,0,2,67,10,1,58,2,1,42,9,1,155,8,1,
122,8,138,8,2,44,8,1,1,10,8,10,9,16,112,9,128,9,144,9,3,9,9,0,11,16,80,11,
1,144,11,208,11,240,11,3,11,184,255,192,64,40,7,11,72,11,7,3,70,0,4,16,4,
48,4,240,4,4,8,4,128,13,192,13,224,13,3,63,13,1,2,1,7,10,4,8,8,5,15,4,0,21,
0,63,50,63,51,17,23,57,1,93,93,47,94,93,237,50,47,43,93,113,56,51,57,47,93,
56,57,51,17,51,49,48,93,93,93,93,0,93,1,93,93,93,93,0,93,1,93,33,1,7,17,35,
17,51,17,1,51,9,1,3,48,254,146,132,180,180,1,219,211,254,73,1,206,1,238,108,
254,126,4,58,253,243,2,13,254,47,253,151,0,0,0,255,255,0,168,0,0,4,47,6,240,
18,38,0,47,0,0,17,7,2,149,0,173,0,0,0,21,180,1,6,5,38,1,184,255,94,180,6,
9,0,4,37,1,43,53,0,43,53,0,255,255,0,91,0,0,2,3,7,62,18,38,0,79,0,0,17,6,
2,149,19,78,0,19,64,11,1,4,2,38,1,75,4,7,0,2,37,1,43,53,0,43,53,0,255,255,
0,168,254,78,4,47,5,129,18,38,0,47,0,0,17,7,2,140,1,133,0,0,0,14,185,0,1,
255,253,180,10,6,0,4,37,1,43,53,255,255,0,126,254,78,1,71,5,204,18,38,0,79,
0,0,17,6,2,140,255,0,0,14,185,0,1,255,255,180,8,4,0,2,37,1,43,53,0,0,255,
255,0,168,0,0,4,47,5,129,18,38,0,47,0,0,17,7,2,146,2,21,0,0,0,18,64,10,1,
15,3,1,138,10,6,0,4,37,1,43,53,0,63,53,255,255,0,138,0,0,2,105,5,204,16,38,
0,79,0,0,17,7,2,146,1,36,0,75,0,65,64,16,16,64,29,29,72,16,64,22,22,72,16,
64,18,18,72,16,184,255,192,179,17,17,72,16,184,255,192,64,12,16,16,72,16,
64,11,11,72,1,13,0,1,184,1,32,180,8,4,0,2,37,1,43,53,0,63,53,1,43,43,43,43,
43,43,0,255,255,0,168,0,0,4,47,5,129,18,38,0,47,0,0,17,7,1,75,1,213,253,143,
0,11,182,1,95,6,8,0,4,37,1,43,53,0,0,0,255,255,0,138,0,0,2,146,5,204,16,38,
0,79,0,0,17,7,1,75,1,66,253,143,0,14,185,0,1,1,84,180,4,6,0,2,37,1,43,53,
0,1,0,20,0,0,4,47,5,129,0,13,0,119,64,49,121,0,137,0,2,100,8,116,8,132,8,
3,86,8,1,134,8,1,86,7,1,134,7,1,12,2,90,9,5,16,3,1,0,3,32,3,64,3,96,3,128,
3,208,3,240,3,7,3,12,184,255,224,179,19,22,72,9,184,255,224,64,24,19,22,72,
6,1,9,12,4,16,7,1,7,0,13,1,13,13,5,10,3,2,95,5,18,0,63,237,63,18,57,47,93,
205,93,23,57,43,43,1,47,93,113,47,51,237,50,49,48,113,114,113,114,0,93,93,
1,5,17,33,21,33,17,7,53,55,17,51,17,37,2,104,254,255,2,200,252,121,148,148,
191,1,1,3,29,149,254,20,156,2,26,85,158,85,2,201,253,165,148,0,1,0,16,0,0,
1,186,5,204,0,11,0,102,64,42,39,3,1,39,2,1,8,7,11,70,4,2,0,0,16,0,32,0,64,
0,4,7,0,0,12,13,255,13,1,112,13,128,13,192,13,208,13,4,31,13,1,4,184,255,
224,64,23,18,22,72,10,32,18,22,72,1,10,4,7,4,2,79,8,1,8,8,5,0,0,21,0,63,63,
57,47,93,205,23,57,43,43,1,93,93,93,17,18,57,47,94,93,51,51,237,50,50,49,
48,113,113,51,17,7,53,55,17,51,17,55,21,7,17,138,122,122,180,124,124,2,30,
68,158,68,3,16,253,88,72,159,71,253,122,255,255,0,168,0,0,5,32,6,240,18,38,
0,49,0,0,17,7,2,149,2,17,0,0,0,19,64,11,1,20,5,38,1,73,20,23,8,18,37,1,43,
53,0,43,53,0,0,0,255,255,0,140,0,0,3,242,5,228,18,38,0,81,4,0,17,7,0,116,
1,132,0,0,0,19,64,11,1,38,17,38,1,97,38,41,19,36,37,1,43,53,0,43,53,0,0,0,
255,255,0,168,254,78,5,32,5,129,18,38,0,49,0,0,17,7,2,140,1,252,0,0,0,14,
185,0,1,255,252,180,24,20,8,18,37,1,43,53,255,255,0,140,254,78,3,242,4,78,
18,38,0,81,4,0,17,7,2,140,1,91,0,0,0,11,182,1,0,42,38,19,36,37,1,43,53,0,
0,0,255,255,0,168,0,0,5,32,6,254,18,38,0,49,0,0,17,7,2,151,1,147,0,0,0,21,
180,1,20,5,38,1,184,255,250,180,22,28,8,18,37,1,43,53,0,43,53,0,255,255,0,
140,0,0,3,242,5,211,18,38,0,81,4,0,17,7,1,72,0,242,0,0,0,21,180,1,38,17,38,
1,184,255,254,180,40,46,19,36,37,1,43,53,0,43,53,0,255,255,255,254,0,0,4,
80,5,129,16,38,0,81,98,0,16,7,2,3,255,127,0,0,0,1,0,165,255,236,5,52,5,149,
0,55,0,162,64,16,154,53,1,149,7,165,7,2,131,41,147,41,163,41,3,48,184,255,
232,179,12,15,72,47,184,255,216,64,91,12,15,72,42,54,58,54,154,54,170,54,
4,6,143,5,159,5,175,5,3,5,5,51,39,26,90,0,27,16,27,64,27,3,27,51,90,0,14,
64,14,80,14,112,14,160,14,176,14,6,48,14,80,14,144,14,240,14,4,224,14,1,143,
14,159,14,175,14,3,0,14,48,14,2,7,14,39,20,95,45,4,33,3,26,18,9,95,0,6,6,
0,19,0,63,50,47,16,237,63,63,63,237,50,1,47,94,93,93,93,113,114,237,47,93,
237,50,17,57,47,93,51,49,48,0,93,43,1,43,0,93,93,93,5,34,46,2,39,55,30,1,
51,50,62,2,53,17,52,46,2,35,34,14,2,21,17,35,17,52,46,2,39,51,30,3,21,51,
62,3,51,50,30,2,21,17,20,14,2,3,173,56,96,79,63,24,127,37,100,59,64,78,41,
13,39,81,127,87,94,163,121,70,191,1,1,1,1,184,1,3,2,1,4,34,103,130,153,86,
124,177,112,53,30,86,152,20,24,40,54,30,115,45,65,58,107,153,95,1,66,108,
154,98,46,62,105,139,77,252,133,4,68,37,92,90,76,22,22,63,69,69,28,61,101,
70,39,64,133,204,139,254,165,130,208,146,78,0,0,0,0,1,0,140,254,87,3,242,
4,78,0,53,0,135,64,18,121,52,137,52,2,90,52,106,52,2,43,52,59,52,75,52,3,
46,184,255,232,64,74,9,12,72,3,46,19,46,2,3,3,24,49,70,64,160,12,1,96,12,
208,12,2,31,12,1,175,12,1,12,55,128,37,24,70,160,25,176,25,2,0,25,192,25,
208,25,3,0,25,16,25,32,25,64,25,224,25,240,25,6,7,25,37,18,80,43,16,31,15,
24,21,7,80,0,27,0,63,237,63,63,63,237,50,1,47,94,93,113,114,237,50,26,16,
220,93,113,113,114,26,237,17,57,47,49,48,93,43,0,93,93,93,1,34,38,39,53,30,
1,51,50,62,2,53,17,52,46,2,35,34,14,2,21,17,35,17,52,46,2,39,51,30,3,21,51,
62,3,51,50,30,2,21,17,20,14,2,3,1,34,65,28,13,36,13,38,49,28,10,23,52,85,
63,64,103,73,40,180,1,2,2,1,170,1,2,3,2,3,26,62,82,106,70,90,130,84,39,22,
54,93,254,87,4,5,139,2,4,20,43,67,46,3,25,79,106,65,27,45,85,125,81,253,141,
3,83,34,75,67,48,7,5,44,57,59,20,47,76,53,29,44,92,145,100,252,169,62,106,
78,45,0,0,0,255,255,0,97,255,236,5,215,6,161,18,38,0,50,0,0,17,7,1,73,1,214,
1,78,0,19,64,11,2,40,5,38,2,0,41,40,10,0,37,1,43,53,0,43,53,0,0,0,255,255,
0,86,255,236,4,29,5,83,18,38,0,82,0,0,17,7,1,73,0,244,0,0,0,19,64,11,2,35,
17,38,2,0,36,35,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,97,255,236,5,215,6,
243,18,38,0,50,0,0,17,7,2,155,1,231,0,0,0,19,64,11,2,40,5,38,2,0,45,53,10,
0,37,1,43,53,0,43,53,0,0,0,255,255,0,86,255,236,4,29,5,230,18,38,0,82,0,0,
17,7,1,74,1,16,0,0,0,19,64,11,2,35,17,38,2,0,40,52,8,0,37,1,43,53,0,43,53,
0,0,0,255,255,0,97,255,236,5,215,6,241,18,38,0,50,0,0,17,7,2,154,1,226,0,
0,0,23,64,13,3,2,40,5,38,3,2,93,40,49,10,0,37,1,43,53,53,0,43,53,53,0,0,0,
255,255,0,86,255,236,4,34,5,228,18,38,0,82,0,0,17,7,1,79,1,9,0,0,0,23,64,
13,3,2,35,17,38,3,2,103,35,44,8,0,37,1,43,53,53,0,43,53,53,0,0,0,0,2,0,97,
255,246,7,166,5,140,0,30,0,49,0,170,64,119,137,13,1,102,13,1,105,12,1,86,
48,1,89,42,1,84,8,132,8,2,4,47,20,47,84,47,3,11,43,27,43,91,43,3,0,20,24,
28,90,34,0,26,32,26,48,26,3,26,22,26,22,29,15,34,47,34,79,34,3,63,34,95,34,
127,34,159,34,207,34,239,34,6,34,64,31,38,72,34,16,29,32,29,2,29,45,91,32,
10,1,15,10,31,10,2,10,127,51,1,27,95,24,24,21,29,95,30,18,22,95,21,3,40,95,
15,4,31,95,5,19,0,63,237,63,237,63,237,63,237,17,57,47,237,1,93,47,93,93,
237,47,93,47,43,93,113,18,57,57,47,47,93,16,237,50,57,57,49,48,0,93,93,93,
93,93,1,93,0,93,93,33,14,3,35,34,36,38,2,53,52,18,54,36,51,50,30,2,23,33,
21,33,17,33,21,33,17,33,21,37,50,54,55,17,46,2,34,35,34,14,2,21,20,30,2,3,
231,20,51,57,57,25,169,254,253,175,89,94,178,1,2,164,26,58,57,52,19,3,146,
252,221,2,231,253,25,3,76,251,111,32,76,26,11,32,37,37,15,125,187,125,63,
64,126,186,3,3,3,1,106,191,1,9,159,165,1,7,183,98,2,3,4,2,156,254,60,154,
254,21,156,145,2,2,4,87,1,2,1,74,142,206,131,129,209,148,80,0,3,0,86,255,
236,7,50,4,78,0,39,0,59,0,68,0,190,64,131,132,7,1,102,7,118,7,2,97,2,1,85,
2,1,90,66,106,66,2,108,61,1,90,61,1,69,58,85,58,101,58,3,69,52,85,52,101,
52,3,74,48,90,48,106,48,3,74,42,90,42,106,42,3,8,73,9,9,38,71,64,31,60,47,
60,63,60,3,144,60,1,60,70,128,17,30,68,0,71,144,40,1,32,40,1,40,50,71,25,
0,80,68,68,5,63,80,33,16,116,30,132,30,2,123,17,139,17,2,30,17,20,45,80,28,
16,55,80,20,22,5,80,14,239,8,1,128,8,1,8,8,14,22,0,63,51,47,93,93,16,237,
63,237,63,237,18,57,57,93,93,63,237,18,57,47,237,1,47,237,47,93,114,237,50,
57,57,26,16,220,93,113,26,237,50,47,237,49,48,0,93,93,93,93,93,93,93,93,93,
93,93,1,20,30,2,51,50,54,55,23,14,3,35,34,38,39,14,1,35,34,46,2,53,16,18,
51,32,23,62,1,51,50,30,2,29,1,37,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,
37,46,1,35,34,14,2,7,4,46,35,73,114,80,117,141,25,158,17,61,102,153,108,137,
198,61,63,201,137,113,181,127,68,253,242,1,25,117,67,200,119,136,183,111,
47,252,63,42,77,110,68,69,114,81,45,47,81,108,62,69,114,81,44,3,7,15,144,
135,45,99,84,58,4,1,247,85,143,103,57,94,72,45,45,91,73,47,91,92,93,90,68,
140,211,143,1,23,1,25,177,94,83,88,155,210,122,24,39,126,164,98,39,41,99,
164,123,126,165,98,40,39,98,166,225,171,157,29,74,127,98,255,255,0,168,0,
0,5,104,6,240,18,38,0,53,0,0,17,7,2,149,1,225,0,0,0,21,180,2,31,5,38,2,184,
255,245,180,31,34,4,17,37,1,43,53,0,43,53,0,255,255,0,136,0,0,2,166,5,228,
18,38,0,85,0,0,17,7,0,116,0,182,0,0,0,19,64,11,1,32,17,38,1,74,32,35,6,21,
37,1,43,53,0,43,53,0,0,0,255,255,0,168,254,78,5,104,5,129,18,38,0,53,0,0,
17,7,2,140,2,5,0,0,0,14,185,0,2,255,225,180,35,31,4,17,37,1,43,53,255,255,
0,129,254,78,2,136,4,78,18,38,0,85,0,0,17,6,2,140,2,0,0,14,185,0,1,255,94,
180,36,32,6,21,37,1,43,53,0,0,255,255,0,168,0,0,5,104,6,254,18,38,0,53,0,
0,17,7,2,151,1,102,0,0,0,21,180,2,31,5,38,2,184,255,169,180,33,39,4,17,37,
1,43,53,0,43,53,0,255,255,0,56,0,0,2,206,5,211,18,38,0,85,0,0,17,6,1,72,56,
0,0,21,180,1,32,17,38,1,184,255,251,180,34,40,6,21,37,1,43,53,0,43,53,0,0,
0,255,255,0,93,255,236,4,248,7,45,18,38,0,54,0,0,17,7,0,116,1,234,1,73,0,
19,64,11,1,64,5,38,1,91,64,67,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,57,255,
236,3,182,5,228,18,38,0,86,0,0,17,7,0,116,1,57,0,0,0,19,64,11,1,56,17,38,
1,93,56,59,10,0,37,1,43,53,0,43,53,0,0,0,255,255,0,93,255,236,4,248,7,26,
18,38,0,54,0,0,17,7,1,71,1,114,1,71,0,19,64,11,1,65,5,38,1,18,70,64,8,0,37,
1,43,53,0,43,53,0,0,0,255,255,0,57,255,236,3,182,5,211,18,38,0,86,0,0,17,
7,1,71,0,172,0,0,0,19,64,11,1,57,17,38,1,0,62,56,10,0,37,1,43,53,0,43,53,
0,0,0,255,255,0,93,254,78,4,248,5,150,18,38,0,54,0,0,17,7,0,120,1,166,0,0,
0,11,182,1,40,72,64,8,0,37,1,43,53,0,0,0,255,255,0,57,254,78,3,182,4,75,18,
38,0,86,0,0,17,7,0,120,0,218,0,0,0,11,182,1,15,64,56,10,0,37,1,43,53,0,0,
0,255,255,0,93,255,236,4,248,6,254,18,38,0,54,0,0,17,7,2,151,1,115,0,0,0,
19,64,11,1,64,5,38,1,19,66,72,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,57,255,
236,3,182,5,211,18,38,0,86,0,0,17,7,1,72,0,173,0,0,0,19,64,11,1,56,17,38,
1,0,58,64,10,0,37,1,43,53,0,43,53,0,0,0,255,255,0,46,254,78,4,180,5,129,18,
38,0,55,0,0,17,7,2,140,1,139,0,0,0,14,185,0,1,255,254,180,12,8,4,6,37,1,43,
53,255,255,0,31,254,78,2,42,5,44,16,38,0,87,0,0,17,6,2,140,115,0,2,233,64,
255,35,64,232,232,72,35,64,231,231,72,35,64,228,228,72,35,64,227,227,72,35,
64,226,226,72,35,64,221,221,72,35,64,217,217,72,35,64,216,216,72,35,64,215,
215,72,35,64,214,214,72,35,64,213,213,72,35,64,210,210,72,35,64,206,206,72,
35,64,205,205,72,35,64,203,203,72,35,64,202,202,72,35,64,199,199,72,35,64,
196,196,72,35,64,195,195,72,35,64,194,194,72,35,64,192,192,72,35,64,191,191,
72,35,64,190,190,72,35,64,185,185,72,35,64,184,184,72,35,64,181,181,72,35,
64,180,180,72,35,64,179,179,72,35,64,178,178,72,35,64,174,174,72,35,64,173,
173,72,35,64,170,170,72,35,64,169,169,72,35,64,168,168,72,35,64,167,167,72,
35,64,163,163,72,35,64,162,162,72,35,64,160,160,72,35,64,159,159,72,35,64,
158,158,72,35,64,157,157,72,35,64,156,156,72,35,64,152,152,72,35,64,149,149,
72,35,64,148,148,72,35,64,147,147,72,35,64,146,146,72,35,64,145,145,72,35,
64,144,144,72,35,64,142,142,72,35,64,141,141,72,64,221,35,64,138,138,72,35,
64,137,137,72,35,64,136,136,72,35,64,134,134,72,35,64,133,133,72,35,64,131,
131,72,35,64,130,130,72,35,64,127,127,72,35,64,126,126,72,35,64,125,125,72,
35,64,124,124,72,35,64,123,123,72,35,64,122,122,72,35,64,121,121,72,35,64,
120,120,72,35,64,116,116,72,35,64,115,115,72,35,64,113,113,72,35,64,112,112,
72,35,64,111,111,72,35,64,110,110,72,35,64,109,109,72,35,64,106,106,72,35,
64,105,105,72,35,64,104,104,72,35,64,102,102,72,35,64,101,101,72,35,64,100,
100,72,35,64,99,99,72,35,64,98,98,72,35,64,95,95,72,35,64,94,94,72,35,64,
93,93,72,35,64,91,91,72,35,64,90,90,72,35,64,89,89,72,35,128,88,88,72,35,
64,87,87,72,35,64,84,84,72,35,64,83,83,72,35,64,80,80,72,35,64,79,79,72,35,
64,78,78,72,35,64,77,77,72,35,184,255,192,179,74,74,72,35,184,255,192,179,
71,71,72,35,184,255,192,179,63,63,72,35,184,255,192,64,9,60,60,72,35,64,52,
52,72,35,184,255,192,179,50,50,72,35,184,255,192,179,49,49,72,35,184,255,
192,64,9,45,45,72,35,64,41,41,72,35,184,255,192,179,39,39,72,35,184,255,192,
64,9,38,38,72,35,64,30,30,72,35,184,255,192,179,28,28,72,35,184,255,192,64,
9,27,27,72,35,64,19,19,72,35,184,255,192,179,17,17,72,35,184,255,192,179,
13,13,72,35,184,255,192,64,15,9,9,72,35,64,8,8,72,1,50,27,23,7,0,37,1,43,
53,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,0,0,0,255,255,0,46,0,0,4,180,
6,254,18,38,0,55,0,0,17,7,2,151,1,33,0,0,0,21,180,1,8,5,38,1,184,255,251,
180,10,16,4,6,37,1,43,53,0,43,53,0,255,255,0,31,255,240,3,17,5,204,16,38,
0,87,0,0,17,7,2,146,1,204,0,75,0,17,177,1,1,184,1,136,180,27,23,7,0,37,1,
43,53,0,53,0,0,1,0,46,0,0,4,180,5,129,0,15,0,101,64,62,0,17,16,17,32,17,3,
9,3,2,5,15,14,6,12,5,14,9,6,127,12,175,12,191,12,3,47,12,143,12,2,12,64,23,
28,72,12,1,5,90,10,16,6,32,6,2,6,0,12,95,13,4,8,95,1,9,9,5,13,3,5,18,0,63,
63,18,57,47,51,237,50,16,237,50,1,47,93,51,253,50,204,43,93,113,17,57,43,
1,24,16,77,228,17,57,95,94,93,49,48,1,17,33,21,33,17,35,17,33,53,33,17,33,
53,33,21,2,208,1,25,254,231,190,254,233,1,23,254,28,4,134,4,229,254,60,154,
253,121,2,135,154,1,196,156,156,0,1,0,31,255,240,2,42,5,44,0,30,0,140,64,
91,40,30,1,40,29,1,40,26,1,40,25,1,12,32,9,15,72,156,12,172,12,2,12,40,9,
14,72,20,15,15,13,29,25,111,7,127,7,2,7,24,28,7,3,1,70,21,17,143,13,1,0,13,
16,13,32,13,3,7,13,128,32,1,47,32,1,27,19,80,20,0,15,80,28,127,16,191,16,
207,16,3,16,16,4,24,22,20,15,4,80,11,22,0,63,237,63,206,51,18,57,47,93,51,
237,50,16,237,50,1,93,93,47,94,93,113,51,51,237,23,50,47,93,51,51,17,51,17,
51,49,48,0,43,93,1,43,113,113,113,113,1,21,20,22,51,50,54,55,21,14,1,35,34,
53,17,35,53,51,17,35,53,51,55,51,21,51,21,35,17,51,21,1,80,51,63,26,49,29,
41,85,56,216,125,125,125,132,53,120,200,200,200,2,4,248,78,63,8,6,133,11,
13,245,1,31,131,1,48,131,242,242,131,254,208,131,255,255,0,158,255,236,5,
41,7,6,18,38,0,56,0,0,17,7,2,153,1,148,0,0,0,19,64,11,1,26,5,38,1,0,35,49,
5,20,37,1,43,53,0,43,53,0,0,0,255,255,0,133,255,236,3,235,5,189,18,38,0,88,
0,0,17,7,1,78,0,246,0,0,0,19,64,11,1,38,17,38,1,13,47,61,36,19,37,1,43,53,
0,43,53,0,0,0,255,255,0,158,255,236,5,41,6,156,18,38,0,56,0,0,17,7,1,73,1,
159,1,73,0,19,64,11,1,26,5,38,1,1,27,26,5,20,37,1,43,53,0,43,53,0,0,0,255,
255,0,133,255,236,3,235,5,83,18,38,0,88,0,0,17,7,1,73,0,240,0,0,0,21,180,
1,38,17,38,1,184,255,254,180,39,38,36,19,37,1,43,53,0,43,53,0,255,255,0,158,
255,236,5,41,6,243,18,38,0,56,0,0,17,7,2,155,1,174,0,0,0,19,64,11,1,26,5,
38,1,0,31,39,5,20,37,1,43,53,0,43,53,0,0,0,255,255,0,133,255,236,3,235,5,
230,18,38,0,88,0,0,17,7,1,74,1,11,0,0,0,21,180,1,38,17,38,1,184,255,253,180,
43,55,36,19,37,1,43,53,0,43,53,0,255,255,0,158,255,236,5,41,7,62,18,38,0,
56,0,0,17,7,1,76,1,191,0,203,0,23,64,13,2,1,31,5,38,2,1,0,36,26,5,20,37,1,
43,53,53,0,43,53,53,0,0,0,255,255,0,133,255,236,3,235,6,115,18,38,0,88,0,
0,17,7,1,76,1,20,0,0,0,23,64,13,2,1,43,17,38,2,1,1,48,38,36,19,37,1,43,53,
53,0,43,53,53,0,0,0,255,255,0,158,255,236,5,41,6,241,18,38,0,56,0,0,17,7,
2,154,1,157,0,0,0,23,64,13,2,1,26,5,38,2,1,81,26,35,5,20,37,1,43,53,53,0,
43,53,53,0,0,0,255,255,0,133,255,236,4,30,5,228,18,38,0,88,0,0,17,7,1,79,
1,5,0,0,0,23,64,13,2,1,38,17,38,2,1,100,38,47,36,19,37,1,43,53,53,0,43,53,
53,0,0,0,255,255,0,158,254,85,5,41,5,129,16,38,0,56,0,0,17,7,1,77,2,32,0,
0,0,40,185,0,1,254,103,181,39,39,21,21,37,51,184,255,192,179,21,21,72,51,
184,255,192,179,20,20,72,51,184,255,192,178,19,19,72,43,43,43,43,53,0,0,255,
255,0,133,254,85,4,5,4,58,18,38,0,88,0,0,17,7,1,77,2,87,0,0,0,13,185,0,1,
255,226,180,50,50,14,14,37,43,53,0,255,255,0,9,0,0,7,134,6,254,18,38,0,58,
0,0,17,7,2,150,2,121,0,0,0,21,180,1,48,5,38,1,184,255,253,180,53,47,15,46,
37,1,43,53,0,43,53,0,255,255,255,253,0,0,5,204,5,211,18,38,0,90,0,0,17,7,
1,71,1,148,0,0,0,21,180,1,44,17,38,1,184,255,251,180,49,43,15,42,37,1,43,
53,0,43,53,0,255,255,0,45,0,0,5,41,6,254,18,38,0,60,0,0,17,7,2,150,1,91,0,
0,0,21,180,1,10,5,38,1,184,255,251,180,15,9,4,8,37,1,43,53,0,43,53,0,255,
255,0,5,254,87,3,252,5,211,18,38,0,92,0,0,17,7,1,71,0,182,0,0,0,19,64,11,
1,33,17,38,1,0,38,32,17,31,37,1,43,53,0,43,53,0,0,0,255,255,0,45,0,0,5,41,
6,178,18,38,0,60,0,0,17,7,2,152,1,104,0,0,0,23,64,13,2,1,9,5,38,2,1,0,13,
11,4,8,37,1,43,53,53,0,43,53,53,0,0,0,255,255,0,65,0,0,4,163,6,240,18,38,
0,61,0,0,17,7,2,149,1,160,0,0,0,19,64,11,1,10,5,38,1,74,10,13,1,0,37,1,43,
53,0,43,53,0,0,0,255,255,0,49,0,0,3,182,5,228,18,38,0,93,0,0,17,7,0,116,1,
53,0,0,0,19,64,11,1,10,17,38,1,93,10,13,0,8,37,1,43,53,0,43,53,0,0,0,255,
255,0,65,0,0,4,163,6,241,18,38,0,61,0,0,17,7,1,75,1,124,1,37,0,19,64,11,1,
10,5,38,1,0,10,12,1,0,37,1,43,53,0,43,53,0,0,0,255,255,0,49,0,0,3,182,5,204,
18,38,0,93,0,0,17,7,1,75,0,253,0,0,0,12,182,1,0,10,12,0,8,37,1,43,53,0,0,
0,255,255,0,65,0,0,4,163,6,254,18,38,0,61,0,0,17,7,2,151,1,56,0,0,0,19,64,
11,1,10,5,38,1,17,12,18,1,0,37,1,43,53,0,43,53,0,0,0,255,255,0,49,0,0,3,182,
5,211,18,38,0,93,0,0,17,7,1,72,0,156,0,0,0,21,180,1,10,17,38,1,184,255,244,
180,12,18,0,8,37,1,43,53,0,43,53,0,0,1,0,138,0,0,2,17,5,202,0,19,0,125,185,
0,5,255,216,179,13,17,72,5,184,255,224,64,56,8,12,72,111,10,1,10,10,0,70,
0,1,16,1,48,1,240,1,4,8,1,255,21,1,224,21,1,223,21,1,176,21,192,21,2,159,
21,1,112,21,128,21,2,31,21,1,0,21,1,240,21,1,223,21,1,21,184,255,192,64,18,
34,37,72,79,21,1,112,21,1,31,21,1,14,80,7,0,0,21,0,63,63,237,1,93,93,113,
43,113,113,114,114,114,114,114,114,114,114,47,94,93,237,50,47,93,49,48,0,
43,43,33,35,17,52,62,2,51,50,22,23,21,46,1,35,34,14,2,21,1,62,180,22,59,102,
81,32,69,26,17,45,18,40,51,29,11,4,180,59,101,75,43,6,6,137,3,5,22,41,60,
39,0,0,0,0,1,0,192,254,78,3,195,5,174,0,27,0,148,64,107,133,6,1,122,18,138,
18,2,139,15,1,89,15,105,15,121,15,3,131,13,1,85,13,101,13,117,13,3,54,13,
1,38,7,1,38,8,1,34,22,50,22,114,22,130,22,4,21,17,37,17,53,17,3,27,212,8,
228,8,244,8,3,80,8,144,8,2,38,8,54,8,70,8,3,8,10,27,3,13,13,17,19,3,8,95,
14,159,14,2,14,12,16,80,9,17,17,13,3,81,15,24,127,24,175,24,3,24,13,0,47,
47,93,237,18,57,47,51,237,50,1,47,113,51,23,51,17,23,51,113,113,113,47,49,
48,93,0,93,1,93,93,93,93,93,93,93,93,93,1,46,1,35,34,14,2,15,1,51,7,35,3,
35,19,35,55,51,55,62,3,51,50,22,23,3,164,17,62,31,31,46,33,24,9,26,211,25,
213,254,180,254,152,27,151,29,12,40,71,109,81,32,82,35,5,32,5,10,19,40,64,
45,137,131,250,211,5,45,131,152,59,102,76,43,10,10,0,0,0,4,0,4,0,0,5,82,7,
62,0,26,0,39,0,61,0,67,1,36,64,18,122,64,138,64,2,102,5,118,5,134,5,3,86,
6,102,6,2,25,184,255,232,64,183,9,17,72,19,24,9,17,72,12,16,14,17,72,10,12,
1,12,38,9,10,32,8,39,32,7,32,40,130,0,68,66,132,66,2,66,62,50,130,17,175,
62,191,62,207,62,3,15,17,47,17,2,144,17,1,0,0,32,0,2,15,0,159,0,2,0,62,17,
17,62,0,3,6,11,5,32,32,10,7,139,7,1,90,7,106,7,122,7,3,7,16,6,32,6,48,6,3,
32,6,1,6,6,69,80,69,176,69,2,48,69,96,69,144,69,192,69,240,69,5,47,69,1,132,
10,1,85,10,101,10,117,10,3,10,11,62,62,45,141,112,22,128,22,2,22,22,57,127,
64,159,64,175,64,191,64,4,64,64,9,13,72,64,8,9,39,38,38,10,5,12,32,3,128,
57,1,63,57,1,0,57,1,57,7,7,10,0,47,51,47,47,93,93,93,23,51,18,57,47,51,205,
50,47,43,93,18,57,47,93,237,51,47,1,47,51,93,93,93,93,113,17,51,47,93,113,
51,93,93,17,18,57,17,51,17,18,23,57,47,47,47,93,113,93,113,93,16,237,16,205,
93,16,237,16,135,192,192,135,192,192,1,51,49,48,93,43,43,43,93,93,93,1,20,
6,7,6,7,1,35,3,33,3,35,1,38,39,46,1,53,52,62,2,51,50,30,2,3,46,3,39,14,3,
7,3,33,3,52,46,2,35,34,14,2,21,20,30,1,23,22,23,51,50,62,2,3,53,55,51,21,
5,3,158,38,33,16,18,2,29,195,161,253,126,162,198,2,36,21,18,33,38,38,66,88,
50,50,88,66,38,158,16,29,22,15,1,2,14,23,29,15,180,2,15,131,21,36,49,28,29,
49,36,21,21,36,24,21,24,9,28,49,36,21,247,217,207,254,202,5,112,45,79,30,
15,11,251,68,1,115,254,141,4,185,12,17,30,79,45,45,79,59,34,34,59,79,253,
254,36,74,60,41,4,4,41,62,73,36,254,95,3,119,25,44,33,19,19,33,44,25,26,44,
35,10,8,1,19,35,44,1,35,16,181,23,174,0,255,255,0,87,255,236,4,115,7,62,18,
38,0,68,0,0,16,39,1,76,1,20,255,85,17,7,0,116,1,99,1,90,0,35,64,14,3,2,101,
16,38,4,26,106,109,3,36,37,3,2,184,255,212,180,76,66,3,36,37,1,43,53,53,43,
53,0,43,53,53,0,0,0,255,255,0,24,0,0,7,168,6,240,18,38,0,134,0,0,17,7,2,149,
3,228,0,0,0,21,180,2,27,5,38,2,184,1,32,180,27,30,4,14,37,1,43,53,0,43,53,
0,255,255,0,66,255,236,6,194,5,228,18,38,0,166,0,0,17,7,0,116,2,175,0,0,0,
19,64,11,3,89,17,38,3,73,89,92,25,61,37,1,43,53,0,43,53,0,0,0,255,255,0,71,
255,203,5,244,6,240,18,38,0,152,0,0,17,7,2,149,2,75,0,0,0,19,64,11,3,52,5,
38,3,73,52,55,10,24,37,1,43,53,0,43,53,0,0,0,255,255,0,44,255,218,4,180,5,
228,18,38,0,184,0,0,17,7,0,116,1,178,0,0,0,19,64,11,3,46,17,38,3,94,46,49,
8,19,37,1,43,53,0,43,53,0,0,0,0,1,0,0,4,177,2,150,5,211,0,9,0,66,64,14,118,
9,134,9,2,120,8,136,8,2,128,0,1,0,184,255,192,64,27,11,15,72,0,191,6,1,6,
4,142,64,8,148,128,6,15,1,47,1,63,1,127,1,239,1,5,1,0,47,93,51,26,253,26,
237,1,47,93,204,43,93,49,48,93,93,1,21,35,39,35,7,35,53,19,51,2,150,105,219,
2,232,104,234,204,4,197,20,169,169,20,1,14,0,0,1,0,0,4,177,2,150,5,211,0,
9,0,66,64,14,118,0,134,0,2,120,1,136,1,2,128,8,1,8,184,255,192,64,27,11,15,
72,8,64,191,2,1,2,7,3,148,128,6,142,15,1,47,1,63,1,127,1,239,1,5,1,0,47,93,
237,26,237,50,1,47,93,26,204,43,93,49,48,93,93,1,35,3,53,51,23,51,55,51,21,
1,182,204,234,104,232,2,219,105,4,177,1,14,20,169,169,20,0,0,1,0,51,4,212,
2,88,5,83,0,3,0,81,64,59,4,1,1,228,1,244,1,2,1,164,0,1,91,0,107,0,2,52,0,
68,0,2,0,2,32,18,25,72,2,142,1,64,28,33,72,47,1,1,2,15,1,63,1,175,1,191,1,
4,1,64,22,26,72,1,64,14,17,72,1,0,47,43,43,93,95,113,43,237,43,1,47,93,93,
93,47,93,113,49,48,1,33,53,33,2,88,253,219,2,37,4,212,127,0,1,255,221,4,177,
2,119,5,230,0,21,0,73,64,51,133,14,1,133,8,1,31,17,79,17,127,17,175,17,223,
17,5,239,17,1,17,64,5,64,29,60,72,5,16,80,5,96,5,2,5,149,128,11,143,15,0,
47,0,63,0,127,0,239,0,5,0,0,47,93,237,26,237,113,50,1,47,43,26,204,93,113,
49,48,0,93,93,1,34,46,2,39,51,30,3,51,50,62,2,55,51,14,3,1,41,74,116,84,50,
8,117,8,39,56,72,42,42,71,56,38,8,117,9,50,83,116,4,177,51,85,112,61,43,59,
36,15,16,36,59,42,61,112,85,51,0,1,0,156,5,32,1,80,5,204,0,3,0,23,64,12,3,
134,0,64,14,17,72,0,0,83,1,0,0,63,237,1,47,43,237,49,48,19,53,51,21,156,180,
5,32,172,172,0,0,2,0,51,4,144,2,23,6,115,0,19,0,39,0,89,185,0,18,255,232,
64,14,9,14,72,12,24,9,14,72,8,24,9,14,72,2,184,255,232,64,42,9,14,72,20,130,
64,0,192,30,130,95,10,1,10,25,141,15,15,31,15,2,15,35,141,15,5,47,5,63,5,
79,5,127,5,159,5,191,5,239,5,8,5,0,47,93,237,220,93,237,1,47,93,237,26,220,
26,237,49,48,43,43,43,43,1,20,14,2,35,34,46,2,53,52,62,2,51,50,30,2,7,52,
46,2,35,34,14,2,21,20,30,2,51,50,62,2,2,23,38,66,88,50,50,88,66,38,38,66,
88,50,50,88,66,38,108,21,36,49,28,29,49,36,21,21,36,49,29,28,49,36,21,5,130,
50,88,66,38,38,66,88,50,50,88,65,38,38,65,88,50,28,49,36,21,21,36,49,28,29,
49,38,21,21,38,49,0,0,0,0,1,0,80,254,85,1,174,0,0,0,23,0,76,64,55,14,24,9,
13,72,9,24,9,13,72,5,32,9,17,72,12,17,132,15,0,31,0,2,95,0,191,0,2,0,6,11,
64,7,10,72,11,20,141,16,3,1,32,3,80,3,96,3,112,3,176,3,192,3,6,3,0,47,93,
113,237,47,43,1,47,205,93,113,237,50,49,48,43,43,43,1,14,1,35,34,38,53,52,
62,2,55,51,14,3,21,20,22,51,50,54,55,1,174,28,71,40,105,106,34,48,53,20,133,
25,52,43,27,49,45,29,58,28,254,112,12,15,102,85,47,79,61,42,11,14,45,59,70,
39,42,48,13,11,0,1,255,233,4,177,2,182,5,189,0,27,2,77,185,0,26,255,232,64,
182,9,17,72,12,24,9,17,72,41,29,1,25,29,41,29,57,29,89,29,105,29,5,29,64,
229,232,72,29,64,217,220,72,11,29,1,208,169,29,185,29,201,29,3,155,29,1,9,
29,57,29,2,185,29,201,29,217,29,3,29,64,195,198,72,155,29,171,29,2,137,29,
1,123,29,1,73,29,1,137,29,185,29,2,29,64,171,175,72,6,29,54,29,2,158,153,
29,1,125,29,141,29,2,111,29,1,45,29,61,29,77,29,3,27,29,1,13,29,1,237,29,
253,29,2,29,128,136,139,72,137,29,153,29,2,91,29,107,29,123,29,3,29,192,127,
130,72,9,29,1,249,29,1,235,29,1,201,29,217,29,2,171,29,187,29,2,153,29,1,
22,29,38,29,102,29,118,29,134,29,5,4,29,1,110,29,184,255,64,64,96,101,109,
72,148,29,1,112,29,128,29,2,82,29,98,29,2,64,29,1,18,29,34,29,50,29,3,4,29,
1,228,29,244,29,2,214,29,1,196,29,1,176,29,1,162,29,1,128,29,144,29,2,82,
29,98,29,114,29,3,36,29,52,29,68,29,3,6,29,22,29,2,246,29,1,210,29,226,29,
2,192,29,1,146,29,162,29,178,29,3,100,29,116,29,132,29,3,29,184,255,192,64,
9,60,64,72,2,29,1,59,1,29,184,255,128,64,57,53,58,72,164,29,180,29,2,144,
29,1,100,29,116,29,132,29,3,48,29,64,29,80,29,3,4,29,20,29,36,29,3,208,29,
224,29,2,164,29,180,29,196,29,3,112,29,128,29,2,148,29,164,29,228,29,3,29,
184,255,192,64,19,26,31,72,128,29,1,84,29,100,29,116,29,3,29,64,7,10,72,23,
184,255,128,64,9,36,39,72,148,23,164,23,2,23,184,255,128,64,23,30,33,72,68,
23,1,48,23,1,2,0,23,16,23,32,23,3,208,23,224,23,2,23,184,255,192,64,43,13,
19,72,15,23,1,23,9,22,22,5,143,64,15,14,31,14,2,255,14,1,14,64,16,19,72,14,
128,19,143,8,15,0,47,0,63,0,127,0,239,0,5,0,0,47,93,50,237,26,221,43,93,113,
26,237,51,47,1,47,204,93,43,93,113,95,113,113,43,113,43,43,93,93,43,93,113,
113,113,114,114,114,114,114,43,95,94,93,43,93,93,93,93,93,113,113,113,113,
113,113,113,113,113,114,114,114,114,114,114,43,94,93,93,93,93,93,93,93,113,
43,113,113,43,113,114,114,114,114,114,114,94,93,43,93,113,113,113,113,43,
113,114,114,114,94,93,43,43,93,113,49,48,43,43,1,34,46,2,35,34,6,7,35,62,
3,51,50,30,2,51,50,54,55,51,14,3,1,236,42,84,78,71,31,55,54,9,91,5,20,45,
74,59,44,84,78,69,30,54,55,8,92,5,20,43,74,4,177,37,45,37,62,57,45,95,78,
50,37,45,37,63,56,44,95,78,51,0,0,0,2,0,22,4,177,3,25,5,228,0,5,0,11,0,111,
64,82,164,10,1,102,10,1,154,8,170,8,2,98,4,162,4,2,98,3,1,154,2,170,2,2,10,
159,6,1,15,6,31,6,127,6,223,6,4,7,6,4,64,63,0,79,0,143,0,175,0,191,0,207,
0,6,0,64,30,41,72,0,64,23,26,72,0,8,2,149,128,6,15,0,47,0,63,0,127,0,239,
0,5,0,0,47,93,50,26,237,50,1,47,43,43,93,26,205,220,94,93,113,205,49,48,93,
93,93,93,93,93,19,53,19,51,21,1,51,53,19,51,21,1,22,217,207,254,182,253,217,
207,254,182,4,177,20,1,31,29,254,234,20,1,31,29,254,234,0,0,1,0,205,4,194,
1,225,6,7,0,5,0,64,64,43,2,16,12,17,72,41,2,1,10,5,26,5,42,5,3,3,43,3,1,3,
64,0,2,128,132,0,148,0,2,112,0,1,2,16,0,32,0,64,0,96,0,4,0,0,47,93,95,93,
93,26,205,1,47,26,205,93,49,48,95,93,93,43,19,53,19,51,21,3,205,69,207,201,
4,194,33,1,36,37,254,224,0,3,0,29,4,176,2,139,6,65,0,5,0,9,0,13,0,83,64,53,
2,16,11,17,72,10,5,26,5,42,5,3,47,4,1,4,47,1,1,1,1,6,192,13,208,13,2,13,10,
192,9,208,9,2,9,6,11,7,144,6,2,0,0,10,192,6,1,15,6,63,6,2,6,0,47,93,93,51,
51,47,205,16,237,50,1,47,205,93,47,205,93,18,57,47,113,205,93,49,48,93,43,
19,53,19,51,21,3,37,53,51,21,33,53,51,21,250,69,187,181,254,216,150,1,66,
150,4,176,33,1,112,37,254,148,31,172,172,172,172,0,0,255,255,0,4,0,0,5,82,
5,131,16,38,0,36,0,0,17,7,1,80,255,108,255,124,0,94,179,2,0,24,1,184,255,
10,181,24,24,5,5,37,28,184,255,192,179,36,36,72,28,184,255,192,179,30,30,
72,28,184,255,192,179,24,24,72,28,184,255,192,179,21,21,72,28,184,255,192,
179,18,18,72,28,184,255,192,179,15,15,72,28,184,255,192,64,11,12,12,72,28,
64,11,11,72,2,23,3,0,63,53,1,43,43,43,43,43,43,43,43,43,93,53,0,1,0,187,1,
190,1,126,2,154,0,3,2,10,179,3,134,0,5,184,255,128,64,12,229,233,72,6,5,22,
5,2,246,5,1,5,184,255,128,64,33,222,225,72,150,5,166,5,2,116,5,132,5,2,86,
5,102,5,2,68,5,1,38,5,54,5,2,2,5,18,5,2,211,5,184,255,128,64,22,207,210,72,
198,5,214,5,2,180,5,1,150,5,166,5,2,116,5,132,5,2,5,184,255,192,64,36,195,
199,72,4,5,20,5,2,214,5,230,5,246,5,3,194,5,1,148,5,164,5,180,5,3,118,5,134,
5,2,84,5,100,5,2,5,184,255,192,64,34,174,181,72,164,5,180,5,196,5,3,70,5,
86,5,118,5,134,5,150,5,5,52,5,1,38,5,1,4,5,20,5,2,161,5,184,255,192,179,157,
160,72,5,184,255,192,64,37,152,155,72,100,5,116,5,2,54,5,70,5,86,5,3,36,5,
1,6,5,22,5,2,244,5,1,214,5,230,5,2,178,5,194,5,2,5,184,255,128,64,28,135,
138,72,86,5,102,5,2,36,5,52,5,68,5,3,2,5,18,5,2,212,5,228,5,244,5,3,5,184,
255,192,64,23,119,124,72,82,5,98,5,2,1,32,5,48,5,64,5,3,4,5,20,5,2,112,5,
184,255,128,64,9,103,111,72,68,5,84,5,2,5,184,255,192,179,99,102,72,5,184,
255,128,179,92,95,72,5,184,255,192,179,87,91,72,5,184,255,128,64,21,81,86,
72,36,5,52,5,68,5,3,228,5,1,176,5,192,5,208,5,3,5,184,255,192,64,16,67,70,
72,48,5,1,36,5,1,0,5,16,5,2,60,5,184,255,192,64,12,56,59,72,187,5,1,128,5,
144,5,2,5,184,255,192,64,41,45,48,72,11,5,1,208,5,224,5,2,164,5,180,5,196,
5,3,32,5,48,5,2,2,0,5,16,5,2,240,5,1,159,5,175,5,2,0,5,1,5,184,255,192,181,
13,17,72,0,155,1,0,47,237,1,43,93,93,93,113,95,113,113,113,114,43,114,114,
43,94,93,93,93,43,93,93,113,43,43,43,43,114,43,94,93,93,95,93,43,93,113,113,
113,43,113,113,113,114,114,114,114,43,43,94,93,93,93,93,93,43,113,113,113,
113,113,114,43,114,114,114,114,43,94,93,93,93,93,93,93,43,93,113,43,47,237,
49,48,19,53,51,21,187,195,1,190,220,220,0,0,255,255,255,245,0,0,5,238,5,131,
16,39,0,40,0,240,0,0,17,7,1,80,255,40,255,124,0,49,64,10,1,14,3,1,16,15,1,
0,15,1,184,255,113,64,19,15,15,1,1,37,0,208,0,1,191,0,1,47,0,1,47,0,1,0,16,
93,93,93,93,53,43,93,93,53,0,63,53,0,0,0,255,255,255,242,0,0,6,13,5,131,16,
39,0,43,0,237,0,0,17,7,1,80,255,37,255,124,0,95,185,0,19,255,192,179,21,21,
72,19,184,255,192,179,20,20,72,19,184,255,192,179,19,19,72,19,184,255,192,
179,17,17,72,19,184,255,192,64,13,14,14,72,1,14,3,1,16,15,1,0,15,1,184,255,
113,64,19,15,15,5,5,37,0,207,0,1,191,0,1,111,0,1,47,0,1,0,16,93,93,93,93,
53,43,93,93,53,0,63,53,1,43,43,43,43,43,0,255,255,255,232,0,0,2,85,5,131,
16,39,0,44,0,217,0,0,17,7,1,80,255,27,255,124,0,92,185,0,11,255,192,179,17,
17,72,11,184,255,192,64,23,12,12,72,11,64,11,11,72,11,64,9,9,72,1,6,3,1,16,
7,1,0,7,1,184,255,102,64,28,7,7,1,1,37,0,128,0,1,127,0,1,111,0,1,95,0,1,79,
0,1,47,0,1,47,0,1,0,16,93,93,93,93,93,93,93,53,43,93,93,53,0,63,53,1,43,43,
43,43,255,255,255,187,255,236,5,211,5,150,16,38,0,50,252,0,17,7,1,80,254,
238,255,124,0,39,64,10,2,42,3,2,192,40,1,0,40,1,184,255,94,64,11,40,40,10,
10,37,1,0,47,0,1,0,16,93,53,53,43,93,93,53,0,63,53,0,0,0,255,255,0,65,0,0,
6,171,5,131,16,39,0,60,1,130,0,0,17,7,1,80,255,116,255,124,5,192,64,21,16,
64,233,233,72,16,64,229,229,72,16,64,227,227,72,16,64,226,226,72,16,184,255,
192,179,224,224,72,16,184,255,192,64,19,222,222,72,16,64,220,220,72,16,64,
219,219,72,16,64,216,216,72,16,184,255,192,179,215,215,72,16,184,255,192,
64,19,211,211,72,16,64,207,207,72,16,64,206,206,72,16,64,205,205,72,16,184,
255,192,179,204,204,72,16,184,255,192,64,19,202,202,72,16,64,199,199,72,16,
64,186,186,72,16,64,184,184,72,16,184,255,192,179,183,183,72,16,184,255,192,
64,14,182,182,72,16,64,179,179,72,16,64,177,177,72,16,184,255,192,64,19,172,
172,72,16,64,166,166,72,16,64,164,164,72,16,64,163,163,72,16,184,255,192,
64,24,161,161,72,16,64,156,156,72,16,128,153,153,72,16,64,152,152,72,16,64,
151,151,72,16,184,255,192,179,149,149,72,16,184,255,128,179,148,148,72,16,
184,255,128,179,147,147,72,16,184,255,192,179,146,146,72,16,184,255,128,179,
145,145,72,16,184,255,192,179,144,144,72,16,184,255,128,179,141,141,72,16,
184,255,128,179,140,140,72,16,184,255,192,179,139,139,72,16,184,255,128,179,
138,138,72,16,184,255,192,179,137,137,72,16,184,255,192,179,136,136,72,16,
184,255,192,179,135,135,72,16,184,255,128,179,134,134,72,16,184,255,192,179,
133,133,72,16,184,255,128,179,131,131,72,16,184,255,192,179,130,130,72,16,
184,255,0,179,129,129,72,16,184,255,0,179,128,128,72,16,184,254,192,179,127,
127,72,16,184,255,0,179,126,126,72,16,184,255,0,179,125,125,72,16,184,255,
64,179,124,124,72,16,184,255,64,179,123,123,72,16,184,255,64,179,122,122,
72,16,184,255,0,179,121,121,72,16,184,254,192,179,120,120,72,16,184,255,0,
179,119,119,72,16,184,255,0,179,118,118,72,16,184,255,64,179,117,117,72,16,
184,255,0,179,116,116,72,16,184,255,64,179,115,115,72,16,184,255,0,179,114,
114,72,16,184,255,64,179,113,113,72,16,184,255,64,179,112,112,72,16,184,255,
64,179,111,111,72,16,184,255,128,179,110,110,72,16,184,255,64,179,109,109,
72,16,184,255,128,179,108,108,72,16,184,255,0,179,107,107,72,16,184,255,64,
179,106,106,72,16,184,255,0,179,105,105,72,16,184,255,64,179,104,104,72,16,
184,255,64,179,103,103,72,16,184,255,64,179,102,102,72,16,184,255,128,179,
101,101,72,16,184,255,64,179,100,100,72,16,184,255,64,179,99,99,72,16,184,
255,0,179,98,98,72,16,184,255,64,179,97,97,72,16,184,255,64,179,96,96,72,
16,184,255,64,179,95,95,72,16,184,255,64,179,94,94,72,16,184,255,64,179,93,
93,72,16,184,255,128,179,92,92,72,16,184,255,64,179,91,91,72,16,184,255,128,
179,90,90,72,16,184,255,64,179,89,89,72,16,184,255,128,179,88,88,72,16,184,
255,64,179,87,87,72,16,184,255,64,179,86,86,72,16,184,255,64,179,85,85,72,
16,184,255,64,179,84,84,72,16,184,255,64,179,83,83,72,16,184,255,128,179,
82,82,72,16,184,255,192,179,81,81,72,16,184,255,128,179,80,80,72,16,184,255,
128,179,79,79,72,16,184,255,64,179,78,78,72,16,184,255,64,179,77,77,72,16,
184,255,64,179,76,76,72,16,184,255,128,179,75,75,72,16,184,255,128,179,74,
74,72,16,184,255,128,179,73,73,72,16,184,255,64,179,72,72,72,16,184,255,128,
179,71,71,72,16,184,255,192,179,70,70,72,16,184,255,128,179,69,69,72,16,184,
255,192,179,68,68,72,16,184,255,192,179,67,67,72,16,184,255,128,179,66,66,
72,16,184,255,64,179,65,65,72,16,184,255,128,179,64,64,72,16,184,255,128,
179,63,63,72,16,184,255,128,179,62,62,72,16,184,255,192,179,61,61,72,16,184,
255,192,179,60,60,72,16,184,255,192,179,59,59,72,16,184,255,128,179,58,58,
72,16,184,255,128,179,57,57,72,16,184,255,128,179,56,56,72,16,184,255,128,
179,55,55,72,16,184,255,128,179,54,54,72,16,184,255,192,179,53,53,72,16,184,
255,192,179,52,52,72,16,184,255,128,179,51,51,72,16,184,255,192,179,50,50,
72,16,184,255,128,179,49,49,72,16,184,255,128,179,48,48,72,16,184,255,128,
179,47,47,72,16,184,255,192,179,46,46,72,16,184,255,128,179,45,45,72,16,184,
255,128,179,44,44,72,16,184,255,128,179,43,43,72,16,184,255,192,179,42,42,
72,16,184,255,192,179,41,41,72,16,184,255,192,179,40,40,72,16,184,255,192,
179,39,39,72,16,184,255,128,179,38,38,72,16,184,255,128,179,37,37,72,16,184,
255,128,179,36,36,72,16,184,255,192,179,35,35,72,16,184,255,128,179,34,34,
72,16,184,255,192,179,33,33,72,16,184,255,192,179,32,32,72,16,184,255,192,
179,31,31,72,16,184,255,192,179,30,30,72,16,184,255,192,179,29,29,72,16,184,
255,192,179,28,28,72,16,184,255,192,179,27,27,72,16,184,255,192,179,26,26,
72,16,184,255,192,179,25,25,72,16,184,255,192,179,24,24,72,16,184,255,128,
179,23,23,72,16,184,255,192,179,22,22,72,16,184,255,192,179,21,21,72,16,184,
255,192,179,17,17,72,16,184,255,128,179,16,16,72,16,184,255,192,179,15,15,
72,16,184,255,192,179,14,14,72,16,184,255,192,64,30,12,12,72,16,64,11,11,
72,1,11,3,1,128,12,1,112,12,1,96,12,1,64,12,1,16,12,1,0,12,1,184,255,166,
64,13,12,12,4,4,37,0,176,0,1,0,0,1,0,16,93,93,53,43,93,93,93,93,93,93,53,
0,63,53,1,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,255,255,255,187,0,0,
5,173,5,150,16,38,1,114,10,0,17,7,1,80,254,238,255,124,0,68,64,15,65,64,19,
19,72,1,60,3,1,144,58,1,16,58,1,184,255,62,64,28,58,58,53,53,37,0,159,0,1,
95,0,1,31,0,1,223,0,1,175,0,1,159,0,1,31,0,1,0,16,93,93,93,93,113,113,113,
53,43,93,93,53,0,63,53,1,43,0,0,255,255,255,176,0,0,2,30,6,65,16,38,1,130,
0,0,17,6,1,81,147,0,2,60,64,11,29,64,227,227,72,29,64,226,226,72,29,184,255,
192,179,223,223,72,29,184,255,192,179,220,220,72,29,184,255,192,64,19,219,
219,72,29,64,213,213,72,29,64,212,212,72,29,64,211,211,72,29,184,255,192,
179,207,207,72,29,184,255,192,179,206,206,72,29,184,255,192,64,19,205,205,
72,29,64,200,200,72,29,64,199,199,72,29,64,198,198,72,29,184,255,192,64,14,
192,192,72,29,64,182,182,72,29,64,177,177,72,29,184,255,192,179,175,175,72,
29,184,255,192,64,19,174,174,72,29,64,168,168,72,29,64,167,167,72,29,64,164,
164,72,29,184,255,192,179,161,161,72,29,184,255,192,64,19,160,160,72,29,64,
155,155,72,29,64,154,154,72,29,64,153,153,72,29,184,255,192,179,152,152,72,
29,184,255,192,64,19,151,151,72,29,64,141,141,72,29,64,132,132,72,29,64,131,
131,72,29,184,255,192,64,9,129,129,72,29,64,119,119,72,29,184,255,192,64,
14,115,115,72,29,64,110,110,72,29,64,109,109,72,29,184,255,192,64,19,106,
106,72,29,64,101,101,72,29,64,100,100,72,29,64,96,96,72,29,184,255,192,179,
94,94,72,29,184,255,192,64,19,93,93,72,29,64,87,87,72,29,64,86,86,72,29,64,
85,85,72,29,184,255,192,179,84,84,72,29,184,255,192,64,9,79,79,72,29,64,74,
74,72,29,184,255,192,64,24,61,61,72,29,64,56,56,72,29,64,55,55,72,29,64,54,
54,72,29,64,51,51,72,29,184,255,192,179,50,50,72,29,184,255,192,179,49,49,
72,29,184,255,192,64,19,48,48,72,29,64,42,42,72,29,64,41,41,72,29,64,40,40,
72,29,184,255,192,179,36,36,72,29,184,255,192,179,35,35,72,29,184,255,192,
64,19,34,34,72,29,64,29,29,72,29,64,24,24,72,29,64,23,23,72,29,184,255,192,
179,21,21,72,29,184,255,192,179,17,17,72,29,184,255,192,64,14,16,16,72,29,
64,9,9,72,29,64,8,8,72,29,184,255,192,64,12,7,7,72,3,2,1,14,17,38,3,2,1,184,
255,220,180,20,26,5,13,37,1,43,53,53,53,0,43,53,53,53,1,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,255,255,0,4,0,0,5,82,5,129,
18,6,0,36,0,0,255,255,0,168,0,0,4,234,5,129,18,6,0,37,0,0,0,1,0,168,0,1,4,
47,5,130,0,5,0,56,64,40,3,90,0,4,16,4,64,4,3,4,16,0,48,0,80,0,3,0,0,16,0,
32,0,64,0,96,0,128,0,160,0,7,7,0,2,95,5,3,3,18,0,63,63,237,1,47,94,93,113,
47,93,237,49,48,1,21,33,17,35,17,4,47,253,56,191,5,130,156,251,27,5,129,0,
2,0,61,0,0,5,26,5,129,0,5,0,18,0,176,64,26,106,7,122,7,138,7,3,101,17,117,
17,133,17,3,89,8,1,86,16,1,6,24,13,17,72,18,184,255,232,64,64,13,17,72,132,
2,1,70,2,102,2,118,2,3,139,1,1,73,1,105,1,121,1,3,2,1,12,12,0,6,95,3,1,16,
3,1,15,3,1,175,3,207,3,223,3,255,3,4,79,3,127,3,2,48,3,1,31,3,1,3,18,128,
0,1,0,184,255,192,64,29,21,30,72,0,48,20,1,47,20,1,0,3,6,3,18,95,5,18,12,
32,19,22,72,153,12,1,12,1,3,0,63,51,93,43,63,237,23,50,1,93,93,47,43,93,51,
47,93,93,93,93,113,113,113,51,18,57,61,47,51,51,49,48,93,93,93,93,43,43,93,
93,93,93,49,48,55,1,51,1,21,33,37,1,46,3,39,14,3,7,1,62,2,5,217,1,254,251,
35,4,21,254,174,16,29,22,15,1,2,14,23,28,16,254,173,141,4,244,251,12,141,
156,3,94,40,82,69,48,8,8,49,70,82,40,252,164,255,255,0,168,0,0,4,254,5,129,
18,6,0,40,0,0,255,255,0,65,0,0,4,163,5,129,18,6,0,61,0,0,255,255,0,168,0,
0,5,32,5,129,18,6,0,43,0,0,0,3,0,97,255,236,5,215,5,150,0,19,0,39,0,43,0,
179,64,130,105,12,1,102,17,1,89,22,1,86,32,1,86,28,1,26,23,90,23,2,21,27,
85,27,2,9,42,1,6,43,1,10,37,26,37,90,37,3,5,33,21,33,85,33,3,9,43,42,30,0,
91,15,20,1,59,207,20,239,20,2,0,20,1,239,20,255,20,2,176,20,1,111,20,1,48,
20,1,31,20,1,0,20,16,20,32,20,64,20,80,20,160,20,6,7,20,30,91,175,10,191,
10,2,32,10,1,15,10,31,10,2,10,43,95,40,40,35,25,95,15,4,35,95,5,19,128,45,
1,32,45,1,93,93,0,63,237,63,237,18,57,47,237,1,47,93,93,93,237,47,94,93,113,
113,113,113,113,114,114,94,93,237,18,57,57,49,48,94,93,93,93,93,93,93,93,
93,93,93,93,1,20,2,6,4,35,34,36,38,2,53,52,18,54,36,51,50,4,22,18,7,52,46,
2,35,34,14,2,21,20,30,2,51,50,62,2,37,33,21,33,5,215,95,180,254,252,165,174,
254,250,174,88,92,178,1,5,169,168,1,5,177,92,195,65,127,188,123,126,190,127,
63,65,127,189,123,132,191,123,59,252,226,2,75,253,181,2,199,165,254,242,192,
104,109,195,1,12,159,165,1,10,187,101,102,188,254,246,163,127,208,148,80,
80,148,208,127,127,211,153,85,86,153,212,208,160,0,0,0,255,255,0,189,0,0,
1,124,5,129,18,6,0,44,0,0,255,255,0,168,0,0,5,63,5,129,18,6,0,46,0,0,0,1,
0,10,0,1,5,78,5,130,0,16,0,202,64,11,116,16,132,16,2,123,15,139,15,2,13,184,
255,232,182,14,17,72,54,13,1,12,184,255,240,64,127,13,17,72,2,16,13,17,72,
1,24,14,17,72,57,1,1,111,18,1,48,18,1,47,18,1,0,18,1,21,16,37,16,53,16,3,
6,16,1,230,16,246,16,2,16,26,15,42,15,58,15,3,9,15,1,233,15,249,15,2,15,7,
7,21,13,37,13,53,13,3,6,13,1,230,13,246,13,2,13,175,14,191,14,2,14,26,1,42,
1,58,1,3,9,1,1,233,1,249,1,2,1,16,0,32,0,48,0,3,111,0,1,0,0,48,0,2,0,118,
7,134,7,2,7,15,3,14,0,18,0,63,50,63,51,93,1,47,93,93,113,50,93,113,113,47,
93,51,93,113,113,57,61,47,51,93,113,113,51,93,113,113,93,93,93,93,49,48,93,
43,43,43,93,43,93,93,37,35,1,46,1,39,38,39,6,7,14,1,7,1,35,1,51,5,78,201,
254,124,17,29,12,14,12,13,14,12,30,15,254,122,201,2,63,198,1,3,224,47,89,
35,41,37,39,41,35,89,45,252,32,5,129,0,255,255,0,168,0,0,6,2,5,129,18,6,0,
48,0,0,255,255,0,168,0,0,5,32,5,129,18,6,0,49,0,0,0,3,0,90,0,0,4,217,5,129,
0,3,0,7,0,11,0,75,64,49,82,3,1,10,9,5,3,95,6,1,15,6,31,6,175,6,191,6,4,6,
2,16,5,48,5,2,32,5,64,5,112,5,160,5,4,5,10,95,11,11,0,7,95,6,18,3,95,0,3,
0,63,237,63,237,17,57,47,237,1,47,93,113,51,47,93,113,51,18,57,57,49,48,113,
19,33,21,33,1,21,33,53,1,21,33,53,125,4,57,251,199,4,92,251,129,3,228,252,
183,5,129,156,251,183,156,156,2,133,154,154,0,0,0,255,255,0,97,255,236,5,
215,5,150,18,6,0,50,0,0,0,1,0,168,0,0,5,32,5,129,0,7,0,79,64,40,3,90,0,4,
16,4,64,4,3,7,4,7,90,64,111,0,127,0,143,0,191,0,4,0,0,9,128,32,9,1,32,9,160,
9,176,9,192,9,4,9,184,255,192,64,10,14,17,72,2,95,5,3,4,0,18,0,63,50,63,237,
1,43,93,113,26,16,204,47,93,26,237,47,94,93,237,49,48,33,17,33,17,35,17,33,
17,4,97,253,6,191,4,120,4,224,251,32,5,129,250,127,255,255,0,168,0,0,4,234,
5,129,18,6,0,51,0,0,0,1,0,108,0,0,4,161,5,129,0,12,0,188,64,135,169,3,1,105,
9,1,116,9,132,9,164,9,3,148,8,164,8,2,87,8,103,8,2,145,7,1,84,7,100,7,2,146,
10,162,10,2,116,10,132,10,2,70,10,86,10,102,10,3,57,3,185,3,2,249,3,1,103,
3,1,168,8,1,103,8,1,8,100,2,1,39,2,1,175,6,1,2,6,2,6,1,208,11,1,0,11,16,11,
48,11,80,11,96,11,128,11,6,7,11,70,7,1,11,7,1,7,3,3,10,175,1,191,1,2,32,1,
1,15,1,1,1,3,7,95,9,2,8,3,0,4,3,1,10,95,0,18,0,63,237,50,63,18,23,57,237,
50,1,47,93,93,93,51,51,47,51,113,113,47,94,93,93,18,57,57,47,47,93,113,113,
51,113,113,113,113,114,49,48,93,93,93,93,93,93,93,93,113,93,51,53,9,1,53,
33,21,33,1,21,1,33,21,108,2,26,253,247,3,231,252,240,1,202,254,22,3,109,162,
2,67,1,251,161,156,254,67,124,253,240,156,0,255,255,0,46,0,0,4,180,5,129,
18,6,0,55,0,0,255,255,0,45,0,0,5,41,5,129,18,6,0,60,0,0,0,3,0,117,255,245,
5,238,5,139,0,29,0,40,0,51,0,180,185,0,28,255,240,179,12,15,72,17,184,255,
240,179,12,15,72,27,184,255,240,179,12,15,72,18,184,255,240,64,72,12,15,72,
41,90,11,15,123,15,171,15,3,15,8,30,90,4,0,116,0,164,0,3,0,35,24,7,90,47,
21,4,8,1,20,8,36,8,68,8,116,8,164,8,244,8,6,8,20,53,68,53,2,0,53,1,132,53,
164,53,196,53,244,53,4,112,53,1,2,96,53,1,53,184,255,192,64,24,10,13,72,35,
46,96,10,6,10,34,49,96,20,24,20,10,20,10,20,7,22,3,7,18,0,63,63,18,57,57,
47,47,17,51,16,237,50,17,51,16,237,50,1,43,93,95,93,93,113,113,47,93,113,
51,51,253,50,50,220,93,237,16,220,93,237,49,48,0,43,43,43,43,1,20,14,2,43,
1,21,35,53,35,34,46,2,53,52,62,2,59,1,53,51,21,51,50,30,2,7,52,38,43,1,17,
51,50,62,2,37,20,30,2,59,1,17,35,34,6,5,238,64,131,197,133,83,185,83,133,
197,131,64,67,133,201,135,72,185,71,135,202,133,67,192,185,183,48,56,92,136,
89,43,252,7,43,89,136,92,56,52,182,182,2,224,105,188,143,84,227,227,84,143,
188,105,113,185,131,72,182,182,72,131,185,117,187,180,253,22,53,98,140,88,
88,140,98,53,2,234,180,255,255,0,46,0,0,5,43,5,129,18,6,0,59,0,0,0,1,0,145,
0,0,6,30,5,129,0,35,0,203,64,127,90,31,106,31,2,85,30,101,30,2,90,4,106,4,
2,90,5,106,5,2,74,22,1,69,13,1,3,25,90,100,28,1,132,28,148,28,2,28,19,35,
90,0,10,90,107,7,1,139,7,155,7,2,7,16,219,0,1,4,0,100,0,132,0,3,219,0,1,4,
0,52,0,68,0,100,0,132,0,148,0,180,0,196,0,8,7,0,4,37,36,37,52,37,68,37,132,
37,196,37,212,37,7,228,37,244,37,2,160,37,1,132,37,148,37,2,96,37,112,37,
2,84,37,1,64,37,1,2,37,184,255,192,64,18,9,12,72,34,2,96,19,239,15,1,15,15,
26,17,8,3,0,18,0,63,63,51,51,57,47,93,51,237,50,1,43,95,93,93,93,93,93,93,
113,47,94,93,93,113,113,51,220,93,113,237,16,253,50,220,93,113,237,49,48,
95,93,93,93,0,93,1,93,0,93,33,17,35,34,46,2,53,17,51,17,20,30,2,59,1,17,51,
17,51,50,62,2,53,17,51,17,20,14,2,43,1,17,2,251,83,133,201,134,67,191,47,
93,139,92,56,185,56,95,140,91,45,191,68,134,201,132,83,1,171,84,142,189,104,
1,207,254,45,80,137,100,57,3,73,252,183,57,100,137,80,1,211,254,49,104,189,
142,84,254,85,0,0,0,1,0,87,0,0,5,163,5,150,0,57,0,225,64,91,101,36,1,101,
22,1,157,49,1,143,49,1,49,16,11,15,72,157,9,1,143,9,1,9,16,11,15,72,116,3,
132,3,2,54,3,1,54,2,118,2,2,54,56,118,56,2,116,55,132,55,2,54,55,1,42,26,
1,42,32,1,41,53,48,40,10,18,96,40,112,40,144,40,3,111,18,127,18,159,18,3,
40,18,40,18,24,34,91,80,53,1,53,184,255,192,64,69,27,30,72,191,53,207,53,
2,48,53,1,53,17,5,91,31,24,79,24,2,224,24,1,15,24,31,24,95,24,207,24,223,
24,5,160,24,1,111,24,159,24,2,0,24,32,24,48,24,3,8,24,95,59,1,10,15,19,39,
48,5,42,95,18,41,18,29,95,0,4,0,63,237,63,51,237,23,50,1,93,47,94,93,93,93,
113,113,114,253,196,47,93,93,43,114,237,17,57,57,47,47,93,93,17,51,17,51,
16,196,49,48,0,93,93,93,93,93,93,93,93,43,93,93,43,93,93,93,93,1,50,30,2,
21,20,14,2,7,54,55,62,1,59,1,21,33,53,62,3,53,52,46,2,35,34,14,2,21,20,30,
2,23,21,33,53,51,50,22,23,22,23,46,3,53,52,62,2,2,253,151,241,168,90,59,109,
157,99,42,39,33,71,23,244,253,179,96,139,89,42,61,116,169,108,109,170,116,
61,42,89,139,96,253,179,244,23,71,33,39,42,99,157,109,59,90,168,241,5,150,
86,162,234,147,106,191,167,138,54,2,3,2,4,156,224,51,126,143,159,85,116,181,
124,65,65,124,181,116,85,159,143,126,51,224,156,4,2,3,2,54,138,167,191,106,
147,234,162,86,0,0,255,255,0,7,0,0,2,52,6,178,18,38,0,44,0,0,17,6,2,152,218,
0,0,23,64,13,2,1,4,5,38,2,1,1,8,6,0,2,37,1,43,53,53,0,43,53,53,0,0,3,0,45,
0,0,5,41,6,178,0,8,0,12,0,16,2,114,64,20,30,7,1,12,7,1,7,24,12,15,72,17,5,
1,3,5,1,16,3,5,184,255,232,64,255,12,15,72,12,133,9,16,133,64,13,5,4,14,2,
1,8,14,7,105,8,169,8,2,6,8,22,8,54,8,70,8,4,14,8,6,1,90,38,2,86,2,150,2,3,
118,2,230,2,2,57,2,73,2,2,6,2,1,16,2,153,18,169,18,201,18,3,86,18,1,9,18,
57,18,2,25,18,89,18,137,18,249,18,4,6,18,1,202,249,18,1,230,18,1,9,18,25,
18,185,18,201,18,4,198,18,1,89,18,121,18,169,18,3,54,18,1,41,18,57,18,185,
18,233,18,4,11,18,1,153,249,18,1,198,18,214,18,2,178,18,1,164,18,1,150,18,
1,130,18,1,116,18,1,86,18,102,18,2,66,18,1,36,18,52,18,2,18,18,1,4,18,1,244,
18,1,230,18,1,196,18,212,18,2,166,18,182,18,2,146,18,1,132,18,1,118,18,1,
98,18,1,84,18,1,54,18,70,18,2,36,18,1,22,18,1,4,18,1,242,18,1,1,208,18,224,
18,2,196,18,1,160,18,176,18,2,148,18,1,112,18,1,100,18,1,64,18,1,20,18,36,
18,52,18,3,0,18,1,105,64,202,228,18,244,18,2,208,18,1,164,18,180,18,196,18,
3,128,18,144,18,2,116,18,1,80,18,96,18,2,68,18,1,32,18,1,4,18,20,18,2,244,
18,1,224,18,1,196,18,212,18,2,176,18,1,84,18,100,18,116,18,148,18,164,18,
5,48,18,64,18,2,36,18,1,0,18,1,196,18,244,18,2,144,18,1,4,18,20,18,36,18,
68,18,84,18,116,18,132,18,7,57,224,18,1,132,18,164,18,212,18,3,112,18,1,4,
18,36,18,52,18,84,18,100,18,5,228,18,244,18,2,192,18,1,180,18,1,144,18,1,
4,18,20,18,52,18,84,18,132,18,5,212,18,228,18,2,187,18,1,164,18,1,112,18,
1,2,48,18,96,18,2,15,18,47,18,2,10,14,145,9,95,13,1,13,64,9,12,72,13,0,3,
59,3,75,3,123,3,3,3,1,8,4,3,1,18,0,63,63,51,18,57,93,17,51,47,43,93,51,237,
50,1,93,93,95,93,93,93,93,113,113,113,113,113,114,114,114,114,94,93,93,93,
113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114,94,93,
93,93,93,93,93,93,93,93,95,93,113,113,113,113,113,113,113,113,113,113,113,
113,113,114,114,114,114,114,114,114,114,114,114,114,114,94,93,93,113,113,
113,114,114,114,94,93,93,113,113,113,47,94,93,93,93,113,253,57,206,94,93,
93,50,43,1,24,16,77,230,50,47,26,237,220,237,49,48,43,95,94,93,93,43,93,93,
1,17,35,19,1,51,9,1,51,37,53,51,21,33,53,51,21,3,9,190,2,253,224,205,1,178,
1,176,205,253,249,163,253,211,165,2,72,253,184,2,72,3,57,253,97,2,159,121,
184,184,184,184,255,255,0,86,255,236,4,101,6,7,18,38,1,122,0,0,17,7,1,80,
1,33,0,0,0,19,64,11,2,60,17,38,2,26,60,63,8,23,37,1,43,53,0,43,53,0,0,0,255,
255,0,70,255,236,3,106,6,7,18,38,1,126,0,0,17,7,1,80,0,202,0,0,0,19,64,11,
1,58,17,38,1,73,58,61,16,6,37,1,43,53,0,43,53,0,0,0,255,255,0,106,254,88,
3,238,6,7,18,38,1,128,0,0,17,7,1,80,1,57,0,0,0,19,64,11,1,36,17,38,1,100,
36,39,17,34,37,1,43,53,0,43,53,0,0,0,255,255,0,137,0,0,1,178,6,7,18,38,1,
130,0,0,17,6,1,80,209,0,0,27,64,17,1,14,17,38,1,16,14,1,0,14,1,29,14,17,5,
13,37,1,43,93,93,53,0,43,53,0,255,255,0,133,255,236,3,254,6,65,18,38,1,142,
0,0,17,7,1,81,0,222,0,0,0,30,64,9,3,2,1,32,17,38,3,2,1,184,255,241,180,38,
44,10,0,37,1,43,53,53,53,0,43,53,53,53,0,2,0,86,255,236,4,101,4,78,0,39,0,
59,1,15,64,196,122,48,138,48,2,121,52,137,52,2,101,43,1,90,58,106,58,2,54,
14,70,14,2,29,31,45,31,2,29,38,45,38,2,47,37,1,29,37,1,75,36,107,36,2,47,
36,63,36,2,29,36,1,139,35,1,47,35,1,29,35,1,47,34,1,29,34,1,47,22,1,27,22,
1,47,21,1,27,21,1,75,20,107,20,2,47,20,1,27,20,1,45,19,1,27,19,1,121,6,137,
6,2,11,6,27,6,2,34,48,18,22,72,34,33,22,48,18,22,72,22,23,26,33,42,33,2,73,
23,1,26,23,42,23,2,33,23,159,28,175,28,191,28,3,28,64,29,33,72,28,64,0,16,
22,34,4,144,50,160,50,176,50,3,127,50,1,32,50,64,50,2,50,61,128,40,71,8,16,
61,1,0,50,28,16,4,23,33,21,23,15,55,80,11,16,45,80,5,22,0,63,237,63,237,63,
63,18,23,57,1,93,47,237,26,16,220,93,93,93,23,50,26,205,43,93,50,50,93,93,
93,17,51,43,17,51,43,49,48,0,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93,
93,93,93,93,93,93,93,93,93,93,0,93,1,93,0,93,1,93,37,14,3,35,34,2,17,16,18,
51,50,30,2,23,51,62,3,55,51,14,3,7,30,3,23,35,46,3,39,1,20,30,2,51,50,62,
2,55,46,3,35,34,14,2,3,75,26,65,87,111,70,205,193,217,209,69,112,86,63,20,
2,4,14,19,23,13,188,22,46,39,30,5,3,23,31,36,18,183,11,21,16,13,3,253,196,
28,59,93,66,54,100,82,61,14,12,45,71,102,70,66,96,64,31,237,56,94,69,38,1,
20,1,24,1,28,1,26,39,69,93,54,21,56,63,65,30,47,128,139,139,58,103,175,144,
110,39,28,66,65,58,20,1,49,112,160,103,48,52,107,160,108,86,154,115,68,46,
102,163,0,2,0,142,254,87,4,73,5,204,0,32,0,62,0,185,64,68,149,20,1,154,16,
1,123,7,139,7,2,122,60,138,60,2,106,3,122,3,138,3,3,102,31,118,31,2,74,50,
90,50,106,50,3,21,2,37,2,101,2,117,2,133,2,5,147,21,1,21,21,37,21,2,28,48,
23,72,52,48,48,64,48,2,96,48,1,48,184,255,192,64,58,20,23,72,48,52,48,52,
14,0,72,64,48,43,64,43,160,43,3,160,43,176,43,192,43,3,43,64,128,33,13,70,
0,14,16,14,48,14,3,8,14,28,48,80,49,49,38,57,80,18,0,13,27,33,38,80,9,5,22,
0,63,51,237,50,63,63,237,18,57,47,237,57,1,47,94,93,237,50,26,16,220,93,113,
26,237,18,57,57,47,47,43,93,113,16,237,17,57,49,48,93,93,93,93,93,0,93,93,
93,1,93,93,1,20,14,2,35,34,38,39,35,30,1,21,17,35,17,52,54,51,50,30,2,21,
20,14,2,7,30,3,1,30,3,51,50,62,2,53,52,46,2,35,53,62,1,53,52,46,2,35,34,14,
2,21,4,73,53,111,173,120,102,160,56,6,3,3,180,228,226,99,152,102,53,35,61,
81,46,57,114,91,56,252,249,28,71,81,87,43,72,110,73,38,38,81,128,89,127,113,
27,57,87,60,70,104,68,34,1,149,89,154,116,66,55,39,57,92,53,254,215,5,172,
237,220,47,90,130,82,73,111,82,56,18,11,55,93,137,254,218,19,34,25,14,41,
76,106,66,65,110,81,45,142,27,139,122,44,77,57,32,35,77,122,88,0,0,0,0,1,
0,7,254,88,3,249,4,58,0,24,0,237,64,59,59,22,75,22,2,41,22,1,59,21,75,21,
2,26,21,42,21,2,9,21,1,42,12,58,12,74,12,3,25,12,1,77,13,1,13,16,13,16,72,
66,2,1,54,2,1,34,2,1,6,2,22,2,2,13,2,1,1,17,1,184,255,240,64,76,13,16,72,
24,15,7,7,13,14,16,15,14,47,14,2,57,31,14,63,14,95,14,127,14,159,14,191,14,
223,14,255,14,8,63,14,127,14,159,14,191,14,223,14,255,14,6,0,14,32,14,2,224,
14,1,191,14,1,160,14,1,95,14,159,14,2,0,14,16,14,64,14,3,8,14,1,0,184,255,
240,64,17,127,0,1,0,64,26,1,0,26,48,26,96,26,144,26,4,26,184,255,192,64,14,
21,26,72,7,15,24,3,25,20,27,13,13,0,15,0,63,50,47,63,17,23,51,1,43,93,113,
47,93,56,50,47,94,93,93,93,93,93,113,113,114,94,93,56,51,57,61,47,51,51,49,
48,43,94,93,94,93,93,93,93,43,93,93,93,93,93,93,93,93,19,51,19,30,3,23,62,
3,55,19,51,1,14,3,7,35,62,1,55,7,192,245,7,21,20,17,4,5,18,21,22,8,239,191,
254,122,17,31,27,23,7,191,17,48,24,4,58,253,93,22,63,67,63,22,21,62,67,63,
22,2,165,251,251,45,111,124,132,65,131,213,91,0,0,0,2,0,86,255,236,4,29,5,
204,0,19,0,50,0,156,64,81,115,28,131,28,2,106,28,1,118,46,134,46,2,106,46,
1,90,2,106,2,2,90,17,106,17,2,85,13,101,13,2,114,26,130,26,2,38,26,1,128,
25,1,114,25,1,51,25,67,25,2,50,50,31,71,0,64,25,46,5,47,47,41,31,0,1,144,
0,1,0,52,128,10,71,31,41,1,41,47,20,80,5,184,255,224,64,22,23,28,72,5,24,
18,22,72,111,5,1,90,5,1,5,46,48,0,15,80,36,22,0,63,237,63,57,57,93,93,43,
43,237,50,1,47,93,237,26,16,204,93,113,17,57,47,57,57,51,26,16,237,50,47,
49,48,93,93,93,93,93,93,93,93,93,93,93,93,1,52,46,2,39,14,3,21,20,30,2,51,
50,62,2,1,34,46,2,39,1,30,3,21,20,14,2,35,34,46,2,53,52,62,2,55,1,53,33,21,
3,96,49,69,76,26,73,134,102,60,35,73,111,77,81,112,69,31,254,255,13,42,45,
41,13,1,60,54,102,79,49,64,123,180,115,114,180,125,66,73,127,169,96,254,193,
2,221,1,215,85,145,115,86,27,26,81,114,146,91,76,131,96,55,54,95,131,3,191,
2,3,2,1,254,188,55,116,134,159,97,110,182,131,72,68,127,183,115,112,176,135,
97,33,1,83,119,132,0,1,0,70,255,236,3,106,4,78,0,57,0,179,64,49,140,37,1,
133,3,1,53,36,69,36,2,55,34,1,42,8,1,37,5,1,14,24,9,12,72,10,29,26,29,42,
29,3,42,70,21,48,27,48,27,48,16,35,35,6,64,37,48,72,6,184,255,192,179,14,
17,72,6,184,255,192,64,66,8,11,72,6,59,53,71,31,16,63,16,79,16,95,16,4,16,
64,37,43,72,16,128,59,1,31,59,95,59,2,21,48,80,15,47,31,47,79,47,95,47,175,
47,223,47,239,47,7,191,47,207,47,2,47,47,0,39,80,36,32,16,0,80,5,11,22,0,
63,51,237,63,51,237,18,57,47,93,113,237,57,1,93,113,47,43,93,237,16,198,43,
43,43,50,47,17,57,57,47,47,18,57,237,49,48,93,43,0,93,1,93,0,93,93,93,93,
37,50,62,2,55,23,14,3,35,34,46,2,53,52,62,2,55,53,46,3,53,52,62,2,51,50,22,
23,7,46,1,35,34,6,21,20,30,2,51,21,34,14,2,21,20,30,2,1,200,54,96,79,63,21,
105,32,84,106,130,78,96,141,92,45,42,72,96,54,51,85,61,34,50,95,136,87,118,
191,67,128,47,125,75,91,96,55,97,131,75,72,139,109,66,29,52,74,114,31,48,
56,26,100,39,71,53,32,46,84,116,69,58,95,69,42,5,2,6,40,64,86,51,62,106,77,
44,86,99,88,71,68,85,74,57,70,37,12,135,11,40,80,69,45,69,46,24,0,0,0,1,0,
86,254,159,3,96,5,204,0,56,0,209,64,117,169,38,1,156,29,172,29,2,149,55,165,
55,2,173,39,1,124,39,140,39,156,39,3,117,8,1,115,2,1,100,36,132,36,148,36,
164,36,4,139,24,155,24,171,24,3,57,24,1,44,31,156,31,172,31,3,44,30,60,30,
76,30,3,100,54,132,54,164,54,3,38,54,86,54,2,240,47,1,47,47,21,0,71,33,40,
50,50,10,31,21,79,21,2,191,21,1,21,64,29,33,72,0,21,16,21,32,21,64,21,4,7,
21,50,47,80,5,26,0,184,255,240,64,31,19,22,72,135,0,151,0,2,218,33,1,169,
33,185,33,201,33,3,136,33,152,33,2,26,33,0,3,15,48,0,15,0,47,63,18,23,57,
93,93,93,93,43,17,51,237,50,1,47,94,93,43,93,113,205,50,47,51,47,237,18,57,
47,113,49,48,93,93,93,93,0,93,93,1,93,0,93,93,1,93,93,93,0,93,1,93,1,20,30,
2,23,30,3,21,20,14,2,7,39,62,3,53,52,46,2,39,46,5,53,52,62,4,55,53,14,3,35,
33,53,33,21,14,5,1,21,43,74,100,57,54,111,90,58,18,26,29,10,126,9,19,16,11,
36,66,94,57,42,89,82,73,54,31,49,85,113,127,135,64,12,34,36,34,11,254,167,
2,130,62,131,123,108,81,47,1,123,64,79,49,31,15,15,34,57,88,68,34,68,62,51,
17,56,12,33,38,39,19,34,45,33,25,13,10,23,36,50,74,100,67,83,176,176,175,
166,155,68,4,1,1,1,1,131,127,70,157,166,172,171,166,0,0,0,0,1,0,106,254,88,
3,238,4,78,0,35,0,100,185,0,32,255,232,64,46,9,12,72,35,70,64,80,0,1,159,
0,255,0,2,0,37,128,23,12,70,192,13,1,0,13,16,13,48,13,224,13,240,13,5,8,13,
240,37,1,255,37,1,112,37,1,37,184,255,192,64,14,19,23,72,35,27,23,6,80,29,
16,17,15,12,21,0,63,63,63,237,50,63,1,43,93,93,113,47,94,93,113,237,50,26,
16,220,93,113,26,237,49,48,43,1,17,52,46,2,35,34,14,2,21,17,35,17,52,38,39,
51,30,3,21,51,62,3,51,50,30,2,21,17,3,57,23,52,85,63,64,103,73,40,180,22,
14,170,9,14,10,5,3,26,62,82,106,70,90,130,84,39,254,88,4,86,79,106,65,27,
45,85,125,81,253,141,3,83,68,121,42,21,48,49,47,20,47,76,53,29,44,92,145,
100,251,135,0,0,0,0,3,0,106,255,236,4,9,5,203,0,15,0,26,0,37,0,194,64,108,
153,19,169,19,2,150,24,166,24,2,138,2,1,133,5,1,138,14,1,133,10,1,124,36,
140,36,2,115,29,131,29,2,85,29,101,29,2,124,18,140,18,2,74,18,90,18,106,18,
3,115,25,131,25,2,69,25,85,25,101,25,3,6,13,22,13,2,6,10,1,9,5,1,9,2,1,7,
33,0,71,64,15,21,31,21,127,21,143,21,239,21,255,21,6,21,64,45,48,72,21,39,
128,32,22,71,32,8,1,8,184,255,192,183,29,35,72,8,48,39,1,39,184,255,192,64,
19,30,35,72,223,39,1,22,80,32,32,16,27,80,11,0,16,80,3,22,0,63,237,63,237,
18,57,47,237,1,93,43,113,47,43,93,237,50,26,16,220,43,113,26,237,51,49,48,
0,94,93,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93,93,1,16,2,35,34,46,
1,2,53,16,18,51,50,30,1,18,1,50,62,2,55,33,30,3,19,34,14,2,7,33,46,3,4,9,
240,228,108,171,118,62,233,232,121,175,112,54,254,42,62,100,73,42,3,253,221,
3,44,71,94,66,62,99,72,42,3,2,35,3,40,69,97,2,221,254,131,254,140,92,186,
1,27,192,1,117,1,121,93,188,254,231,252,216,52,128,216,164,164,215,129,52,
4,217,51,126,212,161,161,212,126,51,0,0,0,1,0,137,0,0,1,141,4,58,0,13,1,13,
64,210,13,8,70,207,5,223,5,2,0,5,32,5,208,5,3,9,5,5,14,15,95,15,111,15,2,
32,15,1,224,15,240,15,2,111,15,127,15,143,15,3,0,15,16,15,32,15,3,205,207,
15,223,15,239,15,3,96,15,1,127,15,207,15,2,64,15,80,15,2,175,15,223,15,239,
15,3,96,15,112,15,2,15,15,31,15,2,154,255,15,1,208,15,224,15,2,63,15,1,159,
15,175,15,2,112,15,1,223,15,1,144,15,1,63,15,79,15,2,0,15,1,106,159,15,223,
15,239,15,3,96,15,112,15,2,15,15,1,239,15,255,15,2,128,15,208,15,2,63,15,
1,96,15,1,15,15,31,15,2,55,207,15,255,15,2,144,15,160,15,176,15,3,31,15,47,
15,63,15,3,176,15,192,15,208,15,3,15,15,31,15,111,15,3,144,15,160,15,224,
15,3,31,15,63,15,2,0,15,1,7,6,15,0,21,0,63,63,1,94,93,93,93,113,113,114,114,
114,94,93,93,113,113,113,114,114,114,94,93,93,93,93,113,113,114,114,114,94,
93,93,93,113,113,114,114,94,93,93,93,113,113,17,18,57,47,94,93,113,237,50,
49,48,51,46,3,53,17,51,17,20,30,2,23,199,15,24,15,8,180,11,21,30,18,16,53,
64,70,33,3,78,252,169,32,64,60,52,19,0,0,0,1,0,138,0,0,4,3,4,58,0,11,0,158,
64,114,148,9,164,9,2,102,9,118,9,134,9,3,172,0,1,139,0,155,0,2,105,0,121,
0,2,86,10,150,10,166,10,3,151,10,167,10,2,84,10,1,70,7,134,7,2,1,10,247,8,
1,8,10,9,16,9,9,0,11,16,0,11,160,11,2,0,11,16,11,32,11,64,11,160,11,224,11,
6,7,11,7,3,70,0,4,16,4,48,4,240,4,4,8,4,128,13,192,13,224,13,3,63,13,1,2,
1,7,10,4,8,5,15,4,0,21,0,63,50,63,51,23,57,1,93,93,47,94,93,237,50,47,94,
93,113,56,51,57,47,56,57,51,113,17,51,49,48,0,93,93,93,1,93,93,93,93,93,93,
33,1,7,17,35,17,51,17,1,51,9,1,3,48,254,146,132,180,180,1,219,211,254,73,
1,206,1,238,109,254,127,4,58,253,243,2,13,254,47,253,151,0,0,0,0,1,0,14,0,
0,3,238,5,204,0,33,1,60,64,101,149,15,1,157,23,1,138,2,1,137,1,1,137,25,153,
25,2,140,21,156,21,2,115,0,131,0,147,0,3,140,20,156,20,2,106,20,122,20,2,
146,32,1,132,32,1,101,32,117,32,2,3,102,26,118,26,150,26,3,141,26,157,26,
2,2,126,26,1,108,26,1,3,84,18,1,148,31,1,101,31,117,31,133,31,3,86,31,1,146,
29,1,2,128,29,1,84,29,1,144,28,1,28,184,255,224,64,59,13,16,72,146,27,1,84,
27,100,27,116,27,3,93,0,109,0,2,149,17,1,73,17,1,150,18,1,138,18,1,101,18,
117,18,2,38,18,86,18,2,42,3,58,3,74,3,122,3,138,3,5,26,0,20,10,10,19,32,33,
184,255,240,64,69,33,20,19,16,31,19,63,19,2,31,19,63,19,95,19,127,19,159,
19,191,19,223,19,255,19,8,223,19,255,19,2,192,19,1,95,19,159,19,2,0,19,16,
19,64,19,3,8,19,0,35,48,35,96,35,160,35,176,35,5,26,0,13,33,19,21,6,80,13,
0,0,63,237,63,51,18,57,57,1,93,47,94,93,93,93,93,113,114,56,51,47,56,51,18,
57,47,18,57,57,49,48,93,93,93,93,93,93,93,0,93,1,93,93,43,93,93,93,95,93,
93,93,93,0,93,95,93,93,95,93,1,93,95,93,93,93,93,93,93,93,93,93,93,93,0,93,
1,39,46,3,35,34,6,7,39,62,1,51,50,30,2,23,1,35,3,46,3,39,14,3,7,1,35,1,207,
36,27,42,45,57,40,11,32,6,35,25,72,32,55,87,73,67,36,1,171,190,207,8,18,18,
16,5,7,22,25,24,8,254,255,187,3,197,99,73,105,67,31,7,3,130,9,15,36,81,131,
95,251,139,2,65,22,56,59,56,21,21,60,62,55,18,253,193,0,0,0,1,0,138,254,119,
4,6,4,58,0,41,0,108,64,55,13,40,14,17,72,90,8,106,8,2,35,70,5,15,34,95,34,
2,159,34,175,34,255,34,3,0,34,16,34,32,34,3,7,34,43,23,19,70,0,20,16,20,48,
20,240,20,4,8,20,96,43,128,43,2,43,184,255,192,64,15,20,23,72,41,21,34,21,
15,19,5,28,80,14,11,22,0,63,51,237,50,47,63,51,63,1,43,93,47,94,93,237,50,
16,220,94,93,93,113,50,237,49,48,0,93,1,43,33,46,3,53,35,14,3,35,34,38,39,
35,30,1,21,17,35,17,51,17,20,30,2,51,50,62,2,53,17,51,17,20,30,2,23,3,94,
1,3,3,3,4,26,56,69,86,57,82,120,32,4,3,1,182,182,25,59,98,74,67,100,67,33,
181,1,2,2,1,6,46,59,59,20,51,79,53,27,64,58,32,63,27,254,139,5,195,253,124,
69,116,85,47,52,91,126,75,2,105,252,175,34,76,67,49,7,0,0,1,0,0,0,0,3,178,
4,58,0,18,2,35,64,79,130,17,146,17,162,17,3,153,6,169,6,2,131,8,147,8,163,
8,3,3,87,8,103,8,119,8,3,6,5,9,32,14,17,72,9,9,7,15,16,16,0,70,64,91,12,107,
12,123,12,3,91,12,219,12,235,12,3,180,12,196,12,2,11,12,27,12,59,12,91,12,
107,12,5,7,12,20,128,8,7,184,255,240,64,255,7,11,20,27,20,2,11,20,27,20,75,
20,91,20,139,20,155,20,203,20,219,20,8,255,20,1,196,20,212,20,2,160,20,1,
132,20,148,20,2,96,20,1,68,20,84,20,2,32,20,1,4,20,20,20,2,199,224,20,1,196,
20,212,20,2,160,20,1,4,20,20,20,68,20,84,20,132,20,148,20,6,68,20,84,20,132,
20,148,20,196,20,212,20,6,27,20,1,4,20,1,219,20,1,196,20,1,155,20,1,132,20,
1,91,20,1,68,20,1,27,20,1,4,20,1,151,11,20,27,20,75,20,91,20,139,20,155,20,
203,20,219,20,8,155,20,203,20,219,20,3,132,20,1,96,20,1,68,20,84,20,2,32,
20,1,4,20,20,20,2,224,20,1,196,20,212,20,2,160,20,1,132,20,148,20,2,96,20,
1,4,20,20,20,68,20,84,20,4,103,4,20,20,20,68,20,84,20,132,20,148,20,196,20,
212,20,8,219,20,1,196,20,1,155,20,1,132,20,1,91,20,1,68,20,1,27,20,1,4,20,
1,219,20,1,196,20,1,11,20,27,20,75,20,91,20,139,20,155,20,64,93,6,55,75,20,
91,20,139,20,155,20,203,20,219,20,6,63,20,1,32,20,1,4,20,20,20,2,224,20,1,
196,20,212,20,2,160,20,1,132,20,148,20,2,96,20,1,68,20,84,20,2,32,20,1,4,
20,20,20,2,196,20,212,20,2,160,20,1,132,20,148,20,2,96,20,1,2,80,20,1,47,
20,1,0,20,16,20,2,7,15,7,15,9,6,21,0,63,51,63,51,1,94,93,93,93,95,93,93,93,
93,113,113,113,113,113,113,113,113,114,114,114,114,94,93,93,93,113,113,113,
113,113,113,113,113,114,94,93,93,93,93,93,93,113,113,113,113,113,113,114,
94,93,93,93,93,93,93,93,93,113,113,113,114,114,114,114,94,93,93,93,93,93,
93,93,93,113,114,47,56,51,26,16,220,94,93,93,113,114,26,237,50,17,51,17,57,
61,47,43,51,51,49,48,93,95,93,93,93,1,20,14,2,7,35,1,51,1,54,18,53,52,38,
39,51,30,1,3,178,63,106,140,77,170,254,122,189,1,55,142,124,29,20,177,24,
28,3,78,99,218,221,214,94,4,58,252,96,185,1,86,156,81,119,45,45,113,0,0,0,
1,0,86,254,159,3,106,5,204,0,74,1,0,64,125,122,71,138,71,2,101,33,117,33,
133,33,3,105,39,1,85,50,1,83,44,1,57,2,1,110,66,126,66,142,66,3,26,66,42,
66,2,12,29,28,29,44,29,3,13,40,9,12,72,12,73,28,73,44,73,108,73,124,73,140,
73,6,5,11,95,37,1,79,37,1,112,37,128,37,2,37,17,95,26,1,111,26,1,26,37,26,
52,63,31,70,11,32,11,1,23,11,23,11,0,31,63,63,63,79,63,111,63,127,63,143,
63,175,63,191,63,207,63,9,159,63,175,63,255,63,3,63,184,255,192,64,17,7,11,
72,63,42,71,31,0,1,0,5,37,80,31,11,24,42,184,255,240,64,32,19,22,72,151,42,
1,0,16,19,22,72,152,0,1,52,0,42,3,57,32,36,1,36,36,24,57,26,17,23,80,24,0,
0,63,237,50,50,47,18,57,47,93,18,23,57,93,43,93,43,18,57,57,237,57,1,47,93,
237,47,43,93,113,18,57,57,47,47,93,16,237,16,205,50,50,47,93,114,51,47,93,
113,114,18,57,49,48,93,43,93,0,93,93,1,93,0,93,93,93,1,93,0,93,19,52,62,2,
55,53,46,3,53,52,62,2,55,53,14,3,43,1,53,33,21,14,3,21,20,30,2,23,21,14,3,
21,20,30,2,23,30,3,21,20,14,2,7,39,62,3,53,52,46,2,39,46,5,86,51,110,175,
125,68,118,87,51,50,79,97,47,12,68,80,76,18,74,2,122,77,144,112,68,60,99,
130,69,100,175,131,76,43,74,100,57,54,114,94,61,18,26,29,10,126,9,19,16,11,
39,70,97,57,42,89,82,73,54,31,1,98,76,147,124,90,19,2,5,39,68,96,62,64,93,
64,40,10,8,1,2,3,2,131,125,9,34,59,90,67,63,81,49,24,6,131,13,54,89,127,84,
64,79,49,31,15,15,34,57,88,68,34,68,62,51,17,56,12,33,38,39,19,34,45,33,25,
13,10,23,36,50,74,100,255,255,0,86,255,236,4,29,4,78,18,6,0,82,0,0,0,1,0,
79,255,236,5,43,4,58,0,48,0,115,64,35,53,12,117,12,133,12,3,3,40,7,17,72,
3,40,7,17,72,46,80,32,96,32,2,46,32,35,70,64,111,5,1,80,5,1,5,184,255,192,
64,38,8,11,72,5,50,128,15,50,47,50,2,13,7,72,79,25,95,25,111,25,207,25,4,
25,14,20,34,7,20,80,31,15,14,21,40,80,0,22,0,63,237,63,63,237,50,50,1,47,
50,50,93,237,50,93,26,16,220,43,93,113,26,237,50,50,93,47,49,48,43,0,43,1,
93,5,34,46,2,53,17,33,21,20,14,2,7,35,62,3,61,1,34,14,2,7,53,62,3,51,33,21,
35,17,20,30,2,51,50,62,2,55,21,14,1,4,102,59,82,52,24,254,110,16,27,36,19,
188,19,39,32,20,39,79,69,53,12,12,43,51,54,23,4,37,234,13,24,35,22,7,23,25,
23,8,31,69,20,28,59,94,66,2,212,72,131,251,228,195,74,76,197,226,247,125,
80,7,10,13,7,139,6,11,8,4,131,253,83,44,56,32,13,2,2,3,1,129,8,12,0,2,0,132,
254,87,4,59,4,79,0,26,0,47,0,129,64,64,122,25,1,101,20,117,20,2,106,19,122,
19,2,106,45,122,45,2,75,8,91,8,107,8,3,125,30,1,107,30,1,74,30,90,30,2,0,
71,64,160,27,1,27,49,128,38,15,70,223,16,1,0,16,16,16,48,16,3,8,16,48,49,
1,49,184,255,192,64,21,30,35,72,223,49,1,96,49,128,49,2,32,80,22,16,15,27,
43,80,5,22,0,63,237,63,63,237,1,93,93,43,113,47,94,93,113,237,50,26,16,220,
93,26,237,49,48,93,93,93,0,93,1,93,93,0,93,1,93,1,20,14,2,35,34,46,2,39,35,
30,1,21,17,35,17,52,62,2,51,50,30,2,7,52,46,2,35,34,14,2,21,17,30,3,51,50,
62,2,4,59,63,115,161,98,62,98,80,66,28,4,2,2,180,60,116,169,110,103,181,134,
78,193,44,83,116,72,69,100,64,30,28,72,80,87,44,67,100,67,33,2,4,118,197,
142,79,20,37,53,33,30,61,32,254,87,3,238,119,193,136,74,79,150,219,131,104,
166,115,61,53,101,146,93,254,195,35,55,37,20,58,107,152,0,0,1,0,86,254,159,
3,156,4,78,0,57,0,209,64,38,137,55,1,139,54,1,143,53,1,123,53,1,106,50,1,
96,2,1,52,15,68,15,84,15,3,82,10,98,10,130,10,3,51,10,67,10,2,3,184,255,224,
64,52,12,17,72,3,24,11,14,72,26,31,106,31,122,31,138,31,4,139,30,1,10,37,
26,37,2,7,71,31,40,1,40,52,17,79,28,1,143,28,159,28,223,28,3,28,64,24,27,
72,96,28,1,28,184,255,192,183,7,12,72,28,48,59,1,59,184,255,192,64,19,30,
35,72,223,59,1,12,33,40,16,19,22,72,136,40,152,40,2,7,184,255,240,64,19,19,
22,72,135,7,151,7,2,33,7,40,3,22,53,0,80,47,16,22,0,47,63,237,51,18,23,57,
93,43,93,43,17,51,1,93,43,113,47,43,93,43,93,113,205,50,47,93,237,49,48,93,
93,0,93,43,1,43,0,93,93,93,1,93,0,93,1,93,93,0,93,93,1,34,14,4,21,20,30,2,
23,30,3,21,20,14,2,7,39,62,3,53,52,46,2,39,46,5,53,52,62,4,51,50,30,2,23,
7,46,3,2,70,54,88,67,49,32,15,32,76,124,92,53,114,95,61,18,26,29,10,126,9,
19,16,11,35,68,97,63,66,113,94,72,50,26,20,46,75,110,148,97,68,99,73,54,22,
116,18,42,49,57,3,193,49,80,104,108,106,42,68,96,72,57,30,17,37,59,89,68,
34,68,62,51,17,56,12,33,38,39,19,30,44,36,31,17,18,40,51,68,93,122,81,47,
130,140,136,108,66,21,34,44,23,119,19,36,28,17,0,2,0,86,255,236,4,209,4,58,
0,28,0,47,0,132,64,94,133,12,1,122,13,138,13,2,131,46,1,101,46,117,46,2,100,
42,116,42,132,42,3,124,33,140,33,2,90,33,106,33,2,143,38,1,108,38,124,38,
2,74,38,90,38,2,15,17,31,17,111,17,127,17,4,7,17,0,71,64,15,29,143,29,191,
29,3,0,29,32,29,64,29,3,29,49,128,40,71,31,10,143,10,2,10,23,35,80,15,15,
43,80,5,22,0,63,237,63,237,50,1,47,93,237,26,16,220,93,113,26,237,196,94,
93,49,48,0,93,93,93,1,93,93,93,0,93,93,93,1,93,1,20,14,2,35,34,46,2,53,52,
62,2,51,33,21,35,34,46,2,39,21,30,3,7,52,46,2,39,35,34,14,2,21,20,22,51,50,
62,2,4,48,61,123,183,123,123,186,124,63,86,153,213,126,2,57,165,9,35,43,44,
17,28,55,43,26,189,20,34,45,25,89,83,143,107,61,151,147,78,117,76,38,1,235,
112,188,135,76,74,139,202,129,144,210,138,66,131,1,2,2,1,4,42,99,115,131,
78,74,132,116,99,42,50,105,160,110,207,206,52,97,139,0,1,0,29,255,236,3,24,
4,58,0,35,0,99,64,50,35,13,131,13,2,31,32,12,17,72,13,31,29,31,45,31,3,26,
13,26,127,5,143,5,2,5,15,70,0,34,32,34,2,34,34,36,37,79,37,1,208,37,1,159,
37,1,16,37,1,37,184,255,192,64,12,14,17,72,20,80,29,22,14,35,80,11,15,0,63,
237,50,63,237,1,43,93,93,93,113,17,18,57,47,93,253,204,93,51,51,47,49,48,
0,93,43,1,93,1,34,14,2,7,53,62,3,51,33,21,33,17,20,30,2,51,50,62,2,55,21,
14,1,35,34,46,2,53,17,1,25,39,79,69,53,12,12,43,51,54,23,2,68,254,208,13,
24,35,22,7,23,25,23,8,31,69,43,59,82,52,24,3,183,7,10,13,7,139,6,11,8,4,131,
253,83,44,56,32,13,2,2,3,1,129,8,12,28,59,94,66,2,212,0,0,0,1,0,133,255,236,
3,254,4,58,0,31,0,113,64,62,134,3,1,133,15,149,15,2,106,18,122,18,2,86,28,
1,25,8,41,8,2,27,0,71,64,15,21,1,47,21,159,21,2,160,21,1,21,33,128,13,70,
0,10,16,10,48,10,240,10,4,8,10,240,33,1,255,33,1,112,33,1,33,184,255,192,
64,13,20,23,72,31,33,1,26,11,15,16,80,5,22,0,63,237,63,51,1,93,43,93,93,113,
47,94,93,237,26,16,220,93,113,114,26,237,50,49,48,93,93,93,93,93,1,20,14,
2,35,34,46,2,53,17,51,17,20,22,51,50,62,2,53,52,46,2,39,51,30,3,3,254,53,
113,176,123,109,160,104,51,181,117,134,73,104,65,30,20,33,40,21,188,18,40,
32,21,2,59,137,218,154,82,50,107,166,116,2,151,253,99,146,148,50,108,170,
120,68,147,139,120,41,40,113,134,149,0,2,0,85,254,87,4,218,4,82,0,35,0,45,
0,130,64,21,101,34,1,101,33,117,33,133,33,3,74,21,90,21,2,69,21,85,21,2,45,
184,255,192,179,11,14,72,25,184,255,224,64,54,11,14,72,11,29,27,29,2,64,19,
80,19,2,19,19,24,71,13,7,36,71,224,0,1,0,43,6,72,27,0,7,64,7,2,7,64,47,1,
19,80,18,18,39,80,31,16,43,27,80,5,8,22,6,27,0,63,63,51,237,50,63,237,51,
47,237,1,113,47,93,51,253,50,220,113,237,16,220,237,50,47,93,49,48,93,0,43,
43,1,93,0,93,1,93,93,1,20,14,2,7,17,35,17,46,3,53,52,62,2,55,23,14,3,21,20,
22,23,17,52,54,51,50,30,2,7,52,38,35,34,6,21,17,62,1,4,218,74,132,184,110,
170,114,181,125,67,49,103,159,109,21,69,96,60,27,147,151,154,158,84,133,92,
49,189,87,80,68,76,162,149,2,53,151,215,140,71,6,254,105,1,151,5,72,138,207,
141,102,188,150,103,18,136,15,77,114,143,80,213,201,8,2,68,193,212,76,141,
199,121,193,211,129,140,253,185,7,218,0,0,0,1,0,21,254,88,4,27,4,80,0,27,
1,26,64,51,169,25,1,153,3,1,138,6,154,6,2,174,23,1,123,23,139,23,155,23,3,
84,21,1,173,27,1,140,27,156,27,2,123,27,1,90,27,106,27,2,41,27,57,27,2,26,
16,9,17,72,2,184,255,240,64,99,9,17,72,162,1,1,131,1,147,1,2,116,1,1,69,1,
85,1,101,1,3,38,1,54,1,2,166,25,1,153,25,1,39,25,55,25,71,25,3,3,101,19,117,
19,2,86,19,1,39,19,55,19,2,25,22,0,3,4,2,26,23,24,24,27,26,16,27,26,59,26,
91,26,123,26,155,26,187,26,219,26,7,219,26,251,26,2,4,26,20,26,68,26,3,7,
26,13,13,1,2,184,255,240,183,2,36,29,1,11,29,1,22,184,255,208,64,41,14,17,
72,70,22,1,53,22,1,139,0,1,125,0,1,2,75,0,91,0,107,0,3,63,0,1,0,25,3,22,4,
1,23,15,9,80,16,16,27,1,27,0,63,51,63,237,63,18,23,57,93,93,95,93,93,93,93,
43,1,93,93,47,56,51,51,47,47,94,93,93,113,56,51,51,47,51,17,18,23,57,49,48,
93,93,93,95,93,93,93,93,93,93,93,93,43,43,93,93,93,93,93,93,93,93,93,93,0,
93,37,1,35,1,3,46,3,35,34,6,7,39,62,1,51,50,30,2,23,19,1,51,9,1,35,2,30,254,
179,188,1,184,170,27,44,40,42,25,11,32,7,34,24,62,32,48,70,60,59,36,142,1,
8,187,254,144,1,150,190,239,253,105,3,57,1,87,54,82,55,28,7,3,131,9,11,27,
62,102,75,254,217,2,27,253,71,252,215,0,0,1,0,135,254,87,5,44,5,60,0,31,0,
128,64,90,121,18,1,18,16,7,10,72,121,19,137,19,153,19,3,121,11,1,11,16,7,
10,72,121,10,137,10,153,10,3,24,70,21,15,5,70,8,0,14,72,29,0,15,16,15,160,
15,208,15,4,8,15,128,33,176,33,224,33,3,111,33,1,32,33,1,255,33,1,80,33,128,
33,144,33,192,33,4,30,30,6,22,15,0,29,80,13,16,22,14,27,0,63,63,51,237,50,
63,51,51,47,1,93,93,113,113,113,47,94,93,51,253,50,220,237,16,220,237,49,
48,0,93,43,93,93,43,93,37,62,3,53,17,51,17,20,14,2,7,17,35,17,46,3,53,17,
51,17,20,30,2,23,17,51,3,46,87,124,80,37,182,59,124,193,134,170,134,192,124,
59,181,38,79,124,87,170,119,1,31,73,121,91,2,134,253,124,122,172,110,53,1,
254,107,1,149,1,53,110,172,122,2,132,253,122,90,121,73,32,1,4,197,0,0,0,0,
1,0,83,255,236,5,235,4,79,0,63,0,176,64,83,153,33,169,33,2,153,26,169,26,
2,119,16,1,122,58,138,58,2,10,37,26,37,42,37,154,37,170,37,5,10,22,26,22,
42,22,154,22,170,22,5,29,0,73,61,61,40,8,46,13,46,13,51,19,71,64,128,8,176,
8,2,15,8,1,7,8,65,128,51,71,63,40,1,40,0,65,1,48,65,1,240,65,1,65,184,255,
192,64,32,30,35,72,175,65,223,65,2,0,65,32,65,64,65,3,30,35,62,62,14,3,56,
80,24,35,22,46,13,80,45,14,16,0,63,51,237,50,63,51,237,50,17,57,47,18,57,
1,93,93,43,93,113,114,47,93,237,26,16,220,94,93,93,26,237,18,57,57,47,47,
17,18,57,47,237,57,49,48,0,93,93,1,93,93,0,93,93,1,20,22,51,50,62,2,53,52,
46,2,39,55,30,3,21,20,14,2,35,34,46,2,39,35,14,3,35,34,46,2,53,52,62,2,55,
23,14,3,21,20,30,2,51,50,62,2,61,1,51,3,115,114,102,65,87,53,22,29,61,97,
67,23,109,159,103,49,53,101,148,95,68,104,77,52,16,4,16,52,77,105,67,95,148,
101,53,49,103,159,109,23,68,96,62,28,22,52,86,65,51,82,57,30,166,1,193,157,
173,56,102,145,90,82,150,121,84,15,139,18,112,161,194,101,128,200,137,72,
36,68,99,64,64,99,68,36,72,137,200,128,101,194,161,112,18,139,15,84,121,150,
82,90,145,102,56,45,84,123,78,252,0,0,0,255,255,255,205,0,0,1,250,5,123,18,
38,1,130,0,0,17,6,0,105,160,0,0,25,182,2,1,14,17,38,2,1,184,255,217,180,18,
16,5,13,37,1,43,53,53,0,43,53,53,0,0,0,255,255,0,133,255,236,3,254,5,123,
18,38,1,142,0,0,17,7,0,105,0,242,0,0,0,25,182,2,1,32,17,38,2,1,184,255,244,
180,36,34,10,0,37,1,43,53,53,0,43,53,53,0,255,255,0,86,255,236,4,29,6,7,18,
38,0,82,0,0,17,7,1,80,1,41,0,0,0,19,64,11,2,35,17,38,2,70,35,38,8,0,37,1,
43,53,0,43,53,0,0,0,255,255,0,133,255,236,3,254,6,7,18,38,1,142,0,0,17,7,
1,80,0,252,0,0,0,19,64,11,1,32,17,38,1,17,32,35,10,0,37,1,43,53,0,43,53,0,
0,0,255,255,0,83,255,236,5,235,6,7,18,38,1,146,0,0,17,7,1,80,1,255,0,0,0,
19,64,11,1,64,17,38,1,55,64,67,40,19,37,1,43,53,0,43,53,0,0,0,255,255,0,168,
0,0,4,254,6,178,16,38,0,40,0,0,17,7,2,152,1,121,0,0,0,153,185,0,21,255,192,
179,233,233,72,21,184,255,192,179,230,230,72,21,184,255,192,179,227,227,72,
21,184,255,192,179,224,224,72,21,184,255,192,179,221,221,72,21,184,255,192,
179,218,218,72,21,184,255,192,179,215,215,72,21,184,255,192,179,212,212,72,
21,184,255,192,179,209,209,72,21,184,255,192,179,206,206,72,21,184,255,192,
179,203,203,72,21,184,255,192,179,200,200,72,21,184,255,192,179,197,197,72,
21,184,255,192,64,10,11,11,72,2,1,12,5,38,2,1,184,255,234,180,16,14,0,10,
37,1,43,53,53,0,43,53,53,1,43,43,43,43,43,43,43,43,43,43,43,43,43,43,0,0,
1,0,46,255,236,6,79,5,129,0,45,0,133,64,13,155,31,171,31,2,101,37,117,37,
133,37,3,2,184,255,224,64,71,13,17,72,18,16,12,15,72,42,13,58,13,2,36,7,52,
7,2,20,20,10,42,1,39,90,45,175,40,1,0,40,1,40,10,90,0,29,16,29,176,29,224,
29,4,7,29,0,42,95,43,38,33,95,1,6,6,40,43,3,40,18,26,95,15,63,21,1,21,21,
15,19,0,63,51,47,93,16,237,63,63,18,57,47,51,237,50,16,237,50,1,47,94,93,
237,47,93,93,204,253,50,204,18,57,47,49,48,0,93,93,43,43,93,93,1,17,62,3,
51,50,22,29,1,20,14,2,35,34,46,2,39,55,30,3,51,50,54,61,1,52,38,35,34,14,
2,7,17,35,17,33,53,33,21,2,208,33,109,127,130,53,226,217,41,86,133,92,53,
88,75,64,29,111,18,41,48,56,33,84,80,129,144,51,123,120,105,33,190,254,28,
4,134,4,229,254,160,7,20,19,13,187,188,214,93,145,100,53,17,32,46,28,123,
16,33,26,17,101,111,219,119,122,10,15,17,8,253,12,4,229,156,156,0,255,255,
0,168,0,1,4,47,6,240,16,38,1,93,0,0,17,7,2,149,1,113,0,0,0,19,64,11,1,6,5,
38,1,33,6,9,4,0,37,1,43,53,0,43,53,0,0,0,0,1,0,104,255,236,5,121,5,150,0,
42,0,218,64,156,156,17,172,17,2,156,15,172,15,2,156,39,172,39,2,138,39,1,
156,41,172,41,2,138,41,1,137,31,1,117,11,1,117,10,165,10,2,166,26,1,73,26,
137,26,2,70,32,134,32,2,37,10,53,10,2,42,3,58,3,2,3,68,44,1,7,7,19,5,8,91,
116,29,132,29,2,203,29,219,29,2,68,29,1,43,29,1,29,37,235,19,1,100,19,116,
19,164,19,212,19,4,64,19,1,2,0,19,48,19,2,7,19,8,95,127,5,175,5,2,5,5,13,
34,79,38,1,38,38,0,95,34,4,13,95,24,16,18,32,18,2,48,18,64,18,112,18,128,
18,192,18,208,18,6,18,18,24,19,0,63,51,47,93,113,16,237,63,237,51,47,93,17,
18,57,47,113,237,1,47,94,93,95,93,93,113,51,47,93,93,93,113,237,50,17,57,
47,93,49,48,0,95,93,93,93,93,93,1,93,0,93,1,93,93,93,93,93,93,93,1,34,14,
2,7,33,21,33,30,3,51,50,62,2,55,23,14,3,35,34,36,38,2,53,52,18,54,36,51,50,
4,23,7,46,3,3,24,111,173,124,73,10,2,142,253,114,9,77,128,176,109,90,141,
108,79,27,156,40,108,148,191,123,171,254,255,173,86,91,175,1,0,164,225,1,
46,71,181,20,68,102,137,4,250,68,126,178,110,154,112,185,132,72,50,82,105,
55,77,79,136,100,57,109,195,1,12,159,165,1,10,187,101,176,173,60,50,91,70,
42,0,0,255,255,0,93,255,236,4,248,5,150,18,6,0,54,0,0,255,255,0,189,0,0,1,
124,5,129,18,6,0,44,0,0,255,255,0,7,0,0,2,52,6,178,18,38,0,44,0,0,17,6,2,
152,218,0,0,23,64,13,2,1,4,5,38,2,1,1,8,6,0,2,37,1,43,53,53,0,43,53,53,0,
255,255,0,32,255,236,3,104,5,129,18,6,0,45,0,0,0,2,0,18,255,240,8,11,5,129,
0,38,0,47,0,215,64,98,57,29,1,166,8,1,167,11,1,162,10,1,133,10,149,10,2,58,
10,1,154,15,170,15,2,141,13,157,13,173,13,3,121,13,1,116,47,132,47,148,47,
3,123,40,139,40,155,40,3,101,11,1,141,14,157,14,173,14,3,14,32,10,14,72,43,
30,123,30,139,30,155,30,4,42,31,122,31,2,0,90,48,39,1,0,39,16,39,2,7,39,20,
13,36,13,52,13,3,13,184,255,248,64,14,22,25,72,73,8,1,20,8,36,8,52,8,3,8,
184,255,248,64,39,22,25,72,9,31,73,31,2,8,13,31,3,175,20,191,20,2,20,33,44,
90,6,43,95,33,33,6,8,95,31,3,23,95,16,19,44,95,6,18,0,63,237,63,237,63,237,
18,57,47,237,1,47,237,50,47,93,23,51,113,43,113,113,43,113,47,94,93,113,237,
49,48,93,93,0,43,93,1,93,0,93,93,93,93,93,1,93,93,93,93,93,93,1,20,14,2,35,
33,17,33,3,6,2,14,3,35,34,38,39,53,30,1,51,50,62,4,55,19,33,17,33,50,30,2,
7,52,38,35,33,17,33,50,54,8,11,61,121,182,121,253,183,254,96,49,22,43,49,
60,78,102,66,25,47,14,11,35,10,30,52,45,42,39,40,21,67,3,2,1,126,125,186,
124,62,192,164,164,254,153,1,111,164,156,1,157,87,150,112,64,4,225,254,144,
172,254,245,199,137,85,37,5,5,152,4,3,23,62,107,169,238,161,1,254,253,172,
58,105,147,92,121,129,254,2,136,0,0,0,2,0,168,0,0,7,171,5,129,0,22,0,31,0,
110,64,25,116,31,132,31,148,31,3,123,24,139,24,155,24,3,38,20,54,20,2,0,90,
176,23,1,23,184,255,192,64,43,7,11,72,23,13,9,90,0,10,16,10,64,10,3,7,10,
17,28,90,14,0,6,1,8,6,27,95,17,17,8,95,13,13,10,15,11,3,10,18,28,95,6,18,
0,63,237,63,63,51,18,57,47,237,51,47,237,1,47,94,93,51,237,50,47,94,93,237,
50,47,43,93,237,49,48,0,93,93,93,1,20,14,2,35,33,17,33,17,35,17,51,17,33,
17,51,17,33,50,30,2,7,52,38,35,33,17,33,50,54,7,171,61,121,182,121,253,223,
253,194,191,191,2,62,191,1,86,125,186,124,62,192,164,164,254,193,1,71,164,
156,1,157,87,150,112,64,2,141,253,115,5,129,253,172,2,84,253,172,58,105,147,
92,121,129,254,2,136,0,0,0,0,1,0,46,0,0,6,47,5,129,0,27,0,131,64,13,155,2,
171,2,2,101,8,117,8,133,8,3,19,184,255,224,64,76,13,17,72,37,24,53,24,69,
24,3,18,13,10,90,16,175,11,1,0,11,48,11,2,11,27,90,0,0,48,0,192,0,208,0,4,
7,0,176,29,192,29,208,29,3,176,29,240,29,2,255,29,1,16,29,112,29,160,29,176,
29,4,9,4,95,18,23,23,0,17,13,95,14,3,11,0,18,0,63,50,63,237,50,18,57,47,51,
237,50,1,93,93,113,114,47,94,93,237,47,93,93,204,253,204,51,49,48,0,93,43,
93,93,33,17,52,38,35,34,14,2,7,17,35,17,33,53,33,21,33,17,62,3,51,50,22,21,
17,5,113,128,133,53,116,110,98,35,190,254,28,4,179,253,239,36,98,112,118,
56,229,214,2,63,122,109,10,15,18,7,253,12,4,229,156,156,254,160,8,20,18,13,
187,178,253,173,0,0,0,255,255,0,168,0,0,4,157,6,240,18,38,1,176,0,0,17,7,
2,149,1,172,0,0,0,19,64,11,1,23,5,38,1,37,23,26,0,13,37,1,43,53,0,43,53,0,
0,0,255,255,0,55,255,236,5,31,7,58,18,38,1,185,0,0,17,7,2,145,1,94,1,74,0,
19,64,11,1,26,5,38,1,7,31,39,21,25,37,1,43,53,0,43,53,0,0,0,0,1,0,168,254,
104,5,24,5,129,0,11,0,94,64,64,11,92,0,0,2,9,90,127,6,1,0,6,48,6,64,6,3,143,
6,159,6,207,6,3,0,6,64,6,2,6,5,90,0,2,16,2,64,2,3,7,2,16,13,1,32,13,128,13,
224,13,3,15,13,1,7,7,3,3,10,5,95,2,18,0,0,47,63,237,51,63,51,47,1,93,93,113,
47,94,93,237,47,93,93,113,113,237,18,57,47,237,49,48,1,17,33,17,51,17,33,
17,51,17,33,17,2,134,254,34,191,2,247,186,254,34,254,104,1,152,5,129,251,
31,4,225,250,127,254,104,255,255,0,4,0,0,5,82,5,129,18,6,0,36,0,0,0,2,0,168,
0,0,4,214,5,129,0,16,0,25,0,142,64,70,116,25,132,25,148,25,3,123,18,139,18,
155,18,3,153,14,1,38,14,1,9,9,0,90,223,17,1,80,17,128,17,2,31,17,1,255,17,
1,192,17,1,159,17,1,0,17,16,17,32,17,64,17,4,17,11,22,90,0,6,16,6,64,6,3,
7,6,48,27,1,27,184,255,192,64,27,30,35,72,223,27,1,21,95,64,11,1,160,11,208,
11,2,11,11,6,10,95,7,3,22,95,6,18,0,63,237,63,237,18,57,47,93,113,237,1,93,
43,113,47,94,93,237,50,47,93,93,93,93,113,113,113,237,50,47,49,48,0,93,93,
93,93,1,20,14,2,35,33,17,33,21,33,17,33,50,30,2,7,52,38,35,33,17,33,50,54,
4,214,61,121,182,121,253,183,3,158,253,33,1,126,125,186,124,62,192,164,164,
254,153,1,111,164,156,1,157,87,150,112,64,5,129,156,254,72,58,105,147,92,
121,129,254,2,136,0,0,0,255,255,0,168,0,0,4,234,5,129,18,6,0,37,0,0,255,255,
0,168,0,1,4,47,5,130,16,6,1,93,0,0,0,2,0,15,254,104,5,69,5,129,0,16,0,25,
0,194,64,95,150,10,1,150,20,1,150,15,1,144,19,1,134,19,1,115,22,131,22,2,
3,147,24,1,2,128,24,1,114,24,1,102,24,1,85,11,101,11,2,90,14,106,14,2,97,
23,145,23,2,83,23,1,53,23,69,23,2,2,92,3,3,0,90,191,17,207,17,2,160,17,1,
31,17,95,17,127,17,143,17,159,17,5,0,17,1,8,17,20,25,36,25,52,25,3,25,184,
255,248,64,11,22,25,72,20,19,36,19,52,19,3,19,184,255,248,64,28,22,25,72,
9,15,19,25,4,6,92,7,15,27,47,27,2,19,95,15,3,8,0,25,95,5,18,7,2,0,47,51,63,
237,50,50,63,237,1,93,47,237,23,51,43,113,43,113,47,94,93,93,93,93,237,50,
47,237,49,48,93,93,93,93,93,93,93,93,95,93,95,93,93,93,93,93,93,37,51,17,
35,17,33,17,35,17,51,62,3,55,19,33,3,17,33,3,14,3,7,4,150,175,180,252,50,
180,144,41,66,55,44,18,67,2,212,186,254,137,49,18,40,46,54,32,160,253,200,
1,152,254,104,2,56,51,138,181,228,141,1,254,251,31,4,65,254,144,134,221,178,
137,51,255,255,0,168,0,0,4,254,5,129,18,6,0,40,0,0,0,1,0,28,0,0,7,71,5,129,
0,41,1,72,64,41,133,8,1,117,31,133,31,2,117,14,1,99,24,1,108,25,124,25,140,
25,3,108,26,124,26,140,26,3,101,13,117,13,133,13,3,33,40,14,17,72,6,184,255,
216,64,35,14,17,72,58,24,74,24,2,41,24,1,53,15,69,15,117,15,3,3,39,15,1,27,
48,14,17,72,40,27,56,27,72,27,3,12,184,255,208,64,11,14,17,72,39,12,55,12,
71,12,3,31,184,255,224,179,14,17,72,31,184,255,240,64,73,10,13,72,8,32,14,
17,72,8,16,10,13,72,34,31,27,31,28,28,32,21,40,90,41,5,8,12,8,41,11,11,7,
18,52,41,1,116,41,196,41,228,41,3,41,33,32,16,32,64,29,32,72,228,32,1,155,
32,171,32,2,68,32,116,32,2,11,32,43,32,2,32,6,7,184,255,240,64,51,171,7,187,
7,2,7,68,43,116,43,132,43,228,43,4,47,43,1,2,15,43,1,31,8,34,5,8,5,39,0,96,
21,127,18,175,18,2,47,18,1,18,18,6,27,19,11,3,41,33,6,18,0,63,51,51,63,51,
51,18,57,47,93,113,51,237,50,57,57,17,51,17,51,1,93,95,93,93,47,93,56,51,
47,93,93,93,93,43,56,51,47,93,113,51,18,57,47,18,57,51,17,51,16,237,50,17,
57,47,57,51,17,51,49,48,43,43,43,43,93,43,93,43,93,95,93,93,93,43,43,93,93,
93,0,93,1,93,0,93,93,1,34,46,2,39,1,35,1,38,39,1,51,19,30,3,51,17,51,17,50,
62,2,55,19,51,1,6,7,1,35,1,14,3,35,17,35,3,82,17,45,48,46,17,254,85,222,1,
253,48,131,254,229,200,205,66,90,76,81,57,191,57,81,76,90,66,205,200,254,
229,131,48,1,253,222,254,85,17,46,48,45,17,191,2,133,6,11,13,8,253,85,3,7,
35,189,1,154,254,207,99,123,68,24,2,107,253,149,24,68,123,99,1,49,254,102,
189,35,252,249,2,171,8,13,11,6,253,123,0,1,0,67,255,236,4,112,5,149,0,60,
1,7,64,51,138,33,1,134,7,1,124,28,140,28,2,3,112,21,1,112,20,1,2,96,20,1,
101,8,117,8,133,8,3,132,34,1,101,34,117,34,2,124,13,1,90,13,106,13,2,59,23,
75,23,2,33,184,255,232,64,122,11,16,72,5,43,1,3,51,20,25,90,46,64,25,37,72,
46,46,56,90,16,139,36,155,36,171,36,3,127,20,1,2,95,20,111,20,2,36,20,36,
20,5,112,16,1,79,16,111,16,2,255,16,1,160,16,1,127,16,1,0,16,16,16,48,16,
3,16,175,5,191,5,2,5,64,32,45,72,5,64,13,16,72,5,51,20,95,127,21,175,21,2,
21,21,11,41,35,64,13,16,72,35,35,30,95,41,4,11,95,0,32,6,48,6,112,6,128,6,
4,208,6,1,6,184,255,192,182,13,17,72,6,6,0,19,0,63,50,47,43,93,113,16,237,
63,237,51,47,43,17,18,57,47,113,237,57,1,47,43,43,93,47,93,93,93,93,113,113,
18,57,57,47,47,93,95,93,113,16,237,50,47,43,237,18,57,49,48,0,95,93,1,43,
93,93,93,93,93,93,93,95,93,93,95,93,93,0,93,5,34,46,2,39,55,30,3,51,50,62,
2,53,52,38,43,1,53,51,50,54,53,52,46,2,35,34,14,2,7,39,62,3,51,50,30,2,21,
20,14,2,7,30,3,21,20,14,2,2,109,118,176,130,94,36,165,24,66,91,121,80,77,
122,85,45,192,202,71,71,181,173,39,72,104,65,77,114,83,56,19,178,33,96,132,
168,105,108,172,120,64,40,73,104,63,67,117,87,51,69,132,192,20,50,91,128,
79,77,55,98,75,44,37,69,100,64,133,118,148,119,123,55,86,59,30,40,68,90,49,
61,82,127,87,45,53,96,136,83,68,107,80,55,15,10,50,82,115,73,95,156,113,62,
0,1,0,168,0,0,5,24,5,129,0,19,0,123,64,17,172,18,1,138,18,154,18,2,147,8,
163,8,2,133,8,1,19,184,255,232,64,65,9,17,72,9,24,9,17,72,11,92,41,9,1,9,
64,12,80,12,144,12,3,224,12,1,143,12,159,12,175,12,3,0,12,48,12,2,12,166,
19,1,19,2,92,0,1,16,1,2,7,1,15,21,47,21,2,9,18,9,1,3,12,12,8,0,18,0,63,50,
50,47,63,51,51,47,1,93,47,94,93,237,50,113,47,93,93,93,113,51,113,237,49,
48,43,43,0,93,93,93,93,51,17,51,17,20,6,7,6,7,1,51,17,35,17,52,54,55,54,55,
1,168,172,2,2,2,2,2,238,222,170,1,2,1,2,253,26,5,129,252,100,51,98,39,46,
40,4,174,250,127,3,168,39,89,38,44,44,251,90,0,255,255,0,168,0,0,5,24,7,58,
18,38,1,174,0,0,17,7,2,145,1,146,1,74,0,19,64,11,1,20,5,38,1,6,25,33,0,10,
37,1,43,53,0,43,53,0,0,0,0,1,0,168,0,0,4,157,5,129,0,22,0,151,64,104,84,12,
116,12,132,12,3,84,15,1,139,8,1,122,8,1,89,8,105,8,2,140,14,1,14,24,13,16,
72,58,5,1,100,12,116,12,132,12,3,80,12,1,53,12,69,12,2,15,12,8,12,9,16,32,
9,96,9,128,9,3,9,9,13,2,21,90,32,22,1,22,14,13,16,15,13,127,13,207,13,239,
13,4,47,13,1,13,47,24,1,15,12,20,96,47,2,1,2,2,22,13,18,8,0,3,0,63,50,63,
51,57,47,93,237,50,57,1,93,47,93,113,56,51,47,93,237,50,17,57,47,93,56,57,
51,17,51,49,48,93,93,93,93,43,93,93,93,93,93,0,93,19,51,17,50,62,2,55,19,
51,1,6,7,1,35,1,14,3,35,17,35,168,191,57,81,76,90,66,205,200,254,229,131,
48,1,253,222,254,85,17,46,48,45,17,191,5,129,253,149,24,68,123,99,1,49,254,
102,189,35,252,249,2,171,8,13,11,6,253,123,0,0,0,0,1,0,18,255,240,4,153,5,
129,0,27,0,176,64,35,150,1,1,147,3,1,117,3,133,3,2,85,4,149,4,2,145,7,1,115,
7,131,7,2,85,7,101,7,2,129,6,145,6,2,6,184,255,216,64,46,12,15,72,37,6,53,
6,2,26,2,1,26,23,106,23,122,23,138,23,4,26,90,32,27,64,27,2,224,27,1,95,27,
1,0,27,1,8,27,20,6,36,6,52,6,3,6,184,255,248,64,14,22,25,72,73,1,1,20,1,36,
1,52,1,3,1,184,255,248,64,26,22,25,72,9,24,73,24,2,1,6,24,3,12,128,29,1,27,
18,1,95,24,3,16,95,9,19,0,63,237,63,237,63,1,93,47,23,51,113,43,113,113,43,
113,47,94,93,93,93,113,237,49,48,93,93,93,43,93,93,93,93,93,93,93,93,1,33,
3,6,2,14,3,35,34,38,39,53,30,1,51,50,62,4,55,19,33,17,35,3,223,254,94,49,
22,43,49,60,78,102,66,25,47,14,11,35,10,30,52,45,42,39,40,21,67,2,255,186,
4,225,254,144,172,254,245,199,137,85,37,5,5,152,4,3,23,62,107,169,238,161,
1,254,250,127,255,255,0,168,0,0,6,2,5,129,18,6,0,48,0,0,255,255,0,168,0,0,
5,32,5,129,18,6,0,43,0,0,255,255,0,97,255,236,5,215,5,150,18,6,0,50,0,0,255,
255,0,166,0,0,5,30,5,129,17,6,1,106,254,0,0,88,185,0,9,255,192,179,27,27,
72,9,184,255,192,179,21,21,72,9,184,255,192,179,20,20,72,9,184,255,192,179,
19,19,72,9,184,255,192,179,17,17,72,9,184,255,192,179,16,16,72,9,184,255,
192,179,15,15,72,9,184,255,192,179,14,14,72,9,184,255,192,183,11,11,72,9,
64,9,9,72,43,43,43,43,43,43,43,43,43,43,0,0,255,255,0,168,0,0,4,234,5,129,
18,6,0,51,0,0,255,255,0,104,255,236,5,121,5,150,18,6,0,38,0,0,255,255,0,46,
0,0,4,180,5,129,18,6,0,55,0,0,0,1,0,55,255,236,5,31,5,129,0,25,0,181,64,111,
217,24,1,139,24,1,90,24,106,24,122,24,3,41,24,1,85,23,101,23,133,23,3,70,
23,1,214,22,1,131,22,1,100,22,116,22,2,86,22,1,121,18,1,128,2,1,5,2,21,2,
2,132,1,1,131,0,1,84,0,100,0,2,70,0,1,198,23,214,23,2,113,23,129,23,2,86,
23,102,23,2,143,3,1,58,3,74,3,2,20,23,24,32,25,144,25,2,25,16,25,22,10,63,
21,79,21,111,21,127,21,4,21,184,255,240,64,14,21,23,20,21,5,24,24,21,3,11,
14,95,5,19,0,63,237,50,63,51,47,17,18,57,57,1,47,56,93,50,50,47,56,93,51,
57,57,49,48,0,93,93,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93,93,93,
93,93,93,1,14,3,35,34,46,2,39,55,30,1,51,50,62,2,63,1,1,51,9,1,51,2,222,47,
81,90,109,75,32,66,64,58,23,81,35,83,48,37,58,53,57,38,49,253,195,218,1,193,
1,128,205,1,62,88,128,82,40,10,18,26,16,144,22,37,21,52,90,68,89,3,186,252,
240,3,16,0,0,3,0,118,255,245,5,159,5,139,0,29,0,40,0,51,0,143,64,92,70,28,
86,28,102,28,3,73,17,89,17,105,17,3,59,51,1,59,31,1,53,43,1,38,43,1,53,39,
1,38,39,1,41,90,15,8,30,90,0,35,24,7,90,46,21,224,8,1,79,8,1,32,8,1,8,32,
53,1,112,53,208,53,224,53,3,79,53,1,16,53,1,36,47,96,10,6,10,34,49,96,20,
24,20,10,20,10,20,7,22,3,7,18,0,63,63,18,57,57,47,47,17,51,16,237,50,17,51,
16,237,50,1,93,93,93,113,47,93,93,93,51,51,253,50,50,220,237,16,220,237,49,
48,0,93,93,93,93,93,93,1,93,93,1,20,14,2,43,1,21,35,53,35,34,46,2,53,52,62,
2,59,1,53,51,21,51,50,30,2,7,52,38,43,1,17,51,50,62,2,37,20,30,2,59,1,17,
35,34,6,5,159,64,131,197,133,40,191,40,133,197,131,64,67,133,201,135,29,191,
28,135,202,133,67,192,185,183,5,13,92,136,89,43,252,87,43,89,136,92,13,9,
182,182,2,224,105,188,143,84,227,227,84,143,188,105,113,185,131,72,182,182,
72,131,185,117,187,180,253,22,53,98,140,88,88,140,98,53,2,234,180,0,255,255,
0,46,0,0,5,43,5,129,18,6,0,59,0,0,0,1,0,168,254,104,5,197,5,129,0,11,0,74,
64,47,1,92,2,2,11,90,0,8,1,175,8,1,0,8,64,8,112,8,3,8,7,90,0,4,16,4,64,4,
3,7,4,32,13,224,13,2,9,9,5,3,11,11,7,95,4,18,2,0,47,63,237,50,47,63,51,47,
1,93,47,94,93,237,47,93,93,113,237,50,47,237,49,48,37,17,35,17,33,17,51,17,
33,17,51,17,5,197,180,251,151,191,2,245,186,160,253,200,1,152,5,129,251,31,
4,225,251,31,0,0,0,1,0,160,0,0,4,174,5,129,0,25,0,134,64,70,164,14,1,20,40,
13,17,72,1,32,13,17,72,42,7,58,7,74,7,3,23,90,25,144,22,1,143,22,1,48,22,
64,22,2,207,22,1,112,22,1,111,22,1,16,22,64,22,2,22,12,90,207,11,1,0,11,16,
11,64,11,3,7,11,32,27,1,32,27,1,27,184,255,192,64,19,14,17,72,0,5,95,21,47,
16,1,16,16,11,24,18,22,22,11,3,0,63,51,47,63,18,57,47,93,51,237,50,1,43,93,
113,47,94,93,93,237,47,93,93,93,93,113,113,113,51,237,49,48,0,93,43,43,93,
1,14,3,35,34,46,2,53,17,51,17,20,22,51,50,62,2,55,17,51,17,35,3,240,36,94,
107,115,56,114,166,108,52,190,130,134,53,110,104,92,35,190,190,1,252,8,20,
18,12,47,92,137,89,2,82,253,194,123,108,10,15,17,7,2,244,250,127,0,0,1,0,
168,0,0,6,173,5,129,0,11,0,114,64,76,7,90,4,4,0,11,90,36,8,1,11,8,1,228,8,
1,219,8,1,148,8,1,123,8,1,4,8,20,8,100,8,3,8,3,90,4,0,68,0,228,0,3,7,0,235,
13,1,196,13,1,187,13,1,132,13,1,112,13,1,2,64,13,1,15,13,1,9,5,1,3,7,7,3,
95,0,18,0,63,237,50,47,63,51,51,1,93,93,95,93,93,93,93,93,47,94,93,237,47,
93,93,93,93,93,113,113,237,18,57,47,237,49,48,51,17,51,17,33,17,51,17,33,
17,51,17,168,191,1,233,186,1,233,186,5,129,251,31,4,225,251,31,4,225,250,
127,0,1,0,168,254,104,7,47,5,129,0,15,0,125,64,84,132,17,148,17,180,17,3,
123,17,1,84,17,1,1,92,2,2,15,90,12,11,90,8,8,4,11,12,59,12,75,12,91,12,123,
12,139,12,155,12,203,12,8,219,12,251,12,2,207,12,1,2,159,12,1,128,12,1,111,
12,1,0,12,1,8,12,7,90,32,4,1,4,13,9,5,3,15,15,11,11,7,95,4,18,2,0,47,63,237,
50,47,50,47,63,51,51,1,47,93,237,47,94,93,93,93,93,95,93,93,113,18,57,47,
237,16,237,50,47,237,93,93,93,49,48,37,17,35,17,33,17,51,17,33,17,51,17,33,
17,51,17,7,47,180,250,45,191,1,211,186,1,210,186,160,253,200,1,152,5,129,
251,31,4,225,251,31,4,225,251,31,0,2,0,46,0,0,5,235,5,129,0,16,0,25,0,100,
64,68,116,25,132,25,148,25,3,123,18,139,18,155,18,3,153,3,1,38,3,1,64,27,
1,6,90,47,17,127,17,2,176,17,1,159,17,1,0,17,16,17,32,17,64,17,4,7,17,14,
0,22,90,32,12,1,12,21,95,0,0,12,14,95,15,3,22,95,12,18,0,63,237,63,237,18,
57,47,237,1,47,93,253,50,204,47,94,93,93,93,113,237,93,49,48,0,93,93,93,93,
1,33,50,30,2,21,20,14,2,35,33,17,33,53,33,1,52,38,35,33,17,33,50,54,2,184,
1,66,125,186,124,62,61,121,182,121,253,243,254,53,2,138,2,115,164,164,254,
213,1,51,164,156,3,45,58,105,147,90,87,150,112,64,4,229,156,252,26,121,129,
254,2,136,0,3,0,168,0,0,6,109,5,129,0,14,0,23,0,27,0,140,64,76,116,23,132,
23,148,23,3,123,16,139,16,155,16,3,153,12,1,38,12,1,27,90,159,24,207,24,223,
24,3,16,24,64,24,80,24,112,24,4,24,0,90,0,15,1,224,15,1,159,15,1,0,15,16,
15,32,15,64,15,4,15,9,20,90,0,6,16,6,64,6,3,7,6,128,29,1,29,184,255,192,64,
19,11,14,72,19,95,9,9,6,7,25,25,7,3,24,24,20,95,6,18,0,63,237,51,47,63,51,
47,17,18,57,47,237,1,43,93,47,94,93,237,50,47,93,93,93,113,237,47,93,93,237,
49,48,0,93,93,93,93,1,20,14,2,35,33,17,51,17,33,50,30,2,7,52,38,35,33,17,
33,50,54,1,17,51,17,4,214,61,121,182,121,253,183,191,1,126,125,186,124,62,
192,164,164,254,153,1,111,164,156,1,152,191,1,157,87,150,112,64,5,129,253,
172,58,105,147,92,121,129,254,2,136,254,225,5,129,250,127,0,2,0,168,0,0,4,
214,5,129,0,14,0,23,0,107,64,76,116,23,132,23,148,23,3,123,16,139,16,155,
16,3,153,12,1,38,12,1,0,90,31,15,1,160,15,176,15,2,159,15,1,0,15,16,15,32,
15,64,15,96,15,5,15,9,20,90,0,6,16,6,2,7,6,175,25,1,64,25,128,25,144,25,3,
19,95,9,9,6,7,3,20,95,6,18,0,63,237,63,18,57,47,237,1,93,93,47,94,93,237,
50,47,93,93,93,113,237,49,48,0,93,93,93,93,1,20,14,2,35,33,17,51,17,33,50,
30,2,7,52,38,35,33,17,33,50,54,4,214,61,121,182,121,253,183,191,1,126,125,
186,124,62,192,164,164,254,153,1,111,165,155,1,157,87,150,112,64,5,129,253,
172,58,105,147,96,121,131,254,4,131,0,1,0,105,255,236,5,121,5,150,0,42,0,
206,64,81,115,26,131,26,2,115,28,131,28,2,101,28,1,115,4,131,4,2,101,4,1,
115,2,131,2,2,101,2,1,101,12,1,101,11,1,135,17,1,106,17,1,90,33,138,33,2,
10,32,26,32,90,32,3,10,40,26,40,2,36,36,24,38,14,91,32,35,112,35,2,144,35,
176,35,2,127,35,1,64,35,1,35,184,255,192,64,63,7,10,72,35,6,80,24,96,24,2,
175,24,191,24,2,32,24,1,24,35,95,127,38,175,38,2,38,38,9,30,95,19,16,25,32,
25,2,48,25,64,25,112,25,128,25,192,25,208,25,6,25,25,19,19,79,5,1,5,5,0,95,
9,4,0,63,237,51,47,93,63,51,47,93,113,16,237,17,57,47,113,237,1,47,93,93,
113,51,47,43,93,93,93,113,237,51,18,57,47,49,48,0,93,1,93,93,0,93,93,93,1,
93,93,93,93,93,93,93,93,1,34,14,2,7,39,54,36,51,50,4,22,18,21,20,2,6,4,35,
34,46,2,39,55,30,3,51,50,62,2,55,33,53,33,46,3,2,201,88,137,102,69,19,181,
71,1,46,225,164,1,0,175,91,86,172,254,255,171,118,189,149,113,41,156,27,81,
109,140,87,109,176,128,77,9,253,114,2,142,10,73,124,173,4,250,42,70,91,50,
60,173,176,101,187,254,246,165,159,254,244,195,109,54,99,136,83,78,55,105,
83,50,72,132,185,112,154,110,178,126,68,0,0,2,0,168,255,236,7,179,5,150,0,
26,0,46,0,168,64,63,165,7,1,133,24,1,138,20,1,121,29,1,118,35,1,118,39,1,
74,19,138,19,2,58,30,122,30,2,53,34,117,34,2,42,44,58,44,122,44,3,37,40,53,
40,117,40,3,160,48,1,0,91,144,27,160,27,2,160,27,176,27,2,27,184,255,192,
64,54,7,11,72,27,16,12,90,0,13,16,13,64,13,3,7,13,37,91,17,48,10,112,10,2,
10,32,95,22,4,11,95,80,16,1,176,16,224,16,2,15,16,1,8,16,16,13,14,3,13,18,
42,95,5,19,0,63,237,63,63,18,57,47,94,93,93,113,237,63,237,1,47,93,51,237,
47,94,93,237,50,47,43,93,113,237,93,49,48,93,93,93,93,93,93,93,93,93,93,93,
1,20,2,14,1,35,34,46,2,39,33,17,35,17,51,17,33,62,3,51,50,30,1,18,7,52,46,
2,35,34,14,2,21,20,30,2,51,50,62,2,7,179,90,170,245,155,156,239,165,90,7,
254,217,191,191,1,42,13,99,166,232,146,159,245,167,87,195,60,117,173,113,
116,175,117,58,60,117,173,114,121,176,114,54,2,199,165,254,242,192,104,99,
179,247,148,253,115,5,129,253,172,142,229,160,86,102,188,254,246,163,127,
208,148,80,80,148,208,127,127,211,153,85,86,153,212,0,2,0,96,0,0,5,32,5,129,
0,17,0,30,0,239,64,22,156,29,172,29,2,138,29,1,147,20,1,117,20,133,20,2,67,
17,83,17,2,17,184,255,216,64,25,33,36,72,130,17,146,17,162,17,3,100,17,116,
17,2,86,17,1,67,16,83,16,2,3,16,184,255,216,64,117,33,36,72,172,16,1,155,
16,1,125,16,141,16,2,2,94,16,110,16,2,73,16,1,44,16,60,16,2,3,175,1,1,2,1,
104,14,16,72,94,1,110,1,2,73,1,1,44,1,60,1,2,16,1,1,6,24,24,14,18,90,6,6,
0,13,90,224,14,1,143,14,159,14,175,14,207,14,4,0,14,64,14,2,7,14,17,32,0,
1,15,0,31,0,2,0,1,15,95,47,24,95,24,111,24,143,24,4,24,24,0,26,95,11,3,14,
14,0,18,0,63,50,47,63,237,18,57,47,93,237,50,1,47,93,93,51,47,94,93,93,93,
237,18,57,47,237,17,51,17,18,57,17,51,49,48,93,93,93,43,95,93,95,93,93,93,
95,93,93,93,43,95,113,93,93,93,43,113,0,93,93,93,93,51,1,46,3,53,52,62,2,
51,33,17,35,17,33,1,19,20,30,2,51,33,17,33,34,14,2,96,1,144,91,130,84,39,
66,126,185,120,2,151,191,254,73,254,146,28,37,77,119,83,1,205,254,59,76,120,
84,44,2,95,16,78,108,130,67,94,150,104,55,250,127,2,73,253,183,3,236,57,98,
72,41,2,8,31,63,94,255,255,0,87,255,236,4,115,4,78,18,6,0,68,0,0,0,2,0,120,
255,236,4,63,5,222,0,19,0,56,0,158,64,69,137,44,1,122,45,138,45,2,102,21,
118,21,134,21,3,84,18,1,84,12,1,91,2,1,90,35,122,35,138,35,3,90,47,106,47,
138,47,3,123,46,139,46,2,73,46,105,46,2,42,42,23,71,64,208,0,1,144,0,1,0,
58,128,48,58,1,128,58,1,58,184,255,192,64,12,30,35,72,52,10,71,0,31,32,31,
2,31,184,255,192,64,23,26,35,72,31,52,5,80,20,20,42,48,41,1,64,41,240,41,
2,41,15,80,26,22,0,63,237,47,93,113,51,57,47,237,50,1,47,43,93,237,57,43,
93,113,26,16,220,93,113,26,237,50,47,49,48,0,93,93,93,93,93,93,93,93,93,93,
1,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,3,50,18,17,16,2,35,34,46,2,53,
52,18,62,1,55,62,3,55,21,14,1,7,14,5,7,62,3,3,130,39,73,104,65,69,114,81,
44,44,77,105,62,69,112,78,42,243,222,210,250,238,113,178,123,65,58,128,206,
147,57,100,91,86,43,86,161,91,78,124,94,67,44,23,2,19,67,97,126,1,246,114,
151,91,37,39,92,150,112,114,150,89,36,36,88,151,2,127,254,251,254,250,254,
247,254,253,70,156,250,180,192,1,22,193,115,28,11,17,14,12,6,161,11,23,17,
14,33,50,73,108,149,101,55,97,72,41,0,0,0,0,3,0,142,0,0,3,231,4,58,0,23,0,
36,0,47,0,149,64,12,42,19,1,37,2,1,26,18,42,18,2,3,184,255,232,64,33,9,12,
72,139,10,155,10,2,10,38,44,71,5,5,24,16,71,64,47,30,159,30,2,160,30,1,30,
49,128,64,49,1,49,184,255,192,64,50,30,35,72,31,49,63,49,239,49,3,38,24,70,
192,22,1,0,22,16,22,48,22,224,22,240,22,5,8,22,10,36,81,143,38,159,38,175,
38,3,38,38,24,37,80,23,15,24,80,22,21,0,63,237,63,237,18,57,47,113,237,57,
1,47,94,93,113,237,50,93,43,113,26,16,220,93,113,26,237,17,57,47,237,18,57,
93,49,48,0,43,93,93,93,1,50,30,2,21,20,14,2,7,21,30,3,21,20,14,2,35,33,17,
19,51,50,62,2,53,52,46,2,43,1,25,1,51,50,62,2,53,52,38,35,2,52,76,144,112,
68,35,60,82,46,54,95,69,40,61,109,151,91,254,67,180,236,69,95,59,27,28,63,
100,71,224,216,68,91,55,23,102,121,4,58,24,62,104,81,53,81,58,37,9,7,7,35,
61,90,61,78,117,78,39,4,58,252,75,20,44,67,47,50,70,44,20,1,194,254,192,19,
39,61,43,82,76,0,1,0,142,0,0,2,175,4,58,0,5,0,54,64,35,0,64,18,39,72,48,0,
1,0,0,7,3,70,192,4,1,0,4,16,4,48,4,224,4,240,4,5,8,4,2,80,5,15,3,21,0,63,
63,237,1,47,94,93,113,237,17,51,47,93,43,49,48,1,21,33,17,35,17,2,175,254,
147,180,4,58,131,252,73,4,58,0,0,0,2,0,20,254,104,4,136,4,58,0,7,0,23,0,159,
64,65,134,3,1,32,3,1,102,1,1,34,5,114,5,130,5,3,34,20,1,34,17,1,137,18,1,
34,18,1,25,19,121,19,2,102,2,118,2,2,34,2,1,25,2,1,34,16,1,4,16,1,98,4,1,
4,4,36,4,68,4,84,4,4,8,73,9,184,255,192,64,42,18,25,72,9,9,22,70,64,111,7,
127,7,143,7,3,32,7,64,7,2,7,25,128,20,15,12,73,6,1,13,1,80,20,15,22,6,14,
80,11,21,13,8,0,47,51,63,237,50,50,63,237,1,47,51,51,237,51,51,26,16,220,
93,93,26,237,50,47,43,237,49,48,93,93,93,93,93,93,93,93,93,93,93,93,93,93,
93,93,1,33,6,2,14,1,7,33,1,35,17,33,17,35,17,51,62,2,18,55,33,17,51,3,66,
254,206,24,49,48,48,22,1,241,1,70,163,252,210,163,119,30,58,58,57,28,2,132,
146,3,183,177,254,249,194,136,50,253,229,1,152,254,104,2,27,50,143,220,1,
59,223,252,73,255,255,0,87,255,236,4,24,4,78,18,6,0,72,0,0,0,1,0,7,0,0,5,
83,4,58,0,39,1,97,64,88,165,23,1,165,14,1,171,34,1,164,3,1,172,24,1,154,24,
1,163,13,1,149,13,1,90,6,106,6,122,6,3,85,31,101,31,117,31,3,74,33,154,33,
170,33,3,69,4,149,4,165,4,3,42,28,58,28,2,37,9,53,9,2,34,31,170,26,1,26,31,
27,16,27,27,32,20,38,70,39,165,11,1,11,10,3,6,6,39,10,184,255,240,64,49,10,
10,17,39,39,5,33,32,16,15,32,1,255,32,1,160,32,1,159,32,1,80,32,1,63,32,1,
32,32,1,207,32,1,128,32,144,32,2,95,32,1,32,32,48,32,2,32,4,5,184,255,240,
64,64,31,5,47,5,2,127,5,159,5,2,63,5,159,5,223,5,255,5,4,5,15,41,1,255,41,
1,160,41,1,111,41,159,41,2,80,41,1,63,41,1,32,41,1,207,41,1,128,41,144,41,
2,79,41,95,41,2,48,41,1,31,6,34,3,6,184,255,240,64,37,11,17,72,6,3,37,0,80,
20,15,17,31,17,79,17,95,17,4,15,17,31,17,79,17,3,7,17,17,4,26,18,10,15,39,
33,4,21,0,63,51,51,63,51,51,18,57,47,94,93,113,51,237,50,57,57,43,17,51,17,
51,1,93,93,93,93,113,113,113,113,113,113,114,47,93,113,114,56,51,47,93,93,
93,93,113,113,113,113,113,113,114,56,51,18,57,47,51,57,47,56,18,57,17,51,
17,51,93,16,237,50,17,57,47,56,57,51,93,17,51,49,48,93,93,93,93,93,93,93,
93,93,93,93,93,0,93,93,1,34,38,39,1,35,1,46,1,39,3,51,23,30,3,51,17,51,17,
50,62,2,63,1,51,3,14,1,7,1,35,1,14,1,35,17,35,2,83,26,65,19,254,234,200,1,
97,17,66,45,216,188,148,48,65,52,48,30,180,30,48,52,65,48,148,188,216,45,
66,17,1,97,200,254,234,19,65,26,180,1,221,12,8,254,15,2,80,14,85,66,1,69,
239,77,92,50,16,1,218,254,38,16,50,92,77,239,254,187,66,85,14,253,176,1,241,
8,12,254,35,0,0,0,1,0,49,255,236,3,94,4,78,0,55,0,175,64,28,5,53,21,53,2,
5,38,21,38,37,38,3,131,45,1,45,15,21,70,40,40,51,71,10,29,73,64,30,184,255,
192,64,86,30,36,72,143,15,1,30,15,30,15,3,144,10,1,144,10,160,10,2,31,10,
1,10,57,128,16,57,1,4,73,3,64,12,20,72,3,45,15,80,143,16,159,16,175,16,3,
16,16,35,7,0,29,1,144,29,224,29,240,29,3,29,29,24,80,35,16,7,80,0,96,4,112,
4,128,4,3,239,4,1,32,4,1,4,4,0,22,0,63,50,47,93,93,113,16,237,63,237,51,47,
93,113,17,18,57,47,113,237,57,1,47,43,237,93,26,16,204,93,93,113,17,57,57,
47,47,93,43,26,237,16,237,50,47,237,18,57,113,49,48,93,93,5,34,38,39,55,30,
1,51,50,54,53,52,46,2,35,53,50,62,2,53,52,38,35,34,14,2,7,39,62,3,51,50,30,
2,21,20,14,2,7,21,30,3,21,20,14,2,1,202,167,197,45,159,25,126,103,96,113,
55,92,120,64,64,114,86,49,99,93,35,70,60,42,7,162,12,62,97,128,78,85,138,
98,53,44,71,88,45,56,100,75,43,49,101,152,20,125,129,44,78,86,94,91,59,78,
45,18,137,15,38,67,52,74,86,14,33,55,42,20,68,98,63,29,42,76,104,63,57,88,
61,36,4,2,6,41,67,93,58,69,119,87,49,0,0,0,0,1,0,142,0,0,3,234,4,58,0,19,
0,186,64,25,9,17,1,233,17,249,17,2,4,15,1,228,15,244,15,2,11,5,1,235,5,251,
5,2,16,184,255,192,64,107,29,60,72,153,16,1,6,64,29,60,72,119,6,151,6,2,6,
7,1,230,7,246,7,2,156,7,1,105,7,137,7,2,31,17,47,17,79,17,3,9,72,64,7,64,
10,1,80,10,1,159,10,255,10,2,10,21,128,0,21,192,21,208,21,224,21,4,192,21,
1,128,21,144,21,176,21,192,21,208,21,5,17,1,72,192,18,1,0,18,16,18,48,18,
224,18,240,18,5,8,18,16,7,19,15,10,6,18,21,0,63,51,51,63,51,51,1,47,94,93,
113,237,50,93,113,114,26,16,220,93,113,114,50,26,237,49,48,0,93,1,93,93,113,
114,0,93,43,93,43,113,114,113,114,1,113,114,1,17,20,14,2,7,1,51,17,35,17,
52,62,2,55,1,35,17,1,60,3,3,3,1,1,243,197,172,2,3,3,2,254,6,192,4,58,253,
176,23,77,82,74,21,3,101,251,198,2,148,19,57,60,57,20,252,151,4,58,0,255,
255,0,142,0,0,3,234,5,240,18,38,1,206,0,0,17,7,2,145,0,234,0,0,0,19,64,11,
1,20,17,38,1,2,25,33,18,8,37,1,43,53,0,43,53,0,0,0,0,1,0,138,0,0,3,138,4,
58,0,21,0,202,64,17,117,16,133,16,149,16,3,57,15,121,15,137,15,153,15,4,13,
184,255,208,64,123,12,17,72,133,11,149,11,2,120,5,1,133,13,149,13,2,47,23,
79,23,2,73,16,1,56,16,1,16,13,121,8,137,8,153,8,3,8,71,13,1,54,13,1,13,9,
16,9,9,14,2,20,70,0,21,16,21,48,21,240,21,4,21,57,15,73,15,2,15,32,14,1,32,
14,144,14,2,144,14,1,79,14,1,48,14,1,47,14,1,16,14,1,14,16,14,13,19,80,15,
2,63,2,79,2,3,15,2,63,2,255,2,3,8,2,2,14,21,21,14,21,8,8,0,15,0,63,50,47,
63,51,47,17,57,47,94,93,113,237,50,1,47,56,93,93,93,93,93,113,114,51,113,
47,93,237,50,17,57,47,56,57,113,113,51,93,17,51,113,113,93,49,48,0,93,1,93,
93,43,93,93,19,51,17,50,62,2,63,1,51,3,14,1,7,1,35,1,14,1,35,17,35,138,180,
30,48,52,65,48,148,188,216,45,66,17,1,97,200,254,234,19,65,26,180,4,58,254,
38,16,50,92,77,239,254,187,66,85,14,253,176,1,241,8,12,254,35,0,0,0,0,1,0,
11,255,236,4,29,4,58,0,25,0,186,64,42,26,21,1,130,7,1,116,7,1,85,7,101,7,
2,130,6,1,117,6,1,22,6,38,6,102,6,3,114,5,130,5,2,100,5,1,86,5,1,134,4,1,
4,184,255,240,64,61,12,15,72,26,3,1,116,2,1,7,24,12,17,72,25,70,64,127,0,
143,0,239,0,3,0,27,128,176,27,192,27,208,27,3,176,27,240,27,2,64,27,96,27,
112,27,160,27,176,27,192,27,6,131,23,1,23,54,6,1,6,2,184,255,240,64,26,24,
28,72,215,2,231,2,2,128,2,1,2,143,12,1,12,2,80,23,15,16,80,9,22,0,21,0,63,
63,237,63,237,1,47,93,51,93,93,43,51,113,51,93,93,113,114,26,16,220,93,26,
237,49,48,0,43,1,93,93,43,93,93,93,93,93,93,93,93,93,93,93,33,17,33,6,2,14,
3,35,34,38,39,53,30,1,51,50,62,3,18,55,33,17,3,104,254,137,25,42,44,51,71,
94,65,29,48,17,11,38,19,35,51,40,33,34,38,25,2,206,3,183,184,254,225,216,
149,93,42,8,5,129,4,5,42,94,149,216,1,29,183,251,198,0,0,1,0,142,0,0,4,243,
4,58,0,28,1,3,64,21,137,18,153,18,2,134,12,150,12,2,107,17,123,17,2,100,13,
116,13,2,1,184,255,224,64,122,29,60,72,138,1,154,1,2,57,1,1,0,32,29,60,72,
133,0,149,0,2,54,0,86,0,2,143,19,159,19,2,93,19,109,19,125,19,3,59,19,75,
19,2,25,19,41,19,2,128,11,144,11,2,82,11,98,11,114,11,3,52,11,68,11,2,22,
11,38,11,2,1,0,15,15,8,21,72,64,19,80,22,1,159,22,255,22,2,22,30,128,144,
30,192,30,208,30,3,79,30,1,11,8,72,192,9,1,0,9,16,9,48,9,224,9,240,9,5,8,
9,28,2,2,184,255,192,64,22,29,60,72,2,32,19,22,72,84,2,1,19,2,10,15,22,15,
64,29,60,72,15,184,255,224,64,18,19,22,72,47,15,63,15,79,15,127,15,143,15,
5,15,1,9,21,0,63,51,51,93,43,43,51,63,51,51,93,43,43,17,51,1,47,94,93,113,
237,50,93,93,26,16,220,93,113,50,26,237,18,57,61,47,51,51,49,48,93,93,93,
93,93,93,93,93,93,93,43,93,93,43,93,93,93,93,33,35,1,30,3,21,17,35,17,33,
19,30,1,23,62,1,55,19,33,17,35,17,52,62,2,55,3,19,153,254,188,1,3,1,1,174,
1,24,220,23,37,8,10,35,23,220,1,13,173,1,3,2,2,3,183,26,60,61,57,23,253,44,
4,58,253,107,63,151,72,72,151,63,2,149,251,198,2,212,22,60,64,60,23,0,1,0,
142,0,0,3,221,4,58,0,11,0,139,64,48,5,70,64,2,15,6,79,6,2,57,47,6,111,6,143,
6,255,6,4,191,6,1,143,6,159,6,255,6,3,6,13,128,0,13,192,13,208,13,224,13,
4,192,13,1,128,13,1,13,184,255,192,64,49,19,23,72,1,9,70,192,10,1,0,10,16,
10,48,10,224,10,240,10,5,10,8,80,176,1,192,1,2,159,1,175,1,191,1,3,15,1,63,
1,2,8,1,1,10,5,21,3,0,15,0,63,50,63,51,57,47,94,93,113,114,237,1,47,93,113,
237,50,43,93,113,114,26,16,220,93,113,114,94,93,50,26,237,49,48,1,17,33,17,
51,17,35,17,33,17,35,17,1,66,1,231,180,180,254,25,180,4,58,254,54,1,202,251,
198,1,237,254,19,4,58,255,255,0,86,255,236,4,29,4,78,18,6,0,82,0,0,0,1,0,
142,0,0,3,199,4,58,0,7,0,109,64,80,1,70,64,15,2,79,2,2,57,47,2,111,2,143,
2,255,2,4,191,2,1,143,2,159,2,255,2,3,2,9,128,0,9,192,9,208,9,224,9,4,192,
9,1,128,9,176,9,192,9,208,9,4,47,9,1,5,70,192,6,1,0,6,16,6,48,6,224,6,240,
6,5,8,6,4,80,7,15,6,1,21,0,63,51,63,237,1,47,94,93,113,237,93,93,113,114,
26,16,220,93,113,114,94,93,26,237,49,48,1,17,35,17,33,17,35,17,3,199,180,
254,47,180,4,58,251,198,3,183,252,73,4,58,0,255,255,0,132,254,87,4,29,4,77,
18,6,0,83,0,0,255,255,0,87,255,236,3,202,4,78,18,6,0,70,0,0,0,1,0,35,0,0,
3,135,4,58,0,7,0,72,64,43,7,14,4,2,5,14,223,2,1,2,4,70,0,5,16,5,2,8,5,5,8,
9,160,9,1,95,9,1,48,9,64,9,2,47,9,1,4,21,3,7,80,0,15,0,63,237,50,63,1,93,
93,93,93,17,18,57,47,94,93,237,204,93,43,1,24,16,77,228,49,48,19,33,21,33,
17,35,17,33,35,3,100,254,168,180,254,168,4,58,131,252,73,3,183,0,0,0,255,
255,0,5,254,87,3,252,4,58,18,6,0,92,0,0,0,3,0,86,254,87,6,62,5,204,0,53,0,
74,0,95,0,229,64,13,141,93,157,93,173,93,3,78,24,14,17,72,72,184,255,232,
179,14,17,72,57,184,255,232,182,14,17,72,109,82,1,51,184,255,224,64,75,7,
10,72,15,26,31,26,47,26,3,24,32,7,10,72,0,3,16,3,32,3,3,7,4,54,71,64,25,14,
13,0,14,14,75,71,36,0,68,0,148,0,164,0,4,0,85,39,13,72,65,38,4,14,1,4,14,
36,14,68,14,100,14,132,14,180,14,228,14,7,7,14,52,97,1,97,184,255,192,64,
52,30,35,72,219,97,1,84,97,100,97,132,97,148,97,4,64,97,1,2,32,97,48,97,2,
31,97,1,0,97,1,38,0,31,45,80,3,70,80,49,28,16,8,18,91,3,59,80,5,22,22,13,
27,0,63,63,51,237,23,50,63,51,237,23,50,63,1,93,93,93,95,93,93,93,43,113,
47,94,93,113,51,51,237,50,50,220,93,237,43,1,24,16,77,244,26,237,49,48,95,
94,93,43,93,0,43,93,1,43,43,43,93,1,20,14,2,35,34,38,39,35,30,1,21,17,35,
17,52,54,55,35,14,1,35,34,2,17,16,18,51,50,22,23,51,52,46,2,53,17,51,17,20,
14,2,21,51,62,1,51,50,30,2,5,20,30,2,51,50,62,2,55,53,52,46,2,35,34,14,2,
5,52,46,2,35,34,14,2,29,1,30,3,51,50,62,2,6,62,38,86,140,101,105,158,42,6,
2,3,170,2,3,5,46,149,111,186,179,185,180,112,149,45,5,2,2,1,170,1,1,1,5,46,
144,114,101,140,86,38,250,213,26,56,85,60,60,94,65,34,2,34,64,94,61,57,86,
57,29,4,110,23,52,88,64,53,92,70,40,1,35,65,92,60,65,88,53,23,2,34,123,208,
150,85,88,100,35,77,58,254,89,1,167,54,82,40,104,90,1,19,1,25,1,28,1,26,90,
98,10,41,46,42,12,1,163,254,92,11,43,47,43,12,104,89,80,145,205,129,112,160,
103,48,43,98,157,113,24,115,159,98,43,46,102,163,116,100,156,108,56,34,96,
169,135,23,108,150,93,41,58,110,159,0,0,0,255,255,0,23,0,0,3,234,4,58,18,
6,0,91,0,0,0,1,0,142,254,104,4,102,4,58,0,11,0,91,178,7,73,8,184,255,192,
64,54,18,21,72,8,8,5,70,64,223,2,1,207,2,223,2,2,2,64,25,28,72,0,2,48,2,2,
2,13,128,111,13,1,1,70,0,10,16,10,48,10,240,10,4,8,10,5,1,80,10,21,8,3,0,
15,0,63,50,47,63,237,50,1,47,94,93,237,93,26,16,220,93,43,93,113,26,237,50,
47,43,237,49,48,1,17,33,17,51,17,51,17,35,17,33,17,1,66,1,221,180,147,163,
252,203,4,58,252,73,3,183,252,73,253,229,1,152,4,58,0,1,0,122,0,0,3,156,4,
58,0,25,0,92,64,37,108,15,124,15,140,15,3,22,32,7,10,72,21,24,7,12,72,12,
70,64,9,175,13,1,127,13,143,13,239,13,3,13,27,128,1,70,24,184,255,192,64,
20,9,12,72,24,14,19,80,9,15,6,31,6,2,6,6,12,21,10,0,15,0,63,50,63,57,47,93,
51,237,50,1,47,43,237,26,16,220,93,113,50,26,237,49,48,43,43,0,93,1,17,20,
30,2,51,50,54,55,17,51,17,35,17,14,3,35,34,46,2,53,17,1,46,16,39,64,47,70,
132,74,180,180,38,81,87,93,51,66,101,69,36,4,58,254,110,34,59,44,25,26,21,
2,5,251,198,1,205,15,31,24,16,41,76,110,69,1,155,0,0,0,1,0,142,0,0,5,221,
4,58,0,11,0,116,64,52,7,70,4,4,0,11,70,64,4,8,52,8,2,36,8,132,8,212,8,228,
8,4,11,8,1,139,8,251,8,2,8,13,128,251,13,1,180,13,212,13,2,128,13,1,2,112,
13,1,95,13,1,13,184,255,192,64,23,9,12,72,3,70,0,0,16,0,48,0,3,8,0,9,5,1,
15,7,3,80,0,21,0,63,237,50,63,51,51,1,47,94,93,237,43,93,93,95,93,93,93,26,
16,220,93,113,113,114,26,237,18,57,47,237,49,48,51,17,51,17,33,17,51,17,33,
17,51,17,142,180,1,154,180,1,153,180,4,58,252,73,3,183,252,73,3,183,251,198,
0,0,0,1,0,142,254,104,6,102,4,58,0,15,0,141,64,96,13,73,244,14,1,14,14,11,
70,8,7,70,64,4,4,0,107,8,1,4,8,1,84,8,228,8,2,59,8,1,107,8,123,8,139,8,251,
8,4,84,8,1,8,17,128,251,17,1,212,17,1,128,17,176,17,2,2,96,17,112,17,2,95,
17,1,32,17,48,17,64,17,3,3,70,0,0,16,0,48,0,240,0,4,8,0,14,9,5,1,15,11,7,
3,80,0,21,0,63,237,50,50,63,51,51,47,1,47,94,93,237,93,93,93,95,93,93,93,
26,16,204,93,93,113,113,114,114,17,57,47,26,237,16,237,50,47,93,237,49,48,
51,17,51,17,33,17,51,17,33,17,51,17,51,17,35,17,142,180,1,149,180,1,148,180,
147,163,4,58,252,73,3,183,252,73,3,183,252,73,253,229,1,152,0,0,0,0,2,0,45,
0,0,4,172,4,58,0,14,0,25,0,113,185,0,5,255,224,179,7,10,72,2,184,255,224,
64,16,7,11,72,3,71,64,176,21,1,21,27,128,80,27,1,27,184,255,192,64,45,30,
35,72,255,27,1,14,11,15,70,32,9,1,32,9,1,9,25,81,175,14,191,14,207,14,3,15,
14,31,14,79,14,3,7,14,14,9,11,80,12,15,15,81,9,21,0,63,237,63,237,18,57,47,
94,93,113,237,1,47,93,113,253,204,51,93,43,113,26,16,220,93,26,237,49,48,
43,43,1,50,22,21,20,14,2,35,33,17,33,53,33,25,1,51,50,62,2,53,52,38,43,1,
3,13,205,210,52,104,155,103,254,103,254,184,1,252,202,69,96,59,26,116,133,
203,2,112,147,159,74,118,82,44,3,183,131,254,54,254,15,25,49,71,46,94,87,
0,3,0,142,0,0,5,50,4,58,0,12,0,23,0,27,0,105,185,0,5,255,224,179,7,10,72,
2,184,255,224,64,58,7,10,72,3,71,19,19,9,27,70,64,159,24,175,24,2,24,29,128,
12,13,70,16,9,32,9,64,9,3,9,23,81,175,12,191,12,207,12,3,15,12,31,12,79,12,
3,7,12,12,9,25,10,15,24,13,81,9,21,0,63,237,51,63,51,18,57,47,94,93,113,237,
1,47,93,237,50,26,16,220,93,26,237,18,57,47,237,49,48,43,43,1,50,22,21,20,
14,2,35,33,17,51,25,1,51,50,62,2,53,52,38,43,1,1,17,51,17,2,38,205,210,52,
104,155,103,254,103,180,202,69,96,59,26,116,133,203,3,60,180,2,112,147,159,
74,118,82,44,4,58,254,54,254,15,25,49,71,46,94,87,254,13,4,58,251,198,0,0,
0,0,2,0,142,0,0,3,215,4,58,0,12,0,23,0,132,185,0,5,255,224,179,7,10,72,2,
184,255,224,64,86,7,10,72,3,71,64,176,19,1,19,25,128,47,25,1,47,25,175,25,
2,63,25,95,25,127,25,159,25,191,25,207,25,223,25,255,25,8,25,64,35,39,72,
12,13,70,0,9,208,9,2,16,9,32,9,64,9,240,9,4,9,23,81,175,12,191,12,207,12,
3,15,12,31,12,79,12,3,7,12,12,9,10,15,13,81,9,21,0,63,237,63,18,57,47,94,
93,113,237,1,47,93,113,237,50,43,93,113,114,26,16,220,93,26,237,49,48,43,
43,1,50,22,21,20,14,2,35,33,17,51,25,1,51,50,62,2,53,52,38,43,1,2,56,205,
210,52,104,155,103,254,85,180,220,69,96,59,26,116,133,221,2,112,147,159,74,
118,82,44,4,58,254,54,254,15,25,49,71,46,94,87,0,0,0,0,1,0,55,255,236,3,190,
4,78,0,40,0,170,64,87,118,34,1,22,29,1,118,28,1,107,15,1,107,6,1,16,10,32,
10,2,10,10,0,31,71,64,12,31,9,1,144,9,1,9,42,128,20,70,21,21,1,70,31,0,1,
223,0,1,0,64,12,18,72,0,10,80,143,11,159,11,175,11,3,11,11,26,4,80,36,0,1,
16,1,32,1,96,1,112,1,128,1,192,1,208,1,8,1,184,255,192,64,29,27,34,72,1,1,
36,22,31,20,47,20,127,20,143,20,223,20,5,20,64,29,32,72,20,20,17,80,26,16,
0,63,237,51,47,43,93,63,51,47,43,93,16,237,17,57,47,113,237,1,47,43,113,114,
237,51,47,237,26,16,220,93,113,50,26,237,18,57,47,93,49,48,93,93,93,93,93,
19,55,30,1,51,50,62,2,55,33,53,33,46,3,35,34,6,7,39,62,3,51,50,30,2,21,20,
14,2,35,34,46,2,55,182,16,133,100,73,103,68,34,5,254,99,1,157,4,34,67,103,
73,109,118,15,185,13,66,105,145,93,90,170,134,81,51,114,182,130,99,151,106,
61,1,59,12,108,104,53,97,135,82,131,90,133,88,44,105,91,14,68,116,84,48,53,
128,216,163,120,205,151,86,54,92,122,0,0,0,0,2,0,142,255,236,5,170,4,78,0,
19,0,39,0,128,64,85,121,37,137,37,2,116,33,132,33,2,118,27,134,27,2,121,23,
137,23,2,150,18,166,18,2,30,71,15,15,8,31,8,2,7,8,8,11,0,71,64,160,20,1,20,
41,128,14,10,70,192,11,1,0,11,16,11,48,11,224,11,240,11,5,8,11,25,80,17,16,
9,80,47,14,1,14,14,11,12,15,11,21,35,80,3,22,0,63,237,63,63,18,57,47,93,237,
63,237,1,47,94,93,113,237,50,26,16,220,93,26,237,18,57,47,94,93,51,237,49,
48,0,93,1,93,93,93,93,1,16,2,35,34,46,2,39,35,17,35,17,51,17,51,18,33,50,
18,3,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,5,170,235,223,102,161,115,65,
5,222,180,180,223,33,1,164,237,215,189,35,67,97,61,63,99,70,37,39,70,94,56,
62,100,70,38,2,30,254,228,254,234,62,128,192,131,254,19,4,58,254,54,1,222,
254,232,254,232,126,164,98,39,41,99,164,123,126,165,98,40,39,98,166,0,0,2,
0,17,0,0,3,199,4,58,0,13,0,22,0,143,64,68,117,1,133,1,2,3,32,11,17,72,0,32,
40,43,72,223,0,239,0,2,0,32,29,37,72,52,0,1,43,0,1,41,4,1,4,48,7,10,72,7,
32,7,11,72,18,71,0,3,3,12,6,6,2,22,11,70,64,175,12,1,239,12,1,12,24,128,1,
2,184,255,240,64,22,91,2,107,2,2,2,3,0,81,47,21,1,21,21,1,15,81,9,15,12,1,
21,0,63,51,63,237,18,57,47,93,237,50,1,47,93,56,51,26,16,220,93,113,26,237,
51,18,57,47,18,57,17,51,237,49,48,43,0,43,93,1,93,113,43,113,43,43,93,9,1,
35,1,46,1,53,52,54,51,33,17,35,25,1,35,34,6,21,20,22,59,1,2,23,254,197,203,
1,88,131,118,216,207,1,176,180,234,130,120,107,124,253,1,202,254,54,1,215,
27,163,122,149,150,251,198,1,202,1,241,92,93,94,93,0,255,255,0,87,255,236,
4,24,5,123,18,38,0,72,0,0,17,7,0,105,0,248,0,0,0,23,64,13,3,2,38,17,38,3,
2,4,42,40,17,27,37,1,43,53,53,0,43,53,53,0,0,0,0,1,0,10,254,87,3,238,5,204,
0,57,0,162,64,9,170,49,1,31,32,9,15,72,24,184,255,232,64,86,9,13,72,0,24,
16,24,2,7,36,36,57,28,70,64,80,45,1,159,45,1,45,59,128,10,7,57,70,4,3,192,
0,1,0,0,16,0,48,0,224,0,240,0,5,8,0,176,59,192,59,208,59,3,176,59,240,59,
2,255,59,1,112,59,160,59,176,59,3,57,21,40,80,33,27,15,51,80,22,10,2,81,7,
3,3,5,22,184,255,192,182,7,13,72,22,15,5,0,0,63,63,43,18,57,47,51,237,50,
16,237,50,63,237,63,1,93,93,113,114,47,94,93,113,51,51,237,50,50,26,16,220,
93,113,26,237,17,57,47,49,48,0,94,93,43,43,1,93,51,17,35,53,51,53,51,21,33,
21,33,21,20,14,2,7,51,62,3,51,50,30,2,21,17,20,14,2,35,34,38,39,53,30,1,51,
50,62,2,53,17,52,46,2,35,34,14,2,21,17,142,132,132,180,1,44,254,212,2,3,2,
1,3,30,70,84,100,62,104,133,77,29,21,54,93,72,34,65,28,13,36,13,38,49,27,
10,17,48,88,70,64,103,73,40,4,182,131,147,147,131,148,33,66,56,39,7,55,77,
50,23,56,101,140,84,252,209,62,106,78,45,4,5,139,2,4,20,43,67,46,2,241,69,
104,69,35,46,84,120,75,253,170,0,0,0,255,255,0,142,0,0,2,200,5,228,18,38,
1,201,0,0,17,7,0,116,0,216,0,0,0,19,64,11,1,6,17,38,1,85,6,9,4,0,37,1,43,
53,0,43,53,0,0,0,0,1,0,87,255,236,3,222,4,78,0,40,0,171,64,113,116,30,1,116,
21,1,137,8,1,137,2,1,47,42,1,63,26,1,26,26,27,36,16,70,15,15,35,70,0,36,32,
36,2,0,36,64,36,96,36,128,36,160,36,192,36,224,36,7,8,36,24,27,71,31,5,1,
5,27,80,143,24,159,24,175,24,3,24,24,32,19,80,10,31,16,47,16,127,16,143,16,
223,16,5,16,64,29,32,72,16,16,10,16,32,80,0,0,35,16,35,32,35,96,35,112,35,
128,35,192,35,208,35,8,35,184,255,192,182,27,34,72,35,35,0,22,0,63,50,47,
43,93,16,237,63,51,47,43,93,16,237,18,57,47,113,237,1,47,93,237,50,47,94,
93,113,237,51,47,237,17,18,57,47,93,93,49,48,93,93,93,93,5,34,46,2,53,52,
62,2,51,50,30,2,23,7,46,1,35,34,14,2,7,33,21,33,30,3,51,50,54,55,23,14,3,
2,52,130,182,114,51,81,134,170,90,93,145,105,66,13,185,15,118,109,73,103,
67,34,4,1,156,254,99,4,35,68,103,74,100,133,16,182,9,61,106,151,20,86,151,
205,120,163,216,128,53,48,84,116,68,14,91,105,44,88,133,90,131,82,135,97,
53,103,109,12,67,122,92,54,0,255,255,0,57,255,236,3,182,4,75,18,6,0,86,0,
0,255,255,0,137,0,0,1,61,5,204,16,38,0,241,199,0,17,6,1,75,237,0,0,212,181,
9,64,56,56,72,9,184,255,192,64,9,55,55,72,9,64,54,54,72,9,184,255,192,179,
53,53,72,9,184,255,192,64,9,52,52,72,9,64,50,50,72,9,184,255,192,179,49,49,
72,9,184,255,192,64,9,48,48,72,9,64,42,42,72,9,184,255,192,179,41,41,72,9,
184,255,192,64,9,40,40,72,9,64,38,38,72,9,184,255,192,179,37,37,72,9,184,
255,192,179,36,36,72,9,184,255,192,179,35,35,72,9,184,255,192,64,16,34,34,
72,9,64,29,29,72,9,64,10,10,72,1,0,0,184,255,192,179,49,49,72,0,184,255,192,
64,9,40,41,72,0,64,25,27,72,0,184,255,192,182,18,18,72,128,0,1,0,184,255,
192,64,11,8,8,72,0,1,0,4,7,1,2,37,1,43,53,17,43,93,43,43,43,43,53,53,1,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,255,255,255,248,0,0,2,
37,5,123,18,38,0,241,0,0,17,6,0,105,203,0,0,25,182,2,1,4,17,38,2,1,184,255,
243,180,8,6,0,2,37,1,43,53,53,0,43,53,53,0,0,0,255,255,255,206,254,87,1,61,
5,204,18,6,0,77,0,0,0,2,0,11,255,236,6,236,4,58,0,34,0,45,1,42,64,82,163,
16,1,148,16,1,117,16,133,16,2,106,14,1,57,14,1,14,16,18,22,72,131,14,147,
14,163,14,3,117,14,1,106,13,1,57,13,1,13,16,18,22,72,163,13,1,87,13,103,13,
119,13,3,16,24,12,17,72,109,15,1,15,32,18,22,72,162,15,1,117,15,133,15,149,
15,3,54,15,70,15,2,5,184,255,224,179,7,10,72,2,184,255,224,64,18,7,11,72,
34,35,70,64,9,1,9,9,22,3,71,176,41,1,41,184,255,192,64,9,8,11,72,41,47,80,
47,1,47,184,255,192,64,93,30,35,72,255,47,1,48,47,1,109,11,1,31,11,63,11,
2,255,11,1,233,11,1,187,11,203,11,219,11,3,163,11,1,149,11,1,31,32,63,32,
2,255,32,1,106,32,1,41,32,1,163,32,1,53,32,1,11,15,32,3,22,45,81,175,34,191,
34,207,34,3,15,34,31,34,79,34,3,7,34,34,9,11,80,32,15,25,80,18,22,35,81,9,
21,0,63,237,63,237,63,237,18,57,47,94,93,113,237,1,47,23,51,93,93,113,113,
93,113,93,93,93,93,93,113,113,93,93,43,113,16,220,43,93,237,18,57,47,93,237,
50,49,48,43,43,93,93,93,43,113,0,43,1,93,93,43,113,113,93,93,43,113,113,93,
93,93,1,50,22,21,20,14,2,35,33,17,33,6,2,14,3,35,34,38,39,53,30,1,51,50,62,
3,18,55,33,25,1,51,50,62,2,53,52,38,43,1,5,77,205,210,52,104,155,103,254,
62,254,101,25,42,44,51,71,94,65,29,48,17,11,38,19,35,51,40,33,34,38,25,2,
242,242,69,96,59,26,116,133,243,2,112,147,159,74,118,82,44,3,183,184,254,
225,216,149,93,42,8,5,129,4,5,42,94,149,216,1,29,183,254,54,254,15,25,49,
71,46,94,87,0,0,2,0,142,0,0,6,44,4,58,0,20,0,31,0,133,185,0,7,255,224,179,
7,10,72,4,184,255,224,64,23,7,11,72,1,21,70,19,11,11,15,5,71,64,176,27,1,
27,33,128,80,33,1,33,184,255,192,64,50,30,35,72,255,33,1,18,14,70,16,15,32,
15,64,15,3,15,31,81,1,1,13,80,175,18,191,18,207,18,3,15,18,31,18,79,18,3,
7,18,18,0,15,21,21,81,11,21,16,0,15,0,63,50,63,237,63,18,57,47,94,93,113,
237,51,47,237,1,47,93,237,50,93,43,113,26,16,220,93,26,237,18,57,47,51,237,
50,49,48,43,43,1,17,51,50,22,21,20,14,2,35,33,17,33,17,35,17,51,17,33,17,
19,51,50,62,2,53,52,38,43,1,3,169,228,205,210,52,104,155,103,254,102,254,
78,180,180,1,178,181,202,69,96,59,26,116,133,203,4,58,254,54,147,159,74,118,
82,44,1,237,254,19,4,58,254,54,1,202,252,69,25,49,71,46,94,87,0,0,0,0,1,0,
10,0,0,3,238,5,204,0,41,0,144,185,0,7,255,232,64,85,9,13,72,0,7,16,7,2,7,
33,24,11,70,64,80,12,1,159,12,255,12,2,12,43,128,35,32,24,70,29,28,192,25,
1,0,25,16,25,48,25,224,25,240,25,5,8,25,176,43,192,43,208,43,3,176,43,240,
43,2,255,43,1,112,43,160,43,176,43,3,35,27,81,32,28,28,5,30,0,25,11,21,0,
18,80,5,184,255,192,180,9,13,72,5,15,0,63,43,237,50,63,51,63,18,57,47,51,
237,50,1,93,93,113,114,47,94,93,113,51,51,237,50,50,26,16,220,93,113,26,237,
17,57,49,48,0,94,93,43,1,62,3,51,50,30,2,21,17,35,17,52,46,2,35,34,14,2,21,
17,35,17,35,53,51,53,51,21,33,21,33,21,20,14,2,7,1,61,30,70,84,100,62,104,
133,77,29,181,17,48,88,70,64,103,73,40,180,132,132,180,1,44,254,212,2,3,2,
1,3,89,55,77,50,23,56,101,140,84,253,87,2,134,69,104,69,35,46,84,120,75,253,
170,4,182,131,147,147,131,148,33,66,56,39,7,0,0,255,255,0,138,0,0,3,138,5,
228,18,38,1,208,0,0,17,7,0,116,1,63,0,0,0,19,64,11,1,22,17,38,1,81,22,25,
0,14,37,1,43,53,0,43,53,0,0,0,255,255,0,5,254,87,3,252,5,240,18,38,0,92,0,
0,17,7,2,145,0,183,0,0,0,19,64,11,1,32,17,38,1,10,37,45,17,31,37,1,43,53,
0,43,53,0,0,0,0,1,0,142,254,104,3,221,4,58,0,11,0,125,64,89,9,73,15,10,79,
10,2,38,10,10,0,7,70,64,15,4,79,4,2,57,47,4,111,4,143,4,255,4,4,191,4,1,143,
4,159,4,255,4,3,4,13,128,3,70,192,0,1,0,0,16,0,48,0,224,0,240,0,5,8,0,176,
13,192,13,208,13,3,176,13,240,13,2,112,13,160,13,176,13,192,13,4,9,5,1,15,
8,3,80,0,0,47,237,51,63,51,47,1,93,113,114,47,94,93,113,237,26,16,220,93,
113,114,94,93,26,237,18,57,47,94,93,237,49,48,51,17,51,17,33,17,51,17,33,
17,35,17,142,180,1,231,180,254,170,163,4,58,252,73,3,183,251,198,254,104,
1,152,0,0,1,0,168,0,1,3,186,7,28,0,7,0,55,64,37,5,90,0,6,16,6,64,6,3,6,3,
70,255,0,1,0,0,16,0,64,0,128,0,176,0,208,0,6,7,0,4,95,1,7,3,5,18,0,63,63,
51,237,1,47,94,93,93,237,47,93,237,49,48,1,17,51,17,33,17,35,17,3,6,180,253,
173,191,5,129,1,155,253,201,251,28,5,128,0,0,0,0,1,0,142,0,0,3,10,5,204,0,
7,0,56,64,36,6,73,16,3,48,3,2,3,3,9,0,70,192,1,1,0,1,16,1,48,1,224,1,240,
1,5,8,1,4,0,7,80,2,15,0,21,0,63,63,237,63,1,47,94,93,113,237,17,51,47,93,
237,49,48,33,35,17,33,17,51,17,33,1,66,180,1,217,163,254,56,4,58,1,146,253,
235,255,255,0,9,0,0,7,134,6,240,18,38,0,58,0,0,17,7,2,148,2,65,0,0,0,21,180,
1,47,5,38,1,184,255,184,180,48,51,15,46,37,1,43,53,0,43,53,0,255,255,255,
253,0,0,5,204,5,228,18,38,0,90,0,0,17,7,0,67,1,72,0,0,0,21,180,1,43,17,38,
1,184,255,162,180,44,47,15,42,37,1,43,53,0,43,53,0,255,255,0,9,0,0,7,134,
6,240,18,38,0,58,0,0,17,7,2,149,2,247,0,0,0,19,64,11,1,47,5,38,1,75,47,50,
15,46,37,1,43,53,0,43,53,0,0,0,255,255,255,253,0,0,5,204,5,228,18,38,0,90,
0,0,17,7,0,116,2,38,0,0,0,19,64,11,1,43,17,38,1,93,43,46,15,42,37,1,43,53,
0,43,53,0,0,0,255,255,0,9,0,0,7,134,6,178,18,38,0,58,0,0,17,7,2,152,2,134,
0,0,0,23,64,13,2,1,47,5,38,2,1,2,51,49,15,46,37,1,43,53,53,0,43,53,53,0,0,
0,255,255,255,253,0,0,5,204,5,123,18,38,0,90,0,0,17,7,0,105,1,161,0,0,0,23,
64,13,2,1,43,17,38,2,1,0,47,45,15,42,37,1,43,53,53,0,43,53,53,0,0,0,255,255,
0,45,0,0,5,41,6,240,18,38,0,60,0,0,17,7,2,148,1,34,0,0,0,21,180,1,9,5,38,
1,184,255,181,180,10,13,4,8,37,1,43,53,0,43,53,0,255,255,0,5,254,87,3,252,
5,228,18,38,0,92,0,0,17,6,0,67,105,0,0,21,180,1,32,17,38,1,184,255,167,180,
33,36,17,31,37,1,43,53,0,43,53,0,0,0,0,1,0,0,1,195,4,114,2,76,0,3,0,43,64,
30,2,0,0,186,15,1,31,1,63,1,79,1,4,47,1,63,1,111,1,175,1,223,1,5,1,64,38,
43,72,1,0,47,43,93,113,237,1,47,47,49,48,17,53,33,21,4,114,1,195,137,137,
0,0,1,0,0,1,195,8,0,2,76,0,3,0,43,64,30,2,0,0,186,15,1,31,1,63,1,79,1,4,47,
1,63,1,111,1,175,1,223,1,5,1,64,38,43,72,1,0,47,43,93,113,237,1,47,47,49,
48,17,53,33,21,8,0,1,195,137,137,0,0,1,0,0,1,195,8,0,2,76,0,3,0,43,64,30,
2,0,0,186,15,1,31,1,63,1,79,1,4,47,1,63,1,111,1,175,1,223,1,5,1,64,38,43,
72,1,0,47,43,93,113,237,1,47,47,49,48,17,53,33,21,8,0,1,195,137,137,0,255,
255,255,225,254,78,4,138,255,169,16,38,0,66,0,229,16,7,0,66,0,0,0,190,0,1,
0,127,3,184,1,72,5,129,0,12,0,47,64,16,4,32,11,17,72,7,64,11,17,72,7,12,150,
10,151,0,184,255,192,64,10,8,11,72,0,10,156,0,169,7,3,0,63,244,237,1,47,43,
237,237,50,43,49,48,43,19,53,52,62,2,55,51,14,1,21,51,21,127,10,20,30,20,
121,45,50,89,3,184,146,52,86,75,66,32,65,132,65,195,0,0,0,1,0,127,3,184,1,
72,5,129,0,12,0,52,185,0,3,255,224,183,11,17,72,9,151,0,150,6,184,255,192,
180,11,17,72,6,11,184,255,192,64,10,8,11,72,11,10,156,5,169,11,3,0,63,228,
237,1,47,43,51,43,253,237,49,48,43,1,20,14,2,7,35,62,1,53,35,53,51,1,72,9,
20,29,20,123,45,49,88,195,4,240,53,86,75,66,32,65,132,63,197,0,1,0,127,254,
250,1,72,0,195,0,12,0,51,185,0,3,255,224,183,11,17,72,9,151,0,150,6,184,255,
192,180,11,17,72,6,11,184,255,192,64,9,8,11,72,11,5,169,11,156,10,0,47,253,
228,1,47,43,51,43,253,237,49,48,43,37,20,14,2,7,35,62,1,53,35,53,51,1,72,
9,20,29,20,123,45,49,88,195,51,53,87,75,66,32,65,132,65,195,0,0,0,1,0,126,
3,184,1,71,5,129,0,12,0,47,64,16,8,32,11,17,72,5,64,11,17,72,5,1,150,2,151,
11,184,255,192,64,10,8,11,72,11,5,169,2,156,12,3,0,63,237,228,1,47,43,237,
237,50,43,49,48,43,1,21,35,20,22,23,35,46,3,61,1,1,65,88,49,45,123,20,29,
20,9,5,129,197,63,132,65,32,66,75,86,53,145,0,0,0,2,0,75,3,184,2,95,5,129,
0,12,0,25,0,89,64,58,17,32,11,17,72,4,32,11,17,72,20,64,11,17,72,20,25,150,
13,7,64,11,17,72,7,12,150,10,151,128,0,1,15,0,31,0,2,8,0,23,151,13,159,27,
175,27,2,10,23,156,13,0,0,13,169,6,20,3,0,63,51,228,50,47,16,237,50,1,93,
47,237,220,94,93,93,237,237,50,43,16,237,50,43,49,48,43,43,1,53,52,62,2,55,
51,14,1,21,51,21,33,53,52,62,2,55,51,14,1,21,51,21,1,151,10,19,29,20,122,
45,49,88,253,242,10,20,30,20,121,45,50,89,3,184,146,52,86,75,66,32,65,132,
65,195,146,52,86,75,66,32,65,132,65,195,0,0,2,0,75,3,184,2,95,5,129,0,12,
0,25,0,107,185,0,16,255,224,179,11,17,72,3,184,255,224,64,13,11,17,72,22,
151,13,150,24,9,151,0,150,6,184,255,192,64,15,11,17,72,6,128,11,1,15,11,31,
11,2,8,11,19,184,255,192,64,24,11,17,72,19,63,24,1,24,159,27,175,27,2,10,
23,156,24,5,5,18,169,11,24,3,0,63,51,228,50,47,16,237,50,1,93,47,93,51,43,
220,94,93,93,50,43,253,237,16,253,237,49,48,43,43,1,20,14,2,7,35,62,1,53,
35,53,51,5,20,14,2,7,35,62,1,53,35,53,51,2,95,10,19,30,20,121,45,49,88,194,
254,181,9,20,29,20,123,45,49,88,195,4,240,53,86,75,66,32,65,132,65,195,145,
53,86,75,66,32,65,132,65,195,0,0,0,2,0,75,254,250,2,95,0,195,0,12,0,25,0,
104,185,0,16,255,224,179,11,17,72,3,184,255,224,64,13,11,17,72,22,151,13,
150,24,9,151,0,150,6,184,255,192,64,15,11,17,72,6,128,11,1,15,11,31,11,2,
8,11,19,184,255,192,64,21,11,17,72,19,24,159,27,175,27,2,5,5,18,169,24,11,
11,24,156,10,23,0,47,51,237,50,47,16,228,50,47,1,93,47,51,43,220,94,93,93,
50,43,253,237,16,253,237,49,48,43,43,37,20,14,2,7,35,62,1,53,35,53,51,5,20,
14,2,7,35,62,1,53,35,53,51,2,95,10,19,30,20,121,45,49,88,194,254,181,9,20,
29,20,123,45,49,88,195,51,53,87,75,66,32,65,132,65,195,144,53,87,75,66,32,
65,132,65,195,0,0,0,1,0,138,255,118,3,234,5,204,0,11,0,64,64,37,11,192,0,
8,9,8,0,188,3,7,7,6,4,192,47,3,111,3,175,3,3,32,3,1,3,11,193,10,194,7,4,193,
5,194,7,0,1,0,47,63,246,237,16,244,237,1,47,93,113,237,51,51,47,16,237,50,
50,47,16,237,49,48,1,3,35,3,5,53,5,3,51,3,37,21,2,137,22,115,22,254,160,1,
96,28,215,28,1,97,3,232,251,142,4,114,27,164,29,1,120,254,136,29,164,0,0,
1,0,136,255,115,3,233,5,204,0,21,0,86,64,50,12,8,189,9,15,5,6,11,14,15,5,
9,190,19,1,189,0,20,17,0,16,3,4,16,3,32,0,1,0,19,193,18,194,15,12,193,13,
194,15,8,193,7,194,4,1,193,2,194,4,0,0,63,246,237,16,244,237,47,246,237,16,
244,237,1,47,93,23,51,47,17,51,51,16,237,50,237,23,50,47,16,237,50,49,48,
1,5,53,5,3,51,3,37,21,37,3,19,37,21,37,19,35,19,5,53,5,19,1,241,254,152,1,
104,16,175,16,1,105,254,151,26,26,1,104,254,152,16,175,16,254,151,1,105,26,
3,232,27,164,29,1,120,254,136,29,164,27,254,182,254,185,27,164,29,254,136,
1,120,29,164,27,1,71,0,0,0,0,1,0,81,1,145,2,124,3,188,0,19,0,73,185,0,17,
255,232,179,9,12,72,13,184,255,232,64,39,9,12,72,7,24,9,12,72,3,24,9,12,72,
128,0,1,15,0,63,0,2,0,191,10,1,10,143,5,1,0,5,48,5,2,5,15,15,1,15,0,47,93,
205,93,93,1,47,93,205,93,93,49,48,0,43,43,43,43,1,20,14,2,35,34,46,2,53,52,
62,2,51,50,30,2,2,124,45,76,102,58,57,99,75,43,43,75,99,57,58,102,76,45,2,
170,58,102,77,44,44,77,102,58,57,100,74,43,43,74,100,0,0,0,3,1,22,0,0,6,234,
0,219,0,3,0,7,0,11,0,86,64,61,7,150,4,4,0,11,150,0,8,48,8,96,8,128,8,144,
8,160,8,208,8,240,8,8,0,8,48,8,64,8,96,8,144,8,192,8,208,8,240,8,8,8,8,3,
150,47,0,191,0,2,16,0,1,0,5,1,9,155,4,0,8,0,47,51,51,237,50,50,1,47,93,93,
237,47,94,93,113,237,18,57,47,237,49,48,33,53,51,21,33,53,51,21,33,53,51,
21,6,40,194,252,183,192,252,181,195,219,219,219,219,219,219,0,0,7,0,55,255,
245,7,200,5,141,0,3,0,23,0,43,0,63,0,83,0,103,0,123,3,217,64,12,118,0,134,
0,2,121,2,137,2,2,3,102,184,255,224,64,14,8,12,72,96,24,8,12,72,92,24,8,12,
72,86,184,255,224,179,8,12,72,62,184,255,232,64,14,8,12,72,56,24,8,12,72,
52,24,8,12,72,46,184,255,224,179,8,12,72,22,184,255,224,64,14,8,12,72,16,
24,8,12,72,12,24,8,12,72,6,184,255,224,64,13,8,12,72,74,180,59,181,49,0,1,
2,3,1,184,255,240,64,131,3,16,118,3,1,9,1,25,1,121,1,3,9,1,3,1,3,19,49,180,
102,64,1,38,64,182,64,198,64,214,64,4,64,64,19,114,180,99,181,89,180,105,
104,1,22,104,38,104,2,201,104,249,104,2,139,104,1,118,104,1,89,104,1,70,104,
1,41,104,1,27,104,1,233,104,1,150,104,198,104,2,121,104,1,107,104,1,86,104,
1,57,104,1,6,104,22,104,38,104,3,10,104,24,180,9,181,34,180,9,19,25,19,41,
19,73,19,89,19,121,19,137,19,153,19,8,34,19,64,45,49,72,19,184,255,192,64,
255,19,23,72,19,217,125,1,198,125,1,169,125,1,155,125,1,121,125,1,107,125,
1,93,125,1,73,125,1,59,125,1,45,125,1,9,125,25,125,2,251,125,1,237,125,1,
217,125,1,203,125,1,189,125,1,155,125,1,125,125,141,125,2,105,125,1,91,125,
1,77,125,1,54,125,1,41,125,1,11,125,27,125,2,204,233,125,249,125,2,214,125,
1,187,125,1,173,125,1,137,125,153,125,2,123,125,1,102,125,1,75,125,1,61,125,
1,9,125,1,219,125,251,125,2,205,125,1,153,125,169,125,2,107,125,139,125,2,
93,125,1,57,125,1,43,125,1,29,125,1,9,125,1,237,125,253,125,2,185,125,201,
125,217,125,3,123,125,171,125,2,89,125,1,11,125,59,125,75,125,3,155,249,125,
1,235,125,1,214,125,1,187,125,1,153,125,1,123,125,139,125,2,102,125,1,59,
125,75,125,2,9,125,25,125,2,246,125,1,217,125,1,205,125,1,169,125,185,125,
2,155,125,1,105,125,121,125,2,93,125,1,57,125,73,125,2,43,125,1,22,125,1,
249,125,1,237,125,1,201,125,64,249,1,187,125,1,153,125,1,123,125,1,102,125,
1,73,125,1,54,125,1,9,125,25,125,2,105,249,125,1,235,125,1,221,125,1,169,
125,1,150,125,1,121,125,1,107,125,1,73,125,1,59,125,1,25,125,1,11,125,1,253,
125,1,217,125,1,203,125,1,169,125,1,155,125,1,141,125,1,121,125,1,91,125,
107,125,2,57,125,1,27,125,43,125,2,249,125,1,235,125,1,169,125,201,125,2,
150,125,1,121,125,1,107,125,1,57,125,1,38,125,1,9,125,1,56,249,125,1,230,
125,1,201,125,1,182,125,1,153,125,1,139,125,1,89,125,1,70,125,1,41,125,1,
27,125,1,249,125,1,235,125,1,201,125,1,187,125,1,173,125,1,1,148,125,1,123,
125,1,100,125,1,75,125,1,63,125,1,27,125,1,15,125,1,228,125,1,203,125,1,176,
125,1,2,160,125,1,143,125,1,112,125,1,95,125,1,64,125,1,31,125,1,0,125,1,
8,109,182,84,183,119,182,94,19,69,182,44,183,79,182,54,19,39,182,14,183,29,
182,4,4,2,3,0,18,0,63,63,63,237,244,237,63,237,244,237,63,237,244,237,1,94,
93,93,93,93,93,93,93,95,93,93,93,113,113,113,113,113,113,113,95,113,113,113,
113,113,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,
93,113,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,
114,114,114,94,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,
113,113,113,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,113,113,
113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114,114,94,93,
93,93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,113,
113,47,43,43,94,93,237,244,237,47,94,93,93,93,93,93,93,93,113,113,113,113,
113,113,113,114,114,253,244,237,18,57,47,93,113,237,17,57,57,47,47,94,93,
93,56,56,17,51,17,51,16,244,237,49,48,0,43,43,43,43,43,43,43,43,43,43,43,
43,1,95,93,93,33,35,1,51,37,50,30,2,21,20,14,2,35,34,46,2,53,52,62,2,19,52,
46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,50,30,2,21,20,14,2,35,34,46,2,53,
52,62,2,19,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,50,30,2,21,20,14,2,
35,34,46,2,53,52,62,2,19,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,48,155,
3,154,157,252,152,60,107,80,46,46,81,108,62,63,108,80,46,46,81,110,210,19,
37,55,35,38,58,39,19,20,39,56,37,34,54,39,21,2,30,60,107,80,46,46,81,108,
62,63,108,80,46,46,81,110,210,19,37,55,35,38,58,39,19,20,39,56,37,34,54,39,
21,1,253,60,107,80,46,46,81,108,62,63,108,80,46,46,81,110,210,19,37,55,35,
38,58,39,19,20,39,56,37,34,54,39,21,5,129,12,33,83,139,106,102,140,86,38,
37,86,140,103,106,139,83,33,254,151,73,98,58,24,24,59,97,73,71,97,59,26,26,
59,97,254,239,33,83,139,106,102,140,86,38,37,86,140,103,106,139,83,33,254,
151,73,98,58,24,24,59,97,73,71,97,59,26,26,59,97,1,176,33,83,139,106,102,
140,86,38,37,86,140,103,106,139,83,33,254,151,73,98,58,24,24,59,97,73,71,
97,59,26,26,59,97,0,0,0,0,1,0,85,3,122,1,89,5,129,0,3,0,40,64,25,3,16,10,
13,72,1,16,10,13,72,1,150,31,2,47,2,2,2,48,0,1,0,0,1,3,0,63,205,1,47,93,221,
93,237,49,48,43,43,27,1,51,3,85,64,196,158,3,122,2,7,253,249,255,255,0,85,
3,122,2,175,5,129,16,38,2,14,0,0,17,7,2,14,1,86,0,0,0,9,180,1,96,4,1,4,17,
93,53,0,0,1,0,88,0,141,2,81,3,172,0,8,0,72,64,55,106,3,122,3,138,3,3,106,
0,122,0,138,0,3,7,236,6,235,5,236,31,1,79,1,95,1,127,1,143,1,5,48,1,64,1,
96,1,112,1,160,1,5,1,0,239,15,3,47,3,111,3,127,3,4,3,0,47,93,228,1,47,93,
113,237,237,237,49,48,93,93,37,1,53,1,51,21,9,1,21,1,168,254,176,1,80,167,
254,177,1,81,141,1,109,63,1,115,31,254,140,254,145,29,0,0,0,1,0,89,0,141,
2,82,3,172,0,8,0,66,64,48,101,6,117,6,133,6,3,101,0,117,0,133,0,3,4,236,1,
236,8,235,112,3,128,3,176,3,3,208,3,1,111,3,127,3,2,3,0,239,15,6,47,6,111,
6,127,6,4,6,0,47,93,228,1,47,93,93,113,253,237,237,49,48,93,93,37,35,53,9,
1,53,51,1,21,1,1,168,1,82,254,176,166,1,81,141,29,1,111,1,116,31,254,141,
63,0,0,0,255,255,0,185,0,0,3,71,5,129,16,38,0,4,0,0,17,7,0,4,1,200,0,0,0,
22,64,12,3,2,47,8,1,8,1,0,47,0,1,0,17,93,53,53,17,93,53,53,0,1,255,192,5,
223,2,235,6,84,0,3,0,13,179,1,0,2,1,0,47,205,1,47,47,49,48,1,33,53,33,2,235,
252,213,3,43,5,223,117,0,1,254,96,0,0,2,98,5,129,0,3,0,45,182,3,16,111,3,
1,3,1,184,255,240,64,18,239,1,1,1,64,13,18,72,1,64,8,11,72,1,2,3,0,18,0,63,
63,1,47,43,43,93,56,47,93,56,49,48,33,35,1,51,254,244,148,3,113,145,5,129,
0,0,1,0,101,2,7,2,131,4,157,0,33,0,111,185,0,30,255,216,64,30,9,17,72,23,
10,224,36,11,1,11,33,224,36,0,212,0,228,0,3,0,23,6,228,11,139,0,251,0,2,0,
184,255,192,64,38,10,13,72,4,0,1,0,29,17,17,75,29,91,29,2,29,64,21,25,72,
29,64,16,19,72,47,29,63,29,2,27,29,1,15,29,1,2,29,0,47,95,93,93,93,43,43,
93,51,47,16,204,93,43,93,50,237,50,1,47,93,237,47,93,237,50,49,48,0,43,1,
17,52,46,2,35,34,6,21,17,35,17,52,46,2,53,51,20,30,2,21,51,62,3,51,50,22,
21,17,2,2,13,29,47,35,72,85,128,1,1,2,119,2,2,2,2,15,38,49,64,42,110,97,2,
7,1,142,46,61,37,16,100,94,254,148,1,255,20,46,40,29,4,3,27,34,35,12,28,46,
32,17,108,121,254,79,0,0,0,1,0,4,0,0,4,46,5,129,0,17,0,106,64,69,7,3,7,3,
10,0,16,32,16,2,16,16,48,16,80,16,112,16,144,16,224,16,6,16,5,1,9,92,14,12,
10,8,12,81,5,31,13,1,0,13,1,13,4,95,15,1,31,1,63,1,79,1,4,63,1,1,15,1,1,8,
1,1,9,0,95,15,3,9,18,0,63,63,237,18,57,47,94,93,93,113,237,220,93,113,50,
237,50,1,47,51,51,237,50,50,47,93,113,18,57,57,47,47,49,48,1,17,33,21,33,
21,33,21,33,17,35,17,35,53,51,17,33,21,1,103,2,175,253,81,1,146,254,110,180,
175,175,3,123,4,230,254,36,157,213,129,254,233,1,23,129,3,233,155,0,1,0,58,
0,0,4,80,5,150,0,58,0,221,64,81,133,58,149,58,2,21,22,37,22,53,22,3,40,44,
0,48,17,13,6,30,111,29,29,0,52,110,6,43,39,48,110,18,14,10,10,0,79,6,95,6,
111,6,3,6,58,111,0,0,32,0,2,0,0,32,0,48,0,80,0,112,0,144,0,176,0,208,0,8,
0,0,16,0,48,0,192,0,224,0,5,8,0,184,255,192,64,70,14,18,72,0,42,16,81,17,
46,12,81,43,175,13,1,13,64,42,45,72,0,13,16,13,32,13,3,13,39,111,17,1,47,
17,95,17,111,17,143,17,159,17,223,17,239,17,7,17,17,52,35,115,41,30,1,30,
24,7,7,52,116,37,58,1,23,58,1,58,6,24,0,63,51,93,93,237,50,63,51,93,237,18,
57,47,93,113,51,222,93,43,93,50,237,50,16,237,50,1,47,43,94,93,113,114,237,
47,93,18,57,47,51,51,237,50,50,16,237,17,57,47,237,17,51,51,17,18,57,57,49,
48,0,93,93,1,14,3,35,33,53,62,1,61,1,35,53,51,53,35,53,51,53,52,62,2,51,50,
30,2,23,7,46,3,35,34,6,29,1,33,21,33,21,33,21,33,21,20,14,2,7,33,50,62,2,
55,4,80,9,57,89,115,67,253,70,89,86,186,186,186,186,48,99,152,103,70,123,
99,71,18,174,10,39,53,65,36,114,112,1,152,254,104,1,152,254,104,22,44,63,
40,1,227,38,67,53,37,8,1,55,80,117,77,37,154,46,160,121,25,129,140,129,130,
92,147,102,55,29,58,86,57,57,31,52,36,20,115,125,138,129,140,129,7,56,106,
92,71,21,19,42,67,48,0,0,0,0,4,0,158,255,236,8,103,5,129,0,14,0,23,0,47,0,
98,1,193,64,71,134,2,1,117,91,133,91,2,91,73,107,73,139,73,3,143,68,1,109,
68,1,91,68,1,105,82,1,105,80,1,125,22,1,91,22,107,22,2,125,17,141,17,2,91,
17,107,17,2,84,57,100,57,2,54,57,70,57,2,37,97,53,97,69,97,3,76,32,9,14,72,
49,184,255,224,64,94,9,14,72,29,32,12,17,72,13,29,29,29,45,29,3,82,73,81,
81,48,72,65,0,70,15,24,39,75,37,41,72,30,34,32,30,57,73,15,56,1,102,56,1,
56,56,89,72,75,95,15,1,63,75,95,75,239,75,3,75,64,27,39,72,239,30,1,31,30,
95,30,127,30,3,15,30,75,75,30,15,3,8,64,65,80,65,96,65,3,127,65,143,65,2,
65,184,255,192,64,16,7,12,72,65,20,7,70,0,8,16,8,32,8,3,8,100,184,255,192,
179,91,95,72,100,184,255,192,179,80,88,72,100,184,255,192,179,70,74,72,100,
184,255,192,179,59,62,72,100,184,255,192,179,48,53,72,100,184,255,192,64,
11,27,31,72,79,100,95,100,111,100,3,100,184,255,192,179,7,10,72,89,184,255,
248,64,71,19,22,72,65,8,19,22,72,89,65,78,60,80,57,51,22,44,80,27,22,6,95,
20,87,80,121,82,1,72,82,88,82,104,82,3,82,78,40,32,80,33,78,37,33,35,35,33,
127,33,143,33,2,175,20,1,20,64,9,17,72,20,33,20,33,8,19,95,9,3,8,18,0,63,
63,237,18,57,57,47,47,43,93,93,17,51,47,17,51,51,16,237,50,47,51,93,93,237,
16,237,63,237,63,51,237,18,57,57,43,43,1,43,93,43,43,43,43,43,43,47,93,237,
50,47,43,93,113,18,23,57,47,47,47,93,113,43,93,93,16,237,51,47,93,113,237,
17,51,51,16,237,50,17,57,57,16,237,16,237,50,47,237,49,48,93,43,43,43,93,
0,93,93,1,93,93,93,93,0,93,93,93,93,93,1,93,0,93,1,93,1,20,14,2,43,1,17,35,
17,33,50,30,2,7,52,38,43,1,17,51,50,54,1,14,1,35,34,38,53,17,35,53,51,55,
51,21,51,21,35,17,20,22,51,50,54,55,37,20,6,35,34,46,2,39,55,30,1,51,50,62,
2,53,52,46,2,39,46,3,53,52,54,51,50,22,23,7,46,3,35,34,21,20,30,2,23,30,3,
3,186,61,121,182,121,130,181,1,43,125,186,124,62,182,164,164,105,113,165,
155,2,123,35,74,48,105,93,104,111,53,110,157,157,41,55,23,40,26,2,232,183,
170,75,121,92,61,15,159,17,99,88,40,68,49,27,34,62,87,52,49,96,77,47,168,
161,141,165,22,161,6,31,45,54,30,155,32,57,80,48,48,100,82,52,3,217,92,159,
117,68,253,219,5,129,61,111,157,97,134,139,253,212,146,252,186,11,13,123,
122,1,197,131,242,242,131,254,98,78,73,8,6,98,120,129,24,54,88,64,26,61,58,
10,25,40,30,30,41,29,23,13,12,32,53,79,59,112,119,105,116,17,28,38,24,10,
85,25,36,28,22,11,11,31,54,87,0,1,0,16,255,236,4,86,5,150,0,61,0,232,185,
0,2,255,235,64,68,15,73,106,38,1,58,43,74,43,122,43,138,43,4,36,59,52,59,
68,59,116,59,132,59,5,46,55,55,4,57,45,51,110,20,24,15,14,26,15,3,20,37,110,
36,36,3,110,64,4,96,4,128,4,160,4,176,4,5,0,4,144,4,176,4,208,4,4,4,184,255,
192,64,94,24,27,72,4,48,24,81,25,57,15,81,54,15,16,31,16,127,16,143,16,159,
16,5,16,64,39,47,72,0,16,16,16,128,16,3,16,45,47,25,63,25,127,25,3,47,25,
63,25,175,25,207,25,4,47,25,175,25,2,25,25,0,40,115,216,37,1,124,37,140,37,
2,26,37,42,37,2,37,31,7,0,115,115,3,131,3,2,21,3,37,3,2,3,9,25,0,63,51,93,
93,237,63,51,93,93,93,237,18,57,47,93,113,114,51,220,93,43,113,50,237,50,
16,237,50,1,47,43,93,113,237,51,47,237,47,23,51,47,196,16,237,50,50,17,57,
47,196,49,48,0,93,93,93,43,37,50,54,55,23,14,3,35,34,46,2,39,35,55,51,46,
1,53,52,54,55,35,55,51,62,3,51,50,30,2,23,7,46,1,35,34,14,2,7,33,7,33,14,
1,21,20,22,23,33,7,33,30,3,2,179,100,120,14,185,13,63,103,147,97,120,177,
121,69,13,171,40,120,1,2,2,1,160,40,129,15,73,123,173,115,97,147,103,63,13,
185,14,121,106,68,106,79,50,11,1,190,40,254,99,2,1,2,2,1,196,40,254,108,9,
42,77,114,126,100,91,14,68,118,87,50,77,139,192,114,129,8,46,24,27,53,6,127,
122,189,130,67,50,87,118,68,14,91,100,39,87,137,99,127,16,47,23,22,37,19,
129,81,138,100,57,0,0,0,0,4,0,69,255,244,6,208,5,140,0,19,0,23,0,43,0,79,
0,192,64,14,118,20,134,20,2,121,22,137,22,2,133,47,1,66,184,255,232,64,9,
8,11,72,60,24,8,11,72,17,184,255,232,179,8,11,72,13,184,255,232,64,29,8,11,
72,7,24,8,11,72,3,24,8,11,72,22,23,20,21,74,180,73,73,52,180,53,178,63,23,
16,21,184,255,240,64,62,21,23,21,23,0,44,180,63,64,10,14,72,63,34,180,10,
178,0,180,0,24,16,24,32,24,80,24,96,24,208,24,224,24,240,24,8,24,38,52,1,
52,49,182,58,184,77,182,74,68,4,23,3,20,18,29,182,15,184,39,182,5,19,0,63,
237,244,237,63,63,63,51,237,244,237,51,93,1,47,93,253,244,237,47,43,237,18,
57,57,47,47,56,56,16,244,237,51,47,237,17,51,17,51,49,48,0,43,43,43,43,43,
43,1,93,93,93,1,20,14,2,35,34,46,2,53,52,62,2,51,50,30,2,1,35,1,51,19,52,
46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,20,30,2,51,50,54,55,23,14,3,35,34,
46,2,53,52,62,2,51,50,30,2,23,7,46,1,35,34,6,6,208,51,87,116,66,66,115,85,
49,48,86,117,68,66,115,85,50,251,59,155,3,154,157,149,22,43,63,40,42,64,44,
22,23,43,63,41,39,63,44,24,250,155,20,47,75,54,69,94,11,141,6,45,77,111,72,
94,132,82,38,59,97,124,65,68,106,76,48,9,143,10,83,75,108,87,1,178,125,171,
105,45,45,104,171,126,133,174,103,41,41,103,174,253,201,5,129,252,49,99,131,
78,32,33,78,131,98,95,128,79,34,34,79,128,2,124,75,124,90,50,82,87,9,54,99,
76,45,69,121,164,96,130,173,103,42,40,70,94,55,11,72,85,164,0,2,0,19,255,
236,2,126,5,149,0,39,0,55,0,185,64,9,138,32,1,53,40,14,17,72,26,184,255,232,
179,8,16,72,22,184,255,232,64,67,8,16,72,8,32,8,16,72,6,32,11,16,72,5,27,
21,27,2,5,21,21,21,2,3,4,4,29,16,40,32,40,2,96,40,112,40,128,40,192,40,4,
15,40,1,40,40,4,51,20,51,2,8,51,159,35,1,35,18,14,192,10,208,10,224,10,3,
10,184,255,192,179,34,38,72,10,184,255,192,64,26,7,11,72,10,79,57,1,18,51,
45,15,11,34,24,14,14,7,45,24,3,3,7,24,7,0,7,0,47,205,63,18,57,47,16,205,17,
57,47,18,57,57,205,17,57,57,1,93,47,43,43,93,198,51,205,93,50,0,94,93,1,51,
47,93,93,113,205,50,47,51,49,48,0,93,93,43,43,43,43,1,43,93,37,50,54,55,51,
14,1,35,34,38,61,1,14,1,7,53,62,1,55,17,52,62,2,51,50,30,2,21,20,14,2,7,21,
20,30,2,19,52,46,2,35,34,14,2,21,17,62,3,1,177,51,68,17,69,20,120,109,111,
127,32,66,34,35,66,31,25,59,98,72,52,79,53,27,44,79,110,66,19,32,42,115,14,
27,40,26,32,39,22,8,49,77,54,28,78,104,109,154,157,159,155,175,17,28,13,73,
14,29,16,2,75,59,108,83,49,42,78,111,69,99,180,152,118,38,244,57,83,54,26,
4,20,52,85,61,33,36,61,81,46,254,5,33,104,131,151,0,0,0,0,4,0,188,0,0,8,46,
5,129,0,19,0,35,0,55,0,59,0,244,64,124,141,0,1,0,24,13,16,72,61,0,1,25,0,
1,132,10,1,114,10,1,69,10,85,10,101,10,3,22,10,38,10,2,5,33,21,33,37,33,3,
4,29,20,29,2,11,24,27,24,2,11,22,27,22,2,47,61,1,58,20,73,36,19,73,16,0,16,
57,46,73,26,144,16,160,16,192,16,3,31,26,1,16,26,16,26,8,144,36,160,36,176,
36,3,47,36,1,0,36,1,36,10,1,7,73,48,8,64,8,80,8,3,0,8,16,8,32,8,144,8,4,8,
41,31,15,1,184,255,192,179,29,36,72,1,184,255,192,64,15,18,21,72,1,17,9,3,
51,23,192,57,208,57,2,57,184,255,192,64,21,35,44,72,57,56,11,64,29,36,72,
11,64,18,21,72,0,11,56,3,8,18,0,63,23,51,43,43,47,221,43,93,222,205,63,51,
51,43,43,63,205,1,47,93,113,237,50,50,47,93,93,93,18,57,57,47,47,93,93,16,
237,51,17,51,16,237,16,237,50,93,49,48,0,93,93,93,93,1,93,93,93,93,93,93,
43,93,33,1,22,23,30,1,21,17,35,17,51,1,38,39,46,1,53,17,51,17,1,20,6,35,34,
38,53,52,62,2,51,50,30,2,7,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,53,
33,21,4,38,253,48,1,2,1,2,160,202,2,216,2,2,2,2,162,3,54,176,175,168,177,
43,87,131,88,93,131,84,39,159,24,47,69,45,46,71,48,25,26,48,67,41,46,72,50,
25,254,16,2,123,4,166,44,44,38,89,39,252,88,5,129,251,82,40,46,39,98,51,3,
156,250,127,2,178,188,203,201,190,91,145,101,53,53,100,145,92,81,107,64,26,
27,64,107,80,82,108,63,26,26,63,108,253,160,146,146,0,0,0,0,2,0,188,2,122,
7,25,5,129,0,39,0,47,0,148,64,9,9,24,19,23,72,136,9,1,8,184,255,232,64,16,
19,23,72,89,8,105,8,121,8,3,37,24,13,17,72,24,184,255,240,64,73,12,17,72,
44,41,196,42,24,21,196,64,22,224,22,2,22,22,0,64,47,1,47,0,42,16,42,64,42,
80,42,4,42,39,196,37,111,0,175,0,207,0,223,0,239,0,5,0,40,44,202,0,9,22,29,
4,0,42,32,42,80,42,128,42,4,42,2,15,23,37,15,3,45,3,0,63,23,51,17,51,204,
93,23,50,237,50,1,47,93,51,237,47,93,204,93,18,57,47,93,237,50,16,253,204,
49,48,43,43,93,43,93,43,1,17,53,6,7,14,1,7,3,35,3,46,1,39,38,39,6,21,6,20,
21,17,35,17,51,19,30,1,31,1,54,55,62,3,53,19,51,17,1,17,35,17,35,53,33,21,
6,155,5,4,4,5,2,230,108,163,2,24,14,17,20,1,1,128,190,223,2,5,2,6,20,16,7,
13,11,7,168,184,251,40,134,255,2,138,2,122,1,169,194,11,11,9,18,5,253,203,
1,157,5,64,38,44,55,10,10,8,18,6,253,201,3,7,253,205,4,13,7,18,51,41,18,34,
28,18,2,1,157,252,249,2,152,253,104,2,152,111,111,0,0,0,0,1,0,108,0,0,5,184,
5,150,0,57,0,221,64,95,101,36,1,101,22,1,157,49,1,143,49,1,49,16,11,15,72,
157,9,1,143,9,1,9,16,11,15,72,116,3,132,3,2,54,3,1,54,2,118,2,2,54,56,118,
56,2,116,55,132,55,2,54,55,1,42,26,1,42,32,1,41,53,48,40,10,18,32,40,96,40,
112,40,144,40,4,47,18,111,18,127,18,159,18,4,40,18,40,18,24,34,91,16,53,1,
53,184,255,192,64,65,23,29,72,191,53,207,53,2,0,53,48,53,2,53,17,5,91,31,
24,63,24,79,24,143,24,191,24,207,24,223,24,7,111,24,127,24,159,24,239,24,
255,24,5,0,24,48,24,2,8,24,10,15,19,39,48,5,42,95,18,41,18,29,95,0,4,0,63,
237,63,51,237,23,50,1,47,94,93,93,113,253,196,47,93,93,43,114,237,17,57,57,
47,47,93,93,17,51,17,51,16,196,49,48,0,93,93,93,93,93,93,93,93,43,93,93,43,
93,93,93,93,1,50,30,2,21,20,14,2,7,54,55,62,1,59,1,21,33,53,62,3,53,52,46,
2,35,34,14,2,21,20,30,2,23,21,33,53,51,50,22,23,22,23,46,3,53,52,62,2,3,18,
151,241,168,90,59,109,157,99,42,39,33,71,23,244,253,179,96,139,89,42,61,116,
169,108,109,170,116,61,42,89,139,96,253,179,244,23,71,33,39,42,99,157,109,
59,90,168,241,5,150,86,162,234,147,106,191,167,138,54,2,3,2,4,156,224,51,
126,143,159,85,116,181,124,65,65,124,181,116,85,159,143,126,51,224,156,4,
2,3,2,54,138,167,191,106,147,234,162,86,0,0,0,2,0,88,255,222,4,124,4,72,0,
32,0,45,0,82,64,50,90,13,1,28,15,64,160,33,176,33,2,95,33,1,80,33,96,33,112,
33,3,33,47,128,32,47,1,45,208,17,1,17,5,16,45,45,22,39,10,16,22,21,27,1,6,
27,1,27,0,22,0,63,50,93,93,205,63,205,18,57,47,205,1,47,205,93,50,93,26,16,
220,93,113,113,26,205,50,49,48,93,5,34,46,2,53,52,62,2,51,50,30,2,21,33,17,
30,3,51,50,62,2,55,23,14,3,19,17,46,3,35,34,14,2,7,17,2,107,130,198,134,69,
95,152,189,95,112,194,142,81,252,197,22,64,78,88,46,75,116,93,76,35,72,36,
84,109,143,203,19,59,77,92,53,51,87,74,60,24,34,93,157,204,111,147,213,139,
66,79,146,210,130,254,156,24,45,35,20,31,60,87,56,42,57,100,76,44,2,138,1,
21,20,42,34,22,19,32,42,24,254,234,0,0,0,255,255,0,80,255,246,6,78,5,129,
16,38,0,121,0,0,16,39,2,20,2,249,0,0,17,7,2,144,3,204,253,206,0,63,64,40,
4,3,2,111,15,1,47,15,1,15,1,191,12,1,128,12,1,112,12,1,96,12,1,64,12,1,16,
12,1,12,98,64,11,11,72,4,3,2,60,24,0,63,53,53,53,1,43,17,93,93,93,93,93,93,
53,17,93,93,53,53,53,0,0,0,255,255,0,61,255,246,6,78,5,141,16,39,2,20,2,249,
0,0,16,39,2,144,3,204,253,206,17,6,0,115,34,0,0,63,64,40,1,3,2,111,49,1,47,
49,1,49,0,191,1,1,128,1,1,112,1,1,96,1,1,64,1,1,16,1,1,1,141,64,11,11,72,
1,3,2,49,24,0,63,53,53,53,1,43,17,93,93,93,93,93,93,53,17,93,93,53,53,53,
0,0,0,255,255,0,93,255,246,6,78,5,129,16,39,2,20,2,249,0,0,16,39,2,144,3,
204,253,206,17,6,2,142,40,0,0,63,64,40,1,3,2,111,49,1,47,49,1,49,0,191,1,
1,128,1,1,112,1,1,96,1,1,64,1,1,16,1,1,1,126,64,11,11,72,1,3,2,49,24,0,63,
53,53,53,1,43,17,93,93,93,93,93,93,53,17,93,93,53,53,53,0,0,0,255,255,0,145,
255,246,6,78,5,129,16,39,2,20,2,189,0,0,16,39,2,144,3,204,253,206,17,6,2,
143,102,0,0,47,64,28,1,3,2,111,49,1,47,49,1,49,0,191,1,1,128,1,1,1,102,64,
11,11,72,1,3,2,49,24,0,63,53,53,53,1,43,17,93,93,53,17,93,93,53,53,53,0,0,
0,0,1,1,162,0,100,6,94,2,68,0,17,0,24,64,9,0,15,12,3,128,16,7,17,16,0,47,
205,1,47,205,26,204,50,57,57,49,48,1,30,1,23,35,46,1,39,53,62,1,55,51,14,
1,7,33,21,2,129,29,59,31,72,58,130,82,82,130,58,72,31,59,29,3,221,1,41,34,
98,65,68,112,42,36,42,112,68,65,98,34,86,0,0,0,1,1,16,255,195,2,240,4,127,
0,17,0,26,64,10,15,64,0,0,15,12,3,17,128,7,0,47,26,205,204,50,57,57,1,47,
26,205,49,48,1,14,1,7,53,62,1,55,51,30,1,23,21,46,1,39,17,35,1,213,34,98,
65,68,112,42,36,42,112,68,65,98,34,86,3,160,29,59,31,72,58,130,82,82,130,
58,72,31,59,29,252,35,0,1,1,162,0,100,6,94,2,68,0,17,0,24,64,9,0,15,12,3,
128,7,17,16,17,0,47,205,1,47,221,26,204,50,57,57,49,48,1,46,1,39,51,30,1,
23,21,14,1,7,35,62,1,55,33,53,5,127,29,59,31,72,58,130,82,82,130,58,72,31,
59,29,252,35,1,127,34,98,65,68,112,42,36,42,112,68,65,98,34,86,0,0,0,1,1,
16,255,195,2,240,4,127,0,17,0,26,64,10,17,64,16,15,0,3,12,128,8,16,0,47,221,
26,204,50,57,57,1,47,26,205,49,48,37,62,1,55,21,14,1,7,35,46,1,39,53,30,1,
23,17,51,2,43,34,98,65,68,112,42,36,42,112,68,65,98,34,86,162,29,59,31,72,
58,130,82,82,130,58,72,31,59,29,3,221,0,0,1,1,162,0,100,6,94,2,68,0,31,0,
36,64,15,16,31,28,19,128,23,64,15,0,3,12,128,8,0,15,0,47,205,1,47,26,204,
50,57,57,26,221,26,204,50,57,57,49,48,1,30,1,23,35,46,1,39,53,62,1,55,51,
14,1,7,33,46,1,39,51,30,1,23,21,14,1,7,35,62,1,55,2,129,29,59,31,72,58,130,
82,82,130,58,72,31,59,29,2,254,29,59,31,72,58,130,82,82,130,58,72,31,59,29,
1,41,34,98,65,68,112,42,36,42,112,68,65,98,34,34,98,65,68,112,42,36,42,112,
68,65,98,34,0,0,0,1,1,16,255,195,2,240,4,127,0,31,0,38,64,16,15,64,0,31,16,
19,28,128,24,64,0,15,12,3,128,7,0,47,26,204,50,57,57,26,221,26,204,50,57,
57,1,47,26,205,49,48,1,14,1,7,53,62,1,55,51,30,1,23,21,46,1,39,17,62,1,55,
21,14,1,7,35,46,1,39,53,30,1,23,1,213,34,98,65,68,112,42,36,42,112,68,65,
98,34,34,98,65,68,112,42,36,42,112,68,65,98,34,3,160,29,59,31,72,58,130,82,
82,130,58,72,31,59,29,253,2,29,59,31,72,58,130,82,82,130,58,72,31,59,29,0,
2,1,16,255,72,2,240,4,127,0,3,0,35,0,40,64,17,1,19,0,4,35,20,23,32,28,3,0,
28,4,19,16,7,11,0,47,204,50,57,57,221,222,205,16,204,50,57,57,1,47,51,205,
50,49,48,5,33,21,33,19,14,1,7,53,62,1,55,51,30,1,23,21,46,1,39,17,62,1,55,
21,14,1,7,35,46,1,39,53,30,1,23,1,16,1,224,254,32,197,34,98,65,68,112,42,
36,42,112,68,65,98,34,34,98,65,68,112,42,36,42,112,68,65,98,34,104,80,4,88,
29,59,31,72,58,130,82,82,130,58,72,31,59,29,253,2,29,59,31,72,58,130,82,82,
130,58,72,31,59,29,0,0,2,0,56,255,229,3,186,5,197,0,47,0,69,0,222,64,93,156,
19,172,19,2,154,6,170,6,2,122,33,138,33,2,68,24,14,17,72,85,20,101,20,149,
20,165,20,4,140,7,1,74,7,90,7,122,7,3,74,56,90,56,2,67,56,11,15,72,58,67,
1,42,12,58,12,74,12,3,37,45,53,45,149,45,165,45,4,32,39,48,39,2,39,39,15,
169,48,249,48,2,40,48,1,48,28,0,70,64,96,31,1,31,184,255,192,64,64,18,21,
72,15,31,1,31,64,12,17,72,31,71,128,60,71,63,15,1,15,64,12,17,72,15,79,71,
1,39,34,80,43,53,81,27,0,22,64,22,128,22,192,22,4,7,22,22,47,43,111,43,223,
43,3,15,43,191,43,2,43,65,80,10,22,0,63,237,47,93,113,57,47,94,93,51,237,
16,237,50,1,93,47,43,93,237,26,16,220,43,93,43,113,26,237,51,51,113,113,18,
57,47,93,49,48,0,93,1,93,93,43,0,93,1,93,93,0,93,1,43,93,93,93,1,20,14,2,
7,14,3,35,34,46,2,53,52,62,4,51,50,30,2,23,51,62,1,53,52,38,35,34,14,2,7,
55,62,1,51,50,30,2,3,46,3,35,34,14,4,21,20,30,2,51,50,62,2,3,186,7,13,18,
11,31,96,130,162,97,93,127,78,35,22,47,73,102,132,83,42,77,64,50,16,4,1,3,
130,129,28,59,58,55,22,36,42,116,67,113,154,94,41,211,8,36,51,64,36,53,86,
67,49,32,15,21,42,65,44,66,108,83,56,3,170,46,104,106,106,48,128,206,144,
77,63,107,138,75,60,143,144,134,104,63,26,48,67,42,25,58,34,196,209,11,19,
28,17,147,23,39,88,149,195,254,147,42,74,55,32,51,84,110,116,116,48,53,91,
67,38,99,161,205,0,0,0,2,0,4,0,0,4,225,5,129,0,5,0,18,0,244,64,27,74,7,90,
7,106,7,3,69,17,85,17,101,17,3,3,56,8,1,55,16,1,6,24,14,17,72,18,184,255,
232,64,157,14,17,72,102,2,1,39,2,71,2,87,2,3,105,1,1,40,1,72,1,88,1,3,2,1,
12,12,0,6,59,3,1,20,3,1,244,3,1,107,3,155,3,187,3,235,3,4,52,3,84,3,2,0,3,
1,11,2,3,18,15,0,31,0,47,0,3,18,0,15,20,47,20,127,20,3,175,20,191,20,223,
20,255,20,4,32,20,112,20,144,20,3,15,20,63,20,143,20,3,58,175,20,207,20,223,
20,255,20,4,64,20,96,20,144,20,3,15,20,95,20,2,143,20,159,20,191,20,223,20,
4,0,20,32,20,80,20,112,20,4,0,3,6,3,18,95,5,18,12,32,19,22,72,153,12,1,12,
1,3,0,63,51,93,43,63,237,23,50,1,93,93,113,114,114,94,93,113,113,114,47,94,
93,51,47,95,94,93,93,93,93,113,113,51,18,57,61,47,51,51,49,48,93,93,93,93,
43,43,93,93,95,93,93,55,1,51,1,21,33,37,1,46,3,39,14,3,7,1,5,2,5,217,1,254,
251,35,4,21,254,174,16,29,22,15,1,2,14,23,28,16,254,173,141,4,244,251,12,
141,156,3,94,40,82,69,48,8,8,49,70,82,40,252,164,0,1,0,235,254,78,5,172,5,
129,0,7,0,54,64,36,3,90,79,4,175,4,191,4,207,4,4,4,7,90,32,0,1,15,0,1,0,0,
32,0,192,0,208,0,4,0,2,95,5,3,4,0,0,47,50,63,237,1,47,93,113,113,237,47,93,
237,49,48,1,17,33,17,35,17,33,17,4,244,252,182,191,4,193,254,78,6,145,249,
111,7,51,248,205,0,0,0,0,1,0,154,254,78,5,48,5,129,0,11,0,170,64,9,134,8,
150,8,2,163,9,1,9,184,255,192,64,26,13,16,72,163,7,1,2,144,7,1,114,7,130,
7,2,100,7,1,53,7,69,7,85,7,3,3,184,255,240,64,74,9,17,72,41,1,57,1,2,1,16,
12,17,72,8,143,6,159,6,175,6,3,2,72,17,73,15,2,127,2,2,2,6,2,6,0,207,10,1,
0,10,64,10,2,10,7,3,9,3,9,207,0,1,0,0,64,0,2,7,0,32,13,1,3,7,95,2,8,0,4,3,
1,9,95,0,0,47,237,57,63,18,57,57,237,57,1,93,47,94,93,93,51,51,47,47,51,47,
93,93,18,57,57,47,47,93,43,93,51,49,48,0,43,93,43,1,93,93,93,93,95,93,43,
93,93,19,53,9,1,53,33,21,33,9,1,33,21,154,2,123,253,149,4,66,252,178,2,72,
253,168,3,162,254,78,109,3,48,3,44,106,152,253,4,252,249,152,0,0,0,0,1,0,
101,2,96,4,72,2,242,0,3,0,32,64,20,0,2,32,2,80,2,112,2,4,2,16,0,32,0,2,0,
0,173,1,179,0,63,237,1,47,93,47,93,49,48,19,53,33,21,101,3,227,2,96,146,146,
0,0,0,0,1,0,51,255,242,4,98,6,84,0,8,0,185,185,0,0,255,232,64,135,14,17,72,
9,1,57,1,73,1,3,9,1,0,4,6,1,6,6,8,16,111,8,143,8,175,8,207,8,239,8,5,15,8,
47,8,79,8,111,8,143,8,5,8,95,2,1,2,2,15,3,47,3,79,3,111,3,4,11,3,175,10,1,
48,10,80,10,112,10,144,10,4,111,10,143,10,2,16,10,48,10,2,240,10,1,15,10,
47,10,79,10,3,57,239,10,1,176,10,208,10,2,143,10,175,10,207,10,239,10,4,112,
10,1,47,10,79,10,111,10,143,10,175,10,5,2,175,31,5,1,5,5,1,7,179,6,1,0,47,
51,63,18,57,47,93,237,1,93,113,113,114,114,94,93,93,113,113,114,114,47,94,
93,51,47,93,47,93,113,56,57,61,47,93,51,51,49,48,94,93,43,5,35,1,35,53,33,
19,1,51,2,110,106,254,229,182,1,14,242,1,174,129,14,3,24,117,253,78,5,135,
0,3,0,87,0,203,5,93,3,215,0,35,0,51,0,67,0,114,64,75,137,50,1,53,67,69,67,
2,10,15,1,10,3,1,5,33,1,5,21,1,39,26,8,52,4,18,0,0,47,32,47,64,47,112,47,
4,47,60,18,36,224,55,1,55,23,42,239,65,1,65,8,39,52,26,4,5,63,13,1,13,64,
18,21,72,0,13,80,13,2,13,31,15,23,1,23,0,47,93,51,220,93,43,113,50,23,57,
205,93,50,16,205,93,50,1,47,205,47,93,205,17,23,57,49,48,0,93,93,93,93,93,
1,93,1,20,14,2,35,34,38,39,14,3,35,34,46,2,53,52,62,2,51,50,22,23,62,3,51,
50,30,2,37,34,6,7,30,1,51,50,62,2,53,52,46,2,5,46,1,35,34,14,2,21,20,30,2,
51,50,54,5,93,44,82,115,70,97,168,70,32,75,84,90,46,69,115,83,46,44,82,116,
71,94,168,67,31,75,84,94,51,69,114,81,45,254,179,70,119,56,51,119,77,43,71,
51,27,29,51,71,254,93,51,119,78,43,70,49,27,25,48,71,47,70,120,2,78,78,141,
106,62,133,149,63,102,72,39,55,100,143,89,81,142,104,60,135,148,62,102,73,
40,55,101,143,168,126,130,128,128,40,70,94,54,54,92,69,39,250,128,128,40,
70,94,54,51,93,69,41,126,0,0,0,1,1,152,0,0,6,96,4,199,0,5,0,13,179,2,5,2,
5,0,47,205,1,47,205,49,48,1,51,17,33,21,33,1,152,94,4,106,251,56,4,199,251,
151,94,0,0,0,0,1,1,22,255,254,4,170,4,8,0,25,0,35,64,18,75,22,91,22,2,75,
16,91,16,2,25,0,12,13,13,0,19,6,0,47,205,47,51,1,47,205,47,205,49,48,0,93,
93,5,17,52,62,2,51,50,30,2,21,17,35,17,52,46,2,35,34,14,2,21,17,1,22,68,122,
167,98,99,169,123,70,103,53,95,130,78,78,130,94,52,2,2,0,116,192,138,76,76,
138,192,116,254,0,2,2,98,155,108,57,56,108,156,100,254,0,0,0,1,255,158,254,
78,2,148,5,227,0,35,2,3,64,30,10,34,26,34,42,34,3,5,16,21,16,37,16,3,9,3,
218,37,1,201,37,1,154,37,170,37,186,37,3,37,184,1,0,64,162,225,228,72,76,
37,1,0,47,37,63,37,2,9,37,1,220,37,64,211,217,72,37,64,205,209,72,134,37,
1,25,37,41,37,57,37,3,11,37,1,251,37,1,233,37,1,37,64,188,191,72,107,37,123,
37,139,37,3,93,37,1,75,37,1,41,37,57,37,2,27,37,1,9,37,1,249,37,1,37,128,
170,177,72,109,37,1,37,128,164,168,72,9,37,1,163,37,128,156,162,72,189,37,
1,121,37,153,37,169,37,3,75,37,91,37,107,37,3,37,192,140,147,72,155,37,171,
37,187,37,3,125,37,141,37,2,107,37,1,93,37,1,38,37,54,37,70,37,3,228,37,1,
214,37,1,180,37,196,37,2,6,37,1,112,37,184,255,192,64,110,119,122,72,37,64,
101,107,72,219,37,1,118,37,166,37,2,9,37,25,37,41,37,3,233,37,1,37,64,79,
82,72,37,128,74,78,72,25,37,41,37,2,11,37,1,251,37,1,217,37,233,37,2,171,
37,187,37,203,37,3,153,37,1,37,128,60,63,72,41,37,57,37,73,37,3,11,37,27,
37,2,55,233,37,249,37,2,187,37,203,37,219,37,3,141,37,157,37,173,37,3,123,
37,1,109,37,1,1,95,37,1,37,184,255,128,179,39,43,72,37,184,255,192,64,13,
34,38,72,144,37,160,37,2,2,16,37,1,37,184,255,192,64,46,28,31,72,223,37,1,
96,37,112,37,160,37,176,37,192,37,5,15,37,31,37,47,37,3,7,32,22,144,22,2,
22,22,31,70,12,47,4,159,4,2,4,4,32,12,1,12,184,255,192,64,15,16,19,72,12,
25,80,64,18,128,18,2,18,7,80,0,0,47,237,47,93,237,1,47,43,93,51,47,93,16,
237,50,47,93,94,93,93,93,43,113,95,113,43,43,114,95,114,114,114,114,114,94,
93,93,43,93,93,93,93,113,113,43,43,113,114,114,114,43,43,94,93,93,93,93,113,
113,113,113,113,43,114,114,114,43,94,93,43,93,43,93,113,113,113,113,113,113,
43,113,113,114,114,114,43,43,94,93,93,95,93,43,93,93,93,49,48,0,95,94,93,
93,19,34,38,39,53,30,1,51,50,62,2,53,3,52,62,2,51,50,22,23,21,46,1,35,34,
14,2,21,17,20,14,2,36,36,75,23,20,62,35,51,66,39,16,2,50,90,125,75,34,75,
22,18,61,36,51,66,39,16,50,89,124,254,78,11,8,147,8,16,37,64,84,48,4,188,
94,134,86,40,9,9,148,10,17,40,65,84,44,251,66,94,134,86,41,0,0,0,2,0,56,1,
80,4,44,3,244,0,33,0,67,1,31,64,26,36,16,12,16,72,2,16,12,16,72,65,24,11,
17,72,66,48,9,17,72,61,48,9,17,72,42,184,255,208,179,9,17,72,48,184,255,208,
64,19,9,17,72,31,24,9,17,72,32,48,9,17,72,26,48,9,17,72,13,184,255,232,179,
13,17,72,14,184,255,208,179,9,13,72,8,184,255,208,179,14,17,72,8,184,255,
208,64,41,9,12,72,63,16,28,48,28,80,28,3,0,28,16,28,64,28,96,28,128,28,160,
28,240,28,7,28,45,11,64,12,17,72,11,47,69,1,59,173,64,45,184,255,192,180,
35,60,72,45,34,184,255,192,179,23,28,72,34,184,255,192,64,27,16,20,72,34,
128,62,64,41,60,72,62,40,173,143,49,1,32,49,48,49,2,49,15,25,173,64,11,184,
255,192,180,39,60,72,11,0,184,255,192,179,23,28,72,0,184,255,192,64,29,16,
20,72,0,128,28,64,41,60,72,28,6,173,15,15,207,15,2,15,64,23,28,72,15,64,11,
19,72,15,0,47,43,43,93,237,196,43,26,221,43,43,196,43,26,237,16,220,93,93,
237,196,43,26,221,43,43,196,43,26,237,1,93,47,43,51,47,93,113,51,49,48,0,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,1,34,38,39,46,1,35,34,14,2,7,53,
62,1,51,50,30,2,23,30,3,51,50,54,55,21,14,3,3,34,38,39,46,1,35,34,14,2,7,
53,62,1,51,50,30,2,23,30,3,51,50,54,55,21,14,3,3,40,69,145,73,65,107,45,38,
65,60,56,29,50,132,81,40,80,77,75,37,21,50,51,51,23,69,123,52,32,59,61,68,
40,69,145,73,65,107,45,38,65,60,56,29,50,132,81,40,80,77,75,37,21,50,51,51,
23,69,123,52,32,59,61,68,2,246,43,26,22,23,12,22,33,21,144,37,47,13,21,27,
13,8,15,14,8,51,43,149,23,30,19,8,254,90,44,26,23,24,12,23,32,21,141,38,46,
13,20,26,13,8,15,14,8,50,42,147,23,32,19,8,0,1,0,65,0,55,4,36,5,16,0,19,0,
162,64,108,53,2,1,58,11,1,60,12,1,42,12,1,3,3,6,7,10,11,2,11,0,17,16,13,12,
1,12,12,11,1,2,4,9,19,100,14,116,14,2,80,14,1,2,48,14,1,0,14,16,14,32,14,
96,14,4,14,4,111,9,127,9,2,95,9,111,9,2,9,16,7,8,173,9,0,1,2,3,4,4,173,17,
6,31,5,47,5,95,5,111,5,223,5,5,5,10,11,12,13,4,80,9,208,9,2,15,9,1,9,0,47,
93,93,23,51,222,93,50,50,237,23,50,16,237,50,50,1,47,93,113,51,47,93,113,
95,113,113,51,18,23,57,16,135,192,192,192,192,16,135,192,192,192,192,49,48,
1,95,93,93,93,93,1,3,35,19,35,53,33,19,33,53,33,19,51,3,33,21,33,3,33,21,
1,192,152,145,151,237,1,55,190,254,11,2,61,154,143,152,1,21,254,162,191,2,
29,1,88,254,223,1,33,148,1,108,148,1,36,254,220,148,254,148,148,0,0,0,0,3,
0,100,0,244,4,71,4,80,0,3,0,7,0,11,0,49,64,27,11,7,2,8,4,0,8,173,9,9,1,5,
173,63,4,1,4,0,173,15,1,31,1,63,1,3,1,0,47,93,237,47,93,237,17,57,47,237,
1,47,51,51,47,51,51,49,48,19,53,33,21,1,53,33,21,1,53,33,21,100,3,227,252,
29,3,227,252,29,3,227,3,188,148,148,253,56,148,148,1,100,148,148,0,0,0,2,
0,63,0,0,4,36,4,207,0,6,0,10,0,123,185,0,5,255,216,64,17,18,22,72,3,40,18,
22,72,0,40,18,22,72,137,0,1,1,184,255,216,64,63,18,22,72,134,1,1,10,48,2,
80,2,2,0,2,16,2,32,2,64,2,96,2,128,2,160,2,7,2,7,7,0,64,12,15,72,0,8,173,
7,79,6,95,6,143,6,3,6,64,2,80,2,128,2,3,2,1,0,80,4,128,4,2,4,0,25,47,93,51,
51,205,93,205,93,24,47,237,1,47,43,51,47,47,93,113,51,49,48,0,93,43,93,43,
43,43,19,53,1,21,9,1,21,5,53,33,21,65,3,227,252,166,3,90,252,27,3,227,2,119,
205,1,139,154,254,168,254,168,153,236,145,145,0,0,2,0,65,0,0,4,36,4,207,0,
6,0,10,0,121,185,0,1,255,216,64,17,18,22,72,3,40,18,22,72,6,40,18,22,72,137,
6,1,5,184,255,216,64,62,18,22,72,134,5,1,9,48,6,80,6,2,0,6,16,6,32,6,64,6,
96,6,128,6,160,6,7,6,7,0,64,12,15,72,0,8,173,7,6,5,64,4,80,4,128,4,3,4,79,
0,95,0,143,0,3,0,80,2,128,2,2,2,0,25,47,93,205,93,205,93,51,51,24,47,237,
1,47,43,51,47,93,113,51,49,48,0,93,43,93,43,43,43,55,53,9,1,53,1,21,1,53,
33,21,65,3,90,252,166,3,227,252,29,3,227,236,153,1,88,1,88,154,254,117,205,
253,137,145,145,0,0,0,0,2,0,157,0,0,4,55,4,129,0,4,0,9,0,35,64,18,105,9,121,
9,2,105,7,121,7,2,6,4,5,0,2,8,5,0,0,47,205,47,205,1,47,205,221,205,49,48,
0,93,93,51,17,9,1,17,37,33,17,9,1,157,1,205,1,205,252,182,2,250,254,131,254,
131,2,123,2,6,253,250,253,133,82,2,6,1,170,254,86,0,0,0,0,1,0,100,0,180,4,
71,2,242,0,5,0,19,183,5,170,0,2,0,4,173,1,0,47,237,47,1,47,47,237,49,48,55,
17,33,21,33,17,100,3,227,252,174,180,2,62,146,254,84,0,0,0,1,2,34,253,154,
3,210,6,170,0,23,0,29,182,4,32,8,11,72,9,0,184,1,0,180,1,19,12,6,1,0,47,47,
205,205,1,47,237,204,49,48,43,1,35,17,52,55,54,51,50,22,21,20,6,35,34,39,
46,1,39,38,35,34,7,6,21,2,181,147,84,82,128,63,75,51,37,30,13,8,26,20,33,
16,36,9,6,253,154,7,86,196,123,123,63,48,40,52,10,4,24,22,39,39,35,105,0,
0,0,1,1,5,253,154,2,181,6,170,0,28,0,32,185,0,4,255,224,180,8,11,72,12,2,
184,1,0,180,28,24,17,7,0,0,47,47,205,205,1,47,253,204,49,48,43,1,51,17,20,
7,14,1,35,34,46,2,53,52,62,2,51,50,23,30,1,23,22,51,50,55,54,53,2,34,147,
90,40,103,62,30,50,37,20,14,23,31,18,33,26,5,21,15,31,16,37,8,7,6,170,248,
168,205,125,56,54,16,29,39,24,20,34,24,14,16,2,23,20,37,41,31,106,0,0,0,1,
255,246,2,37,5,181,2,182,0,3,0,22,180,3,5,0,4,0,184,1,2,177,1,252,0,63,237,
17,1,51,17,51,49,48,3,53,33,21,10,5,191,2,37,145,145,0,0,1,1,216,253,147,
2,105,7,72,0,3,0,24,187,0,2,1,0,0,3,1,6,180,4,3,254,0,250,0,63,63,1,16,246,
237,49,48,1,51,17,35,1,216,145,145,7,72,246,75,0,0,0,1,2,141,253,147,5,181,
2,182,0,5,0,34,178,2,7,3,186,1,0,0,0,1,6,179,6,5,254,3,184,1,2,177,0,252,
0,63,237,63,1,16,246,237,17,51,49,48,1,33,21,33,17,35,2,141,3,40,253,105,
145,2,182,145,251,110,0,0,0,1,255,246,253,147,3,30,2,182,0,5,0,34,187,0,2,
1,0,0,5,1,6,181,6,0,6,4,254,5,184,1,2,177,2,252,0,63,237,63,17,1,51,16,246,
237,49,48,3,53,33,17,35,17,10,3,40,145,2,37,145,250,221,4,146,0,0,0,0,1,2,
141,2,37,5,181,7,72,0,5,0,34,178,4,7,2,189,1,0,0,5,1,6,0,6,0,5,1,2,179,2,
252,0,250,0,63,63,237,1,16,246,237,17,51,49,48,1,51,17,33,21,33,2,141,145,
2,151,252,216,7,72,251,110,145,0,0,0,1,255,246,2,37,3,30,7,72,0,5,0,34,187,
0,5,1,0,0,2,1,6,181,6,0,6,3,250,5,184,1,2,177,2,252,0,63,237,63,17,1,51,16,
244,237,49,48,3,53,33,17,51,17,10,2,151,145,2,37,145,4,146,250,221,0,0,0,
0,1,2,141,253,147,5,181,7,72,0,7,0,39,179,4,9,5,1,186,1,0,0,0,1,6,179,8,7,
254,5,184,1,2,179,2,252,0,250,0,63,63,237,63,1,16,246,237,50,17,51,49,48,
1,51,17,33,21,33,17,35,2,141,145,2,151,253,105,145,7,72,251,110,145,251,110,
0,1,255,246,253,147,3,30,7,72,0,7,0,39,177,7,4,186,1,0,0,2,1,6,183,8,0,8,
6,254,3,250,7,184,1,2,177,2,252,0,63,237,63,63,17,1,51,16,244,237,51,49,48,
3,53,33,17,51,17,35,17,10,2,151,145,145,2,37,145,4,146,246,75,4,146,0,0,1,
255,246,253,147,5,181,2,182,0,7,0,40,178,3,9,4,186,1,0,0,7,1,6,182,8,0,8,
6,254,4,0,184,1,2,177,1,252,0,63,237,50,63,17,1,51,16,246,237,17,51,49,48,
3,53,33,21,33,17,35,17,10,5,191,253,105,145,2,37,145,145,251,110,4,146,0,
1,255,246,2,37,5,181,7,72,0,7,0,40,178,7,9,5,186,1,0,0,2,1,6,182,8,0,8,3,
250,5,0,184,1,2,177,1,252,0,63,237,51,63,17,1,51,16,244,237,17,51,49,48,3,
53,33,17,51,17,33,21,10,2,151,145,2,151,2,37,145,4,146,251,110,145,0,1,255,
246,253,147,5,181,7,72,0,11,0,51,179,7,13,5,8,187,1,0,0,2,0,11,1,6,64,9,12,
0,12,10,254,3,250,8,11,184,1,2,178,5,2,252,0,63,51,237,50,63,63,17,1,51,16,
246,50,237,50,17,51,49,48,3,53,33,17,51,17,33,21,33,17,35,17,10,2,151,145,
2,151,253,105,145,2,37,145,4,146,251,110,145,251,110,4,146,0,0,0,2,255,246,
1,113,5,181,3,106,0,3,0,7,0,37,183,3,7,7,9,0,4,8,4,184,1,2,178,5,253,0,184,
1,2,177,1,251,0,63,237,63,237,17,1,51,50,17,51,17,51,49,48,3,53,33,21,1,53,
33,21,10,5,191,250,65,5,191,2,217,145,145,254,152,145,145,0,2,1,217,253,147,
3,210,7,72,0,3,0,7,0,42,65,9,0,5,1,0,0,4,1,7,0,8,0,1,1,0,0,0,1,4,182,8,7,
3,254,4,0,250,0,63,50,63,51,1,16,246,237,16,244,237,49,48,1,51,17,35,1,51,
17,35,1,217,145,145,1,104,145,145,7,72,246,75,9,181,246,75,0,0,0,1,2,141,
253,147,5,181,3,106,0,9,0,49,181,2,6,6,11,7,3,186,1,0,0,0,1,6,179,10,9,254,
7,184,1,2,178,4,253,3,184,1,2,177,0,251,0,63,237,63,237,63,1,16,246,237,50,
17,51,17,51,49,48,1,33,21,33,21,33,21,33,17,35,2,141,3,40,253,105,2,151,253,
105,145,3,106,145,215,145,252,34,0,0,1,1,217,253,147,5,181,2,182,0,9,0,51,
178,1,11,6,191,1,0,0,9,1,4,0,10,0,2,1,0,0,5,1,7,178,10,2,6,184,1,2,180,9,
252,4,8,254,0,63,51,63,237,50,1,16,244,237,16,246,237,17,51,49,48,1,21,33,
17,35,17,35,17,35,17,5,181,254,29,145,215,145,2,182,145,251,110,4,146,251,
110,5,35,0,0,0,0,2,1,217,253,147,5,181,3,106,0,5,0,11,0,63,180,2,8,8,13,9,
65,11,1,0,0,6,1,7,0,12,0,3,1,0,0,0,1,4,0,12,0,9,1,2,181,6,253,11,5,254,3,
184,1,2,177,0,251,0,63,237,63,51,63,237,1,16,246,237,16,244,237,17,51,17,
51,49,48,1,33,21,33,17,35,1,33,21,33,17,35,1,217,3,220,252,181,145,1,104,
2,116,254,29,145,3,106,145,250,186,4,111,145,252,34,0,0,1,255,246,253,147,
3,30,3,106,0,9,0,49,177,9,6,186,1,0,0,3,1,6,183,10,4,0,0,10,8,254,3,184,1,
2,178,6,251,9,184,1,2,177,2,253,0,63,237,63,237,63,17,1,51,17,51,16,244,237,
51,49,48,3,53,33,53,33,53,33,17,35,17,10,2,151,253,105,3,40,145,1,113,145,
215,145,250,41,3,222,0,0,0,1,255,246,253,147,3,210,2,182,0,9,0,52,65,9,0,
6,1,0,0,9,1,4,0,10,0,2,1,0,0,5,1,7,183,10,0,10,4,8,254,6,0,184,1,2,177,1,
252,0,63,237,50,63,51,17,1,51,16,244,237,16,246,237,49,48,3,53,33,17,35,17,
35,17,35,17,10,3,220,145,215,145,2,37,145,250,221,4,146,251,110,4,146,0,0,
0,0,2,255,246,253,147,3,210,3,106,0,5,0,11,0,63,180,4,9,9,12,11,65,11,1,0,
0,8,1,4,0,12,0,0,1,0,0,3,1,7,0,12,0,9,1,2,181,10,253,2,7,254,4,184,1,2,177,
5,251,0,63,237,63,51,63,237,1,16,244,237,16,246,237,17,51,17,51,49,48,1,17,
35,17,33,53,1,35,17,33,53,33,3,210,145,252,181,2,116,145,254,29,2,116,3,106,
250,41,5,70,145,250,41,3,222,145,0,0,1,2,141,1,113,5,181,7,72,0,9,0,49,181,
4,8,8,11,2,6,189,1,0,0,9,1,6,0,10,0,9,1,2,178,6,253,5,184,1,2,179,2,251,0,
250,0,63,63,237,63,237,1,16,246,237,50,17,51,17,51,49,48,1,51,17,33,21,33,
21,33,21,33,2,141,145,2,151,253,105,2,151,252,216,7,72,252,34,145,215,145,
0,0,1,1,217,2,37,5,181,7,72,0,9,0,52,178,4,11,2,65,11,1,0,0,9,1,7,0,10,0,
8,1,0,0,5,1,4,0,10,0,5,1,2,181,2,8,252,0,6,250,0,63,51,63,51,237,1,16,246,
237,16,244,237,17,51,49,48,1,51,17,33,21,33,17,51,17,51,3,65,145,1,227,252,
36,145,215,7,72,251,110,145,5,35,251,110,0,0,0,2,1,217,1,113,5,181,7,72,0,
5,0,11,0,63,180,10,4,4,13,8,65,11,1,0,0,11,1,7,0,12,0,2,1,0,0,5,1,4,0,12,
0,11,1,2,178,8,251,5,184,1,2,180,2,253,6,0,250,0,63,50,63,237,63,237,1,16,
246,237,16,244,237,17,51,17,51,49,48,1,51,17,33,21,33,1,51,17,33,21,33,1,
217,145,3,75,252,36,1,104,145,1,227,253,140,7,72,250,186,145,5,215,252,34,
145,0,0,1,255,246,1,113,3,30,7,72,0,9,0,50,188,0,9,1,0,0,6,0,2,1,6,183,10,
4,0,0,10,7,250,3,184,1,2,178,6,251,9,184,1,2,177,2,253,0,63,237,63,237,63,
17,1,51,17,51,16,244,50,237,49,48,3,53,33,53,33,53,33,17,51,17,10,2,151,253,
105,2,151,145,1,113,145,215,145,3,222,250,41,0,0,1,255,246,2,37,3,210,7,72,
0,9,0,52,65,9,0,0,1,0,0,7,1,7,0,10,0,6,1,0,0,3,1,4,183,10,1,10,8,4,250,6,
1,184,1,2,177,2,252,0,63,237,51,63,51,17,1,51,16,244,237,16,244,237,49,48,
1,33,53,33,17,51,17,51,17,51,3,210,252,36,1,227,145,215,145,2,37,145,4,146,
251,110,4,146,0,0,0,2,255,246,1,113,3,210,7,72,0,5,0,11,0,63,65,9,0,8,1,0,
0,11,1,4,0,12,0,0,1,0,0,3,1,7,181,12,9,1,1,12,9,184,1,2,181,10,251,4,6,250,
1,184,1,2,177,2,253,0,63,237,63,51,63,237,17,1,51,17,51,16,244,237,16,244,
237,49,48,1,33,53,33,17,51,33,51,17,33,53,33,3,210,252,36,3,75,145,254,7,
145,253,140,1,227,1,113,145,5,70,251,145,145,0,0,0,0,1,2,141,253,147,5,181,
7,72,0,11,0,54,182,4,8,8,13,6,2,10,186,1,0,0,11,1,6,179,12,11,254,9,184,1,
2,178,6,253,5,184,1,2,179,2,251,0,250,0,63,63,237,63,237,63,1,16,246,237,
50,50,17,51,17,51,49,48,1,51,17,33,21,33,21,33,21,33,17,35,2,141,145,2,151,
253,105,2,151,253,105,145,7,72,252,34,145,215,145,252,34,0,0,0,0,2,1,217,
253,147,5,181,7,72,0,7,0,11,0,56,178,4,13,10,186,1,0,0,11,1,4,178,12,2,6,
186,1,0,0,7,1,7,183,12,7,11,254,0,8,250,5,184,1,2,177,2,252,0,63,237,63,51,
63,51,1,16,244,237,50,16,246,237,17,51,49,48,1,51,17,33,21,33,17,35,1,51,
17,35,3,65,145,1,227,254,29,145,254,152,145,145,7,72,251,110,145,251,110,
9,181,246,75,0,0,3,1,217,253,147,5,181,7,72,0,3,0,9,0,15,0,73,181,14,6,6,
17,12,8,65,12,1,0,0,15,0,9,1,7,0,16,0,0,1,0,0,1,1,4,0,16,0,15,1,2,178,12,
251,7,184,1,2,183,4,253,10,2,250,9,1,254,0,63,51,63,51,63,237,63,237,1,16,
246,237,16,244,50,237,50,17,51,17,51,49,48,1,35,17,51,19,33,21,33,17,35,17,
51,17,33,21,33,2,106,145,145,215,2,116,254,29,145,145,1,227,253,140,253,147,
9,181,250,186,145,252,34,9,181,252,34,145,0,1,255,246,253,147,3,30,7,72,0,
11,0,56,185,0,9,1,0,178,6,2,10,184,1,6,64,10,12,4,0,0,12,10,254,7,250,3,184,
1,2,178,6,251,11,184,1,2,177,2,253,0,63,237,63,237,63,63,17,1,51,17,51,16,
246,50,50,237,49,48,3,53,33,53,33,53,33,17,51,17,35,17,10,2,151,253,105,2,
151,145,145,1,113,145,215,145,3,222,246,75,3,222,0,0,0,2,255,246,253,147,
3,210,7,72,0,7,0,11,0,59,65,10,0,10,1,0,0,11,1,7,0,12,0,5,1,0,0,2,0,6,1,4,
64,10,12,0,12,11,6,254,8,3,250,7,184,1,2,177,2,252,0,63,237,63,51,63,51,17,
1,51,16,246,50,237,16,244,237,49,48,3,53,33,17,51,17,35,17,1,51,17,35,10,
1,227,145,145,1,104,145,145,2,37,145,4,146,246,75,4,146,5,35,246,75,0,0,0,
0,3,255,246,253,147,3,210,7,72,0,3,0,9,0,15,0,73,181,7,13,13,16,6,10,65,12,
1,0,0,9,0,11,1,4,0,16,0,2,1,0,0,3,1,7,0,16,0,12,1,2,181,15,253,3,11,254,6,
184,1,2,180,9,251,0,4,250,0,63,51,63,237,63,51,63,237,1,16,244,237,16,246,
50,237,50,17,51,17,51,49,48,1,51,17,35,1,51,17,33,53,33,19,35,17,33,53,33,
3,65,145,145,254,152,145,253,140,1,227,145,145,254,29,2,116,7,72,246,75,9,
181,251,145,145,250,41,3,222,145,0,0,0,2,255,246,253,147,5,181,3,106,0,7,
0,11,0,57,180,11,3,3,13,4,186,1,0,0,7,1,6,181,12,8,0,0,12,8,184,1,2,181,9,
251,6,254,4,0,184,1,2,177,1,253,0,63,237,50,63,63,237,17,1,51,17,51,16,246,
237,17,51,17,51,49,48,3,53,33,21,33,17,35,17,1,53,33,21,10,5,191,253,105,
145,253,105,5,191,1,113,145,145,252,34,3,222,1,104,145,145,0,0,1,255,246,
253,147,5,181,2,182,0,11,0,58,178,3,13,8,191,1,0,0,11,1,4,0,12,0,4,1,0,0,
7,1,7,64,9,12,0,12,6,10,254,8,4,0,184,1,2,177,1,252,0,63,237,50,50,63,51,
17,1,51,16,244,237,16,246,237,17,51,49,48,3,53,33,21,33,17,35,17,35,17,35,
17,10,5,191,254,29,145,215,145,2,37,145,145,251,110,4,146,251,110,4,146,0,
3,255,246,253,147,5,181,3,106,0,5,0,11,0,15,0,74,180,13,8,8,17,9,186,1,0,
0,6,1,7,181,16,14,3,3,16,5,189,1,0,0,2,1,4,0,16,0,14,1,2,179,15,251,9,3,184,
1,2,181,6,4,253,11,1,254,0,63,51,63,51,237,50,63,237,1,16,246,237,17,51,17,
51,16,244,237,17,51,17,51,49,48,1,35,17,33,53,33,51,33,21,33,17,35,1,21,33,
53,2,106,145,254,29,2,116,215,2,116,254,29,145,2,116,250,65,253,147,3,222,
145,145,252,34,5,215,145,145,0,0,0,0,2,255,246,1,113,5,181,7,72,0,7,0,11,
0,58,64,9,7,11,11,13,0,8,8,12,5,189,1,0,0,2,1,6,0,12,0,8,1,2,181,9,253,3,
250,5,0,184,1,2,177,1,251,0,63,237,51,63,63,237,1,16,244,237,17,51,17,51,
17,51,17,51,49,48,3,53,33,17,51,17,33,21,1,53,33,21,10,2,151,145,2,151,250,
65,5,191,2,217,145,3,222,252,34,145,254,152,145,145,0,1,255,246,2,37,5,181,
7,72,0,11,0,58,178,11,13,9,191,1,0,0,6,1,7,0,12,0,5,1,0,0,2,1,4,64,9,12,0,
12,7,3,250,9,5,0,184,1,2,177,1,252,0,63,237,51,51,63,51,17,1,51,16,244,237,
16,244,237,17,51,49,48,3,53,33,17,51,17,51,17,51,17,33,21,10,1,227,145,215,
145,1,227,2,37,145,4,146,251,110,4,146,251,110,145,0,3,255,246,1,113,5,181,
7,72,0,5,0,11,0,15,0,76,64,9,4,15,15,17,9,12,12,16,8,65,11,1,0,0,11,1,4,0,
16,0,2,1,0,0,5,1,7,0,16,0,12,1,2,179,13,253,5,9,184,1,2,181,2,10,251,0,6,
250,0,63,51,63,51,237,50,63,237,1,16,244,237,16,244,237,17,51,17,51,17,51,
17,51,49,48,1,51,17,33,21,33,1,51,17,33,53,33,1,53,33,21,3,65,145,1,227,253,
140,254,152,145,253,140,1,227,254,29,5,191,7,72,252,34,145,4,111,251,145,
145,254,7,145,145,0,0,0,1,255,246,253,147,5,181,7,72,0,19,0,76,182,11,15,
15,21,13,9,16,184,1,0,178,6,2,19,184,1,6,64,11,20,4,0,0,20,18,254,7,250,12,
4,184,1,2,180,9,5,251,16,0,184,1,2,178,13,1,253,0,63,51,237,50,63,51,237,
50,63,63,17,1,51,17,51,16,246,50,50,237,50,50,17,51,17,51,49,48,3,53,33,53,
33,53,33,17,51,17,33,21,33,21,33,21,33,17,35,17,10,2,151,253,105,2,151,145,
2,151,253,105,2,151,253,105,145,1,113,145,215,145,3,222,252,34,145,215,145,
252,34,3,222,0,0,1,255,246,253,147,5,181,7,72,0,19,0,77,179,4,21,18,9,187,
1,0,0,15,0,12,1,4,178,20,2,5,187,1,0,0,19,0,8,1,7,64,9,20,13,20,0,16,250,
9,5,13,184,1,2,182,18,2,14,252,7,11,254,0,63,51,63,51,51,237,50,50,63,51,
17,1,51,16,244,50,237,50,16,246,50,237,50,17,51,49,48,1,51,17,33,21,33,17,
35,17,35,17,35,17,33,53,33,17,51,17,51,3,65,145,1,227,254,29,145,215,145,
254,29,1,227,145,215,7,72,251,110,145,251,110,4,146,251,110,4,146,145,4,146,
251,110,0,0,0,0,4,255,246,253,147,5,181,7,72,0,5,0,11,0,17,0,23,0,93,181,
4,14,14,25,2,15,187,1,0,0,5,0,12,1,7,182,24,21,9,9,24,20,11,187,1,0,0,23,
0,8,1,4,178,24,5,21,184,1,2,183,2,22,251,0,18,250,15,9,184,1,2,181,12,10,
253,17,7,254,0,63,51,63,51,237,50,63,51,63,51,237,50,1,16,246,50,237,50,17,
51,17,51,16,244,50,237,50,17,51,17,51,49,48,1,51,17,33,21,33,3,35,17,33,53,
33,51,33,21,33,17,35,1,51,17,33,53,33,3,65,145,1,227,253,140,215,145,254,
29,2,116,215,2,116,254,29,145,254,152,145,253,140,1,227,7,72,252,34,145,250,
186,3,222,145,145,252,34,9,181,251,145,145,0,0,0,0,1,0,0,2,109,5,171,7,72,
0,3,0,18,182,0,5,1,4,2,250,1,0,47,63,17,1,51,17,51,49,48,1,33,17,33,5,171,
250,85,5,171,2,109,4,219,0,0,0,1,0,0,253,147,5,171,2,109,0,3,0,18,182,0,5,
1,4,2,1,254,0,63,47,17,1,51,17,51,49,48,1,33,17,33,5,171,250,85,5,171,253,
147,4,218,0,0,0,1,0,0,253,147,5,171,7,72,0,3,0,19,183,0,5,1,4,2,250,1,254,
0,63,63,17,1,51,17,51,49,48,1,33,17,33,5,171,250,85,5,171,253,147,9,181,0,
0,1,0,0,253,147,2,214,7,72,0,3,0,17,182,1,4,0,2,250,1,254,0,63,63,1,47,17,
51,49,48,1,33,17,33,2,214,253,42,2,214,253,147,9,181,0,0,0,0,1,2,213,253,
147,5,171,7,72,0,3,0,17,182,0,5,1,2,250,1,254,0,63,63,1,47,17,51,49,48,1,
33,17,33,5,171,253,42,2,214,253,147,9,181,0,0,0,0,42,0,103,253,245,5,171,
6,163,0,3,0,7,0,11,0,15,0,19,0,23,0,27,0,31,0,35,0,39,0,43,0,47,0,51,0,55,
0,59,0,63,0,67,0,71,0,75,0,79,0,83,0,87,0,91,0,95,0,99,0,103,0,107,0,111,
0,115,0,119,0,123,0,127,0,131,0,135,0,139,0,143,0,147,0,151,0,155,0,159,0,
163,0,167,2,49,181,161,157,153,149,145,165,184,1,1,182,164,109,85,69,45,13,
121,184,1,1,64,13,120,108,84,68,44,12,120,101,77,53,29,5,137,184,1,1,64,13,
136,100,76,52,28,4,136,113,89,65,41,17,125,184,1,1,64,13,124,112,88,64,40,
16,124,97,81,57,25,9,141,184,1,1,64,13,140,96,80,56,24,8,140,117,93,61,37,
21,129,184,1,1,64,33,128,116,92,60,36,20,128,120,136,124,140,128,128,140,
124,136,120,5,132,160,156,152,148,144,164,164,169,105,73,49,33,1,133,184,
1,1,64,15,104,72,48,32,0,10,132,1,8,3,132,167,143,139,135,184,1,3,180,132,
163,103,99,107,184,1,3,183,104,160,100,96,104,95,91,87,184,1,3,183,84,92,
88,84,159,83,79,75,184,1,3,183,72,156,80,76,72,67,63,71,184,1,3,183,68,64,
60,68,155,59,55,51,184,1,3,183,48,152,56,52,48,43,39,47,184,1,3,183,44,40,
36,44,151,31,27,35,184,1,3,183,32,148,28,24,32,23,19,15,184,1,3,183,12,20,
16,12,147,11,7,3,184,1,3,183,0,144,8,4,0,131,127,123,184,1,3,64,60,120,128,
124,120,22,84,1,27,72,1,25,68,1,27,48,1,27,44,1,20,32,1,104,84,72,68,48,44,
32,12,0,120,120,0,12,32,44,48,68,72,84,104,10,108,164,140,136,27,132,59,132,
2,15,132,1,2,132,119,115,111,184,1,3,178,116,112,108,0,47,51,51,237,50,50,
47,95,93,93,51,51,51,18,23,57,47,47,47,47,47,47,47,47,47,47,93,93,93,93,93,
93,17,51,51,16,237,50,50,17,51,51,51,16,237,50,50,50,17,51,51,16,237,50,50,
17,51,51,51,16,237,50,50,50,17,51,51,16,237,50,50,17,51,51,51,16,237,50,50,
50,17,51,51,16,237,50,50,17,51,51,51,16,237,50,50,50,17,51,51,16,237,50,50,
17,51,51,51,16,237,50,50,50,16,237,50,50,50,1,47,95,94,93,51,51,51,51,51,
237,50,50,50,50,50,17,51,47,51,51,51,51,51,18,23,57,47,47,47,47,47,17,51,
51,51,51,51,16,237,50,50,50,50,50,17,51,51,51,51,51,16,237,50,50,50,50,50,
17,51,51,51,51,51,16,237,50,50,50,50,50,17,51,51,51,51,51,16,237,50,50,50,
50,50,17,51,51,51,51,51,16,237,50,50,50,50,50,16,237,50,50,50,50,50,49,48,
19,51,21,35,37,51,21,35,37,51,21,35,5,51,21,35,37,51,21,35,37,51,21,35,7,
51,21,35,37,51,21,35,37,51,21,35,5,51,21,35,37,51,21,35,37,51,21,35,7,51,
21,35,37,51,21,35,37,51,21,35,23,51,21,35,37,51,21,35,37,51,21,35,7,51,21,
35,37,51,21,35,37,51,21,35,5,51,21,35,37,51,21,35,37,51,21,35,7,51,21,35,
37,51,21,35,37,51,21,35,23,51,21,35,37,51,21,35,37,51,21,35,1,51,21,35,37,
51,21,35,37,51,21,35,1,51,21,35,37,51,21,35,37,51,21,35,1,51,21,35,17,51,
21,35,17,51,21,35,17,51,21,35,17,51,21,35,17,51,21,35,103,104,104,1,158,104,
104,1,160,103,103,253,145,104,104,1,159,104,104,1,159,104,104,207,103,103,
254,96,104,104,254,98,104,104,4,13,104,104,254,97,104,104,254,97,104,104,
207,104,104,1,158,104,104,1,160,103,103,207,104,104,254,97,104,104,254,97,
104,104,207,104,104,1,158,104,104,1,160,103,103,253,145,104,104,1,159,104,
104,1,159,104,104,207,103,103,254,96,104,104,254,98,104,104,207,104,104,1,
159,104,104,1,159,104,104,252,194,104,104,1,159,104,104,1,159,104,104,251,
243,104,104,1,158,104,104,1,160,103,103,1,158,104,104,104,104,104,104,104,
104,104,104,104,104,5,34,98,98,98,98,98,97,96,96,96,96,96,96,96,96,96,96,
96,99,96,96,96,96,96,96,96,96,96,96,96,99,96,96,96,96,96,96,97,97,97,97,97,
98,94,94,94,94,94,98,97,97,97,97,97,96,96,96,96,96,96,7,237,98,98,98,98,98,
1,35,96,96,96,96,96,254,223,98,254,223,96,254,221,96,254,221,97,254,222,97,
7,238,96,0,0,0,0,84,0,0,253,245,5,171,6,163,0,3,0,7,0,11,0,15,0,19,0,23,0,
27,0,31,0,35,0,39,0,43,0,47,0,51,0,55,0,59,0,63,0,67,0,71,0,75,0,79,0,83,
0,87,0,91,0,95,0,99,0,103,0,107,0,111,0,115,0,119,0,123,0,127,0,131,0,135,
0,139,0,143,0,147,0,151,0,155,0,159,0,163,0,167,0,171,0,175,0,179,0,183,0,
187,0,191,0,195,0,199,0,203,0,207,0,211,0,215,0,219,0,223,0,227,0,231,0,235,
0,239,0,243,0,247,0,251,0,255,1,3,1,7,1,11,1,15,1,19,1,23,1,27,1,31,1,35,
1,39,1,43,1,47,1,51,1,55,1,59,1,63,1,67,1,71,1,75,1,79,0,0,19,51,21,35,55,
51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,55,51,
21,35,55,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,55,51,21,
35,55,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,55,51,21,35,
55,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,55,51,21,35,55,
51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,37,51,21,35,55,51,
21,35,55,51,21,35,55,51,21,35,37,51,21,35,5,51,21,35,39,51,21,35,39,51,21,
35,39,51,21,35,39,51,21,35,39,51,21,35,7,51,21,35,55,51,21,35,55,51,21,35,
55,51,21,35,55,51,21,35,55,51,21,35,23,51,21,35,39,51,21,35,39,51,21,35,39,
51,21,35,39,51,21,35,39,51,21,35,7,51,21,35,55,51,21,35,55,51,21,35,55,51,
21,35,55,51,21,35,55,51,21,35,1,51,21,35,55,51,21,35,55,51,21,35,55,51,21,
35,55,51,21,35,55,51,21,35,1,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,
55,51,21,35,55,51,21,35,19,51,21,35,7,51,21,35,23,51,21,35,7,51,21,35,23,
51,21,35,7,51,21,35,23,51,21,35,7,51,21,35,23,51,21,35,7,51,21,35,17,51,21,
35,19,51,21,35,103,104,104,207,104,104,207,104,104,208,104,104,208,104,104,
207,104,104,251,140,103,103,207,103,103,207,103,103,207,104,104,208,104,104,
208,103,103,252,90,104,104,207,104,104,207,104,104,208,104,104,208,104,104,
207,104,104,251,140,103,103,207,103,103,207,103,103,207,104,104,208,104,104,
208,103,103,252,90,104,104,207,104,104,207,104,104,208,104,104,208,104,104,
207,104,104,251,140,103,103,1,158,103,103,207,104,104,208,104,104,208,103,
103,252,194,103,103,3,165,104,104,207,104,104,208,104,104,208,104,104,207,
104,104,207,104,104,103,103,103,207,103,103,207,103,103,207,104,104,208,104,
104,208,103,103,103,104,104,207,104,104,208,104,104,208,104,104,207,104,104,
207,104,104,103,103,103,207,103,103,207,103,103,207,104,104,208,104,104,208,
103,103,251,243,103,103,207,103,103,207,103,103,207,104,104,208,104,104,208,
103,103,252,90,104,104,207,104,104,207,104,104,208,104,104,208,104,104,207,
104,104,207,104,104,103,103,103,103,104,104,103,103,103,103,104,104,103,103,
103,103,104,104,103,103,103,103,104,104,103,103,103,103,103,103,104,104,5,
34,98,98,98,98,98,98,98,98,98,98,98,97,96,96,96,96,96,96,96,96,96,96,96,96,
96,96,96,96,96,96,96,96,96,96,96,99,96,96,96,96,96,96,96,96,96,96,96,96,96,
96,96,96,96,96,96,96,96,96,96,99,96,96,96,96,96,96,96,96,96,96,96,96,97,97,
97,97,97,97,97,97,97,97,97,98,94,94,94,94,94,94,94,94,94,94,94,98,97,97,97,
97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96,96,96,96,7,237,98,98,98,
98,98,98,98,98,98,98,98,1,35,96,96,96,96,96,96,96,96,96,96,96,254,223,98,
97,96,96,96,99,96,96,96,99,96,96,97,98,94,98,97,96,96,7,237,98,1,35,96,0,
0,67,0,0,253,147,5,213,6,163,0,73,0,77,0,81,0,85,0,89,0,93,0,97,0,101,0,105,
0,109,0,113,0,117,0,121,0,125,0,129,0,133,0,137,0,141,0,145,0,149,0,153,0,
157,0,161,0,165,0,169,0,173,0,177,0,181,0,185,0,189,0,193,0,197,0,201,0,205,
0,209,0,213,0,217,0,221,0,225,0,229,0,233,0,237,0,241,0,245,0,249,0,253,1,
1,1,5,1,9,1,13,1,17,1,21,1,25,1,29,1,33,1,37,1,41,1,45,1,49,1,53,1,57,1,61,
1,65,1,69,1,73,1,77,1,81,0,0,1,33,17,51,53,35,17,51,53,35,17,51,53,35,17,
51,53,35,17,51,53,35,17,51,53,51,21,51,53,51,21,51,53,51,21,51,53,51,21,51,
53,51,21,51,53,51,21,51,53,51,21,35,21,51,17,35,21,51,17,35,21,51,17,35,21,
51,17,35,21,51,17,35,21,51,1,21,51,53,51,21,51,53,51,21,51,53,51,21,51,53,
23,35,21,51,39,35,21,51,39,35,21,51,39,35,21,51,7,21,51,53,51,21,51,53,51,
21,51,53,51,21,51,53,5,35,21,51,55,21,51,53,51,21,51,53,51,21,51,53,5,21,
51,53,33,21,51,53,7,53,35,21,37,21,51,53,19,53,35,21,35,53,35,21,35,53,35,
21,35,53,35,21,7,21,51,53,51,21,51,53,51,21,51,53,51,21,51,53,19,53,35,21,
35,53,35,21,35,53,35,21,35,53,35,21,7,21,51,53,51,21,51,53,51,21,51,53,51,
21,51,53,19,35,21,51,39,35,21,51,39,35,21,51,39,35,21,51,1,35,21,51,39,35,
21,51,39,35,21,51,39,35,21,51,1,21,51,53,51,21,51,53,23,35,21,51,39,35,21,
51,7,21,51,53,51,21,51,53,7,35,21,51,55,21,51,53,5,21,51,53,23,53,35,21,23,
53,35,21,35,53,35,21,7,21,51,53,51,21,51,53,19,53,35,21,35,53,35,21,7,21,
51,53,51,21,51,53,19,35,21,51,39,35,21,51,19,35,21,51,39,35,21,51,5,213,250,
43,106,106,106,106,106,106,106,106,106,106,106,107,106,107,106,107,107,107,
107,107,106,107,106,107,107,107,107,107,107,107,107,107,107,107,107,107,250,
149,107,106,107,106,107,107,107,107,107,107,214,107,107,214,106,106,213,106,
106,213,107,106,107,106,107,107,107,253,234,106,106,107,106,107,107,107,107,
252,170,107,1,63,107,213,107,1,171,107,107,107,107,107,107,106,107,106,107,
107,106,107,106,107,107,107,107,107,107,107,107,106,107,106,107,107,106,107,
106,107,107,107,107,107,107,214,107,107,214,106,106,213,106,106,2,22,107,
107,214,107,107,213,107,107,213,107,107,2,235,107,106,107,106,106,106,213,
106,106,213,107,106,107,107,106,106,107,106,254,86,107,213,107,213,106,107,
106,107,107,106,107,106,106,107,106,107,107,106,107,106,106,106,213,106,106,
107,107,107,213,107,107,253,147,1,34,97,1,34,97,1,35,96,1,33,98,1,33,98,1,
33,96,96,96,96,96,96,96,96,96,96,96,96,96,193,98,254,223,96,254,221,96,254,
221,96,254,221,94,254,221,96,6,106,96,96,96,96,96,96,96,96,192,98,98,98,98,
98,98,98,97,96,96,96,96,96,96,96,96,192,96,96,96,96,96,96,96,96,195,96,96,
96,96,96,96,96,96,96,96,254,223,97,97,97,97,97,97,97,97,98,94,94,94,94,94,
94,94,94,254,223,97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96,6,205,
98,98,98,98,98,98,98,1,34,98,98,98,98,98,98,98,254,223,96,96,96,96,192,98,
98,98,97,96,96,96,96,192,96,96,96,96,195,96,96,96,96,96,193,97,97,97,97,98,
94,94,94,94,254,223,97,97,97,97,96,96,96,96,96,6,205,98,98,98,1,34,98,98,
98,0,0,0,0,1,0,123,0,117,4,90,4,84,0,3,0,0,19,33,17,33,123,3,223,252,33,4,
84,252,33,0,0,2,0,6,0,0,4,207,4,201,0,3,0,7,0,21,183,7,1,4,0,4,0,5,3,0,47,
205,221,205,1,47,205,221,205,49,48,19,33,17,33,19,17,33,17,6,4,201,251,55,
76,4,49,4,201,251,55,4,125,251,207,4,49,0,0,1,0,109,1,127,2,105,3,123,0,3,
0,26,64,13,3,48,2,1,15,2,31,2,2,8,2,1,2,0,47,205,1,47,94,93,93,205,49,48,
1,33,17,33,2,105,254,4,1,252,1,127,1,252,0,0,0,2,0,109,1,127,2,105,3,123,
0,3,0,7,0,34,64,17,5,3,6,48,2,1,15,2,31,2,2,8,2,7,1,6,2,0,47,205,221,205,
1,47,94,93,93,205,221,205,49,48,1,33,17,33,3,17,33,17,2,105,254,4,1,252,76,
254,156,1,127,1,252,254,80,1,98,254,158,0,0,0,0,1,0,0,0,0,8,0,2,104,0,3,0,
0,17,33,17,33,8,0,248,0,2,104,253,152,0,0,0,1,1,158,0,0,6,76,4,174,0,2,0,
0,33,9,1,1,158,2,88,2,86,4,174,251,82,0,0,1,1,145,255,229,6,90,4,172,0,2,
0,0,9,2,1,145,4,201,251,55,4,172,253,158,253,155,0,1,1,158,255,229,6,76,4,
147,0,2,0,0,9,2,6,76,253,170,253,168,4,147,251,82,4,174,0,1,1,145,255,229,
6,90,4,172,0,2,0,0,1,17,1,6,90,251,55,4,172,251,57,2,101,0,0,2,0,8,0,0,3,
238,5,160,0,5,0,9,0,37,64,20,134,7,1,9,0,5,16,5,2,5,7,31,2,1,2,6,3,4,8,1,
0,47,51,63,51,1,47,93,51,47,93,51,49,48,93,33,35,9,1,51,9,4,2,35,82,254,55,
1,201,82,1,203,254,14,254,158,1,98,1,96,2,207,2,209,253,49,2,53,253,203,253,
194,2,62,0,2,0,167,0,162,4,46,4,41,0,19,0,39,0,46,64,28,68,37,84,37,2,75,
33,91,33,2,75,27,91,27,2,68,23,84,23,2,30,10,20,0,25,15,35,5,0,47,205,220,
205,1,47,205,220,205,49,48,93,93,93,93,19,52,62,2,51,50,30,2,21,20,14,2,35,
34,46,2,55,20,30,2,51,50,62,2,53,52,46,2,35,34,14,2,167,70,122,164,94,94,
165,123,71,71,123,165,94,94,164,122,70,86,57,98,133,76,76,134,99,58,58,99,
134,76,76,133,98,57,2,100,94,165,123,71,71,123,165,94,94,164,122,70,70,122,
164,94,76,132,99,57,57,99,132,76,76,134,99,58,58,99,134,0,0,0,0,1,0,178,0,
137,4,35,3,250,0,23,0,17,182,8,16,12,15,0,1,0,0,47,93,205,1,47,205,49,48,
1,50,23,30,1,23,30,1,21,20,7,6,35,34,39,38,53,52,54,55,62,1,55,54,2,106,110,
107,53,82,29,29,31,129,129,183,182,129,129,30,29,29,83,52,108,3,250,57,28,
82,52,54,110,57,183,129,129,129,129,183,58,109,54,52,82,28,57,0,0,0,2,0,41,
0,0,4,172,4,131,0,3,0,23,0,21,183,14,2,4,1,19,1,9,0,0,47,205,221,205,1,47,
205,221,205,49,48,51,17,33,17,1,20,30,2,51,50,62,2,53,52,46,2,35,34,14,2,
41,4,131,252,4,69,120,160,91,91,161,120,69,69,120,161,91,91,160,120,69,4,
131,251,125,2,65,91,160,120,69,69,120,160,91,91,161,120,69,69,120,161,0,0,
3,0,41,0,0,4,172,4,131,0,3,0,23,0,43,0,34,64,14,4,24,1,14,34,2,1,19,29,0,
9,39,1,0,0,47,221,221,206,16,221,206,1,47,221,221,206,16,221,206,49,48,51,
17,33,17,1,52,62,2,51,50,30,2,21,20,14,2,35,34,46,2,39,20,30,2,51,50,62,2,
53,52,46,2,35,34,14,2,41,4,131,252,81,58,99,133,75,75,133,99,58,58,99,133,
75,75,133,99,58,77,69,120,160,91,91,161,120,69,69,120,161,91,91,160,120,69,
4,131,251,125,2,65,75,133,99,58,58,99,133,75,75,133,99,58,58,99,133,75,91,
160,120,69,69,120,160,91,91,161,120,69,69,120,161,0,0,2,0,115,1,133,2,99,
3,117,0,18,0,34,0,21,183,19,0,27,11,31,6,23,15,0,47,205,220,205,1,47,205,
220,205,49,48,1,20,6,7,14,1,35,34,39,46,1,53,52,55,54,51,50,23,22,7,52,39,
38,35,34,7,6,21,20,23,22,51,50,55,54,2,99,37,37,37,86,51,101,75,35,37,72,
74,102,103,71,74,76,51,51,70,70,51,51,51,49,72,72,49,51,2,125,53,86,37,35,
37,72,37,86,53,102,72,74,74,71,103,70,51,51,51,51,70,69,54,49,49,54,0,0,0,
5,1,177,255,229,6,121,4,172,0,17,0,33,0,45,0,57,0,68,0,147,64,93,20,32,36,
32,116,32,3,20,28,36,28,116,28,3,27,24,43,24,123,24,3,27,20,43,20,123,20,
3,68,34,40,63,52,46,40,46,40,46,8,18,31,0,1,0,26,8,49,37,43,55,43,62,58,104,
58,1,89,58,1,71,58,1,25,58,1,58,60,65,15,43,95,43,111,43,3,8,65,64,9,14,72,
43,65,43,65,4,22,15,13,1,13,30,4,0,47,205,220,93,205,18,57,57,47,47,43,94,
93,16,205,51,93,93,93,93,17,51,17,51,16,205,50,1,47,205,220,93,205,18,57,
57,47,47,16,205,51,16,205,51,49,48,0,93,93,93,93,1,20,7,6,35,34,39,38,53,
52,54,55,54,51,50,23,30,1,7,52,39,38,35,34,7,6,21,20,23,22,51,50,55,54,1,
20,6,35,34,38,53,52,54,51,50,22,5,20,6,35,34,38,53,52,54,51,50,22,1,22,51,
50,55,23,6,35,34,38,39,6,121,180,179,253,253,179,180,90,90,178,254,254,178,
90,90,90,153,151,218,218,151,153,153,152,217,217,152,153,253,90,46,32,32,
45,45,32,32,46,1,211,44,32,32,47,47,32,32,44,253,234,76,147,145,76,62,98,
185,94,141,48,2,72,254,178,179,179,178,254,128,215,91,178,178,91,215,128,
217,153,154,154,153,217,216,153,154,154,153,1,87,32,46,46,32,32,45,45,32,
32,46,46,32,32,45,45,254,191,137,137,35,186,95,91,0,0,4,1,209,255,229,6,153,
4,172,0,17,0,29,0,41,0,52,0,96,64,55,42,18,24,47,36,30,24,30,24,30,0,8,39,
27,21,33,21,48,52,104,52,1,89,52,1,75,52,1,61,52,1,52,50,45,15,21,31,21,95,
21,111,21,4,8,79,45,95,45,2,21,45,21,45,13,4,0,47,204,57,57,47,47,93,94,93,
16,206,51,93,93,93,93,17,51,17,51,16,206,50,1,47,205,57,57,47,47,16,206,51,
16,206,51,49,48,1,20,7,6,35,34,39,38,53,52,54,55,54,51,50,23,30,1,5,52,38,
35,34,6,21,20,22,51,50,54,37,52,38,35,34,6,21,20,22,51,50,54,1,30,1,51,50,
55,39,6,35,34,39,6,153,180,179,253,253,179,180,90,90,178,254,254,178,90,90,
253,0,46,32,32,45,45,32,32,46,1,211,44,32,32,47,47,32,32,44,253,174,48,141,
94,185,98,62,76,145,147,76,2,72,254,178,179,179,178,254,128,215,91,178,178,
91,215,1,32,45,45,32,32,46,46,32,32,45,45,32,32,46,46,254,220,91,95,186,35,
137,137,0,2,1,70,255,115,6,14,4,59,0,51,0,70,0,139,185,0,47,255,240,64,13,
11,14,72,52,46,1,52,36,1,119,35,1,35,184,255,240,64,77,11,14,72,21,16,11,
14,72,59,20,1,59,9,1,8,16,11,14,72,59,47,1,52,35,1,52,21,1,59,8,1,66,143,
13,223,13,2,112,13,1,63,13,1,32,13,1,13,57,43,62,128,31,208,31,224,31,3,127,
31,1,48,31,1,47,31,1,31,52,15,51,63,51,79,51,3,8,51,0,47,94,93,205,220,93,
93,93,93,205,1,47,205,220,93,93,93,93,205,49,48,0,93,93,93,93,1,43,93,93,
43,43,93,93,93,43,1,51,21,30,3,23,55,23,7,30,1,23,51,21,35,14,1,7,23,7,39,
14,1,7,14,1,7,21,35,53,46,1,39,7,39,55,46,1,39,35,53,51,54,55,39,55,23,62,
1,55,23,34,6,7,6,21,20,23,30,1,51,50,55,54,53,52,39,46,1,3,137,66,32,57,54,
53,29,186,45,184,45,44,3,215,215,8,44,40,184,49,182,31,55,23,24,58,34,66,
63,110,48,188,43,182,40,46,8,215,215,12,80,180,40,189,57,112,54,31,69,117,
48,98,98,48,117,69,139,96,99,99,49,117,4,59,217,3,12,21,32,22,182,45,184,
59,113,57,62,60,110,51,188,43,182,23,32,11,9,12,5,217,217,9,46,35,180,45,
184,51,111,63,62,128,95,184,49,182,40,44,6,61,50,48,100,136,137,98,50,47,
97,97,138,137,99,48,50,0,0,0,2,1,218,0,80,4,38,4,129,0,28,0,47,0,98,64,62,
22,18,25,0,0,5,15,43,1,239,43,255,43,2,43,15,14,1,14,0,34,1,224,34,240,34,
2,34,5,22,25,19,0,28,16,28,80,28,3,28,0,39,1,240,39,1,39,18,0,0,128,0,2,8,
0,29,64,37,40,72,29,10,0,47,205,43,220,94,93,50,205,113,114,47,93,51,205,
50,1,47,205,113,114,220,93,205,113,114,17,57,47,51,205,50,49,48,1,46,1,39,
38,53,52,55,62,1,51,50,23,22,21,20,7,6,7,21,33,21,33,17,35,17,33,53,33,19,
34,7,14,1,21,20,22,23,22,51,50,55,54,53,52,38,39,38,2,220,55,90,35,71,83,
44,101,60,118,83,86,72,72,106,1,0,255,0,74,254,254,1,2,35,83,62,29,31,31,
29,62,83,87,59,61,30,29,62,2,66,8,46,42,80,108,122,83,43,43,86,83,122,109,
81,82,12,166,70,254,250,1,6,70,2,145,59,31,71,44,43,71,31,62,62,61,84,44,
71,31,59,0,2,1,81,0,250,4,175,4,129,0,65,0,81,0,70,64,40,49,65,59,15,78,1,
78,63,32,1,32,15,51,1,51,0,70,1,70,59,65,49,63,74,0,55,128,55,2,55,66,144,
20,1,20,15,63,1,8,63,0,47,94,93,204,93,205,220,93,205,18,57,57,1,47,205,114,
220,93,204,93,205,114,18,57,57,49,48,1,46,1,39,46,1,39,46,1,53,52,55,62,1,
51,50,22,23,30,1,51,50,54,55,54,51,50,21,20,7,14,1,21,20,22,23,30,1,21,20,
6,7,6,35,34,39,46,1,39,7,22,21,20,7,6,35,34,39,38,53,52,55,54,51,50,23,7,
34,7,6,21,20,23,22,51,50,55,54,53,52,39,38,3,255,17,54,37,28,40,14,5,3,6,
3,6,5,5,15,13,32,63,32,46,64,19,36,13,16,6,9,7,4,8,2,2,2,2,9,5,21,20,22,31,
11,237,84,86,87,118,118,87,84,84,85,122,71,83,154,90,62,61,61,64,88,89,60,
62,62,60,4,0,5,18,14,11,24,14,3,10,5,8,9,2,2,2,2,8,9,7,6,12,14,9,18,34,79,
45,31,64,34,11,16,5,5,7,3,6,39,42,82,42,238,81,109,125,86,88,84,84,117,117,
87,86,43,32,62,61,88,91,61,61,61,62,90,87,62,62,0,0,1,0,59,0,0,4,5,4,207,
0,47,0,40,64,25,38,32,10,48,10,96,10,112,10,4,10,14,34,64,8,11,72,34,23,79,
0,95,0,2,0,0,47,93,47,47,43,51,1,47,93,47,49,48,1,30,1,23,30,1,23,22,23,22,
21,20,7,6,35,34,39,22,23,30,1,31,1,33,55,50,55,62,3,39,14,1,35,34,39,38,53,
52,55,62,1,55,62,1,55,54,2,32,14,40,26,28,95,69,141,35,37,63,66,88,157,99,
3,36,38,163,137,8,252,232,6,125,86,43,66,44,20,1,45,132,83,90,66,63,30,23,
78,57,69,110,38,56,4,207,54,95,44,43,105,63,126,66,67,70,95,63,66,191,147,
87,86,99,9,37,37,49,25,69,91,119,75,96,95,66,63,91,74,59,42,85,47,59,113,
57,83,0,0,0,0,1,0,60,0,0,5,4,4,199,0,75,0,47,64,24,57,77,63,23,1,23,52,61,
67,13,47,30,4,18,31,18,1,27,18,27,18,1,41,1,0,47,47,18,57,57,47,47,93,18,
23,57,50,51,1,47,93,16,206,49,48,41,1,55,62,1,55,62,1,55,54,53,52,38,53,6,
7,14,1,35,34,38,39,38,53,52,55,54,51,50,22,23,46,1,39,46,1,53,52,55,62,1,
51,50,23,22,21,20,7,54,55,62,1,51,50,22,23,22,21,20,7,6,35,34,38,39,46,1,
39,30,1,23,30,1,23,22,23,4,70,252,182,8,84,108,27,41,64,26,52,2,58,90,43,
88,45,59,97,41,79,73,73,93,31,80,51,20,27,8,5,6,78,40,97,60,116,80,80,69,
84,16,14,30,17,51,86,36,73,80,80,112,62,132,50,17,43,26,3,23,23,22,67,46,
61,159,35,17,33,17,25,75,50,100,109,8,22,17,121,59,28,30,42,38,83,116,115,
79,80,25,26,34,52,19,17,38,20,115,78,38,40,80,78,109,86,98,40,3,5,3,37,41,
76,116,118,83,80,60,51,19,61,45,81,125,46,45,76,31,39,30,0,1,0,102,255,233,
4,90,4,121,0,39,0,38,64,23,18,2,1,4,2,1,8,29,41,16,12,64,12,80,12,112,12,
128,12,5,12,16,0,0,47,47,1,47,93,16,206,49,48,94,93,93,5,46,1,39,46,1,39,
46,1,39,46,1,53,52,55,54,51,50,23,30,1,23,62,1,51,50,22,23,22,21,20,7,14,
1,7,14,1,7,14,1,2,98,14,42,26,28,103,76,56,69,14,43,37,68,70,102,98,78,28,
47,17,34,142,88,50,85,35,70,41,20,78,60,75,108,32,31,44,23,56,101,48,50,147,
102,76,93,22,65,106,56,103,71,70,72,28,80,54,119,117,36,34,70,94,86,88,45,
119,75,96,152,55,54,110,0,0,0,0,1,0,66,255,231,3,210,4,199,0,26,0,18,183,
48,12,1,12,75,21,1,21,0,25,47,93,1,47,93,49,48,1,30,1,23,30,1,23,14,1,7,14,
1,7,46,1,39,46,1,39,46,1,39,62,1,55,62,1,2,7,45,113,69,69,116,47,39,120,83,
69,106,40,13,35,22,38,98,60,14,94,81,50,128,80,59,96,4,199,78,165,93,93,141,
53,40,150,111,93,159,72,25,58,32,57,135,80,20,119,99,59,160,107,77,148,0,
0,1,0,196,0,29,3,59,4,129,0,33,0,48,64,25,2,19,33,13,64,79,6,95,6,111,6,3,
6,128,27,33,18,10,10,47,0,1,0,31,24,0,47,205,204,93,57,47,57,1,47,205,26,
220,93,26,205,16,205,50,49,48,1,51,21,23,30,1,21,20,6,7,35,62,1,53,52,38,
39,38,39,17,20,6,7,6,35,34,38,53,52,55,54,51,50,23,1,233,76,153,51,58,48,
46,47,29,28,28,29,57,64,37,37,72,108,57,58,60,63,80,44,46,4,129,100,193,69,
163,85,78,134,59,65,124,59,60,99,40,81,9,254,6,63,98,38,75,54,46,73,60,60,
19,0,2,1,16,255,213,4,239,4,135,0,34,0,38,0,108,64,61,35,32,64,18,26,128,
36,15,64,111,0,1,0,128,15,9,1,9,9,0,26,1,26,17,35,86,35,1,67,35,1,35,16,36,
54,36,1,37,36,1,20,36,1,3,36,1,8,36,34,38,33,88,33,1,33,37,34,30,23,13,6,
0,47,205,47,205,47,51,51,93,17,51,17,51,94,93,93,93,93,17,51,51,93,93,17,
51,1,47,93,51,47,93,26,221,93,26,205,50,26,16,221,26,205,51,49,48,1,20,6,
7,14,1,35,34,38,53,52,55,54,51,50,23,17,5,17,20,6,7,6,35,34,38,53,52,55,54,
51,50,23,17,37,1,37,53,5,4,239,36,38,37,88,51,57,57,57,62,81,48,42,253,218,
37,35,74,106,57,58,59,60,84,45,45,2,186,253,144,2,38,253,218,1,68,63,101,
35,37,39,54,47,76,57,59,18,1,192,149,254,118,62,98,38,74,53,45,76,57,60,19,
2,240,178,254,103,149,117,152,0,0,0,3,0,29,0,0,3,118,5,204,0,27,0,31,0,35,
0,100,179,67,10,1,10,184,255,224,64,59,8,12,72,31,35,70,28,47,32,143,32,207,
32,3,31,32,79,32,111,32,143,32,4,32,79,16,95,16,2,16,16,1,70,144,2,1,111,
2,1,2,34,15,31,83,30,0,19,80,12,0,0,4,80,25,5,15,32,1,21,0,63,51,63,51,237,
50,63,237,63,237,63,1,47,93,93,237,50,47,93,47,93,113,51,237,50,49,48,0,43,
93,1,17,35,17,35,53,51,53,52,62,2,51,50,22,23,21,46,1,35,34,14,2,29,1,51,
21,19,53,51,21,3,17,51,17,1,105,180,152,152,22,59,102,81,32,69,26,17,45,18,
40,51,29,11,211,134,180,180,180,3,183,252,73,3,183,131,122,59,101,75,43,6,
6,137,3,5,22,41,60,39,97,131,1,105,172,172,250,224,4,58,251,198,0,0,0,0,2,
0,29,0,0,3,119,5,204,0,27,0,31,0,90,179,67,10,1,10,184,255,224,64,53,8,12,
72,31,70,47,28,143,28,207,28,3,31,28,79,28,111,28,143,28,4,28,79,16,95,16,
2,16,16,1,70,144,2,1,111,2,1,2,30,0,19,80,12,0,0,4,80,25,5,15,28,1,21,0,63,
51,63,51,237,50,63,237,63,1,47,93,93,237,50,47,93,47,93,113,237,49,48,0,43,
93,1,17,35,17,35,53,51,53,52,62,2,51,50,22,23,21,46,1,35,34,14,2,29,1,51,
21,19,17,51,17,1,105,180,152,152,22,59,102,81,32,69,26,17,45,18,40,51,29,
11,211,135,180,3,183,252,73,3,183,131,122,59,101,75,43,6,6,137,3,5,22,41,
60,39,97,131,252,73,5,204,250,52,0,0,1,0,119,254,78,1,227,255,170,0,28,0,
75,185,0,2,255,232,179,9,17,72,27,184,255,224,64,40,9,17,72,22,22,8,16,131,
15,0,1,95,0,1,0,8,19,140,63,23,79,23,2,23,11,140,0,5,16,5,32,5,80,5,96,5,
112,5,6,5,0,47,93,237,47,93,237,1,47,221,93,113,237,18,57,47,49,48,43,43,
5,20,14,2,35,34,38,39,53,22,51,50,62,2,53,52,38,35,42,1,7,55,51,50,30,2,1,
227,30,65,104,75,20,45,25,49,37,41,56,35,15,61,72,14,29,14,31,62,52,84,60,
32,253,41,67,48,25,1,3,98,6,12,21,30,18,37,40,2,96,18,41,63,0,0,0,255,255,
0,243,1,190,1,182,2,154,17,6,0,119,56,0,0,18,64,11,0,127,0,1,111,0,1,95,0,
1,0,17,93,93,93,53,0,1,0,127,254,78,1,72,255,158,0,10,0,75,185,0,5,255,192,
179,9,17,72,2,184,255,192,64,28,9,17,72,7,151,0,150,4,9,8,146,16,3,32,3,2,
0,3,96,3,160,3,176,3,192,3,5,3,184,255,192,64,10,30,33,72,3,0,9,16,9,2,9,
0,47,93,204,43,93,113,237,1,47,51,253,237,49,48,43,43,5,20,6,7,35,62,1,53,
35,53,51,1,72,44,40,117,45,49,88,195,193,87,107,47,48,86,46,156,0,0,0,0,2,
0,14,2,51,2,150,5,129,0,10,0,23,0,108,64,74,86,10,1,86,9,1,121,6,137,6,2,
17,175,5,191,5,2,5,64,29,60,72,5,64,24,27,72,5,8,1,224,18,6,16,2,1,48,2,1,
64,2,144,2,2,2,0,4,229,8,5,95,17,111,17,127,17,3,15,17,31,17,127,17,143,17,
4,17,17,1,11,6,220,1,223,0,63,63,51,18,57,47,93,113,51,51,237,50,1,47,93,
113,114,51,51,237,50,47,43,43,93,51,49,48,93,114,114,1,21,35,53,33,53,1,51,
17,51,21,3,14,3,7,3,33,17,60,2,54,2,39,131,254,106,1,130,151,111,240,7,22,
24,22,7,199,1,23,1,2,229,178,178,111,2,45,253,213,113,2,23,13,37,39,35,11,
254,225,1,33,14,38,38,34,0,0,0,0,1,0,53,2,40,2,124,5,129,0,38,0,134,64,37,
37,36,53,36,69,36,3,3,24,9,13,72,19,34,1,4,34,1,3,31,30,25,224,139,27,1,6,
27,10,192,26,208,26,224,26,3,26,184,255,192,64,53,16,19,72,26,29,0,225,32,
19,96,19,2,32,19,96,19,160,19,224,19,4,19,22,228,34,34,16,30,229,27,220,68,
11,84,11,100,11,3,53,11,1,6,11,22,11,38,11,3,11,16,228,5,221,0,63,237,50,
93,93,93,63,237,18,57,47,237,1,47,93,113,237,50,47,43,93,51,51,95,113,237,
50,50,0,95,93,93,49,48,43,93,1,20,14,2,35,34,46,2,39,55,30,3,51,50,54,53,
52,38,35,34,6,7,35,19,33,21,33,7,62,1,51,50,30,2,2,124,38,73,108,70,66,101,
74,44,9,133,5,24,39,54,36,71,86,81,75,51,77,23,129,33,1,250,254,114,19,29,
91,54,67,103,69,36,3,67,65,104,74,40,33,59,81,48,15,27,47,36,21,85,93,81,
85,37,23,1,212,113,245,26,33,39,71,102,0,0,0,1,0,43,2,52,2,120,5,129,0,14,
0,54,64,33,5,224,6,6,0,175,12,191,12,2,12,11,96,0,1,191,0,207,0,255,0,3,96,
0,1,0,0,12,229,13,220,5,223,0,63,63,237,50,1,47,93,93,113,51,47,93,17,57,
47,237,49,48,1,14,3,21,35,52,62,2,55,33,53,33,2,120,64,106,77,43,133,47,80,
107,60,254,52,2,77,5,28,97,176,176,187,108,102,188,179,175,88,113,0,3,0,45,
2,40,2,130,5,142,0,19,0,39,0,81,0,138,185,0,68,255,232,179,11,15,72,64,184,
255,232,64,82,11,15,72,47,24,9,13,72,43,24,9,13,72,5,15,21,15,2,76,55,71,
10,226,72,61,1,61,61,30,226,224,50,1,191,50,1,50,0,226,70,71,1,71,71,40,226,
32,20,96,20,2,32,20,96,20,160,20,224,20,4,20,76,56,25,228,15,15,35,26,5,1,
11,5,1,5,228,66,222,35,228,45,221,0,63,237,63,237,93,93,18,57,47,237,57,57,
1,47,93,113,237,50,47,113,237,47,93,93,237,51,47,113,237,18,57,57,0,93,49,
48,43,43,43,43,1,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,19,52,46,2,35,34,
14,2,21,20,30,2,51,50,62,2,55,20,14,2,35,34,46,2,53,52,62,2,55,53,46,3,53,
52,62,2,51,50,30,2,21,20,14,2,7,21,30,3,1,223,12,31,53,41,39,53,31,13,9,29,
54,45,48,54,27,7,21,13,35,61,49,45,59,36,15,15,36,61,46,46,61,34,14,142,35,
73,113,77,77,113,74,35,29,47,61,32,36,55,38,20,35,70,104,68,72,105,69,33,
20,38,56,36,36,63,46,26,4,169,28,48,34,19,19,34,48,28,23,47,39,25,25,39,48,
254,155,28,52,40,24,24,41,53,28,35,59,42,23,23,42,60,22,54,91,66,37,37,66,
90,54,46,72,52,32,5,3,8,37,52,64,35,45,79,59,34,35,60,79,44,35,63,52,37,7,
3,6,31,52,72,0,1,255,229,4,176,2,195,5,240,0,17,0,62,64,41,117,11,133,11,
2,117,7,133,7,2,12,73,15,13,191,13,239,13,3,13,6,73,64,5,12,5,128,9,142,15,
0,47,0,63,0,127,0,239,0,5,0,0,47,93,237,26,205,50,1,47,26,237,220,93,237,
49,48,0,93,93,1,34,46,2,39,51,30,1,51,50,54,55,51,14,3,1,84,111,141,81,32,
2,164,6,104,93,93,104,6,164,2,32,81,141,4,176,57,91,115,57,103,96,96,103,
57,115,91,57,0,1,0,124,4,28,1,69,5,129,0,10,0,36,64,21,7,151,0,150,4,9,8,
146,80,3,96,3,2,160,3,176,3,2,3,9,3,0,63,204,93,113,237,1,47,51,253,237,49,
48,1,20,6,7,35,62,1,53,35,53,51,1,69,44,40,117,45,49,88,195,5,23,87,117,47,
48,96,46,167,0,0,1,0,130,4,187,1,75,6,32,0,10,0,47,64,30,4,9,150,7,151,10,
7,146,95,3,111,3,2,175,3,191,3,2,3,80,10,1,15,10,63,10,127,10,3,10,0,47,93,
113,205,93,113,237,1,47,237,237,50,49,48,19,52,54,55,51,14,1,21,51,21,35,
130,44,40,117,45,49,88,195,5,37,87,117,47,48,96,46,167,0,0,0,0,1,0,106,5,
250,2,18,6,240,0,5,0,48,64,30,117,3,133,3,2,128,4,1,64,4,1,4,64,1,2,64,16,
20,72,2,128,95,0,1,0,64,9,12,72,0,0,47,43,93,26,205,43,1,47,26,205,93,93,
49,48,93,1,37,53,51,23,21,1,160,254,202,207,217,5,250,217,29,226,20,0,1,0,
72,5,250,1,240,6,240,0,5,0,52,64,34,122,2,138,2,2,64,3,128,3,2,3,64,79,0,
143,0,2,0,2,64,16,20,72,2,128,95,0,1,0,64,9,12,72,0,0,47,43,93,26,205,43,
1,47,93,26,205,93,49,48,93,19,53,55,51,21,5,72,217,207,254,202,5,250,20,226,
29,217,0,0,1,0,0,5,250,2,150,6,254,0,9,0,65,64,14,118,9,134,9,2,120,8,136,
8,2,128,0,1,0,184,255,192,64,25,11,15,72,0,6,4,142,64,8,64,16,19,72,8,128,
6,95,1,1,1,64,9,12,72,1,0,47,43,93,51,26,221,43,26,237,1,47,204,43,93,49,
48,93,93,1,21,35,39,35,7,35,53,55,51,2,150,105,219,2,232,104,234,204,6,14,
20,139,139,20,240,0,0,0,0,1,0,0,5,250,2,150,6,254,0,9,0,65,64,14,118,0,134,
0,2,120,1,136,1,2,128,8,1,8,184,255,192,64,25,11,15,72,8,64,2,7,3,64,16,19,
72,3,128,6,142,95,1,1,1,64,9,12,72,1,0,47,43,93,237,26,205,43,50,1,47,26,
204,43,93,49,48,93,93,1,35,39,53,51,23,51,55,51,21,1,182,204,234,104,232,
2,219,105,5,250,239,21,139,139,21,0,0,0,0,2,0,45,5,250,2,90,6,178,0,3,0,7,
0,35,64,19,3,133,0,7,133,4,1,5,145,0,95,4,1,4,64,9,12,72,4,0,47,43,93,51,
237,50,1,47,237,220,237,49,48,1,53,51,21,33,53,51,21,1,183,163,253,211,165,
5,250,184,184,184,184,0,0,1,255,233,5,250,2,182,7,6,0,27,0,68,181,89,2,105,
2,2,26,184,255,232,64,34,9,15,72,12,24,9,15,72,64,23,1,15,23,1,23,9,22,5,
143,64,14,128,19,143,8,95,0,1,0,64,9,12,72,0,0,47,43,93,50,237,26,221,26,
237,51,1,47,204,93,93,49,48,43,43,0,93,1,34,46,2,35,34,6,7,35,62,3,51,50,
30,2,51,50,54,55,51,14,3,1,236,42,84,78,71,31,55,54,9,91,5,20,45,74,59,44,
84,78,69,30,54,55,8,92,5,20,43,74,5,250,37,45,37,62,57,45,95,78,50,37,45,
37,63,56,44,95,78,51,0,0,0,0,2,0,32,5,250,3,15,6,241,0,5,0,11,0,88,64,60,
154,8,170,8,2,154,2,170,2,2,102,10,1,98,4,1,98,3,1,10,159,7,1,15,7,31,7,127,
7,223,7,4,7,7,4,64,0,64,9,31,72,0,8,2,64,16,20,72,2,128,6,95,0,1,0,64,9,12,
72,0,0,47,43,93,50,26,205,43,50,1,47,43,26,205,220,94,93,113,205,49,48,93,
93,93,93,93,19,53,55,51,21,5,51,53,55,51,21,5,32,197,207,254,202,253,197,
207,254,202,5,250,20,227,29,218,20,227,29,218,0,1,255,232,5,250,2,130,6,243,
0,17,0,55,64,32,4,11,1,4,7,1,17,15,19,1,100,13,64,5,12,5,64,16,20,72,5,128,
9,95,0,1,0,64,9,12,72,0,0,47,43,93,205,26,205,43,50,1,47,26,204,94,93,49,
48,0,94,93,93,1,34,46,2,39,51,30,1,51,50,54,55,51,14,3,1,52,74,116,84,50,
8,117,17,109,91,91,107,17,117,9,50,83,116,5,250,41,69,90,49,53,60,61,52,49,
90,69,41,0,0,0,0,0,0,1,0,0,21,86,0,1,3,140,12,0,0,9,9,72,0,3,0,36,255,143,
0,3,0,55,255,219,0,3,0,60,255,219,0,3,1,82,255,143,0,3,1,91,255,143,0,3,1,
94,255,143,0,3,1,101,255,143,0,3,1,109,255,219,0,3,1,110,255,219,0,3,1,116,
255,219,0,20,0,20,255,104,0,36,0,3,255,143,0,36,0,55,255,104,0,36,0,57,255,
104,0,36,0,58,255,180,0,36,0,60,255,104,0,36,0,89,255,219,0,36,0,90,255,219,
0,36,0,92,255,219,0,36,2,3,255,104,0,41,0,15,255,29,0,41,0,17,255,29,0,41,
0,36,255,143,0,47,0,3,255,180,0,47,0,55,255,104,0,47,0,57,255,104,0,47,0,
58,255,104,0,47,0,60,255,104,0,47,0,92,255,180,0,47,2,3,255,143,0,51,0,3,
255,219,0,51,0,15,254,248,0,51,0,17,254,248,0,51,0,36,255,104,0,53,0,55,255,
219,0,53,0,57,255,219,0,53,0,58,255,219,0,53,0,60,255,219,0,55,0,3,255,219,
0,55,0,15,255,29,0,55,0,16,255,143,0,55,0,17,255,29,0,55,0,29,255,29,0,55,
0,30,255,29,0,55,0,36,255,104,0,55,0,50,255,219,0,55,0,68,255,29,0,55,0,70,
255,29,0,55,0,72,255,29,0,55,0,76,255,180,0,55,0,82,255,29,0,55,0,85,255,
180,0,55,0,86,255,29,0,55,0,88,255,180,0,55,0,90,255,143,0,55,0,92,255,143,
0,57,0,15,255,68,0,57,0,16,255,143,0,57,0,17,255,68,0,57,0,29,255,180,0,57,
0,30,255,180,0,57,0,36,255,104,0,57,0,68,255,104,0,57,0,72,255,143,0,57,0,
76,255,219,0,57,0,82,255,143,0,57,0,85,255,180,0,57,0,88,255,180,0,57,0,92,
255,180,0,58,0,15,255,143,0,58,0,16,255,219,0,58,0,17,255,143,0,58,0,29,255,
219,0,58,0,30,255,219,0,58,0,36,255,180,0,58,0,68,255,180,0,58,0,72,255,219,
0,58,0,82,255,219,0,58,0,85,255,219,0,58,0,88,255,219,0,58,0,92,255,238,0,
60,0,3,255,219,0,60,0,15,254,248,0,60,0,16,255,68,0,60,0,17,254,248,0,60,
0,29,255,143,0,60,0,30,255,123,0,60,0,36,255,104,0,60,0,68,255,104,0,60,0,
72,255,68,0,60,0,76,255,180,0,60,0,82,255,68,0,60,0,83,255,104,0,60,0,84,
255,68,0,60,0,88,255,143,0,60,0,89,255,143,0,73,0,73,255,219,0,73,2,3,0,37,
0,85,0,15,255,143,0,85,0,17,255,143,0,85,2,3,0,76,0,89,0,15,255,104,0,89,
0,17,255,104,0,90,0,15,255,143,0,90,0,17,255,143,0,92,0,15,255,104,0,92,0,
17,255,104,1,82,1,98,255,213,1,82,1,105,255,213,1,82,1,109,255,104,1,82,1,
110,255,104,1,82,1,111,255,197,1,82,1,116,255,104,1,82,1,124,255,219,1,82,
1,134,255,219,1,82,1,144,255,219,1,87,1,110,255,190,1,88,1,90,0,170,1,88,
1,91,255,104,1,88,1,94,255,104,1,88,1,98,255,141,1,88,1,101,255,104,1,88,
1,105,255,141,1,88,1,111,255,141,1,88,1,114,255,158,1,88,1,119,255,104,1,
88,1,120,255,180,1,88,1,122,255,70,1,88,1,128,255,104,1,88,1,130,255,180,
1,88,1,131,255,104,1,88,1,133,255,104,1,88,1,136,255,70,1,88,1,140,255,70,
1,88,1,143,255,70,1,88,1,147,0,98,1,88,1,149,255,70,1,89,1,110,255,209,1,
89,1,116,255,209,1,91,0,3,255,143,1,91,1,98,255,213,1,91,1,105,255,213,1,
91,1,109,255,104,1,91,1,110,255,104,1,91,1,111,255,197,1,91,1,116,255,104,
1,91,1,124,255,219,1,91,1,134,255,219,1,91,1,144,255,219,1,91,2,3,255,104,
1,93,0,15,255,31,1,93,0,17,255,31,1,93,1,90,0,164,1,93,1,91,255,68,1,93,1,
94,255,68,1,93,1,101,255,68,1,93,1,130,255,168,1,93,1,147,0,88,1,94,0,3,255,
143,1,94,1,98,255,213,1,94,1,105,255,213,1,94,1,109,255,137,1,94,1,110,255,
104,1,94,1,116,255,104,1,98,1,91,255,219,1,98,1,94,255,219,1,98,1,101,255,
219,1,98,1,110,255,190,1,98,1,116,255,190,1,100,1,98,255,193,1,100,1,105,
255,193,1,100,1,111,255,143,1,100,1,117,255,231,1,100,1,122,255,231,1,100,
1,125,255,231,1,100,1,127,255,231,1,100,1,129,255,231,1,100,1,135,255,231,
1,100,1,136,255,231,1,100,1,140,255,231,1,100,1,143,255,231,1,100,1,146,255,
231,1,100,1,149,255,231,1,100,1,151,255,231,1,101,0,3,255,143,1,101,1,98,
255,213,1,101,1,105,255,213,1,101,1,109,255,104,1,101,1,110,255,104,1,101,
1,116,255,104,1,105,1,91,255,219,1,105,1,94,255,213,1,105,1,101,255,219,1,
105,1,110,255,190,1,105,1,116,255,190,1,107,0,3,255,219,1,107,0,15,254,250,
1,107,0,17,254,250,1,107,1,91,255,104,1,107,1,94,255,104,1,107,1,101,255,
104,1,108,1,137,255,158,1,108,1,141,255,158,1,109,0,3,255,219,1,109,0,15,
255,31,1,109,0,17,255,31,1,109,0,29,255,31,1,109,0,30,255,31,1,109,1,90,0,
188,1,109,1,91,255,104,1,109,1,94,255,104,1,109,1,98,255,219,1,109,1,101,
255,104,1,109,1,105,255,219,1,109,1,111,255,219,1,109,1,114,255,219,1,109,
1,117,255,31,1,109,1,118,255,31,1,109,1,121,255,78,1,109,1,122,255,31,1,109,
1,124,255,78,1,109,1,126,255,31,1,109,1,128,255,106,1,109,1,130,255,180,1,
109,1,133,255,106,1,109,1,134,255,143,1,109,1,136,255,31,1,109,1,140,255,
31,1,109,1,142,255,80,1,109,1,143,255,31,1,109,1,144,255,143,1,109,1,145,
255,106,1,109,1,147,0,188,1,109,1,148,255,78,1,109,1,149,255,31,1,109,1,150,
255,78,1,110,0,3,255,219,1,110,0,15,254,250,1,110,0,16,255,70,1,110,0,17,
254,250,1,110,0,29,255,143,1,110,0,30,255,143,1,110,1,90,0,188,1,110,1,91,
255,104,1,110,1,94,255,104,1,110,1,98,255,141,1,110,1,101,255,104,1,110,1,
105,255,141,1,110,1,111,255,141,1,110,1,114,255,158,1,110,1,119,255,104,1,
110,1,120,255,180,1,110,1,122,255,70,1,110,1,124,255,158,1,110,1,128,255,
104,1,110,1,130,255,180,1,110,1,131,255,104,1,110,1,133,255,104,1,110,1,136,
255,70,1,110,1,140,255,70,1,110,1,143,255,70,1,110,1,147,0,121,1,110,1,149,
255,70,1,111,1,91,255,197,1,111,1,110,255,190,1,111,1,116,255,190,1,113,1,
117,255,178,1,113,1,122,255,178,1,113,1,125,255,178,1,113,1,129,255,217,1,
113,1,136,255,178,1,113,1,140,255,178,1,113,1,143,255,178,1,113,1,146,255,
178,1,113,1,149,255,178,1,113,1,151,255,178,1,114,1,110,255,209,1,114,1,116,
255,209,1,116,0,3,255,219,1,116,1,90,0,170,1,116,1,91,255,104,1,116,1,94,
255,104,1,116,1,98,255,141,1,116,1,101,255,104,1,116,1,105,255,141,1,116,
1,111,255,141,1,116,1,114,255,158,1,116,1,119,255,104,1,116,1,120,255,180,
1,116,1,122,255,70,1,116,1,128,255,104,1,116,1,130,255,180,1,116,1,131,255,
104,1,116,1,133,255,104,1,116,1,136,255,70,1,116,1,140,255,70,1,116,1,143,
255,70,1,116,1,147,0,98,1,116,1,149,255,70,1,125,1,132,255,217,1,125,1,137,
255,227,1,125,1,141,255,227,1,125,1,144,255,201,1,127,1,117,255,119,1,127,
1,119,255,219,1,127,1,122,255,119,1,127,1,124,255,170,1,127,1,125,255,180,
1,127,1,128,255,219,1,127,1,129,255,158,1,127,1,130,255,219,1,127,1,131,255,
219,1,127,1,134,255,170,1,127,1,136,255,119,1,127,1,137,255,170,1,127,1,140,
255,119,1,127,1,141,255,170,1,127,1,143,255,119,1,127,1,146,255,119,1,127,
1,149,255,119,1,127,1,151,255,119,1,129,1,132,255,217,1,131,1,117,255,231,
1,131,1,122,255,231,1,131,1,125,255,231,1,131,1,127,255,231,1,131,1,129,255,
231,1,131,1,135,255,231,1,131,1,136,255,231,1,131,1,139,255,231,1,131,1,140,
255,231,1,131,1,143,255,231,1,131,1,146,255,231,1,131,1,149,255,231,1,131,
1,151,255,231,1,132,1,117,255,225,1,132,1,122,255,225,1,132,1,125,255,225,
1,132,1,135,255,225,1,132,1,136,255,225,1,132,1,139,255,209,1,132,1,140,255,
225,1,132,1,142,255,207,1,132,1,143,255,219,1,132,1,146,255,225,1,132,1,149,
255,225,1,132,1,150,255,207,1,132,1,151,255,225,1,135,1,117,255,201,1,135,
1,122,255,201,1,135,1,125,255,201,1,135,1,127,255,201,1,135,1,135,255,201,
1,135,1,136,255,201,1,135,1,139,255,201,1,135,1,140,255,201,1,135,1,143,255,
201,1,135,1,149,255,201,1,136,1,132,255,217,1,136,1,137,255,227,1,136,1,141,
255,227,1,136,1,144,255,201,1,137,1,117,255,227,1,137,1,122,255,227,1,137,
1,127,255,227,1,137,1,136,255,227,1,137,1,139,255,227,1,137,1,140,255,227,
1,137,1,143,255,227,1,137,1,146,255,227,1,137,1,151,255,227,1,138,1,132,255,
217,1,138,1,137,255,227,1,138,1,141,255,227,1,141,1,117,255,227,1,141,1,122,
255,227,1,141,1,125,255,227,1,141,1,127,255,227,1,141,1,136,255,227,1,141,
1,139,255,227,1,141,1,140,255,227,1,141,1,143,255,227,1,141,1,146,255,227,
1,141,1,151,255,227,1,143,1,132,255,217,1,143,1,137,255,227,1,143,1,141,255,
227,1,143,1,144,255,201,1,144,1,117,255,201,1,144,1,122,255,201,1,144,1,125,
255,201,1,144,1,127,255,201,1,144,1,136,255,201,1,144,1,139,255,201,1,144,
1,140,255,201,1,144,1,143,255,201,1,144,1,146,255,201,1,144,1,149,255,201,
1,144,1,151,255,201,1,146,1,132,255,217,1,146,1,137,255,227,1,146,1,141,255,
227,1,146,1,144,255,201,1,149,1,132,255,217,1,149,1,137,255,227,1,149,1,141,
255,227,1,149,1,144,255,201,1,151,1,132,255,217,1,151,1,137,255,227,1,151,
1,141,255,227,1,151,1,144,255,201,1,154,0,15,255,6,1,154,0,17,255,6,1,154,
0,108,255,119,1,154,0,123,255,119,1,154,1,255,255,211,1,160,2,3,255,96,1,
161,2,3,255,119,1,166,1,170,0,68,1,166,1,173,255,233,1,166,1,177,0,45,1,166,
1,180,255,211,1,166,1,181,255,233,1,166,1,183,255,211,1,166,1,184,255,96,
1,166,1,185,255,166,1,166,1,186,255,188,1,166,1,189,255,96,1,166,1,195,255,
211,1,166,1,198,0,23,1,166,1,216,255,211,1,166,1,217,255,233,1,166,1,218,
0,23,1,166,1,227,0,45,1,166,2,3,255,141,1,167,1,166,255,211,1,167,1,173,255,
233,1,167,1,180,255,233,1,167,1,183,255,233,1,167,1,184,255,164,1,167,1,185,
255,209,1,167,1,186,255,233,1,167,1,187,255,211,1,167,1,189,255,164,1,167,
1,192,255,188,1,167,1,195,255,233,1,167,1,197,255,233,1,167,1,209,255,233,
1,167,1,217,255,211,1,168,1,166,255,188,1,168,1,170,255,211,1,168,1,172,255,
211,1,168,1,173,255,188,1,168,1,177,255,233,1,168,1,180,255,188,1,168,1,183,
255,188,1,168,1,184,255,119,1,168,1,185,255,188,1,168,1,186,255,188,1,168,
1,187,255,166,1,168,1,189,255,164,1,168,1,192,255,141,1,168,1,197,255,188,
1,168,1,202,255,233,1,168,1,210,255,233,1,168,1,216,255,188,1,168,1,217,255,
233,1,168,1,219,255,233,1,168,1,221,255,188,1,168,1,229,255,233,1,169,0,15,
255,6,1,169,0,17,255,6,1,169,0,108,255,119,1,169,0,123,255,119,1,169,1,166,
255,119,1,169,1,170,255,119,1,169,1,173,255,211,1,169,1,177,255,141,1,169,
1,178,255,209,1,169,1,180,255,141,1,169,1,183,255,164,1,169,1,197,255,188,
1,169,1,198,255,141,1,169,1,200,255,141,1,169,1,202,255,119,1,169,1,203,255,
119,1,169,1,206,255,141,1,169,1,209,255,141,1,169,1,210,255,141,1,169,1,211,
255,141,1,169,1,212,255,119,1,169,1,214,255,141,1,169,1,217,255,119,1,169,
1,225,255,141,1,169,1,226,255,141,1,169,1,228,255,141,1,169,1,229,255,119,
1,169,1,255,255,211,1,170,1,185,0,23,1,170,1,186,255,211,1,170,1,189,255,
186,1,170,1,205,0,68,1,170,1,212,0,23,1,170,1,217,0,45,1,171,1,173,255,211,
1,171,1,215,255,233,1,172,1,173,255,233,1,172,1,180,255,211,1,172,1,183,255,
233,1,172,1,184,0,23,1,172,1,185,0,45,1,172,1,192,0,45,1,172,1,198,0,23,1,
172,1,203,255,231,1,172,1,212,255,233,1,172,1,217,255,233,1,173,1,177,255,
233,1,173,1,180,255,233,1,173,1,183,255,233,1,173,1,184,255,211,1,173,1,185,
255,233,1,173,1,186,255,233,1,173,1,189,255,211,1,173,1,197,255,233,1,176,
1,173,255,233,1,176,1,180,255,233,1,176,1,183,255,233,1,176,1,185,0,23,1,
176,1,186,255,186,1,177,1,186,255,233,1,177,1,199,0,23,1,177,1,217,0,23,1,
178,1,186,255,233,1,178,1,189,255,233,1,178,1,198,0,23,1,178,1,203,0,23,1,
178,1,212,0,23,1,178,1,215,0,23,1,178,1,217,0,23,1,178,1,221,255,233,1,178,
1,227,0,23,1,180,1,166,255,211,1,180,1,170,255,211,1,180,1,172,255,211,1,
180,1,177,255,233,1,180,1,185,255,211,1,180,1,187,255,164,1,180,1,189,255,
211,1,180,1,197,255,211,1,180,1,202,255,211,1,180,1,209,255,233,1,180,1,219,
255,233,1,182,0,15,254,125,1,182,0,17,254,125,1,182,0,29,255,211,1,182,0,
30,255,211,1,182,0,123,255,141,1,182,1,166,255,119,1,182,1,170,255,119,1,
182,1,172,255,233,1,182,1,173,255,211,1,182,1,177,255,141,1,182,1,178,255,
233,1,182,1,180,255,211,1,182,1,183,255,233,1,182,1,184,255,164,1,182,1,185,
255,211,1,182,1,186,255,233,1,182,1,187,255,164,1,182,1,197,255,211,1,182,
1,198,255,188,1,182,1,202,255,96,1,182,1,203,255,166,1,182,1,212,255,166,
1,182,1,227,255,211,1,182,1,229,255,188,1,183,1,166,255,211,1,183,1,170,255,
211,1,183,1,173,255,233,1,183,1,177,255,188,1,183,1,178,255,233,1,183,1,180,
255,211,1,183,1,184,255,188,1,183,1,185,255,188,1,183,1,187,255,141,1,183,
1,189,255,188,1,183,1,192,255,186,1,183,1,195,255,233,1,183,1,198,0,23,1,
183,1,204,0,45,1,183,1,221,255,233,1,184,0,15,255,29,1,184,0,17,255,29,1,
184,0,108,255,166,1,184,0,123,255,166,1,184,1,166,255,188,1,184,1,170,255,
188,1,184,1,172,0,23,1,184,1,173,255,233,1,184,1,177,255,211,1,184,1,180,
255,164,1,184,1,186,255,188,1,184,1,197,255,211,1,184,1,198,255,164,1,184,
1,200,255,166,1,184,1,203,255,141,1,184,1,206,255,166,1,184,1,208,255,166,
1,184,1,209,255,164,1,184,1,210,255,166,1,184,1,212,255,96,1,184,1,213,255,
166,1,184,1,214,255,141,1,184,1,215,255,141,1,184,1,217,255,141,1,184,1,219,
255,166,1,184,1,223,255,166,1,184,1,225,255,166,1,184,1,226,255,166,1,184,
1,228,255,166,1,184,1,229,255,141,1,184,1,255,255,211,1,185,0,15,254,240,
1,185,0,17,254,240,1,185,0,29,255,211,1,185,0,30,255,211,1,185,0,108,255,
166,1,185,0,123,255,164,1,185,1,166,255,119,1,185,1,170,255,164,1,185,1,173,
255,211,1,185,1,177,255,188,1,185,1,180,255,188,1,185,1,186,255,188,1,185,
1,195,255,211,1,185,1,197,255,211,1,185,1,199,255,211,1,185,1,200,255,141,
1,185,1,201,255,164,1,185,1,202,255,96,1,185,1,203,255,119,1,185,1,204,255,
188,1,185,1,205,255,141,1,185,1,206,255,164,1,185,1,207,255,188,1,185,1,208,
255,164,1,185,1,209,255,119,1,185,1,210,255,164,1,185,1,211,255,164,1,185,
1,212,255,119,1,185,1,213,255,164,1,185,1,214,255,164,1,185,1,215,255,119,
1,185,1,219,255,164,1,185,1,220,255,164,1,185,1,222,255,164,1,185,1,223,255,
164,1,185,1,228,255,164,1,185,1,229,255,119,1,185,1,255,255,233,1,186,1,166,
255,211,1,186,1,170,255,188,1,186,1,177,255,188,1,186,1,184,255,141,1,186,
1,185,255,164,1,186,1,189,255,211,1,186,1,197,255,186,1,186,1,209,255,188,
1,187,1,173,255,211,1,187,1,180,255,188,1,187,1,183,255,188,1,187,1,186,255,
188,1,187,1,195,255,186,1,187,1,212,255,233,1,187,1,217,255,211,1,188,1,180,
255,211,1,188,1,198,0,45,1,191,1,198,0,23,1,191,1,217,0,45,1,192,1,197,255,
188,1,192,2,3,255,119,1,194,1,166,255,211,1,194,1,170,255,211,1,194,1,172,
255,188,1,194,1,173,255,233,1,194,1,177,255,186,1,194,1,178,255,211,1,194,
1,180,255,211,1,194,1,183,255,211,1,194,1,184,255,51,1,194,1,187,255,164,
1,194,1,189,255,96,1,194,1,195,255,233,1,194,1,197,255,164,1,194,2,3,255,
96,1,195,1,170,255,188,1,195,1,172,255,231,1,195,1,173,255,233,1,195,1,177,
255,188,1,195,1,187,255,186,1,195,1,197,255,211,1,195,1,202,255,188,1,195,
1,204,0,23,1,195,1,209,255,188,1,195,1,210,255,233,1,195,1,229,255,233,1,
196,1,166,255,188,1,196,1,170,255,166,1,196,1,172,255,211,1,196,1,177,255,
164,1,196,1,180,255,233,1,196,1,183,255,233,1,196,1,184,255,141,1,196,1,187,
255,164,1,196,1,189,255,188,1,196,1,202,255,164,1,196,1,209,255,164,1,196,
1,210,255,233,1,198,1,205,255,233,1,198,1,216,255,211,1,198,1,217,255,233,
1,198,1,221,255,211,1,199,1,198,255,209,1,199,1,202,255,164,1,199,1,203,255,
233,1,199,1,204,255,233,1,199,1,205,255,211,1,199,1,209,255,164,1,199,1,210,
255,211,1,199,1,215,255,233,1,199,1,217,255,211,1,199,1,218,255,233,1,199,
1,219,255,188,1,199,1,221,255,188,1,199,1,224,255,188,1,199,1,227,255,233,
1,199,1,229,255,211,1,200,1,198,255,233,1,200,1,199,255,233,1,200,1,202,255,
233,1,200,1,203,255,233,1,200,1,204,255,233,1,200,1,205,255,233,1,200,1,209,
255,209,1,200,1,210,255,233,1,200,1,212,255,233,1,200,1,215,255,233,1,200,
1,216,255,211,1,200,1,217,255,211,1,200,1,218,255,233,1,200,1,221,255,164,
1,200,1,224,255,188,1,200,1,229,255,233,1,201,0,15,255,6,1,201,0,17,255,6,
1,201,1,198,255,211,1,201,1,202,255,164,1,201,1,203,255,211,1,201,1,205,255,
233,1,201,1,209,255,211,1,201,1,212,255,211,1,201,1,215,255,211,1,201,1,229,
255,233,1,202,1,224,255,211,1,202,1,227,0,23,1,203,1,199,255,233,1,203,1,
202,255,211,1,203,1,204,255,233,1,203,1,205,255,211,1,203,1,209,255,188,1,
203,1,216,255,188,1,203,1,217,255,233,1,203,1,219,255,211,1,203,1,221,255,
188,1,204,1,199,0,23,1,204,1,217,0,23,1,204,1,221,255,233,1,204,1,224,0,45,
1,205,1,199,255,233,1,205,1,202,255,211,1,205,1,203,255,233,1,205,1,205,255,
233,1,205,1,209,255,233,1,205,1,212,255,233,1,205,1,215,255,233,1,205,1,217,
255,233,1,205,1,218,255,233,1,205,1,221,255,188,1,205,1,224,255,211,1,208,
1,198,0,45,1,208,1,199,0,45,1,208,1,203,0,23,1,208,1,205,0,23,1,208,1,209,
0,23,1,208,1,212,0,23,1,208,1,215,0,23,1,208,1,216,0,23,1,208,1,217,0,23,
1,208,1,227,0,23,1,209,1,212,0,23,1,209,1,221,255,211,1,210,1,199,255,233,
1,210,1,205,255,233,1,210,1,217,0,23,1,212,1,202,255,211,1,212,1,204,255,
233,1,212,1,205,255,233,1,212,1,209,255,211,1,212,1,216,255,211,1,212,1,217,
255,233,1,212,1,219,255,233,1,212,1,221,255,211,1,214,1,202,255,209,1,214,
1,205,255,233,1,214,1,209,255,186,1,214,1,216,255,211,1,214,1,217,255,233,
1,214,1,219,255,233,1,214,1,221,255,211,1,214,1,229,255,233,1,215,1,204,0,
23,1,215,1,212,0,23,1,215,1,221,255,233,1,215,1,227,0,23,1,216,0,15,255,29,
1,216,0,17,255,29,1,216,1,198,255,233,1,216,1,202,255,188,1,216,1,203,255,
233,1,216,1,204,0,68,1,216,1,209,255,211,1,216,1,212,255,233,1,216,1,215,
255,233,1,216,1,217,0,23,1,217,0,15,255,51,1,217,0,17,255,51,1,217,0,123,
0,23,1,217,1,198,255,233,1,217,1,199,0,23,1,217,1,202,255,188,1,217,1,203,
255,233,1,217,1,204,0,23,1,217,1,209,255,211,1,217,1,210,255,233,1,217,1,
212,255,231,1,217,1,214,255,233,1,217,1,215,255,233,1,217,1,218,255,233,1,
217,1,227,255,233,1,217,1,229,255,233,1,218,1,199,255,233,1,218,1,202,255,
211,1,218,1,209,255,211,1,218,1,216,255,211,1,218,1,217,255,233,1,218,1,221,
255,211,1,218,1,229,255,233,1,219,1,198,255,233,1,219,1,199,255,233,1,219,
1,203,255,233,1,219,1,205,255,233,1,219,1,212,255,233,1,219,1,215,255,233,
1,219,1,216,255,233,1,219,1,218,255,233,1,219,1,221,255,211,1,220,1,203,255,
233,1,220,1,205,255,233,1,220,1,212,255,233,1,220,1,215,255,233,1,223,1,203,
255,233,1,223,1,212,255,233,1,223,1,217,0,23,1,226,1,216,255,96,1,226,1,221,
255,119,1,227,1,202,255,211,1,227,1,203,0,23,1,227,1,205,255,233,1,227,1,
209,255,211,1,227,1,212,0,23,1,227,1,216,255,211,1,227,1,219,255,233,1,227,
1,229,255,233,1,228,1,202,255,211,1,228,1,204,255,233,1,228,1,209,255,211,
1,228,1,210,255,233,1,228,1,216,255,211,1,228,1,219,255,233,1,228,1,221,255,
211,1,242,0,15,255,51,1,242,0,17,255,51,1,244,0,15,255,6,1,244,0,17,255,6,
1,244,0,29,255,211,1,244,0,30,255,211,1,244,0,108,255,96,1,244,0,123,255,
96,1,244,1,255,255,211,2,2,2,2,255,219,2,3,0,3,255,180,2,3,0,86,255,219,2,
3,2,3,255,219,2,8,1,153,255,96,2,8,1,162,255,96,2,8,1,184,255,96,2,8,1,189,
255,188,2,8,1,192,255,188,0,0,0,0,0,28,1,86,0,1,0,0,0,0,0,0,0,64,0,130,0,
1,0,0,0,0,0,1,0,15,0,227,0,1,0,0,0,0,0,2,0,7,1,3,0,1,0,0,0,0,0,3,0,26,1,65,
0,1,0,0,0,0,0,4,0,15,1,124,0,1,0,0,0,0,0,5,0,12,1,166,0,1,0,0,0,0,0,6,0,14,
1,209,0,1,0,0,0,0,0,7,0,122,2,214,0,1,0,0,0,0,0,8,0,20,3,123,0,1,0,0,0,0,
0,9,0,14,3,174,0,1,0,0,0,0,0,11,0,28,3,247,0,1,0,0,0,0,0,12,0,46,4,114,0,
1,0,0,0,0,0,13,0,127,5,161,0,1,0,0,0,0,0,14,0,43,6,121,0,3,0,1,4,9,0,0,0,
128,0,0,0,3,0,1,4,9,0,1,0,30,0,195,0,3,0,1,4,9,0,2,0,14,0,243,0,3,0,1,4,9,
0,3,0,52,1,11,0,3,0,1,4,9,0,4,0,30,1,92,0,3,0,1,4,9,0,5,0,24,1,140,0,3,0,
1,4,9,0,6,0,28,1,179,0,3,0,1,4,9,0,7,0,244,1,224,0,3,0,1,4,9,0,8,0,40,3,81,
0,3,0,1,4,9,0,9,0,28,3,144,0,3,0,1,4,9,0,11,0,56,3,189,0,3,0,1,4,9,0,12,0,
92,4,20,0,3,0,1,4,9,0,13,0,254,4,161,0,3,0,1,4,9,0,14,0,86,6,33,0,68,0,105,
0,103,0,105,0,116,0,105,0,122,0,101,0,100,0,32,0,100,0,97,0,116,0,97,0,32,
0,169,0,32,0,50,0,48,0,48,0,55,0,32,0,65,0,115,0,99,0,101,0,110,0,100,0,101,
0,114,0,32,0,67,0,111,0,114,0,112,0,111,0,114,0,97,0,116,0,105,0,111,0,110,
0,46,0,32,0,65,0,108,0,108,0,32,0,114,0,105,0,103,0,104,0,116,0,115,0,32,
0,114,0,101,0,115,0,101,0,114,0,118,0,101,0,100,0,46,0,0,68,105,103,105,116,
105,122,101,100,32,100,97,116,97,32,169,32,50,48,48,55,32,65,115,99,101,110,
100,101,114,32,67,111,114,112,111,114,97,116,105,111,110,46,32,65,108,108,
32,114,105,103,104,116,115,32,114,101,115,101,114,118,101,100,46,0,0,76,0,
105,0,98,0,101,0,114,0,97,0,116,0,105,0,111,0,110,0,32,0,83,0,97,0,110,0,
115,0,0,76,105,98,101,114,97,116,105,111,110,32,83,97,110,115,0,0,82,0,101,
0,103,0,117,0,108,0,97,0,114,0,0,82,101,103,117,108,97,114,0,0,65,0,115,0,
99,0,101,0,110,0,100,0,101,0,114,0,32,0,45,0,32,0,76,0,105,0,98,0,101,0,114,
0,97,0,116,0,105,0,111,0,110,0,32,0,83,0,97,0,110,0,115,0,0,65,115,99,101,
110,100,101,114,32,45,32,76,105,98,101,114,97,116,105,111,110,32,83,97,110,
115,0,0,76,0,105,0,98,0,101,0,114,0,97,0,116,0,105,0,111,0,110,0,32,0,83,
0,97,0,110,0,115,0,0,76,105,98,101,114,97,116,105,111,110,32,83,97,110,115,
0,0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,32,0,49,0,46,0,48,0,50,0,0,86,
101,114,115,105,111,110,32,49,46,48,50,0,0,76,0,105,0,98,0,101,0,114,0,97,
0,116,0,105,0,111,0,110,0,83,0,97,0,110,0,115,0,0,76,105,98,101,114,97,116,
105,111,110,83,97,110,115,0,0,76,0,105,0,98,0,101,0,114,0,97,0,116,0,105,
0,111,0,110,0,32,0,105,0,115,0,32,0,97,0,32,0,116,0,114,0,97,0,100,0,101,
0,109,0,97,0,114,0,107,0,32,0,111,0,102,0,32,0,82,0,101,0,100,0,32,0,72,0,
97,0,116,0,44,0,32,0,73,0,110,0,99,0,46,0,32,0,114,0,101,0,103,0,105,0,115,
0,116,0,101,0,114,0,101,0,100,0,32,0,105,0,110,0,32,0,85,0,46,0,83,0,46,0,
32,0,80,0,97,0,116,0,101,0,110,0,116,0,32,0,97,0,110,0,100,0,32,0,84,0,114,
0,97,0,100,0,101,0,109,0,97,0,114,0,107,0,32,0,79,0,102,0,102,0,105,0,99,
0,101,0,32,0,97,0,110,0,100,0,32,0,99,0,101,0,114,0,116,0,97,0,105,0,110,
0,32,0,111,0,116,0,104,0,101,0,114,0,32,0,106,0,117,0,114,0,105,0,115,0,100,
0,105,0,99,0,116,0,105,0,111,0,110,0,115,0,46,0,0,76,105,98,101,114,97,116,
105,111,110,32,105,115,32,97,32,116,114,97,100,101,109,97,114,107,32,111,
102,32,82,101,100,32,72,97,116,44,32,73,110,99,46,32,114,101,103,105,115,
116,101,114,101,100,32,105,110,32,85,46,83,46,32,80,97,116,101,110,116,32,
97,110,100,32,84,114,97,100,101,109,97,114,107,32,79,102,102,105,99,101,32,
97,110,100,32,99,101,114,116,97,105,110,32,111,116,104,101,114,32,106,117,
114,105,115,100,105,99,116,105,111,110,115,46,0,0,65,0,115,0,99,0,101,0,110,
0,100,0,101,0,114,0,32,0,67,0,111,0,114,0,112,0,111,0,114,0,97,0,116,0,105,
0,111,0,110,0,0,65,115,99,101,110,100,101,114,32,67,111,114,112,111,114,97,
116,105,111,110,0,0,83,0,116,0,101,0,118,0,101,0,32,0,77,0,97,0,116,0,116,
0,101,0,115,0,111,0,110,0,0,83,116,101,118,101,32,77,97,116,116,101,115,111,
110,0,0,104,0,116,0,116,0,112,0,58,0,47,0,47,0,119,0,119,0,119,0,46,0,97,
0,115,0,99,0,101,0,110,0,100,0,101,0,114,0,99,0,111,0,114,0,112,0,46,0,99,
0,111,0,109,0,47,0,0,104,116,116,112,58,47,47,119,119,119,46,97,115,99,101,
110,100,101,114,99,111,114,112,46,99,111,109,47,0,0,104,0,116,0,116,0,112,
0,58,0,47,0,47,0,119,0,119,0,119,0,46,0,97,0,115,0,99,0,101,0,110,0,100,0,
101,0,114,0,99,0,111,0,114,0,112,0,46,0,99,0,111,0,109,0,47,0,116,0,121,0,
112,0,101,0,100,0,101,0,115,0,105,0,103,0,110,0,101,0,114,0,115,0,46,0,104,
0,116,0,109,0,108,0,0,104,116,116,112,58,47,47,119,119,119,46,97,115,99,101,
110,100,101,114,99,111,114,112,46,99,111,109,47,116,121,112,101,100,101,115,
105,103,110,101,114,115,46,104,116,109,108,0,0,85,0,115,0,101,0,32,0,111,
0,102,0,32,0,116,0,104,0,105,0,115,0,32,0,76,0,105,0,98,0,101,0,114,0,97,
0,116,0,105,0,111,0,110,0,32,0,102,0,111,0,110,0,116,0,32,0,115,0,111,0,102,
0,116,0,119,0,97,0,114,0,101,0,32,0,105,0,115,0,32,0,115,0,117,0,98,0,106,
0,101,0,99,0,116,0,32,0,116,0,111,0,32,0,116,0,104,0,101,0,32,0,108,0,105,
0,99,0,101,0,110,0,115,0,101,0,32,0,97,0,103,0,114,0,101,0,101,0,109,0,101,
0,110,0,116,0,32,0,117,0,110,0,100,0,101,0,114,0,32,0,119,0,104,0,105,0,99,
0,104,0,32,0,121,0,111,0,117,0,32,0,97,0,99,0,99,0,101,0,112,0,116,0,101,
0,100,0,32,0,116,0,104,0,101,0,32,0,76,0,105,0,98,0,101,0,114,0,97,0,116,
0,105,0,111,0,110,0,32,0,102,0,111,0,110,0,116,0,32,0,115,0,111,0,102,0,116,
0,119,0,97,0,114,0,101,0,46,0,0,85,115,101,32,111,102,32,116,104,105,115,
32,76,105,98,101,114,97,116,105,111,110,32,102,111,110,116,32,115,111,102,
116,119,97,114,101,32,105,115,32,115,117,98,106,101,99,116,32,116,111,32,
116,104,101,32,108,105,99,101,110,115,101,32,97,103,114,101,101,109,101,110,
116,32,117,110,100,101,114,32,119,104,105,99,104,32,121,111,117,32,97,99,
99,101,112,116,101,100,32,116,104,101,32,76,105,98,101,114,97,116,105,111,
110,32,102,111,110,116,32,115,111,102,116,119,97,114,101,46,0,0,104,0,116,
0,116,0,112,0,58,0,47,0,47,0,119,0,119,0,119,0,46,0,97,0,115,0,99,0,101,0,
110,0,100,0,101,0,114,0,99,0,111,0,114,0,112,0,46,0,99,0,111,0,109,0,47,0,
108,0,105,0,98,0,101,0,114,0,97,0,116,0,105,0,111,0,110,0,46,0,104,0,116,
0,109,0,108,0,0,104,116,116,112,58,47,47,119,119,119,46,97,115,99,101,110,
100,101,114,99,111,114,112,46,99,111,109,47,108,105,98,101,114,97,116,105,
111,110,46,104,116,109,108,0,0,0,2,0,0,0,0,0,0,255,39,0,150,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,2,156,0,0,0,1,0,2,1,2,0,4,0,5,0,6,0,7,0,8,0,9,0,
10,0,11,0,12,0,13,0,14,0,15,1,3,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,
25,0,26,0,27,0,28,0,29,1,4,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,
40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,
0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,
0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,
0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,163,0,
132,0,133,0,189,0,150,0,232,0,134,0,142,0,139,0,157,0,169,0,164,0,138,0,218,
0,131,0,147,1,5,1,6,0,141,1,7,0,136,1,8,0,222,1,9,0,158,0,170,0,245,0,244,
0,246,0,162,0,173,0,201,0,199,0,174,0,98,0,99,0,144,0,100,0,203,0,101,0,200,
0,202,0,207,0,204,0,205,0,206,0,233,0,102,0,211,0,208,0,209,0,175,0,103,0,
240,0,145,0,214,0,212,0,213,0,104,0,235,0,237,0,137,0,106,0,105,0,107,0,109,
0,108,0,110,0,160,0,111,0,113,0,112,0,114,0,115,0,117,0,116,0,118,0,119,0,
234,0,120,0,122,0,121,0,123,0,125,0,124,0,184,0,161,0,127,0,126,0,128,0,129,
0,236,0,238,0,186,1,10,1,11,1,12,1,13,1,14,1,15,0,253,0,254,1,16,1,17,1,18,
1,19,0,255,1,0,1,20,1,21,1,22,1,1,1,23,1,24,1,25,1,26,1,27,1,28,1,29,1,30,
1,31,1,32,1,33,1,34,0,248,0,249,1,35,1,36,1,37,1,38,1,39,1,40,1,41,1,42,1,
43,1,44,1,45,1,46,1,47,1,48,1,49,1,50,0,250,0,215,1,51,1,52,1,53,1,54,1,55,
1,56,1,57,1,58,1,59,1,60,1,61,1,62,1,63,1,64,1,65,0,226,0,227,1,66,1,67,1,
68,1,69,1,70,1,71,1,72,1,73,1,74,1,75,1,76,1,77,1,78,1,79,1,80,0,176,0,177,
1,81,1,82,1,83,1,84,1,85,1,86,1,87,1,88,1,89,1,90,0,251,0,252,0,228,0,229,
1,91,1,92,1,93,1,94,1,95,1,96,1,97,1,98,1,99,1,100,1,101,1,102,1,103,1,104,
1,105,1,106,1,107,1,108,1,109,1,110,1,111,1,112,0,187,1,113,1,114,1,115,1,
116,0,230,0,231,1,117,0,166,1,118,1,119,1,120,1,121,1,122,1,123,0,216,0,225,
1,124,0,219,0,220,0,221,0,224,0,217,0,223,1,125,1,126,1,127,1,128,1,129,1,
130,1,131,1,132,1,133,1,134,1,135,1,136,1,137,1,138,0,168,1,139,1,140,1,141,
1,142,1,143,1,144,1,145,1,146,1,147,1,148,1,149,1,150,1,151,1,152,1,153,1,
154,1,155,1,156,1,157,0,159,1,158,1,159,1,160,1,161,1,162,1,163,1,164,1,165,
1,166,1,167,1,168,1,169,1,170,1,171,1,172,1,173,1,174,1,175,0,151,1,176,1,
177,1,178,0,155,1,179,1,180,1,181,1,182,1,183,1,184,1,185,1,186,1,187,1,188,
1,189,1,190,1,191,1,192,1,193,1,194,1,195,1,196,1,197,1,198,1,199,1,200,1,
201,1,202,1,203,1,204,1,205,1,206,1,207,1,208,1,209,1,210,1,211,1,212,1,213,
1,214,1,215,1,216,1,217,1,218,1,219,1,220,1,221,1,222,1,223,1,224,1,225,1,
226,1,227,1,228,1,229,1,230,1,231,1,232,1,233,1,234,1,235,1,236,1,237,1,238,
1,239,1,240,1,241,1,242,1,243,1,244,1,245,1,246,1,247,1,248,1,249,1,250,1,
251,1,252,1,253,1,254,1,255,2,0,2,1,2,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10,
2,11,2,12,2,13,2,14,2,15,2,16,2,17,2,18,2,19,2,20,2,21,2,22,2,23,2,24,2,25,
2,26,2,27,2,28,2,29,2,30,2,31,2,32,2,33,2,34,2,35,2,36,2,37,2,38,0,178,0,
179,2,39,2,40,0,182,0,183,0,196,2,41,0,180,0,181,0,197,0,130,0,194,0,135,
0,171,0,198,2,42,2,43,0,190,0,191,2,44,2,45,2,46,2,47,0,247,2,48,2,49,2,50,
2,51,2,52,2,53,0,140,2,54,2,55,2,56,2,57,2,58,2,59,2,60,2,61,2,62,2,63,2,
64,2,65,2,66,0,152,2,67,0,154,0,153,0,239,0,165,0,146,2,68,2,69,0,156,0,167,
0,143,2,70,0,148,0,149,2,71,2,72,2,73,2,74,2,75,2,76,2,77,2,78,2,79,2,80,
2,81,2,82,2,83,2,84,2,85,2,86,2,87,2,88,2,89,2,90,2,91,2,92,2,93,2,94,2,95,
2,96,2,97,2,98,2,99,2,100,2,101,2,102,2,103,2,104,2,105,2,106,2,107,2,108,
2,109,2,110,2,111,2,112,2,113,2,114,2,115,2,116,2,117,2,118,2,119,2,120,2,
121,2,122,2,123,2,124,2,125,2,126,2,127,2,128,2,129,2,130,2,131,0,185,2,132,
2,133,2,134,2,135,2,136,2,137,2,138,2,139,2,140,2,141,2,142,2,143,2,144,2,
145,2,146,2,147,2,148,2,149,2,150,2,151,2,152,2,153,2,154,2,155,2,156,2,157,
2,158,2,159,2,160,2,161,2,162,2,163,2,164,2,165,2,166,2,167,7,117,110,105,
48,48,65,48,7,117,110,105,48,48,65,68,7,117,110,105,48,51,55,69,7,117,110,
105,48,48,66,50,7,117,110,105,48,48,66,51,7,117,110,105,48,48,66,53,7,117,
110,105,50,50,49,57,7,117,110,105,48,48,66,57,7,65,109,97,99,114,111,110,
7,97,109,97,99,114,111,110,6,65,98,114,101,118,101,6,97,98,114,101,118,101,
7,65,111,103,111,110,101,107,7,97,111,103,111,110,101,107,11,67,99,105,114,
99,117,109,102,108,101,120,11,99,99,105,114,99,117,109,102,108,101,120,10,
67,100,111,116,97,99,99,101,110,116,10,99,100,111,116,97,99,99,101,110,116,
6,68,99,97,114,111,110,6,100,99,97,114,111,110,6,68,99,114,111,97,116,7,69,
109,97,99,114,111,110,7,101,109,97,99,114,111,110,6,69,98,114,101,118,101,
6,101,98,114,101,118,101,10,69,100,111,116,97,99,99,101,110,116,10,101,100,
111,116,97,99,99,101,110,116,7,69,111,103,111,110,101,107,7,101,111,103,111,
110,101,107,6,69,99,97,114,111,110,6,101,99,97,114,111,110,11,71,99,105,114,
99,117,109,102,108,101,120,11,103,99,105,114,99,117,109,102,108,101,120,10,
71,100,111,116,97,99,99,101,110,116,10,103,100,111,116,97,99,99,101,110,116,
12,71,99,111,109,109,97,97,99,99,101,110,116,12,103,99,111,109,109,97,97,
99,99,101,110,116,11,72,99,105,114,99,117,109,102,108,101,120,11,104,99,105,
114,99,117,109,102,108,101,120,4,72,98,97,114,4,104,98,97,114,6,73,116,105,
108,100,101,6,105,116,105,108,100,101,7,73,109,97,99,114,111,110,7,105,109,
97,99,114,111,110,6,73,98,114,101,118,101,6,105,98,114,101,118,101,7,73,111,
103,111,110,101,107,7,105,111,103,111,110,101,107,2,73,74,2,105,106,11,74,
99,105,114,99,117,109,102,108,101,120,11,106,99,105,114,99,117,109,102,108,
101,120,12,75,99,111,109,109,97,97,99,99,101,110,116,12,107,99,111,109,109,
97,97,99,99,101,110,116,12,107,103,114,101,101,110,108,97,110,100,105,99,
6,76,97,99,117,116,101,6,108,97,99,117,116,101,12,76,99,111,109,109,97,97,
99,99,101,110,116,12,108,99,111,109,109,97,97,99,99,101,110,116,6,76,99,97,
114,111,110,6,108,99,97,114,111,110,4,76,100,111,116,4,108,100,111,116,6,
78,97,99,117,116,101,6,110,97,99,117,116,101,12,78,99,111,109,109,97,97,99,
99,101,110,116,12,110,99,111,109,109,97,97,99,99,101,110,116,6,78,99,97,114,
111,110,6,110,99,97,114,111,110,11,110,97,112,111,115,116,114,111,112,104,
101,3,69,110,103,3,101,110,103,7,79,109,97,99,114,111,110,7,111,109,97,99,
114,111,110,6,79,98,114,101,118,101,6,111,98,114,101,118,101,13,79,104,117,
110,103,97,114,117,109,108,97,117,116,13,111,104,117,110,103,97,114,117,109,
108,97,117,116,6,82,97,99,117,116,101,6,114,97,99,117,116,101,12,82,99,111,
109,109,97,97,99,99,101,110,116,12,114,99,111,109,109,97,97,99,99,101,110,
116,6,82,99,97,114,111,110,6,114,99,97,114,111,110,6,83,97,99,117,116,101,
6,115,97,99,117,116,101,11,83,99,105,114,99,117,109,102,108,101,120,11,115,
99,105,114,99,117,109,102,108,101,120,12,84,99,111,109,109,97,97,99,99,101,
110,116,12,116,99,111,109,109,97,97,99,99,101,110,116,6,84,99,97,114,111,
110,6,116,99,97,114,111,110,4,84,98,97,114,4,116,98,97,114,6,85,116,105,108,
100,101,6,117,116,105,108,100,101,7,85,109,97,99,114,111,110,7,117,109,97,
99,114,111,110,6,85,98,114,101,118,101,6,117,98,114,101,118,101,5,85,114,
105,110,103,5,117,114,105,110,103,13,85,104,117,110,103,97,114,117,109,108,
97,117,116,13,117,104,117,110,103,97,114,117,109,108,97,117,116,7,85,111,
103,111,110,101,107,7,117,111,103,111,110,101,107,11,87,99,105,114,99,117,
109,102,108,101,120,11,119,99,105,114,99,117,109,102,108,101,120,11,89,99,
105,114,99,117,109,102,108,101,120,11,121,99,105,114,99,117,109,102,108,101,
120,6,90,97,99,117,116,101,6,122,97,99,117,116,101,10,90,100,111,116,97,99,
99,101,110,116,10,122,100,111,116,97,99,99,101,110,116,5,108,111,110,103,
115,10,65,114,105,110,103,97,99,117,116,101,10,97,114,105,110,103,97,99,117,
116,101,7,65,69,97,99,117,116,101,7,97,101,97,99,117,116,101,11,79,115,108,
97,115,104,97,99,117,116,101,11,111,115,108,97,115,104,97,99,117,116,101,
7,117,110,105,48,50,67,57,5,116,111,110,111,115,13,100,105,101,114,101,115,
105,115,116,111,110,111,115,10,65,108,112,104,97,116,111,110,111,115,9,97,
110,111,116,101,108,101,105,97,12,69,112,115,105,108,111,110,116,111,110,
111,115,8,69,116,97,116,111,110,111,115,9,73,111,116,97,116,111,110,111,115,
12,79,109,105,99,114,111,110,116,111,110,111,115,12,85,112,115,105,108,111,
110,116,111,110,111,115,10,79,109,101,103,97,116,111,110,111,115,17,105,111,
116,97,100,105,101,114,101,115,105,115,116,111,110,111,115,5,65,108,112,104,
97,4,66,101,116,97,5,71,97,109,109,97,7,69,112,115,105,108,111,110,4,90,101,
116,97,3,69,116,97,5,84,104,101,116,97,4,73,111,116,97,5,75,97,112,112,97,
6,76,97,109,98,100,97,2,77,117,2,78,117,2,88,105,7,79,109,105,99,114,111,
110,2,80,105,3,82,104,111,5,83,105,103,109,97,3,84,97,117,7,85,112,115,105,
108,111,110,3,80,104,105,3,67,104,105,3,80,115,105,12,73,111,116,97,100,105,
101,114,101,115,105,115,15,85,112,115,105,108,111,110,100,105,101,114,101,
115,105,115,10,97,108,112,104,97,116,111,110,111,115,12,101,112,115,105,108,
111,110,116,111,110,111,115,8,101,116,97,116,111,110,111,115,9,105,111,116,
97,116,111,110,111,115,20,117,112,115,105,108,111,110,100,105,101,114,101,
115,105,115,116,111,110,111,115,5,97,108,112,104,97,4,98,101,116,97,5,103,
97,109,109,97,5,100,101,108,116,97,7,101,112,115,105,108,111,110,4,122,101,
116,97,3,101,116,97,5,116,104,101,116,97,4,105,111,116,97,5,107,97,112,112,
97,6,108,97,109,98,100,97,2,110,117,2,120,105,7,111,109,105,99,114,111,110,
3,114,104,111,6,115,105,103,109,97,49,5,115,105,103,109,97,3,116,97,117,7,
117,112,115,105,108,111,110,3,112,104,105,3,99,104,105,3,112,115,105,5,111,
109,101,103,97,12,105,111,116,97,100,105,101,114,101,115,105,115,15,117,112,
115,105,108,111,110,100,105,101,114,101,115,105,115,12,111,109,105,99,114,
111,110,116,111,110,111,115,12,117,112,115,105,108,111,110,116,111,110,111,
115,10,111,109,101,103,97,116,111,110,111,115,9,97,102,105,105,49,48,48,50,
51,9,97,102,105,105,49,48,48,53,49,9,97,102,105,105,49,48,48,53,50,9,97,102,
105,105,49,48,48,53,51,9,97,102,105,105,49,48,48,53,52,9,97,102,105,105,49,
48,48,53,53,9,97,102,105,105,49,48,48,53,54,9,97,102,105,105,49,48,48,53,
55,9,97,102,105,105,49,48,48,53,56,9,97,102,105,105,49,48,48,53,57,9,97,102,
105,105,49,48,48,54,48,9,97,102,105,105,49,48,48,54,49,9,97,102,105,105,49,
48,48,54,50,9,97,102,105,105,49,48,49,52,53,9,97,102,105,105,49,48,48,49,
55,9,97,102,105,105,49,48,48,49,56,9,97,102,105,105,49,48,48,49,57,9,97,102,
105,105,49,48,48,50,48,9,97,102,105,105,49,48,48,50,49,9,97,102,105,105,49,
48,48,50,50,9,97,102,105,105,49,48,48,50,52,9,97,102,105,105,49,48,48,50,
53,9,97,102,105,105,49,48,48,50,54,9,97,102,105,105,49,48,48,50,55,9,97,102,
105,105,49,48,48,50,56,9,97,102,105,105,49,48,48,50,57,9,97,102,105,105,49,
48,48,51,48,9,97,102,105,105,49,48,48,51,49,9,97,102,105,105,49,48,48,51,
50,9,97,102,105,105,49,48,48,51,51,9,97,102,105,105,49,48,48,51,52,9,97,102,
105,105,49,48,48,51,53,9,97,102,105,105,49,48,48,51,54,9,97,102,105,105,49,
48,48,51,55,9,97,102,105,105,49,48,48,51,56,9,97,102,105,105,49,48,48,51,
57,9,97,102,105,105,49,48,48,52,48,9,97,102,105,105,49,48,48,52,49,9,97,102,
105,105,49,48,48,52,50,9,97,102,105,105,49,48,48,52,51,9,97,102,105,105,49,
48,48,52,52,9,97,102,105,105,49,48,48,52,53,9,97,102,105,105,49,48,48,52,
54,9,97,102,105,105,49,48,48,52,55,9,97,102,105,105,49,48,48,52,56,9,97,102,
105,105,49,48,48,52,57,9,97,102,105,105,49,48,48,54,53,9,97,102,105,105,49,
48,48,54,54,9,97,102,105,105,49,48,48,54,55,9,97,102,105,105,49,48,48,54,
56,9,97,102,105,105,49,48,48,54,57,9,97,102,105,105,49,48,48,55,48,9,97,102,
105,105,49,48,48,55,50,9,97,102,105,105,49,48,48,55,51,9,97,102,105,105,49,
48,48,55,52,9,97,102,105,105,49,48,48,55,53,9,97,102,105,105,49,48,48,55,
54,9,97,102,105,105,49,48,48,55,55,9,97,102,105,105,49,48,48,55,56,9,97,102,
105,105,49,48,48,55,57,9,97,102,105,105,49,48,48,56,48,9,97,102,105,105,49,
48,48,56,49,9,97,102,105,105,49,48,48,56,50,9,97,102,105,105,49,48,48,56,
51,9,97,102,105,105,49,48,48,56,52,9,97,102,105,105,49,48,48,56,53,9,97,102,
105,105,49,48,48,56,54,9,97,102,105,105,49,48,48,56,55,9,97,102,105,105,49,
48,48,56,56,9,97,102,105,105,49,48,48,56,57,9,97,102,105,105,49,48,48,57,
48,9,97,102,105,105,49,48,48,57,49,9,97,102,105,105,49,48,48,57,50,9,97,102,
105,105,49,48,48,57,51,9,97,102,105,105,49,48,48,57,52,9,97,102,105,105,49,
48,48,57,53,9,97,102,105,105,49,48,48,57,54,9,97,102,105,105,49,48,48,57,
55,9,97,102,105,105,49,48,48,55,49,9,97,102,105,105,49,48,48,57,57,9,97,102,
105,105,49,48,49,48,48,9,97,102,105,105,49,48,49,48,49,9,97,102,105,105,49,
48,49,48,50,9,97,102,105,105,49,48,49,48,51,9,97,102,105,105,49,48,49,48,
52,9,97,102,105,105,49,48,49,48,53,9,97,102,105,105,49,48,49,48,54,9,97,102,
105,105,49,48,49,48,55,9,97,102,105,105,49,48,49,48,56,9,97,102,105,105,49,
48,49,48,57,9,97,102,105,105,49,48,49,49,48,9,97,102,105,105,49,48,49,57,
51,9,97,102,105,105,49,48,48,53,48,9,97,102,105,105,49,48,48,57,56,6,87,103,
114,97,118,101,6,119,103,114,97,118,101,6,87,97,99,117,116,101,6,119,97,99,
117,116,101,9,87,100,105,101,114,101,115,105,115,9,119,100,105,101,114,101,
115,105,115,6,89,103,114,97,118,101,6,121,103,114,97,118,101,9,97,102,105,
105,48,48,50,48,56,13,117,110,100,101,114,115,99,111,114,101,100,98,108,13,
113,117,111,116,101,114,101,118,101,114,115,101,100,6,109,105,110,117,116,
101,6,115,101,99,111,110,100,9,101,120,99,108,97,109,100,98,108,7,117,110,
105,50,48,51,69,7,117,110,105,50,50,49,53,7,117,110,105,50,48,55,70,4,108,
105,114,97,6,112,101,115,101,116,97,4,69,117,114,111,9,97,102,105,105,54,
49,50,52,56,9,97,102,105,105,54,49,50,56,57,9,97,102,105,105,54,49,51,53,
50,7,117,110,105,50,49,50,54,9,101,115,116,105,109,97,116,101,100,9,111,110,
101,101,105,103,104,116,104,12,116,104,114,101,101,101,105,103,104,116,104,
115,11,102,105,118,101,101,105,103,104,116,104,115,12,115,101,118,101,110,
101,105,103,104,116,104,115,9,97,114,114,111,119,108,101,102,116,7,97,114,
114,111,119,117,112,10,97,114,114,111,119,114,105,103,104,116,9,97,114,114,
111,119,100,111,119,110,9,97,114,114,111,119,98,111,116,104,9,97,114,114,
111,119,117,112,100,110,12,97,114,114,111,119,117,112,100,110,98,115,101,
7,117,110,105,50,50,48,54,10,111,114,116,104,111,103,111,110,97,108,12,105,
110,116,101,114,115,101,99,116,105,111,110,11,101,113,117,105,118,97,108,
101,110,99,101,5,104,111,117,115,101,13,114,101,118,108,111,103,105,99,97,
108,110,111,116,10,105,110,116,101,103,114,97,108,116,112,10,105,110,116,
101,103,114,97,108,98,116,8,83,70,49,48,48,48,48,48,8,83,70,49,49,48,48,48,
48,8,83,70,48,49,48,48,48,48,8,83,70,48,51,48,48,48,48,8,83,70,48,50,48,48,
48,48,8,83,70,48,52,48,48,48,48,8,83,70,48,56,48,48,48,48,8,83,70,48,57,48,
48,48,48,8,83,70,48,54,48,48,48,48,8,83,70,48,55,48,48,48,48,8,83,70,48,53,
48,48,48,48,8,83,70,52,51,48,48,48,48,8,83,70,50,52,48,48,48,48,8,83,70,53,
49,48,48,48,48,8,83,70,53,50,48,48,48,48,8,83,70,51,57,48,48,48,48,8,83,70,
50,50,48,48,48,48,8,83,70,50,49,48,48,48,48,8,83,70,50,53,48,48,48,48,8,83,
70,53,48,48,48,48,48,8,83,70,52,57,48,48,48,48,8,83,70,51,56,48,48,48,48,
8,83,70,50,56,48,48,48,48,8,83,70,50,55,48,48,48,48,8,83,70,50,54,48,48,48,
48,8,83,70,51,54,48,48,48,48,8,83,70,51,55,48,48,48,48,8,83,70,52,50,48,48,
48,48,8,83,70,49,57,48,48,48,48,8,83,70,50,48,48,48,48,48,8,83,70,50,51,48,
48,48,48,8,83,70,52,55,48,48,48,48,8,83,70,52,56,48,48,48,48,8,83,70,52,49,
48,48,48,48,8,83,70,52,53,48,48,48,48,8,83,70,52,54,48,48,48,48,8,83,70,52,
48,48,48,48,48,8,83,70,53,52,48,48,48,48,8,83,70,53,51,48,48,48,48,8,83,70,
52,52,48,48,48,48,7,117,112,98,108,111,99,107,7,100,110,98,108,111,99,107,
5,98,108,111,99,107,7,108,102,98,108,111,99,107,7,114,116,98,108,111,99,107,
7,108,116,115,104,97,100,101,5,115,104,97,100,101,7,100,107,115,104,97,100,
101,9,102,105,108,108,101,100,98,111,120,6,72,50,50,48,55,51,6,72,49,56,53,
52,51,6,72,49,56,53,53,49,10,102,105,108,108,101,100,114,101,99,116,7,116,
114,105,97,103,117,112,7,116,114,105,97,103,114,116,7,116,114,105,97,103,
100,110,7,116,114,105,97,103,108,102,6,99,105,114,99,108,101,6,72,49,56,53,
51,51,9,105,110,118,98,117,108,108,101,116,9,105,110,118,99,105,114,99,108,
101,10,111,112,101,110,98,117,108,108,101,116,9,115,109,105,108,101,102,97,
99,101,12,105,110,118,115,109,105,108,101,102,97,99,101,3,115,117,110,6,102,
101,109,97,108,101,4,109,97,108,101,5,115,112,97,100,101,4,99,108,117,98,
5,104,101,97,114,116,7,100,105,97,109,111,110,100,11,109,117,115,105,99,97,
108,110,111,116,101,14,109,117,115,105,99,97,108,110,111,116,101,100,98,108,
7,117,110,105,70,66,48,49,7,117,110,105,70,66,48,50,7,117,110,105,70,48,48,
53,6,109,105,100,100,111,116,7,117,110,105,70,48,48,52,7,117,110,105,50,48,
55,52,7,117,110,105,50,48,55,53,7,117,110,105,50,48,55,55,7,117,110,105,50,
48,55,56,8,103,108,121,112,104,53,55,49,8,103,108,121,112,104,53,55,50,8,
103,108,121,112,104,53,55,51,8,103,108,121,112,104,53,55,52,8,103,108,121,
112,104,53,55,53,8,103,108,121,112,104,53,55,54,8,103,108,121,112,104,53,
55,55,8,103,108,121,112,104,53,55,56,8,103,108,121,112,104,53,55,57,8,103,
108,121,112,104,53,56,48,8,103,108,121,112,104,53,56,49,0,0,0,0,0,0,3,0,8,
0,2,0,17,0,1,255,255,0,3,0,1,0,0,0,14,0,0,0,24,0,0,0,0,0,2,0,1,0,1,2,155,
0,1,0,4,0,0,0,2,0,0,0,1,0,0,0,10,0,76,0,78,0,4,68,70,76,84,0,26,99,121,114,
108,0,36,103,114,101,107,0,46,108,97,116,110,0,56,0,4,0,0,0,0,255,255,0,0,
0,4,0,0,0,0,255,255,0,0,0,4,0,0,0,0,255,255,0,0,0,4,0,0,0,0,255,255,0,0,0,
0,0,0,0,1,0,0,0,10,0,84,0,98,0,4,68,70,76,84,0,26,99,121,114,108,0,38,103,
114,101,107,0,50,108,97,116,110,0,62,0,4,0,0,0,0,255,255,0,1,0,0,0,4,0,0,
0,0,255,255,0,1,0,0,0,4,0,0,0,0,255,255,0,1,0,0,0,4,0,0,0,0,255,255,0,1,0,
0,0,1,107,101,114,110,0,8,0,0,0,1,0,0,0,1,0,4,0,2,0,0,0,1,0,8,0,1,15,112,
0,4,0,0,0,105,0,220,1,6,1,12,1,50,1,64,1,94,1,112,1,130,1,204,2,2,2,52,2,
114,2,124,2,138,2,148,2,138,2,158,2,196,2,202,3,28,3,38,3,84,3,118,3,144,
3,166,3,228,3,254,4,20,4,46,4,56,4,190,5,44,5,58,3,28,5,100,5,186,5,204,6,
22,6,28,6,82,6,136,5,186,6,178,6,216,6,230,5,186,7,16,5,186,5,186,5,186,7,
62,7,84,7,90,7,96,7,166,7,224,8,54,8,168,8,194,8,204,8,246,9,24,9,46,9,60,
9,98,9,144,9,242,10,48,10,174,11,72,11,106,11,136,11,146,11,156,11,166,11,
224,12,14,12,64,12,82,12,144,12,210,12,252,13,6,13,44,13,62,13,108,13,150,
13,160,13,174,13,208,13,242,14,4,14,46,14,112,14,142,14,180,14,198,14,212,
14,222,15,0,15,30,15,40,15,70,15,76,15,90,0,10,0,36,255,143,0,55,255,219,
0,60,255,219,1,82,255,143,1,91,255,143,1,94,255,143,1,101,255,143,1,109,255,
219,1,110,255,219,1,116,255,219,0,1,0,20,255,104,0,9,0,3,255,143,0,55,255,
104,0,57,255,104,0,58,255,180,0,60,255,104,0,89,255,219,0,90,255,219,0,92,
255,219,2,3,255,104,0,3,0,15,255,29,0,17,255,29,0,36,255,143,0,7,0,3,255,
180,0,55,255,104,0,57,255,104,0,58,255,104,0,60,255,104,0,92,255,180,2,3,
255,143,0,4,0,3,255,219,0,15,254,248,0,17,254,248,0,36,255,104,0,4,0,55,255,
219,0,57,255,219,0,58,255,219,0,60,255,219,0,18,0,3,255,219,0,15,255,29,0,
16,255,143,0,17,255,29,0,29,255,29,0,30,255,29,0,36,255,104,0,50,255,219,
0,68,255,29,0,70,255,29,0,72,255,29,0,76,255,180,0,82,255,29,0,85,255,180,
0,86,255,29,0,88,255,180,0,90,255,143,0,92,255,143,0,13,0,15,255,68,0,16,
255,143,0,17,255,68,0,29,255,180,0,30,255,180,0,36,255,104,0,68,255,104,0,
72,255,143,0,76,255,219,0,82,255,143,0,85,255,180,0,88,255,180,0,92,255,180,
0,12,0,15,255,143,0,16,255,219,0,17,255,143,0,29,255,219,0,30,255,219,0,36,
255,180,0,68,255,180,0,72,255,219,0,82,255,219,0,85,255,219,0,88,255,219,
0,92,255,238,0,15,0,3,255,219,0,15,254,248,0,16,255,68,0,17,254,248,0,29,
255,143,0,30,255,123,0,36,255,104,0,68,255,104,0,72,255,68,0,76,255,180,0,
82,255,68,0,83,255,104,0,84,255,68,0,88,255,143,0,89,255,143,0,2,0,73,255,
219,2,3,0,37,0,3,0,15,255,143,0,17,255,143,2,3,0,76,0,2,0,15,255,104,0,17,
255,104,0,2,0,15,255,143,0,17,255,143,0,9,1,98,255,213,1,105,255,213,1,109,
255,104,1,110,255,104,1,111,255,197,1,116,255,104,1,124,255,219,1,134,255,
219,1,144,255,219,0,1,1,110,255,190,0,20,1,90,0,170,1,91,255,104,1,94,255,
104,1,98,255,141,1,101,255,104,1,105,255,141,1,111,255,141,1,114,255,158,
1,119,255,104,1,120,255,180,1,122,255,70,1,128,255,104,1,130,255,180,1,131,
255,104,1,133,255,104,1,136,255,70,1,140,255,70,1,143,255,70,1,147,0,98,1,
149,255,70,0,2,1,110,255,209,1,116,255,209,0,11,0,3,255,143,1,98,255,213,
1,105,255,213,1,109,255,104,1,110,255,104,1,111,255,197,1,116,255,104,1,124,
255,219,1,134,255,219,1,144,255,219,2,3,255,104,0,8,0,15,255,31,0,17,255,
31,1,90,0,164,1,91,255,68,1,94,255,68,1,101,255,68,1,130,255,168,1,147,0,
88,0,6,0,3,255,143,1,98,255,213,1,105,255,213,1,109,255,137,1,110,255,104,
1,116,255,104,0,5,1,91,255,219,1,94,255,219,1,101,255,219,1,110,255,190,1,
116,255,190,0,15,1,98,255,193,1,105,255,193,1,111,255,143,1,117,255,231,1,
122,255,231,1,125,255,231,1,127,255,231,1,129,255,231,1,135,255,231,1,136,
255,231,1,140,255,231,1,143,255,231,1,146,255,231,1,149,255,231,1,151,255,
231,0,6,0,3,255,143,1,98,255,213,1,105,255,213,1,109,255,104,1,110,255,104,
1,116,255,104,0,5,1,91,255,219,1,94,255,213,1,101,255,219,1,110,255,190,1,
116,255,190,0,6,0,3,255,219,0,15,254,250,0,17,254,250,1,91,255,104,1,94,255,
104,1,101,255,104,0,2,1,137,255,158,1,141,255,158,0,33,0,3,255,219,0,15,255,
31,0,17,255,31,0,29,255,31,0,30,255,31,1,90,0,188,1,91,255,104,1,94,255,104,
1,98,255,219,1,101,255,104,1,105,255,219,1,111,255,219,1,114,255,219,1,117,
255,31,1,118,255,31,1,121,255,78,1,122,255,31,1,124,255,78,1,126,255,31,1,
128,255,106,1,130,255,180,1,133,255,106,1,134,255,143,1,136,255,31,1,140,
255,31,1,142,255,80,1,143,255,31,1,144,255,143,1,145,255,106,1,147,0,188,
1,148,255,78,1,149,255,31,1,150,255,78,0,27,0,3,255,219,0,15,254,250,0,16,
255,70,0,17,254,250,0,29,255,143,0,30,255,143,1,90,0,188,1,91,255,104,1,94,
255,104,1,98,255,141,1,101,255,104,1,105,255,141,1,111,255,141,1,114,255,
158,1,119,255,104,1,120,255,180,1,122,255,70,1,124,255,158,1,128,255,104,
1,130,255,180,1,131,255,104,1,133,255,104,1,136,255,70,1,140,255,70,1,143,
255,70,1,147,0,121,1,149,255,70,0,3,1,91,255,197,1,110,255,190,1,116,255,
190,0,10,1,117,255,178,1,122,255,178,1,125,255,178,1,129,255,217,1,136,255,
178,1,140,255,178,1,143,255,178,1,146,255,178,1,149,255,178,1,151,255,178,
0,21,0,3,255,219,1,90,0,170,1,91,255,104,1,94,255,104,1,98,255,141,1,101,
255,104,1,105,255,141,1,111,255,141,1,114,255,158,1,119,255,104,1,120,255,
180,1,122,255,70,1,128,255,104,1,130,255,180,1,131,255,104,1,133,255,104,
1,136,255,70,1,140,255,70,1,143,255,70,1,147,0,98,1,149,255,70,0,4,1,132,
255,217,1,137,255,227,1,141,255,227,1,144,255,201,0,18,1,117,255,119,1,119,
255,219,1,122,255,119,1,124,255,170,1,125,255,180,1,128,255,219,1,129,255,
158,1,130,255,219,1,131,255,219,1,134,255,170,1,136,255,119,1,137,255,170,
1,140,255,119,1,141,255,170,1,143,255,119,1,146,255,119,1,149,255,119,1,151,
255,119,0,1,1,132,255,217,0,13,1,117,255,231,1,122,255,231,1,125,255,231,
1,127,255,231,1,129,255,231,1,135,255,231,1,136,255,231,1,139,255,231,1,140,
255,231,1,143,255,231,1,146,255,231,1,149,255,231,1,151,255,231,0,13,1,117,
255,225,1,122,255,225,1,125,255,225,1,135,255,225,1,136,255,225,1,139,255,
209,1,140,255,225,1,142,255,207,1,143,255,219,1,146,255,225,1,149,255,225,
1,150,255,207,1,151,255,225,0,10,1,117,255,201,1,122,255,201,1,125,255,201,
1,127,255,201,1,135,255,201,1,136,255,201,1,139,255,201,1,140,255,201,1,143,
255,201,1,149,255,201,0,9,1,117,255,227,1,122,255,227,1,127,255,227,1,136,
255,227,1,139,255,227,1,140,255,227,1,143,255,227,1,146,255,227,1,151,255,
227,0,3,1,132,255,217,1,137,255,227,1,141,255,227,0,10,1,117,255,227,1,122,
255,227,1,125,255,227,1,127,255,227,1,136,255,227,1,139,255,227,1,140,255,
227,1,143,255,227,1,146,255,227,1,151,255,227,0,11,1,117,255,201,1,122,255,
201,1,125,255,201,1,127,255,201,1,136,255,201,1,139,255,201,1,140,255,201,
1,143,255,201,1,146,255,201,1,149,255,201,1,151,255,201,0,5,0,15,255,6,0,
17,255,6,0,108,255,119,0,123,255,119,1,255,255,211,0,1,2,3,255,96,0,1,2,3,
255,119,0,17,1,170,0,68,1,173,255,233,1,177,0,45,1,180,255,211,1,181,255,
233,1,183,255,211,1,184,255,96,1,185,255,166,1,186,255,188,1,189,255,96,1,
195,255,211,1,198,0,23,1,216,255,211,1,217,255,233,1,218,0,23,1,227,0,45,
2,3,255,141,0,14,1,166,255,211,1,173,255,233,1,180,255,233,1,183,255,233,
1,184,255,164,1,185,255,209,1,186,255,233,1,187,255,211,1,189,255,164,1,192,
255,188,1,195,255,233,1,197,255,233,1,209,255,233,1,217,255,211,0,21,1,166,
255,188,1,170,255,211,1,172,255,211,1,173,255,188,1,177,255,233,1,180,255,
188,1,183,255,188,1,184,255,119,1,185,255,188,1,186,255,188,1,187,255,166,
1,189,255,164,1,192,255,141,1,197,255,188,1,202,255,233,1,210,255,233,1,216,
255,188,1,217,255,233,1,219,255,233,1,221,255,188,1,229,255,233,0,28,0,15,
255,6,0,17,255,6,0,108,255,119,0,123,255,119,1,166,255,119,1,170,255,119,
1,173,255,211,1,177,255,141,1,178,255,209,1,180,255,141,1,183,255,164,1,197,
255,188,1,198,255,141,1,200,255,141,1,202,255,119,1,203,255,119,1,206,255,
141,1,209,255,141,1,210,255,141,1,211,255,141,1,212,255,119,1,214,255,141,
1,217,255,119,1,225,255,141,1,226,255,141,1,228,255,141,1,229,255,119,1,255,
255,211,0,6,1,185,0,23,1,186,255,211,1,189,255,186,1,205,0,68,1,212,0,23,
1,217,0,45,0,2,1,173,255,211,1,215,255,233,0,10,1,173,255,233,1,180,255,211,
1,183,255,233,1,184,0,23,1,185,0,45,1,192,0,45,1,198,0,23,1,203,255,231,1,
212,255,233,1,217,255,233,0,8,1,177,255,233,1,180,255,233,1,183,255,233,1,
184,255,211,1,185,255,233,1,186,255,233,1,189,255,211,1,197,255,233,0,5,1,
173,255,233,1,180,255,233,1,183,255,233,1,185,0,23,1,186,255,186,0,3,1,186,
255,233,1,199,0,23,1,217,0,23,0,9,1,186,255,233,1,189,255,233,1,198,0,23,
1,203,0,23,1,212,0,23,1,215,0,23,1,217,0,23,1,221,255,233,1,227,0,23,0,11,
1,166,255,211,1,170,255,211,1,172,255,211,1,177,255,233,1,185,255,211,1,187,
255,164,1,189,255,211,1,197,255,211,1,202,255,211,1,209,255,233,1,219,255,
233,0,24,0,15,254,125,0,17,254,125,0,29,255,211,0,30,255,211,0,123,255,141,
1,166,255,119,1,170,255,119,1,172,255,233,1,173,255,211,1,177,255,141,1,178,
255,233,1,180,255,211,1,183,255,233,1,184,255,164,1,185,255,211,1,186,255,
233,1,187,255,164,1,197,255,211,1,198,255,188,1,202,255,96,1,203,255,166,
1,212,255,166,1,227,255,211,1,229,255,188,0,15,1,166,255,211,1,170,255,211,
1,173,255,233,1,177,255,188,1,178,255,233,1,180,255,211,1,184,255,188,1,185,
255,188,1,187,255,141,1,189,255,188,1,192,255,186,1,195,255,233,1,198,0,23,
1,204,0,45,1,221,255,233,0,31,0,15,255,29,0,17,255,29,0,108,255,166,0,123,
255,166,1,166,255,188,1,170,255,188,1,172,0,23,1,173,255,233,1,177,255,211,
1,180,255,164,1,186,255,188,1,197,255,211,1,198,255,164,1,200,255,166,1,203,
255,141,1,206,255,166,1,208,255,166,1,209,255,164,1,210,255,166,1,212,255,
96,1,213,255,166,1,214,255,141,1,215,255,141,1,217,255,141,1,219,255,166,
1,223,255,166,1,225,255,166,1,226,255,166,1,228,255,166,1,229,255,141,1,255,
255,211,0,38,0,15,254,240,0,17,254,240,0,29,255,211,0,30,255,211,0,108,255,
166,0,123,255,164,1,166,255,119,1,170,255,164,1,173,255,211,1,177,255,188,
1,180,255,188,1,186,255,188,1,195,255,211,1,197,255,211,1,199,255,211,1,200,
255,141,1,201,255,164,1,202,255,96,1,203,255,119,1,204,255,188,1,205,255,
141,1,206,255,164,1,207,255,188,1,208,255,164,1,209,255,119,1,210,255,164,
1,211,255,164,1,212,255,119,1,213,255,164,1,214,255,164,1,215,255,119,1,219,
255,164,1,220,255,164,1,222,255,164,1,223,255,164,1,228,255,164,1,229,255,
119,1,255,255,233,0,8,1,166,255,211,1,170,255,188,1,177,255,188,1,184,255,
141,1,185,255,164,1,189,255,211,1,197,255,186,1,209,255,188,0,7,1,173,255,
211,1,180,255,188,1,183,255,188,1,186,255,188,1,195,255,186,1,212,255,233,
1,217,255,211,0,2,1,180,255,211,1,198,0,45,0,2,1,198,0,23,1,217,0,45,0,2,
1,197,255,188,2,3,255,119,0,14,1,166,255,211,1,170,255,211,1,172,255,188,
1,173,255,233,1,177,255,186,1,178,255,211,1,180,255,211,1,183,255,211,1,184,
255,51,1,187,255,164,1,189,255,96,1,195,255,233,1,197,255,164,2,3,255,96,
0,11,1,170,255,188,1,172,255,231,1,173,255,233,1,177,255,188,1,187,255,186,
1,197,255,211,1,202,255,188,1,204,0,23,1,209,255,188,1,210,255,233,1,229,
255,233,0,12,1,166,255,188,1,170,255,166,1,172,255,211,1,177,255,164,1,180,
255,233,1,183,255,233,1,184,255,141,1,187,255,164,1,189,255,188,1,202,255,
164,1,209,255,164,1,210,255,233,0,4,1,205,255,233,1,216,255,211,1,217,255,
233,1,221,255,211,0,15,1,198,255,209,1,202,255,164,1,203,255,233,1,204,255,
233,1,205,255,211,1,209,255,164,1,210,255,211,1,215,255,233,1,217,255,211,
1,218,255,233,1,219,255,188,1,221,255,188,1,224,255,188,1,227,255,233,1,229,
255,211,0,16,1,198,255,233,1,199,255,233,1,202,255,233,1,203,255,233,1,204,
255,233,1,205,255,233,1,209,255,209,1,210,255,233,1,212,255,233,1,215,255,
233,1,216,255,211,1,217,255,211,1,218,255,233,1,221,255,164,1,224,255,188,
1,229,255,233,0,10,0,15,255,6,0,17,255,6,1,198,255,211,1,202,255,164,1,203,
255,211,1,205,255,233,1,209,255,211,1,212,255,211,1,215,255,211,1,229,255,
233,0,2,1,224,255,211,1,227,0,23,0,9,1,199,255,233,1,202,255,211,1,204,255,
233,1,205,255,211,1,209,255,188,1,216,255,188,1,217,255,233,1,219,255,211,
1,221,255,188,0,4,1,199,0,23,1,217,0,23,1,221,255,233,1,224,0,45,0,11,1,199,
255,233,1,202,255,211,1,203,255,233,1,205,255,233,1,209,255,233,1,212,255,
233,1,215,255,233,1,217,255,233,1,218,255,233,1,221,255,188,1,224,255,211,
0,10,1,198,0,45,1,199,0,45,1,203,0,23,1,205,0,23,1,209,0,23,1,212,0,23,1,
215,0,23,1,216,0,23,1,217,0,23,1,227,0,23,0,2,1,212,0,23,1,221,255,211,0,
3,1,199,255,233,1,205,255,233,1,217,0,23,0,8,1,202,255,211,1,204,255,233,
1,205,255,233,1,209,255,211,1,216,255,211,1,217,255,233,1,219,255,233,1,221,
255,211,0,8,1,202,255,209,1,205,255,233,1,209,255,186,1,216,255,211,1,217,
255,233,1,219,255,233,1,221,255,211,1,229,255,233,0,4,1,204,0,23,1,212,0,
23,1,221,255,233,1,227,0,23,0,10,0,15,255,29,0,17,255,29,1,198,255,233,1,
202,255,188,1,203,255,233,1,204,0,68,1,209,255,211,1,212,255,233,1,215,255,
233,1,217,0,23,0,16,0,15,255,51,0,17,255,51,0,123,0,23,1,198,255,233,1,199,
0,23,1,202,255,188,1,203,255,233,1,204,0,23,1,209,255,211,1,210,255,233,1,
212,255,231,1,214,255,233,1,215,255,233,1,218,255,233,1,227,255,233,1,229,
255,233,0,7,1,199,255,233,1,202,255,211,1,209,255,211,1,216,255,211,1,217,
255,233,1,221,255,211,1,229,255,233,0,9,1,198,255,233,1,199,255,233,1,203,
255,233,1,205,255,233,1,212,255,233,1,215,255,233,1,216,255,233,1,218,255,
233,1,221,255,211,0,4,1,203,255,233,1,205,255,233,1,212,255,233,1,215,255,
233,0,3,1,203,255,233,1,212,255,233,1,217,0,23,0,2,1,216,255,96,1,221,255,
119,0,8,1,202,255,211,1,203,0,23,1,205,255,233,1,209,255,211,1,212,0,23,1,
216,255,211,1,219,255,233,1,229,255,233,0,7,1,202,255,211,1,204,255,233,1,
209,255,211,1,210,255,233,1,216,255,211,1,219,255,233,1,221,255,211,0,2,0,
15,255,51,0,17,255,51,0,7,0,15,255,6,0,17,255,6,0,29,255,211,0,30,255,211,
0,108,255,96,0,123,255,96,1,255,255,211,0,1,2,2,255,219,0,3,0,3,255,180,0,
86,255,219,2,3,255,219,0,5,1,153,255,96,1,162,255,96,1,184,255,96,1,189,255,
188,1,192,255,188,0,1,0,105,0,3,0,20,0,36,0,41,0,47,0,51,0,53,0,55,0,57,0,
58,0,60,0,73,0,85,0,89,0,90,0,92,1,82,1,87,1,88,1,89,1,91,1,93,1,94,1,98,
1,100,1,101,1,105,1,107,1,108,1,109,1,110,1,111,1,113,1,114,1,116,1,125,1,
127,1,129,1,131,1,132,1,135,1,136,1,137,1,138,1,141,1,143,1,144,1,146,1,149,
1,151,1,154,1,160,1,161,1,166,1,167,1,168,1,169,1,170,1,171,1,172,1,173,1,
176,1,177,1,178,1,180,1,182,1,183,1,184,1,185,1,186,1,187,1,188,1,191,1,192,
1,194,1,195,1,196,1,198,1,199,1,200,1,201,1,202,1,203,1,204,1,205,1,208,1,
209,1,210,1,212,1,214,1,215,1,216,1,217,1,218,1,219,1,220,1,223,1,226,1,227,
1,228,1,242,1,244,2,2,2,3,2,8,0,0,0,1,0,0,0,0,199,254,176,223,0,0,0,0,191,
26,255,128,0,0,0,0,196,4,48,20,};
#endif
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/generated/font_droid.h
0,0 → 1,11257
#ifndef __STRICT_ANSI__
#if defined(__linux__) || defined(__FreeBSD__)
#define HAVE_INCBIN
#endif
#endif
 
#ifdef HAVE_INCBIN
extern const unsigned char pdf_font_DroidSans[139280];
asm(".globl pdf_font_DroidSans");
asm(".balign 8");
asm("pdf_font_DroidSans:");
asm(".incbin \"fonts/droid/DroidSans.ttf\"");
#else
static const unsigned char pdf_font_DroidSans[139280] = {
0,1,0,0,0,19,1,0,0,4,0,48,70,70,84,77,75,29,224,116,0,2,31,244,0,0,0,28,71,
68,69,70,2,201,0,4,0,2,14,208,0,0,0,32,71,80,79,83,236,144,228,222,0,2,15,
64,0,0,16,180,71,83,85,66,147,60,130,75,0,2,14,240,0,0,0,80,79,83,47,50,247,
26,134,136,0,0,1,184,0,0,0,96,99,109,97,112,29,150,101,90,0,0,12,136,0,0,
6,242,99,118,116,32,65,244,67,234,0,0,29,92,0,0,2,20,102,112,103,109,115,
211,35,176,0,0,19,124,0,0,7,5,103,97,115,112,0,24,0,9,0,2,14,192,0,0,0,16,
103,108,121,102,155,28,79,66,0,0,36,172,0,1,184,160,104,101,97,100,248,253,
254,54,0,0,1,60,0,0,0,54,104,104,101,97,14,75,8,159,0,0,1,116,0,0,0,36,104,
109,116,120,38,164,8,117,0,0,2,24,0,0,10,112,107,101,114,110,174,170,185,
111,0,1,221,76,0,0,21,90,108,111,99,97,120,114,13,144,0,0,31,112,0,0,5,58,
109,97,120,112,7,1,7,208,0,0,1,152,0,0,0,32,110,97,109,101,35,87,171,194,
0,1,242,168,0,0,7,251,112,111,115,116,26,213,54,16,0,1,250,164,0,0,20,25,
112,114,101,112,122,200,94,246,0,0,26,132,0,0,2,213,0,1,0,0,0,1,5,30,235,
107,75,224,95,15,60,245,0,31,8,0,0,0,0,0,201,129,215,160,0,0,0,0,201,129,
215,160,254,96,253,147,8,103,7,72,0,0,0,8,0,2,0,0,0,0,0,0,0,1,0,0,7,62,254,
78,0,67,8,192,254,96,254,244,8,103,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,156,
0,1,0,0,2,156,1,82,0,84,0,140,0,5,0,2,0,16,0,47,0,90,0,0,3,158,5,192,0,3,
0,1,0,3,4,185,1,144,0,5,0,8,5,154,5,51,0,0,1,27,5,154,5,51,0,0,3,209,0,102,
2,18,8,5,2,11,6,4,2,2,2,2,2,4,160,0,2,175,80,0,120,251,0,0,0,0,0,0,0,0,49,
65,83,67,0,64,0,33,251,2,5,211,254,81,1,51,7,62,1,178,96,0,0,159,223,215,
0,0,4,58,5,129,0,0,0,32,0,2,2,236,0,68,0,0,0,0,2,170,0,0,2,57,0,0,2,57,0,
185,2,215,0,87,4,115,0,9,4,115,0,22,7,29,0,73,5,86,0,72,1,135,0,104,2,170,
0,127,2,170,0,12,3,29,0,33,4,172,0,100,2,57,0,184,2,170,0,91,2,57,0,187,2,
57,0,0,4,115,0,80,4,115,0,156,4,115,0,103,4,115,0,78,4,115,0,47,4,115,0,82,
4,115,0,104,4,115,0,105,4,115,0,89,4,115,0,96,2,57,0,187,2,57,0,184,4,172,
0,101,4,172,0,100,4,172,0,101,4,115,0,84,8,31,0,161,5,86,0,4,5,86,0,168,5,
199,0,104,5,199,0,168,5,86,0,168,4,227,0,168,6,57,0,103,5,199,0,168,2,57,
0,189,4,0,0,32,5,86,0,168,4,115,0,168,6,170,0,168,5,199,0,168,6,57,0,97,5,
86,0,168,6,57,0,97,5,199,0,168,5,86,0,93,4,227,0,46,5,199,0,158,5,86,0,9,
7,141,0,9,5,86,0,46,5,86,0,45,4,227,0,65,2,57,0,146,2,57,0,0,2,57,0,16,3,
193,0,10,4,115,255,225,2,170,0,106,4,115,0,87,4,115,0,132,4,0,0,87,4,115,
0,86,4,115,0,87,2,57,0,29,4,115,0,86,4,115,0,142,1,199,0,137,1,199,255,206,
4,0,0,138,1,199,0,138,6,170,0,136,4,115,0,136,4,115,0,86,4,115,0,132,4,115,
0,86,2,170,0,136,4,0,0,57,2,57,0,31,4,115,0,133,4,0,0,7,5,199,255,253,4,0,
0,23,4,0,0,5,4,0,0,49,2,172,0,34,2,20,0,183,2,172,0,34,4,172,0,92,2,170,0,
242,4,115,0,135,4,115,0,58,4,115,0,113,4,115,255,254,2,20,0,183,4,115,0,115,
2,170,0,45,5,229,0,31,2,246,0,26,4,115,0,83,4,172,0,100,5,229,0,31,4,107,
255,239,3,51,0,122,4,100,0,65,2,170,0,41,2,170,0,27,2,170,0,72,4,156,0,140,
4,76,0,80,2,57,0,187,2,170,0,119,2,170,0,80,2,236,0,27,4,115,0,83,6,172,0,
56,6,172,0,56,6,172,0,73,4,227,0,131,5,86,0,4,5,86,0,4,5,86,0,4,5,86,0,4,
5,86,0,4,5,86,0,4,8,0,0,24,5,199,0,104,5,86,0,168,5,86,0,168,5,86,0,168,5,
86,0,168,2,57,0,9,2,57,0,142,2,57,255,210,2,57,0,7,5,199,0,14,5,199,0,168,
6,57,0,97,6,57,0,97,6,57,0,97,6,57,0,97,6,57,0,97,4,172,0,142,6,57,0,71,5,
199,0,158,5,199,0,158,5,199,0,158,5,199,0,158,5,86,0,45,5,86,0,168,4,227,
0,142,4,115,0,87,4,115,0,87,4,115,0,87,4,115,0,87,4,115,0,87,4,115,0,87,7,
29,0,66,4,0,0,87,4,115,0,87,4,115,0,87,4,115,0,87,4,115,0,87,2,57,0,10,2,
57,0,135,2,57,255,211,2,57,0,8,4,115,0,86,4,115,0,140,4,115,0,86,4,115,0,
86,4,115,0,86,4,115,0,86,4,115,0,86,4,100,0,65,4,227,0,44,4,115,0,139,4,115,
0,139,4,115,0,139,4,115,0,139,4,0,0,5,4,115,0,138,4,0,0,5,5,86,0,4,4,115,
0,87,5,86,0,4,4,115,0,87,5,86,0,4,4,115,0,87,5,199,0,104,4,0,0,87,5,199,0,
104,4,0,0,87,5,199,0,104,4,0,0,87,5,199,0,104,4,0,0,87,5,199,0,168,4,235,
0,86,5,199,0,14,4,115,0,86,5,86,0,168,4,115,0,87,5,86,0,168,4,115,0,87,5,
86,0,168,4,115,0,87,5,86,0,168,4,115,0,87,5,86,0,168,4,115,0,87,6,57,0,103,
4,115,0,86,6,57,0,103,4,115,0,86,6,57,0,103,4,115,0,86,6,57,0,103,4,115,0,
86,5,199,0,168,4,115,0,142,5,199,0,14,4,115,0,10,2,57,255,184,2,57,255,184,
2,57,0,12,2,57,0,12,2,57,255,210,2,57,255,210,2,57,0,92,1,199,0,31,2,57,0,
189,2,57,0,194,5,225,0,170,3,141,0,137,4,0,0,32,1,199,255,153,5,86,0,168,
4,0,0,138,4,0,0,138,4,115,0,168,1,199,0,91,4,115,0,168,1,199,0,126,4,115,
0,168,2,85,0,138,4,115,0,168,2,172,0,138,4,115,0,20,1,199,0,16,5,199,0,168,
4,115,0,140,5,199,0,168,4,115,0,140,5,199,0,168,4,115,0,140,4,213,255,254,
5,201,0,165,4,115,0,140,6,57,0,97,4,115,0,86,6,57,0,97,4,115,0,86,6,57,0,
97,4,115,0,86,8,0,0,97,7,141,0,86,5,199,0,168,2,170,0,136,5,199,0,168,2,170,
0,129,5,199,0,168,2,170,0,56,5,86,0,93,4,0,0,57,5,86,0,93,4,0,0,57,5,86,0,
93,4,0,0,57,5,86,0,93,4,0,0,57,4,227,0,46,2,57,0,31,4,227,0,46,3,0,0,31,4,
227,0,46,2,57,0,31,5,199,0,158,4,115,0,133,5,199,0,158,4,115,0,133,5,199,
0,158,4,115,0,133,5,199,0,158,4,115,0,133,5,199,0,158,4,115,0,133,5,199,0,
158,4,115,0,133,7,141,0,9,5,199,255,253,5,86,0,45,4,0,0,5,5,86,0,45,4,227,
0,65,4,0,0,49,4,227,0,65,4,0,0,49,4,227,0,65,4,0,0,49,1,199,0,138,4,115,0,
192,5,86,0,4,4,115,0,87,8,0,0,24,7,29,0,66,6,57,0,71,4,227,0,44,2,170,0,0,
2,170,0,0,2,170,0,51,2,170,255,221,2,170,0,156,2,170,0,51,2,170,0,80,2,170,
255,233,2,170,0,22,2,170,0,205,2,170,0,29,5,87,0,4,2,57,0,187,6,70,255,245,
6,180,255,242,3,18,255,232,6,50,255,187,6,216,0,65,6,5,255,187,1,199,255,
176,5,86,0,4,5,86,0,168,4,104,0,168,5,88,0,61,5,86,0,168,4,227,0,65,5,199,
0,168,6,57,0,97,2,57,0,189,5,86,0,168,5,88,0,10,6,170,0,168,5,199,0,168,5,
51,0,90,6,57,0,97,5,199,0,168,5,86,0,168,4,242,0,108,4,227,0,46,5,86,0,45,
6,98,0,117,5,86,0,46,6,175,0,145,5,251,0,87,2,57,0,7,5,86,0,45,4,160,0,86,
3,145,0,70,4,115,0,106,1,199,0,137,4,96,0,133,4,160,0,86,4,154,0,142,4,0,
0,7,4,116,0,86,3,145,0,70,3,135,0,86,4,115,0,106,4,115,0,106,1,199,0,137,
4,0,0,138,4,0,0,14,4,156,0,138,4,0,0,0,3,149,0,86,4,115,0,86,5,133,0,79,4,
141,0,132,3,219,0,86,4,240,0,86,3,41,0,29,4,96,0,133,5,48,0,85,4,51,0,21,
5,180,0,135,6,63,0,83,1,199,255,205,4,96,0,133,4,115,0,86,4,96,0,133,6,63,
0,83,5,87,0,168,6,235,0,46,4,85,0,168,5,192,0,104,5,86,0,93,2,57,0,189,2,
57,0,7,4,0,0,32,8,117,0,18,8,21,0,168,6,213,0,46,4,169,0,168,5,21,0,55,5,
192,0,168,5,86,0,4,5,64,0,168,5,86,0,168,4,85,0,168,5,107,0,15,5,86,0,168,
7,99,0,28,4,213,0,67,5,192,0,168,5,192,0,168,4,169,0,168,5,64,0,18,6,170,
0,168,5,199,0,168,6,57,0,97,5,192,0,166,5,86,0,168,5,199,0,104,4,227,0,46,
5,21,0,55,6,21,0,118,5,86,0,46,5,235,0,168,5,85,0,160,7,85,0,168,7,128,0,
168,6,85,0,46,7,21,0,168,5,64,0,168,5,192,0,105,8,21,0,168,5,199,0,96,4,115,
0,87,4,149,0,120,4,64,0,142,2,235,0,142,4,171,0,20,4,115,0,87,5,90,0,7,3,
171,0,49,4,120,0,142,4,120,0,142,3,128,0,138,4,171,0,11,5,128,0,142,4,107,
0,142,4,115,0,86,4,85,0,142,4,115,0,132,4,0,0,87,3,170,0,35,4,0,0,5,6,149,
0,86,4,0,0,23,4,149,0,142,4,43,0,122,6,107,0,142,6,149,0,142,5,0,0,45,5,192,
0,142,4,43,0,142,4,21,0,55,6,0,0,142,4,85,0,17,4,115,0,87,4,115,0,10,2,235,
0,142,4,21,0,87,4,0,0,57,1,199,0,137,2,57,255,248,1,199,255,206,7,64,0,11,
6,128,0,142,4,115,0,10,3,128,0,138,4,0,0,5,4,107,0,142,3,233,0,168,3,74,0,
142,7,141,0,9,5,199,255,253,7,141,0,9,5,199,255,253,7,141,0,9,5,199,255,253,
5,86,0,45,4,0,0,5,4,115,0,0,8,0,0,0,8,0,0,0,4,107,255,225,1,199,0,127,1,199,
0,127,1,199,0,127,1,199,0,126,2,170,0,75,2,170,0,75,2,170,0,75,4,115,0,138,
4,115,0,136,2,205,0,81,8,0,1,22,8,0,0,55,1,128,0,85,2,213,0,85,2,170,0,88,
2,170,0,89,4,0,0,185,2,170,255,192,1,86,254,96,2,235,0,101,4,115,0,4,4,115,
0,58,8,192,0,158,4,115,0,16,7,21,0,69,2,150,0,19,8,149,0,188,8,0,0,188,6,
37,0,108,4,205,0,88,6,172,0,80,6,172,0,61,6,172,0,93,6,172,0,145,8,0,1,162,
4,0,1,16,8,0,1,162,4,0,1,16,8,0,1,162,4,0,1,16,4,0,1,16,3,244,0,56,4,229,
0,4,6,150,0,235,5,180,0,154,4,172,0,101,4,100,0,51,5,180,0,87,7,213,1,152,
5,192,1,22,2,49,255,158,4,100,0,56,4,100,0,65,4,171,0,100,4,100,0,63,4,100,
0,65,4,213,0,157,4,172,0,100,4,213,2,34,4,213,1,5,5,171,255,246,5,0,1,216,
5,171,2,141,5,171,255,246,5,171,2,141,5,171,255,246,5,171,2,141,5,171,255,
246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,1,217,5,
171,2,141,5,171,1,217,5,171,1,217,5,171,255,246,5,171,255,246,5,171,255,246,
5,171,2,141,5,171,1,217,5,171,1,217,5,171,255,246,5,171,255,246,5,171,255,
246,5,171,2,141,5,171,1,217,5,171,1,217,5,171,255,246,5,171,255,246,5,171,
255,246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,255,
246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,0,0,5,171,
0,0,5,171,0,0,5,171,0,0,5,171,2,213,5,171,0,103,5,171,0,0,5,213,0,0,4,213,
0,123,4,213,0,6,2,214,0,109,2,214,0,109,8,0,0,0,7,235,1,158,7,235,1,145,7,
235,1,158,7,235,1,145,3,244,0,8,4,213,0,167,4,213,0,178,4,213,0,41,4,213,
0,41,2,214,0,115,8,43,1,177,8,107,1,209,7,85,1,70,6,0,1,218,6,0,1,81,4,64,
0,59,5,64,0,60,4,192,0,102,4,21,0,66,4,0,0,196,6,0,1,16,4,0,0,29,4,0,0,29,
2,170,0,119,2,170,0,243,2,170,0,127,2,170,0,14,2,170,0,53,2,170,0,43,2,170,
0,45,2,170,255,229,1,199,0,124,1,199,0,130,2,90,0,106,2,90,0,72,2,152,0,0,
2,152,0,0,2,135,0,45,2,160,255,233,3,47,0,32,2,72,255,232,0,0,0,3,0,0,0,3,
0,0,0,28,0,1,0,0,0,0,4,232,0,3,0,1,0,0,0,28,0,4,4,204,0,0,0,190,0,128,0,6,
0,62,0,126,1,127,1,146,1,255,2,199,2,201,2,221,3,126,3,138,3,140,3,161,3,
206,4,12,4,79,4,92,4,95,4,145,30,133,30,243,32,21,32,30,32,34,32,38,32,48,
32,51,32,58,32,60,32,62,32,68,32,127,32,164,32,167,32,172,33,5,33,19,33,22,
33,34,33,38,33,46,33,94,33,149,33,168,34,2,34,6,34,15,34,18,34,21,34,26,34,
31,34,41,34,43,34,72,34,97,34,101,35,2,35,16,35,33,37,0,37,2,37,12,37,16,
37,20,37,24,37,28,37,36,37,44,37,52,37,60,37,108,37,128,37,132,37,136,37,
140,37,147,37,161,37,172,37,178,37,186,37,188,37,196,37,203,37,207,37,217,
37,230,38,60,38,64,38,66,38,96,38,99,38,102,38,107,240,2,240,5,251,2,255,
255,0,0,0,32,0,160,1,146,1,250,2,198,2,201,2,216,3,126,3,132,3,140,3,142,
3,163,4,1,4,14,4,81,4,94,4,144,30,128,30,242,32,19,32,23,32,32,32,38,32,48,
32,50,32,57,32,60,32,62,32,68,32,127,32,163,32,167,32,172,33,5,33,19,33,22,
33,34,33,38,33,46,33,91,33,144,33,168,34,2,34,6,34,15,34,17,34,21,34,25,34,
30,34,41,34,43,34,72,34,96,34,100,35,2,35,16,35,32,37,0,37,2,37,12,37,16,
37,20,37,24,37,28,37,36,37,44,37,52,37,60,37,80,37,128,37,132,37,136,37,140,
37,144,37,160,37,170,37,178,37,186,37,188,37,196,37,202,37,207,37,216,37,
230,38,58,38,64,38,66,38,96,38,99,38,101,38,106,240,1,240,5,251,1,255,255,
255,227,0,0,255,174,255,71,254,129,254,128,254,114,252,160,253,204,253,203,
253,202,253,201,253,151,253,150,253,149,253,148,253,100,227,118,227,10,225,
235,225,234,225,233,225,230,225,221,225,220,225,215,225,214,225,213,225,208,
225,150,225,115,225,113,225,109,225,21,225,8,225,6,224,251,224,248,224,241,
224,197,224,148,224,130,224,41,224,38,224,30,224,29,223,255,0,0,224,19,224,
10,224,9,223,237,223,214,223,212,223,56,223,43,223,28,221,62,221,61,221,52,
221,49,221,46,221,43,221,40,221,33,221,26,221,19,221,12,220,249,220,230,220,
227,220,224,220,221,220,218,220,206,220,198,220,193,220,186,220,185,220,178,
220,173,220,170,220,162,220,150,220,67,220,64,220,63,220,34,220,32,220,31,
220,28,18,135,18,133,7,135,0,1,0,0,0,188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,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,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
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,0,98,0,99,0,100,0,101,0,
102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,16,0,110,0,111,0,112,0,113,
0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,
126,0,127,0,128,0,129,0,130,0,131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,
0,139,0,140,0,141,0,142,0,143,0,144,0,145,0,146,0,147,0,148,0,149,0,150,0,
151,0,152,0,153,0,154,0,155,0,156,0,157,0,158,0,159,0,160,0,161,0,162,0,163,
0,164,0,165,0,166,0,167,0,168,0,169,0,170,0,171,0,172,0,173,0,174,0,175,0,
176,0,177,0,178,0,179,0,180,0,181,0,182,0,183,0,184,0,185,0,186,0,187,0,188,
0,189,0,190,0,191,0,192,0,193,0,194,0,195,0,196,0,197,0,198,0,199,0,200,0,
201,0,202,0,203,0,204,0,205,0,206,0,207,0,208,0,209,0,210,0,211,0,212,0,213,
0,214,0,215,0,216,0,217,0,218,0,219,0,220,0,221,0,222,0,223,0,224,0,225,0,
226,0,227,0,228,0,229,0,230,0,231,0,232,0,233,0,234,0,235,0,236,0,237,0,238,
0,239,0,240,0,241,0,242,0,243,0,244,0,245,0,246,0,247,0,248,0,249,0,250,0,
251,0,252,0,253,0,254,0,255,1,0,1,1,1,2,1,3,1,4,1,5,1,6,1,7,1,8,1,9,1,10,
1,11,1,12,1,13,1,14,1,15,1,16,1,17,1,18,1,19,1,20,1,21,1,22,1,23,1,24,1,25,
1,26,1,27,1,28,1,29,1,30,1,31,1,32,1,33,1,34,1,35,1,36,1,37,1,38,1,39,1,40,
1,41,1,42,1,43,1,44,1,45,1,46,1,47,1,48,1,49,1,50,1,51,1,52,1,53,1,54,1,55,
1,56,1,57,1,58,1,59,1,60,1,61,1,62,1,63,0,119,2,48,0,6,2,10,0,0,0,0,1,0,0,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,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,1,0,0,0,0,0,3,0,4,0,5,0,6,0,7,0,
8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,
23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,
0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,
0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,
0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,
0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,
0,0,0,132,0,133,0,135,0,137,0,145,0,150,0,156,0,161,0,160,0,162,0,164,0,163,
0,165,0,167,0,169,0,168,0,170,0,171,0,173,0,172,0,174,0,175,0,177,0,179,0,
178,0,180,0,182,0,181,0,186,0,185,0,187,0,188,2,9,0,112,0,99,0,100,0,104,
2,11,0,118,0,159,0,110,0,106,2,29,0,116,0,105,2,54,0,134,0,152,2,49,0,113,
2,56,2,57,0,102,0,117,2,43,2,46,2,45,1,137,2,52,0,107,0,122,1,114,0,166,0,
184,0,127,0,98,0,109,2,48,1,64,2,53,2,44,0,108,0,123,2,12,0,3,0,128,0,131,
0,149,1,18,1,19,1,254,1,255,2,6,2,7,2,2,2,3,0,183,2,119,0,191,1,56,2,20,2,
25,2,16,2,17,2,136,2,137,2,10,0,119,2,4,2,8,2,13,0,130,0,138,0,129,0,139,
0,136,0,141,0,142,0,143,0,140,0,147,0,148,0,0,0,146,0,154,0,155,0,153,0,241,
1,71,1,78,0,111,1,74,1,75,1,76,0,120,1,79,1,77,1,72,0,0,64,69,89,88,85,84,
83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,
58,57,56,55,54,53,49,48,47,46,45,44,40,39,38,37,36,35,34,33,31,24,20,17,16,
15,14,13,11,10,9,8,7,6,5,4,3,2,1,0,44,69,35,70,96,32,176,38,96,176,4,38,35,
72,72,45,44,69,35,70,35,97,32,176,38,97,176,4,38,35,72,72,45,44,69,35,70,
96,176,32,97,32,176,70,96,176,4,38,35,72,72,45,44,69,35,70,35,97,176,32,96,
32,176,38,97,176,32,97,176,4,38,35,72,72,45,44,69,35,70,96,176,64,97,32,176,
102,96,176,4,38,35,72,72,45,44,69,35,70,35,97,176,64,96,32,176,38,97,176,
64,97,176,4,38,35,72,72,45,44,1,16,32,60,0,60,45,44,32,69,35,32,176,205,68,
35,32,184,1,90,81,88,35,32,176,141,68,35,89,32,176,237,81,88,35,32,176,77,
68,35,89,32,176,4,38,81,88,35,32,176,13,68,35,89,33,33,45,44,32,32,69,24,
104,68,32,176,1,96,32,69,176,70,118,104,138,69,96,68,45,44,1,177,11,10,67,
35,67,101,10,45,44,0,177,10,11,67,35,67,11,45,44,0,176,40,35,112,177,1,40,
62,1,176,40,35,112,177,2,40,69,58,177,2,0,8,13,45,44,32,69,176,3,37,69,97,
100,176,80,81,88,69,68,27,33,33,89,45,44,73,176,14,35,68,45,44,32,69,176,
0,67,96,68,45,44,1,176,6,67,176,7,67,101,10,45,44,32,105,176,64,97,176,0,
139,32,177,44,192,138,140,184,16,0,98,96,43,12,100,35,100,97,92,88,176,3,
97,89,45,44,138,3,69,138,138,135,176,17,43,176,41,35,68,176,41,122,228,24,
45,44,69,101,176,44,35,68,69,176,43,35,68,45,44,75,82,88,69,68,27,33,33,89,
45,44,75,81,88,69,68,27,33,33,89,45,44,1,176,5,37,16,35,32,138,245,0,176,
1,96,35,237,236,45,44,1,176,5,37,16,35,32,138,245,0,176,1,97,35,237,236,45,
44,1,176,6,37,16,245,0,237,236,45,44,70,35,70,96,138,138,70,35,32,70,138,
96,138,97,184,255,128,98,35,32,16,35,138,177,12,12,138,112,69,96,32,176,0,
80,88,176,1,97,184,255,186,139,27,176,70,140,89,176,16,96,104,1,58,45,44,
32,69,176,3,37,70,82,75,176,19,81,91,88,176,2,37,70,32,104,97,176,3,37,176,
3,37,63,35,33,56,27,33,17,89,45,44,32,69,176,3,37,70,80,88,176,2,37,70,32,
104,97,176,3,37,176,3,37,63,35,33,56,27,33,17,89,45,44,0,176,7,67,176,6,67,
11,45,44,33,33,12,100,35,100,139,184,64,0,98,45,44,33,176,128,81,88,12,100,
35,100,139,184,32,0,98,27,178,0,64,47,43,89,176,2,96,45,44,33,176,192,81,
88,12,100,35,100,139,184,21,85,98,27,178,0,128,47,43,89,176,2,96,45,44,12,
100,35,100,139,184,64,0,98,96,35,33,45,44,75,83,88,138,176,4,37,73,100,35,
69,105,176,64,139,97,176,128,98,176,32,97,106,176,14,35,68,35,16,176,14,246,
27,33,35,138,18,17,32,57,47,89,45,44,75,83,88,32,176,3,37,73,100,105,32,176,
5,38,176,6,37,73,100,35,97,176,128,98,176,32,97,106,176,14,35,68,176,4,38,
16,176,14,246,138,16,176,14,35,68,176,14,246,176,14,35,68,176,14,237,27,138,
176,4,38,17,18,32,57,35,32,57,47,47,89,45,44,69,35,69,96,35,69,96,35,69,96,
35,118,104,24,176,128,98,32,45,44,176,72,43,45,44,32,69,176,0,84,88,176,64,
68,32,69,176,64,97,68,27,33,33,89,45,44,69,177,48,47,69,35,69,97,96,176,1,
96,105,68,45,44,75,81,88,176,47,35,112,176,20,35,66,27,33,33,89,45,44,75,
81,88,32,176,3,37,69,105,83,88,68,27,33,33,89,27,33,33,89,45,44,69,176,20,
67,176,0,96,99,176,1,96,105,68,45,44,176,47,69,68,45,44,69,35,32,69,138,96,
68,45,44,69,35,69,96,68,45,44,75,35,81,88,185,0,51,255,224,177,52,32,27,179,
51,0,52,0,89,68,68,45,44,176,22,67,88,176,3,38,69,138,88,100,102,176,31,96,
27,100,176,32,96,102,32,88,27,33,176,64,89,176,1,97,89,35,88,101,89,176,41,
35,68,35,16,176,41,224,27,33,33,33,33,33,89,45,44,176,2,67,84,88,75,83,35,
75,81,90,88,56,27,33,33,89,27,33,33,33,33,89,45,44,176,22,67,88,176,4,37,
69,100,176,32,96,102,32,88,27,33,176,64,89,176,1,97,35,88,27,101,89,176,41,
35,68,176,5,37,176,8,37,8,32,88,2,27,3,89,176,4,37,16,176,5,37,32,70,176,
4,37,35,66,60,176,4,37,176,7,37,8,176,7,37,16,176,6,37,32,70,176,4,37,176,
1,96,35,66,60,32,88,1,27,0,89,176,4,37,16,176,5,37,176,41,224,176,41,32,69,
101,68,176,7,37,16,176,6,37,176,41,224,176,5,37,176,8,37,8,32,88,2,27,3,89,
176,5,37,176,3,37,67,72,176,4,37,176,7,37,8,176,6,37,176,3,37,176,1,96,67,
72,27,33,89,33,33,33,33,33,33,33,45,44,2,176,4,37,32,32,70,176,4,37,35,66,
176,5,37,8,176,3,37,69,72,33,33,33,33,45,44,2,176,3,37,32,176,4,37,8,176,
2,37,67,72,33,33,33,45,44,69,35,32,69,24,32,176,0,80,32,88,35,101,35,89,35,
104,32,176,64,80,88,33,176,64,89,35,88,101,89,138,96,68,45,44,75,83,35,75,
81,90,88,32,69,138,96,68,27,33,33,89,45,44,75,84,88,32,69,138,96,68,27,33,
33,89,45,44,75,83,35,75,81,90,88,56,27,33,33,89,45,44,176,0,33,75,84,88,56,
27,33,33,89,45,44,176,2,67,84,88,176,70,43,27,33,33,33,33,89,45,44,176,2,
67,84,88,176,71,43,27,33,33,33,89,45,44,176,2,67,84,88,176,72,43,27,33,33,
33,33,89,45,44,176,2,67,84,88,176,73,43,27,33,33,33,89,45,44,32,138,8,35,
75,83,138,75,81,90,88,35,56,27,33,33,89,45,44,0,176,2,37,73,176,0,83,88,32,
176,64,56,17,27,33,89,45,44,1,70,35,70,96,35,70,97,35,32,16,32,70,138,97,
184,255,128,98,138,177,64,64,138,112,69,96,104,58,45,44,32,138,35,73,100,
138,35,83,88,60,27,33,89,45,44,75,82,88,125,27,122,89,45,44,176,18,0,75,1,
75,84,66,45,44,177,2,0,66,177,35,1,136,81,177,64,1,136,83,90,88,185,16,0,
0,32,136,84,88,178,2,1,2,67,96,66,89,177,36,1,136,81,88,185,32,0,0,64,136,
84,88,178,2,2,2,67,96,66,177,36,1,136,84,88,178,2,32,2,67,96,66,0,75,1,75,
82,88,178,2,8,2,67,96,66,89,27,185,64,0,0,128,136,84,88,178,2,4,2,67,96,66,
89,185,64,0,0,128,99,184,1,0,136,84,88,178,2,8,2,67,96,66,89,185,64,0,1,0,
99,184,2,0,136,84,88,178,2,16,2,67,96,66,89,185,64,0,2,0,99,184,4,0,136,84,
88,178,2,64,2,67,96,66,89,89,89,89,89,45,44,69,24,104,35,75,81,88,35,32,69,
32,100,176,64,80,88,124,89,104,138,96,89,68,45,44,176,0,22,176,2,37,176,2,
37,1,176,1,35,62,0,176,2,35,62,177,1,2,6,12,176,10,35,101,66,176,11,35,66,
1,176,1,35,63,0,176,2,35,63,177,1,2,6,12,176,6,35,101,66,176,7,35,66,176,
1,22,1,45,44,122,138,16,69,35,245,24,45,0,0,0,177,9,64,190,1,7,0,1,0,31,1,
7,0,1,0,159,1,4,64,142,1,192,253,1,175,253,1,0,253,1,10,79,251,1,32,251,1,
245,80,40,31,242,70,40,31,241,70,42,31,240,70,43,31,95,239,127,239,2,15,239,
79,239,95,239,143,239,175,239,5,11,229,228,30,31,227,226,70,31,15,226,1,64,
226,70,22,31,225,224,70,31,207,224,223,224,239,224,3,64,224,51,54,70,224,
70,24,31,221,61,223,85,222,61,3,85,223,1,3,85,220,3,255,31,15,213,31,213,
2,15,213,31,213,2,64,202,24,27,70,207,194,1,189,192,60,31,193,80,38,31,188,
190,40,31,255,185,1,80,184,112,184,128,184,3,184,255,192,64,255,184,18,50,
70,31,183,63,183,79,183,111,183,127,183,159,183,175,183,7,112,178,160,178,
176,178,3,15,178,1,144,181,1,176,181,1,15,181,1,8,15,179,63,179,239,179,3,
128,176,144,176,2,176,176,192,176,208,176,3,47,175,63,175,2,160,173,176,173,
2,192,173,208,173,2,47,172,63,172,2,159,171,1,192,170,208,170,2,79,169,143,
169,2,47,169,111,169,191,169,255,169,4,156,155,36,31,80,155,1,111,150,1,191,
150,1,150,70,29,31,149,148,23,31,127,148,143,148,255,148,3,48,145,64,145,
2,128,145,1,112,143,128,143,2,144,143,1,192,143,208,143,2,79,140,95,140,111,
140,3,134,70,255,31,159,133,1,132,131,49,31,116,115,63,31,115,80,38,31,111,
110,60,31,110,70,53,31,26,1,24,85,25,51,24,85,7,51,3,85,6,3,255,31,96,80,
38,31,95,80,38,31,92,70,49,31,91,90,72,31,90,70,49,31,19,50,18,85,5,1,3,85,
4,50,3,85,111,3,1,15,3,63,3,2,239,81,255,81,2,64,81,53,56,70,64,81,37,40,
70,207,64,84,80,1,73,70,32,31,72,70,53,31,71,70,53,31,175,70,1,223,70,239,
70,2,128,70,1,22,50,21,85,17,1,15,85,16,50,15,85,2,1,0,85,1,0,1,31,31,15,
63,15,95,15,127,15,4,15,15,47,15,79,15,111,15,143,15,223,15,255,15,7,63,15,
127,15,239,15,3,111,0,1,128,22,1,5,1,184,1,144,177,84,83,43,43,75,184,7,255,
82,75,176,7,80,91,176,1,136,176,37,83,176,1,136,176,64,81,90,176,6,136,176,
0,85,90,91,88,177,1,1,142,89,133,141,141,0,66,29,75,176,50,83,88,176,96,29,
89,75,176,100,83,88,176,64,29,89,75,176,128,83,88,176,16,29,177,22,0,66,89,
116,115,116,117,43,43,43,43,43,1,115,116,117,43,43,43,0,116,43,43,115,115,
117,43,43,43,1,43,43,43,0,43,43,43,43,43,43,1,43,43,0,43,43,1,43,115,43,0,
116,115,116,117,115,116,115,43,1,43,116,117,0,115,43,115,116,1,115,115,116,
0,115,116,116,115,116,115,1,94,115,115,116,115,115,0,115,43,115,115,1,43,
0,43,1,43,0,115,43,116,117,43,43,43,43,1,43,43,116,43,43,94,115,43,0,43,94,
115,116,1,43,43,43,0,43,115,115,94,115,115,115,1,115,115,115,24,94,0,0,0,
5,204,5,204,0,125,5,129,0,21,0,121,5,129,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
4,58,0,20,0,119,0,0,255,236,0,0,0,0,255,236,0,0,0,0,255,236,0,0,254,87,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,8,0,0,0,0,0,0,180,0,189,0,175,0,160,0,0,0,0,0,0,0,0,0,0,0,0,0,136,0,
126,0,0,0,172,0,0,0,0,0,0,0,0,0,0,0,0,0,191,0,195,0,171,0,0,0,0,0,155,0,141,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,185,0,170,0,0,0,0,0,
0,0,148,0,153,0,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,
0,131,0,141,0,164,0,180,0,0,0,0,0,0,0,0,0,0,0,96,0,106,0,121,0,152,0,172,
0,184,0,167,0,0,1,34,1,51,0,195,0,107,0,0,0,0,0,0,0,219,0,201,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,225,1,201,0,146,0,168,0,107,0,146,0,183,
0,107,0,155,0,0,2,123,2,242,0,146,2,82,0,110,2,215,3,129,0,130,0,137,0,160,
0,159,1,105,0,143,0,0,1,96,0,164,1,91,0,94,0,130,0,0,0,0,0,0,0,94,0,101,0,
111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,0,144,0,165,0,122,0,128,0,0,0,0,0,0,
0,0,0,0,5,129,255,243,0,13,252,167,0,131,0,137,0,143,0,150,0,105,0,113,0,
0,0,0,0,0,0,0,0,0,0,168,1,249,0,0,0,0,3,31,0,167,0,174,0,181,0,0,0,0,0,129,
0,0,0,0,0,0,0,0,7,72,3,106,2,182,2,2,253,147,0,0,0,145,0,103,0,145,0,97,1,
217,0,0,2,141,3,65,0,68,5,17,0,0,0,44,0,44,0,44,0,44,1,22,1,96,2,4,3,4,3,
230,4,240,5,14,5,84,5,158,5,246,6,50,6,114,6,144,6,178,6,218,7,80,7,150,8,
32,8,222,9,68,9,226,10,140,10,206,11,158,12,80,12,126,12,200,13,18,13,74,
13,146,14,20,15,100,16,22,16,172,17,64,17,160,17,222,18,40,18,202,19,22,19,
96,19,194,20,44,20,88,21,184,22,64,22,182,23,26,23,192,24,94,25,40,26,38,
26,146,27,42,29,162,30,254,32,64,32,148,32,190,32,242,33,28,34,172,34,202,
34,244,35,160,36,54,36,172,37,54,37,166,38,32,38,238,39,88,39,166,40,102,
41,0,41,68,42,246,43,100,43,212,44,112,45,20,45,98,46,16,46,114,46,230,48,
52,50,86,51,226,53,124,54,24,54,136,55,126,55,240,56,112,57,142,58,18,58,
196,59,100,59,234,60,238,62,28,62,144,63,134,64,72,64,168,64,210,65,178,65,
200,66,36,66,110,66,232,67,126,67,170,68,42,68,106,68,138,68,244,69,48,69,
166,70,14,70,48,70,90,70,124,71,8,71,32,71,56,71,80,71,104,71,130,71,154,
72,14,72,34,72,58,72,82,72,106,72,132,72,156,72,178,72,200,72,224,73,80,73,
104,73,128,73,152,73,176,73,200,73,226,74,68,74,252,75,20,75,44,75,68,75,
94,75,118,75,212,76,154,76,178,76,202,76,226,76,250,77,20,77,46,78,38,78,
58,78,82,78,106,78,130,78,156,78,180,78,202,78,224,78,248,79,172,79,196,79,
220,79,244,80,12,80,36,80,62,80,126,81,26,81,50,81,74,81,98,81,124,81,148,
82,24,82,50,82,74,82,98,82,122,82,146,82,166,82,186,82,210,82,234,83,2,83,
26,83,50,83,70,83,94,83,118,83,142,83,164,83,172,84,74,84,98,84,122,84,146,
84,170,84,194,84,214,84,234,84,254,85,22,85,46,85,70,85,94,85,118,85,142,
85,166,85,186,85,206,85,230,85,254,86,22,86,142,87,20,87,42,87,64,87,88,87,
110,87,132,87,154,87,172,87,192,87,216,88,170,88,182,88,210,88,234,89,228,
89,248,90,12,90,124,90,148,90,170,90,190,90,210,90,232,91,22,91,42,91,62,
91,150,91,224,91,248,92,16,92,36,92,56,92,80,92,104,92,116,93,20,93,164,93,
188,93,212,93,236,94,4,94,30,94,56,94,216,95,154,95,178,95,202,95,222,95,
242,96,10,96,34,96,58,96,82,96,106,96,130,96,150,96,170,96,194,96,218,96,
238,98,112,98,136,98,158,98,238,99,96,99,120,99,144,99,168,99,192,99,216,
99,240,100,10,100,36,100,62,100,88,100,122,100,142,100,166,100,190,100,214,
100,238,101,8,101,32,101,56,101,80,101,100,101,124,101,148,101,244,102,108,
103,104,103,140,103,164,103,188,103,212,103,236,104,34,104,88,104,142,104,
214,104,238,105,86,105,162,106,244,107,70,107,118,107,188,107,248,109,10,
109,50,109,112,109,172,109,206,112,188,112,236,114,22,114,30,114,38,114,82,
114,208,114,216,114,224,114,232,115,138,115,146,115,154,116,34,116,42,116,
50,116,116,116,124,116,182,116,190,117,56,117,64,117,72,117,234,117,242,118,
140,119,78,119,102,120,194,120,218,120,242,121,10,121,36,121,64,122,30,122,
212,123,118,124,16,124,186,125,114,125,218,126,124,127,28,127,136,128,94,
128,208,130,6,130,234,130,242,131,112,131,246,132,174,133,52,133,156,134,
4,134,138,135,74,135,188,136,108,136,134,136,160,136,184,136,208,136,232,
137,66,137,198,137,222,138,142,138,150,138,158,138,182,138,190,139,116,139,
224,140,78,140,102,140,126,140,198,140,206,141,66,141,74,141,82,141,224,141,
232,142,210,143,168,144,10,144,34,144,152,145,30,145,38,145,46,145,54,145,
108,145,116,145,124,145,132,146,12,146,156,146,164,146,226,147,78,147,158,
147,250,148,88,148,206,149,44,149,214,150,112,151,26,151,34,151,198,152,86,
152,130,152,254,153,6,153,250,154,160,155,34,155,58,155,200,156,80,157,2,
157,96,157,104,157,178,157,186,157,194,157,250,158,2,158,250,159,2,159,72,
159,160,159,242,160,86,160,184,161,28,161,134,162,24,162,150,163,6,163,32,
163,192,163,216,164,106,164,114,164,232,165,2,165,10,165,228,166,90,166,222,
166,246,167,14,167,100,167,148,167,194,167,218,167,242,168,10,168,34,168,
60,168,86,168,110,168,134,168,168,168,202,168,236,168,248,169,40,169,90,169,
140,169,188,170,18,170,114,170,208,171,12,171,102,171,172,171,238,174,134,
174,168,174,186,174,246,175,46,175,70,175,90,175,126,175,232,176,60,176,252,
178,100,179,50,180,4,180,178,181,136,182,32,182,224,183,78,183,128,183,178,
183,228,184,14,184,60,184,106,184,152,184,198,185,14,185,86,185,166,186,118,
187,22,187,70,187,184,187,214,188,72,188,226,188,250,189,52,190,108,191,92,
191,212,192,8,192,96,192,184,192,230,193,0,193,54,193,116,193,140,193,166,
193,200,193,234,194,12,194,46,194,84,194,122,194,160,194,198,194,248,195,
30,195,72,195,118,195,166,195,224,196,14,196,62,196,120,196,166,196,214,197,
16,197,62,197,110,197,168,197,220,198,18,198,86,198,138,198,194,199,8,199,
62,199,114,199,184,199,238,200,34,200,106,200,178,200,252,201,88,201,112,
201,136,201,160,201,184,201,208,203,232,205,196,207,132,207,146,207,178,207,
206,207,246,208,4,208,18,208,32,208,46,208,60,208,106,208,188,208,238,209,
32,209,114,209,180,210,100,210,228,211,148,212,14,212,166,213,6,213,140,213,
224,214,26,214,102,214,220,215,70,215,164,215,246,216,8,216,68,216,164,217,
34,217,88,218,12,218,74,218,114,218,160,218,200,218,242,219,40,219,94,219,
130,219,208,220,20,220,80,0,0,0,2,0,68,0,0,2,100,5,85,0,3,0,7,0,46,177,1,
0,47,60,178,7,4,8,237,50,177,6,5,220,60,178,3,2,8,237,50,0,177,3,0,47,60,
178,5,4,8,237,50,178,7,6,9,252,60,178,1,2,8,237,50,51,17,33,17,37,33,17,33,
68,2,32,254,36,1,152,254,104,5,85,250,171,68,4,205,0,0,0,2,0,185,0,0,1,127,
5,129,0,3,0,7,1,172,64,158,3,91,2,2,150,7,166,7,2,7,150,57,4,73,4,89,4,3,
4,64,23,27,72,6,4,1,11,4,38,9,1,201,9,217,9,2,118,9,166,9,2,25,9,41,9,2,6,
9,1,215,73,9,1,38,9,1,217,9,1,118,9,1,41,9,1,6,9,1,121,9,1,86,9,1,9,9,1,163,
169,9,1,130,9,1,84,9,100,9,116,9,3,137,9,1,98,9,114,9,2,68,9,84,9,2,34,9,
50,9,2,20,9,1,2,9,1,242,9,1,212,9,228,9,2,178,9,194,9,2,148,9,164,9,2,114,
9,130,9,2,84,9,100,9,2,66,9,1,20,9,36,9,52,9,3,2,9,1,110,9,184,255,128,64,
17,102,109,72,73,9,1,9,64,94,98,72,45,9,61,9,2,9,184,1,0,64,153,85,88,72,
9,128,81,84,72,125,9,141,9,157,9,3,95,9,111,9,2,9,128,71,75,72,9,192,67,70,
72,9,128,63,66,72,125,9,1,91,9,107,9,2,61,9,77,9,2,25,9,41,9,2,11,9,1,55,
235,9,251,9,2,205,9,221,9,2,171,9,187,9,2,9,64,45,48,72,59,9,75,9,91,9,3,
29,9,45,9,2,1,203,9,219,9,235,9,3,159,9,175,9,191,9,3,27,9,43,9,59,9,107,
9,123,9,5,15,9,1,2,127,9,143,9,159,9,191,9,207,9,5,64,9,96,9,2,15,9,31,9,
2,7,112,1,1,95,1,1,1,5,156,4,2,3,0,63,47,253,206,93,93,1,94,93,93,93,95,113,
113,113,113,95,114,114,43,114,114,114,94,93,93,93,93,93,43,43,43,113,113,
43,43,114,43,114,43,94,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,
114,114,114,94,93,93,93,113,113,113,113,114,114,94,93,93,93,93,113,47,94,
93,43,93,237,113,51,47,237,49,48,1,35,3,51,3,53,51,21,1,103,148,24,196,198,
194,1,141,3,244,250,127,201,201,0,0,2,0,87,3,198,2,128,5,129,0,3,0,7,0,104,
64,33,48,3,1,128,3,1,3,16,2,32,2,96,2,112,2,128,2,5,96,2,112,2,2,80,2,96,
2,176,2,192,2,4,2,184,255,192,179,37,40,72,2,184,255,192,64,32,25,28,72,2,
48,7,1,128,7,1,7,111,6,127,6,143,6,3,47,6,63,6,2,6,5,32,0,1,0,6,2,3,0,63,
51,205,93,50,1,47,113,114,205,93,113,220,43,43,93,113,114,205,93,113,49,48,
1,35,3,51,1,35,3,51,2,106,142,20,184,254,121,141,21,184,3,198,1,187,254,69,
1,187,0,0,0,2,0,9,0,0,4,105,5,121,0,27,0,31,0,214,64,134,90,25,1,90,21,1,
68,14,1,68,19,1,54,19,1,68,30,1,38,30,54,30,2,68,23,1,38,23,54,23,2,3,16,
1,8,29,28,21,20,9,20,20,11,14,15,18,19,10,9,19,12,16,4,10,4,1,0,25,24,5,24,
24,27,3,3,7,30,31,22,23,6,23,5,6,4,7,8,11,4,12,13,1,14,29,30,4,13,0,15,28,
31,4,16,17,18,21,22,25,4,17,16,13,1,208,13,1,79,17,143,17,159,17,3,63,17,
79,17,2,13,17,13,17,5,20,23,24,3,19,3,6,9,10,3,5,0,47,23,51,63,23,51,18,57,
57,47,47,93,113,93,113,17,23,51,16,205,23,50,17,23,51,16,205,23,50,1,47,51,
51,135,192,192,192,192,1,23,51,16,135,192,192,192,192,1,47,23,51,135,192,
192,192,192,1,51,16,135,192,192,192,192,49,48,1,93,93,93,93,93,93,93,93,93,
93,1,3,33,21,33,3,35,19,33,3,35,19,35,53,51,19,35,53,33,19,51,3,33,19,51,
3,51,21,33,3,33,19,3,128,78,1,4,254,229,88,110,86,254,149,84,110,84,201,225,
78,252,1,18,89,110,88,1,107,88,110,88,211,253,64,80,1,106,78,3,117,254,143,
108,254,104,1,152,254,104,1,152,108,1,113,108,1,152,254,104,1,152,254,104,
108,254,143,1,113,0,3,0,22,255,114,4,82,5,236,0,48,0,59,0,70,1,46,64,92,154,
14,1,154,13,1,150,68,1,133,39,1,138,57,154,57,2,137,53,153,53,2,132,37,1,
118,6,134,6,150,6,3,70,63,86,63,134,63,3,52,38,100,38,116,38,3,37,2,1,25,
27,1,24,34,55,3,47,9,21,65,3,32,48,1,48,48,16,49,30,111,29,41,111,0,49,32,
49,2,0,49,32,49,48,49,80,49,112,49,5,8,3,49,184,255,192,179,29,35,72,49,184,
255,192,64,117,17,22,72,49,4,111,3,64,16,24,72,3,60,111,16,33,66,115,207,
54,1,157,54,1,5,136,54,1,120,10,216,10,2,199,34,215,34,2,182,34,1,135,34,
167,34,2,215,65,1,166,65,1,119,65,1,60,16,65,34,10,54,41,49,8,0,125,30,141,
30,2,26,30,1,30,24,22,64,19,23,72,22,15,21,47,21,63,21,95,21,4,21,55,9,115,
47,148,4,164,4,2,112,4,128,4,2,5,4,21,4,85,4,101,4,4,46,4,0,0,47,50,50,93,
93,93,205,237,50,47,93,205,43,51,51,93,93,18,23,57,93,93,93,93,93,93,93,93,
95,93,93,237,50,1,47,237,214,43,237,47,43,43,95,94,93,113,253,212,237,17,
18,57,47,114,23,51,205,23,50,49,48,93,0,93,93,93,93,93,93,1,93,93,93,0,93,
1,93,37,46,1,39,55,30,3,23,17,39,46,3,53,52,62,2,55,53,51,21,30,3,23,7,46,
1,39,17,30,5,21,20,14,2,7,21,35,1,52,46,2,39,17,62,3,1,20,30,2,23,17,14,3,
2,6,217,245,34,170,11,46,78,113,78,20,77,148,116,71,64,115,158,95,124,100,
145,102,66,20,174,20,122,117,59,114,103,88,64,36,56,114,175,119,124,1,160,
47,81,106,58,65,108,77,42,253,92,40,70,95,55,72,100,61,27,20,9,185,165,37,
53,87,64,39,5,1,240,5,18,50,83,128,98,84,124,83,44,4,131,131,5,45,80,115,
75,33,94,105,11,254,67,14,30,41,56,79,109,72,77,131,100,62,6,162,2,24,63,
80,51,32,15,254,44,4,31,56,81,2,197,54,74,50,33,14,1,165,4,33,52,68,0,0,0,
0,5,0,73,255,244,6,212,5,141,0,19,0,23,0,43,0,63,0,83,0,212,64,11,118,20,
134,20,2,121,22,137,22,2,42,184,255,232,64,14,8,12,72,37,24,8,12,72,32,24,
8,12,72,26,184,255,232,179,8,12,72,17,184,255,232,179,8,12,72,13,184,255,
232,64,18,8,12,72,7,24,8,12,72,3,24,8,12,72,22,23,20,21,21,184,255,240,64,
84,23,16,23,21,23,21,0,39,54,180,10,178,0,180,0,44,16,44,32,44,3,0,44,64,
44,2,0,44,16,44,32,44,80,44,96,44,112,44,224,44,240,44,8,44,64,180,29,178,
74,180,15,39,1,239,39,255,39,2,39,64,10,13,72,39,79,182,34,184,69,182,24,
4,22,3,21,18,49,182,15,184,59,182,5,19,0,63,237,244,237,63,63,63,237,244,
237,1,47,43,113,114,237,244,237,47,93,113,114,253,244,237,17,18,57,57,47,
47,56,56,17,51,17,51,49,48,0,43,43,43,43,43,43,43,43,1,93,93,1,20,14,2,35,
34,46,2,53,52,62,2,51,50,30,2,1,35,1,51,37,50,30,2,21,20,14,2,35,34,46,2,
53,52,62,2,1,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,52,46,2,35,34,14,
2,21,20,30,2,51,50,62,2,6,212,51,87,116,66,66,115,85,49,48,86,117,68,66,115,
85,50,251,59,155,3,154,157,251,223,64,114,86,49,50,85,116,66,67,116,85,49,
49,86,118,4,250,22,43,63,40,42,64,44,22,23,43,63,41,39,63,44,24,251,240,22,
42,62,40,43,65,44,22,23,43,64,42,38,62,44,24,1,178,125,171,105,45,45,104,
171,126,133,174,103,41,41,103,174,253,201,5,129,12,41,102,172,131,126,172,
107,46,46,106,172,127,131,172,102,41,252,37,99,131,78,32,33,78,131,98,95,
128,79,34,34,79,128,2,124,98,130,78,32,33,78,130,97,95,130,79,34,34,79,130,
0,0,3,0,72,255,236,5,54,5,137,0,57,0,73,0,89,1,20,64,73,137,1,1,140,36,1,
123,42,139,42,2,98,82,114,82,130,82,3,102,71,1,127,78,1,91,78,1,73,43,89,
43,105,43,3,54,48,134,48,2,37,40,1,44,35,124,35,140,35,3,28,5,44,5,60,5,92,
5,4,10,10,26,10,42,10,3,10,2,26,2,42,2,3,31,184,255,232,64,56,9,13,72,10,
25,26,25,42,25,3,48,41,38,69,4,54,66,73,23,33,73,58,45,44,140,74,1,74,77,
18,3,23,3,58,44,80,23,1,3,44,1,23,58,44,44,58,23,3,13,15,54,1,175,54,1,54,
184,255,192,64,61,9,12,72,54,80,72,63,13,79,13,2,13,143,3,1,141,77,1,98,69,
114,69,2,54,69,70,69,2,3,74,48,41,77,44,38,18,69,9,8,63,81,144,28,1,192,28,
1,15,28,63,28,2,28,85,81,8,22,51,80,0,22,0,63,237,63,237,47,93,93,113,237,
18,23,57,93,93,93,93,1,47,93,237,47,43,93,113,18,23,57,47,47,47,0,93,1,93,
17,18,57,17,23,57,93,16,205,16,237,16,237,17,23,57,49,48,93,43,0,93,93,93,
93,1,93,93,93,0,93,93,93,93,1,93,0,93,93,5,34,38,39,14,3,35,34,46,2,53,52,
62,2,55,46,3,53,52,62,2,51,50,30,2,21,20,14,2,7,30,1,23,62,1,55,23,14,1,7,
30,1,51,50,54,55,21,14,1,1,52,46,2,35,34,6,21,20,22,23,62,3,3,46,1,39,14,
1,21,20,30,2,51,50,62,2,4,169,96,144,58,30,76,93,109,64,117,171,110,53,51,
91,126,75,18,29,22,12,40,85,133,93,73,123,90,50,66,112,148,83,62,146,85,61,
81,29,145,35,107,70,53,106,49,32,59,26,28,75,254,150,27,48,69,42,96,100,37,
28,65,116,86,50,74,89,164,66,113,123,35,72,109,73,44,79,68,55,12,66,61,26,
48,38,23,60,105,143,83,79,129,105,83,33,34,77,78,78,35,66,115,85,49,38,72,
106,68,75,117,92,75,33,114,201,97,90,199,121,43,139,227,103,54,44,7,9,135,
11,11,4,121,37,60,43,23,103,91,59,129,56,26,55,65,79,252,158,105,230,122,
48,148,105,55,95,71,41,19,30,38,0,0,1,0,104,3,198,1,32,5,129,0,3,0,33,64,
19,48,3,1,128,3,1,3,16,2,32,2,2,2,32,0,1,0,2,3,0,63,205,93,1,47,93,205,93,
113,49,48,1,35,3,51,1,10,141,21,184,3,198,1,187,0,1,0,127,254,88,2,158,5,
204,0,22,0,66,64,45,135,13,1,135,9,1,88,20,1,88,2,1,17,24,14,17,72,5,24,14,
17,72,16,6,16,16,6,128,6,2,6,11,242,0,0,16,0,32,0,3,0,16,27,5,0,0,63,63,1,
47,93,237,204,93,56,50,49,48,43,43,93,93,93,93,19,52,62,2,55,51,14,3,21,20,
30,2,23,35,46,3,53,127,42,90,140,97,174,94,137,88,43,43,88,137,94,174,97,
140,90,42,2,20,139,254,234,220,105,105,221,235,254,139,139,254,236,220,105,
105,220,234,253,140,0,0,0,1,0,12,254,88,2,43,5,204,0,22,0,72,64,13,136,13,
1,136,9,1,87,20,1,87,2,1,17,184,255,232,179,14,17,72,5,184,255,232,180,14,
17,72,16,6,184,255,240,64,16,31,6,143,6,2,6,0,242,143,11,1,11,16,0,5,27,0,
63,63,1,47,93,253,204,93,56,50,49,48,43,43,93,93,93,93,1,20,14,2,7,35,62,
3,53,52,46,2,39,51,30,3,21,2,43,42,90,140,97,174,94,137,88,43,43,88,137,94,
174,97,140,90,42,2,16,140,253,234,220,105,105,220,236,254,139,139,254,235,
221,105,105,220,234,254,139,0,0,0,0,1,0,33,2,178,2,253,5,129,0,14,0,107,64,
75,77,5,93,5,109,5,3,75,4,91,4,107,4,3,66,8,82,8,2,67,7,83,7,2,0,6,12,3,13,
95,4,1,15,4,1,4,3,32,2,48,2,2,2,14,47,10,63,10,2,10,9,8,191,13,207,13,2,16,
13,32,13,2,13,240,5,1,223,5,1,0,5,1,5,14,3,0,63,204,93,93,93,1,47,93,93,204,
51,204,93,221,204,93,51,204,113,114,18,23,57,49,48,93,93,93,93,1,37,23,5,
23,7,11,1,39,55,37,55,5,3,51,1,200,1,8,45,254,230,185,119,150,156,119,189,
254,232,45,1,11,12,136,4,90,103,132,73,250,72,1,2,255,0,72,248,73,134,107,
1,41,0,0,0,1,0,100,0,180,4,71,4,158,0,11,0,71,64,46,211,11,1,133,11,1,220,
4,1,138,4,1,9,1,170,6,16,2,32,2,2,2,217,2,1,56,2,136,2,2,2,0,4,173,9,214,
7,1,55,7,135,7,2,7,5,179,0,63,51,93,93,51,237,50,50,93,93,1,47,93,51,237,
50,49,48,93,93,93,93,1,17,35,17,33,53,33,17,51,17,33,21,2,159,147,254,88,
1,168,147,1,168,2,96,254,84,1,172,146,1,172,254,84,146,0,0,1,0,184,254,250,
1,129,0,219,0,12,0,78,185,0,4,255,224,183,11,17,72,10,151,0,150,7,184,255,
192,64,22,9,17,72,7,128,12,144,12,2,64,12,80,12,176,12,3,144,12,160,12,2,
12,184,255,192,64,14,38,41,72,12,64,13,16,72,12,7,168,0,155,11,0,47,253,228,
1,47,43,43,93,113,114,51,43,253,237,49,48,43,37,21,20,14,2,7,35,62,1,53,35,
53,1,129,9,20,29,20,123,45,49,88,219,168,53,87,75,66,32,65,132,65,219,0,0,
0,0,1,0,91,1,208,2,79,2,112,0,3,0,33,64,20,0,2,64,2,112,2,3,2,0,0,187,159,
1,207,1,2,47,1,1,1,0,47,93,113,237,1,47,47,93,49,48,19,53,33,21,91,1,244,
1,208,160,160,0,0,0,1,0,187,0,0,1,126,0,219,0,3,0,46,64,32,3,150,0,0,144,
0,2,64,0,80,0,176,0,224,0,240,0,5,144,0,160,0,2,0,64,13,16,72,0,1,155,0,0,
47,237,1,47,43,93,113,114,237,49,48,51,53,51,21,187,195,219,219,0,1,0,0,255,
236,2,57,5,204,0,3,0,51,64,26,121,0,137,0,2,1,24,13,17,72,41,2,1,2,16,0,2,
16,2,32,2,128,2,4,2,0,184,255,240,180,0,1,0,0,19,0,63,63,1,47,56,205,93,56,
49,48,93,43,93,21,1,51,1,1,155,158,254,105,20,5,224,250,32,0,0,2,0,80,255,
236,4,35,5,150,0,19,0,39,0,112,64,80,89,37,105,37,2,70,33,86,33,102,33,3,
86,27,102,27,2,89,23,105,23,2,4,18,1,118,17,134,17,2,121,13,137,13,2,11,12,
1,11,8,1,121,7,137,7,2,118,3,134,3,2,4,2,1,7,0,110,64,144,20,160,20,2,20,
41,128,30,110,63,10,1,10,25,115,15,7,35,115,5,25,0,63,237,63,237,1,47,93,
237,26,16,220,93,26,237,49,48,94,93,93,93,93,93,93,93,93,93,93,93,93,1,20,
2,14,1,35,34,46,1,2,53,52,18,62,1,51,50,30,1,18,7,52,46,2,35,34,14,2,21,20,
30,2,51,50,62,2,4,35,77,133,180,102,103,178,131,75,75,132,180,106,101,177,
132,76,183,40,78,113,72,76,116,79,40,41,79,114,73,71,114,79,43,2,193,203,
254,235,171,74,74,170,1,21,204,213,1,23,166,67,67,166,254,233,213,168,223,
133,55,56,133,223,167,162,222,135,59,59,135,222,0,1,0,156,0,0,4,15,5,129,
0,10,0,94,64,32,32,9,128,9,2,9,9,8,110,2,144,4,1,4,47,1,143,1,2,1,1,4,6,3,
0,2,16,2,2,7,2,5,184,255,240,64,26,16,22,72,68,5,84,5,100,5,3,5,4,3,16,16,
22,72,4,3,6,6,8,1,116,0,24,0,63,237,50,63,51,51,43,47,51,93,43,1,47,94,93,
23,51,47,93,47,93,16,237,50,47,93,49,48,51,53,33,17,5,53,37,51,17,33,21,156,
1,103,254,194,1,77,166,1,87,153,4,60,227,170,229,251,24,153,0,0,0,1,0,103,
0,0,4,12,5,150,0,40,0,161,64,77,117,4,1,117,26,133,26,2,122,16,138,16,2,101,
37,1,86,37,1,41,33,89,33,105,33,3,105,35,1,28,35,1,25,21,1,117,27,133,27,
2,6,27,1,39,29,110,64,8,64,38,42,72,64,8,1,143,8,1,8,42,128,18,110,19,116,
38,132,38,2,19,38,16,0,32,0,2,0,184,255,192,64,31,30,38,72,0,8,38,142,18,
1,92,18,108,18,124,18,3,10,18,26,18,2,18,13,115,24,7,1,38,116,0,24,0,63,237,
57,63,237,51,93,93,93,18,57,1,47,43,93,51,51,93,47,237,26,16,220,93,113,43,
26,237,50,49,48,93,93,0,93,93,93,93,1,93,93,0,93,93,93,51,53,62,5,53,52,46,
2,35,34,14,2,7,39,62,3,51,50,30,2,21,20,14,6,7,33,21,103,51,147,162,159,128,
79,36,68,95,58,54,95,74,47,7,184,9,66,116,163,107,105,164,113,60,51,85,112,
122,124,109,86,24,2,223,127,117,179,145,124,124,136,86,60,91,62,31,30,60,
89,59,17,76,134,101,58,50,98,144,94,71,128,116,108,103,101,102,105,57,153,
0,0,0,0,1,0,78,255,236,4,25,5,150,0,59,0,216,64,149,122,3,138,3,2,117,2,133,
2,2,117,58,133,58,2,117,51,133,51,2,117,47,133,47,2,117,13,133,13,2,122,37,
138,37,2,91,17,107,17,2,26,41,1,21,8,1,118,46,134,46,2,7,46,1,73,39,1,38,
110,54,25,49,95,25,111,25,2,39,25,39,25,10,19,32,110,49,49,0,110,64,31,19,
47,19,159,19,3,144,19,1,19,61,128,11,110,239,10,1,63,10,1,10,54,25,116,26,
26,16,141,38,1,92,38,108,38,124,38,3,10,38,26,38,2,38,35,115,44,7,16,115,
129,11,1,83,11,99,11,115,11,3,20,11,1,5,11,1,11,5,25,0,63,51,93,93,93,93,
237,63,237,51,93,93,93,18,57,47,237,57,1,47,93,113,237,26,16,220,93,113,26,
237,50,47,237,17,18,57,57,47,47,93,17,18,57,237,113,49,48,0,93,93,93,93,1,
93,0,93,93,1,93,93,93,93,0,93,1,20,14,2,35,34,46,2,39,55,30,3,51,50,54,53,
52,46,2,43,1,53,51,50,62,2,53,52,38,35,34,6,7,39,62,3,51,50,30,2,21,20,14,
2,7,21,30,3,4,25,63,121,179,115,131,179,116,58,9,186,8,43,74,108,74,136,155,
69,103,121,51,102,98,51,110,91,59,133,131,119,147,12,181,11,80,123,158,89,
118,170,108,51,34,72,111,78,85,126,82,41,1,133,97,152,105,55,65,107,137,73,
17,56,92,66,36,134,132,78,95,53,18,156,21,55,94,73,113,131,122,111,14,93,
138,91,45,59,101,136,77,62,108,86,62,16,4,9,59,88,112,0,0,2,0,47,0,0,4,55,
5,129,0,10,0,23,0,117,64,80,154,15,1,153,6,1,136,6,1,133,16,149,16,2,118,
16,1,24,22,1,118,22,134,22,150,22,3,22,5,64,12,21,72,5,91,10,107,10,123,10,
3,10,8,1,111,23,6,31,2,1,112,2,224,2,2,0,2,16,2,48,2,80,2,224,2,5,8,2,0,4,
115,8,22,22,1,11,6,6,1,24,0,63,63,51,18,57,47,51,237,50,1,47,94,93,113,114,
51,51,237,50,50,93,47,43,51,93,113,49,48,93,93,93,93,0,93,1,17,35,17,33,53,
1,51,17,51,21,1,14,3,7,1,14,3,7,33,3,113,170,253,104,2,133,189,198,254,144,
2,16,20,21,8,254,151,5,19,20,20,6,1,242,1,63,254,193,1,63,140,3,182,252,76,
142,3,119,5,29,36,37,12,253,236,8,26,27,26,7,0,1,0,82,255,236,4,29,5,129,
0,44,0,181,64,28,86,13,102,13,134,13,3,85,2,101,2,2,90,3,106,3,2,85,43,101,
43,2,85,42,101,42,2,38,184,255,216,64,89,14,17,72,21,8,1,6,10,1,25,36,153,
36,2,137,36,217,36,2,3,68,33,1,6,35,32,14,17,72,35,11,0,110,64,31,21,1,47,
21,159,21,2,144,21,1,21,46,128,36,31,37,110,33,32,32,11,110,208,10,1,63,10,
1,10,26,115,40,40,16,36,116,33,6,16,115,115,11,131,11,2,103,11,1,22,11,1,
11,5,25,0,63,51,93,93,93,237,63,237,18,57,47,237,1,47,93,113,237,51,47,51,
237,50,50,26,16,220,93,113,114,26,237,17,57,43,49,48,95,113,95,113,114,0,
93,1,93,0,43,93,1,93,0,93,1,93,0,93,1,20,14,2,35,34,46,2,39,55,30,3,51,50,
62,2,53,52,46,2,35,34,14,2,7,35,19,33,21,33,3,62,1,51,50,30,2,4,29,64,126,
187,123,111,165,114,67,14,182,11,40,69,101,72,70,114,81,44,42,78,113,72,45,
76,65,53,23,176,47,3,33,253,131,27,48,144,99,105,168,118,64,1,203,106,176,
127,70,52,91,122,70,21,40,75,59,35,43,84,122,79,65,109,79,44,16,28,37,20,
2,246,153,254,65,37,53,64,117,162,0,0,0,0,2,0,104,255,236,4,25,5,150,0,36,
0,56,0,175,64,48,140,21,1,122,22,138,22,2,89,7,105,7,2,90,3,106,3,122,3,3,
84,2,100,2,2,84,35,100,35,116,35,3,84,34,100,34,116,34,3,53,30,69,30,2,133,
50,1,50,184,255,240,64,45,10,13,72,132,26,1,37,26,53,26,69,26,117,26,4,22,
26,1,21,111,20,20,0,110,64,47,37,159,37,2,144,37,1,37,58,128,47,29,110,16,
10,32,10,2,10,184,255,192,64,24,30,38,72,10,29,42,117,32,32,52,24,115,25,
21,153,21,2,21,15,7,52,115,5,25,0,63,237,63,51,93,237,18,57,47,237,50,1,47,
43,93,237,50,26,16,220,93,113,26,237,50,47,237,49,48,93,93,93,43,93,0,93,
93,1,93,93,0,93,93,93,93,1,20,14,2,35,34,46,1,2,53,52,18,62,1,51,50,30,2,
23,7,46,1,35,34,14,2,21,62,1,51,50,30,2,7,52,46,2,35,34,14,2,21,20,30,2,51,
50,62,2,4,25,59,115,170,111,123,184,122,61,69,130,187,118,72,126,103,78,23,
172,28,123,81,74,120,84,45,49,178,115,96,156,111,61,183,36,72,106,70,49,100,
81,51,40,75,106,66,65,103,72,38,1,205,106,177,127,71,94,177,1,1,164,188,1,
28,190,96,30,67,110,80,31,91,81,70,139,210,140,91,95,62,117,167,112,73,118,
83,45,29,65,106,76,78,135,100,58,45,85,122,0,0,1,0,105,0,0,4,12,5,129,0,14,
0,68,64,45,122,11,138,11,2,105,11,1,5,110,6,6,0,80,12,1,16,12,32,12,2,12,
11,95,0,1,0,0,32,0,64,0,96,0,128,0,5,0,0,12,116,13,6,5,24,0,63,63,237,50,
1,47,93,113,51,47,93,113,18,57,47,237,49,48,93,93,1,6,10,2,21,35,52,26,2,
55,33,53,33,4,12,106,178,128,71,188,80,136,180,101,253,11,3,163,4,239,162,
254,213,254,209,254,193,180,169,1,69,1,57,1,46,147,153,0,0,0,0,3,0,89,255,
236,4,26,5,150,0,41,0,61,0,81,0,191,64,132,117,40,133,40,2,117,33,133,33,
2,117,29,133,29,2,117,28,133,28,2,117,24,133,24,2,122,23,138,23,2,122,19,
138,19,2,122,12,1,122,8,138,8,2,122,7,138,7,2,122,3,138,3,2,117,2,133,2,2,
85,69,101,69,2,85,75,101,75,2,90,65,106,65,2,52,110,21,42,110,31,15,36,31,
79,21,1,21,31,21,31,10,0,110,64,15,62,31,62,2,31,62,47,62,159,62,3,144,62,
1,62,83,128,72,110,208,10,1,10,36,15,67,117,57,57,77,47,117,26,7,77,117,5,
25,0,63,237,63,237,18,57,47,237,57,57,1,47,113,237,26,16,220,93,113,114,26,
237,17,57,57,47,47,113,18,57,57,16,237,16,237,49,48,93,93,93,93,0,93,93,1,
93,93,93,93,0,93,93,1,93,93,93,1,20,14,2,35,34,46,2,53,52,62,2,55,53,46,3,
53,52,62,2,51,50,30,2,21,20,14,2,7,21,30,3,3,52,46,2,35,34,14,2,21,20,30,
2,51,50,62,2,19,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,4,26,57,117,182,
124,124,181,119,57,47,79,101,54,59,93,63,33,57,112,166,109,115,169,111,54,
33,63,93,61,61,104,76,44,222,27,62,100,73,71,98,63,28,22,58,102,80,85,103,
55,17,35,28,68,115,86,79,111,69,32,32,70,114,81,82,112,68,29,1,137,90,151,
110,62,62,109,151,89,77,120,87,53,9,4,14,62,87,106,59,74,131,99,57,58,99,
132,74,58,106,87,61,12,4,10,53,87,120,2,76,53,88,63,35,35,63,88,53,42,88,
72,46,46,72,88,253,163,51,95,73,45,45,74,97,52,65,107,77,42,42,77,109,0,0,
0,2,0,96,255,236,4,18,5,150,0,36,0,56,0,190,64,105,169,39,1,163,11,1,149,
12,165,12,2,170,17,1,153,17,1,116,35,132,35,2,116,32,132,32,148,32,3,122,
31,138,31,154,31,3,122,27,138,27,154,27,3,123,26,139,26,155,26,3,90,40,106,
40,2,89,2,105,2,2,16,24,10,13,72,54,8,1,37,0,110,47,19,63,19,2,79,19,191,
19,2,0,19,32,19,48,19,64,19,176,19,5,7,19,58,11,111,10,10,47,110,32,29,1,
29,184,255,192,64,27,32,38,72,29,19,52,115,95,24,111,24,2,24,24,5,42,115,
34,7,14,115,23,11,1,11,5,25,0,63,51,93,237,63,237,17,57,47,93,237,50,1,47,
43,93,237,51,47,237,16,220,94,93,113,114,237,51,49,48,93,43,93,93,0,93,1,
93,93,0,93,93,1,93,93,0,93,93,1,93,1,20,2,14,1,35,34,46,2,39,55,30,1,51,50,
62,2,55,14,3,35,34,46,2,53,52,62,2,51,50,18,7,52,46,2,35,34,14,2,21,20,30,
2,51,50,62,2,4,18,71,132,189,118,81,130,102,72,22,172,28,119,91,73,121,85,
48,2,21,73,93,108,55,96,155,108,59,63,120,175,111,235,242,196,37,73,107,70,
65,104,72,39,35,70,104,69,50,103,83,53,2,221,188,254,229,188,94,33,70,112,
79,27,91,85,69,138,208,140,47,74,51,27,69,124,175,107,109,176,123,66,254,
164,175,78,138,102,59,46,85,122,75,71,122,89,51,34,70,107,0,0,0,0,2,0,187,
0,0,1,126,4,58,0,3,0,7,0,54,64,36,3,7,150,0,0,4,144,4,2,64,4,80,4,224,4,240,
4,4,144,4,160,4,2,4,64,13,16,72,4,5,156,4,0,156,1,15,0,63,237,47,237,1,47,
43,93,113,114,51,237,50,49,48,19,53,51,21,3,53,51,21,187,195,195,195,3,107,
207,207,252,149,207,207,0,0,0,2,0,184,254,250,1,129,4,58,0,12,0,16,0,89,185,
0,4,255,224,64,10,11,17,72,16,10,151,0,150,13,7,184,255,192,64,22,9,17,72,
7,128,12,144,12,2,64,12,80,12,176,12,3,144,12,160,12,2,12,184,255,192,64,
18,38,41,72,12,64,13,16,72,12,13,156,14,15,7,168,0,156,11,0,47,253,228,63,
237,1,47,43,43,93,113,114,51,43,51,253,237,51,49,48,43,37,21,20,14,2,7,35,
62,1,53,35,53,17,53,51,21,1,129,9,20,29,20,123,45,49,88,195,207,156,53,87,
75,66,32,65,132,65,207,2,156,207,207,0,0,1,0,101,0,154,4,72,4,170,0,6,0,106,
185,0,5,255,216,64,17,18,22,72,3,40,18,22,72,0,40,18,22,72,137,0,1,1,184,
255,216,64,51,18,22,72,134,1,1,6,0,2,32,2,80,2,112,2,4,2,32,0,1,0,63,6,127,
6,143,6,3,6,48,2,112,2,128,2,3,2,1,0,15,4,63,4,111,4,159,4,207,4,5,4,0,25,
47,93,51,51,205,93,205,93,1,24,47,93,47,93,51,49,48,0,93,43,93,43,43,43,19,
53,1,21,9,1,21,101,3,227,252,166,3,90,2,59,205,1,162,154,254,146,254,145,
153,0,0,0,0,2,0,100,1,88,4,71,3,236,0,3,0,7,0,70,64,49,7,64,2,96,2,2,0,2,
32,2,112,2,208,2,4,2,4,223,0,1,32,0,1,0,4,173,31,5,47,5,95,5,111,5,223,5,
5,5,0,173,80,1,208,1,2,15,1,1,1,0,47,93,93,237,222,93,237,1,47,93,93,51,47,
93,113,51,49,48,19,53,33,21,1,53,33,21,100,3,227,252,29,3,227,3,88,148,148,
254,0,148,148,0,0,0,0,1,0,101,0,154,4,72,4,170,0,6,0,106,185,0,1,255,216,
64,17,18,22,72,3,40,18,22,72,6,40,18,22,72,137,6,1,5,184,255,216,64,51,18,
22,72,134,5,1,0,6,32,6,80,6,112,6,4,6,3,32,0,1,0,6,5,48,4,112,4,128,4,3,4,
63,0,127,0,143,0,3,0,15,2,63,2,111,2,159,2,207,2,5,2,0,25,47,93,205,93,205,
93,51,51,1,24,47,93,51,47,93,49,48,0,93,43,93,43,43,43,55,53,9,1,53,1,21,
101,3,90,252,166,3,227,154,153,1,111,1,110,154,254,94,205,0,2,0,84,0,0,4,
39,5,150,0,37,0,41,0,137,64,68,117,36,133,36,2,117,35,133,35,2,90,26,106,
26,2,90,21,1,90,14,122,14,138,14,3,90,13,122,13,138,13,3,58,6,74,6,2,9,72,
10,10,176,41,192,41,2,41,150,38,38,19,27,70,28,0,70,0,19,32,19,64,19,144,
19,176,19,5,19,184,255,192,64,23,38,44,72,19,19,33,95,10,143,10,2,10,39,156,
38,76,27,1,27,24,95,33,4,0,63,237,51,93,47,253,198,93,17,57,1,47,43,93,237,
47,237,18,57,47,237,113,51,47,237,49,48,0,93,1,93,93,0,93,93,93,1,93,1,20,
14,6,7,35,62,7,53,52,46,2,35,34,6,7,39,62,3,51,50,30,2,1,53,51,21,4,39,37,
62,79,82,79,63,39,1,175,2,39,62,78,80,77,60,37,42,77,109,67,140,164,14,184,
11,67,121,179,122,114,178,123,64,253,143,195,4,8,71,108,85,67,60,58,68,83,
55,69,104,80,63,57,57,70,88,59,59,92,63,32,140,122,12,84,149,112,65,56,103,
148,251,157,201,201,0,0,0,0,2,0,161,254,229,7,110,5,204,0,93,0,114,1,101,
64,255,122,17,138,17,2,117,15,133,15,2,117,27,133,27,2,121,47,137,47,2,116,
38,132,38,2,102,38,1,99,70,1,86,69,102,69,2,123,26,139,26,2,73,26,1,74,56,
90,56,106,56,3,59,102,1,82,63,1,54,63,70,63,2,82,64,1,38,64,54,64,70,64,3,
131,3,1,37,3,53,3,69,3,3,37,2,53,2,69,2,133,2,4,25,8,57,8,2,11,8,1,11,8,27,
8,2,8,32,12,17,72,22,92,102,92,134,92,3,80,58,96,58,2,5,58,21,58,53,58,69,
58,4,137,57,1,93,57,1,10,57,26,57,2,9,7,1,125,52,141,52,2,11,52,75,52,2,10,
22,26,22,42,22,3,104,212,24,37,41,211,10,112,34,132,72,1,72,10,49,80,24,1,
80,24,1,24,10,24,10,82,0,210,64,95,49,111,49,2,143,49,159,49,2,49,116,128,
61,210,0,82,16,82,32,82,3,82,44,213,5,5,107,214,19,99,214,29,36,29,47,19,
63,19,79,19,3,32,29,48,29,64,29,3,19,29,19,29,77,54,214,89,0,149,71,1,71,
66,214,77,0,47,237,51,93,63,237,18,57,57,47,47,93,93,17,51,16,237,16,237,
51,47,237,1,47,93,237,26,16,220,93,113,26,237,18,57,57,47,47,93,114,17,18,
57,93,50,50,16,237,50,16,237,49,48,93,93,93,93,0,93,93,93,1,93,93,93,43,93,
0,93,93,1,93,93,93,0,93,93,1,93,93,0,93,93,1,93,93,0,93,93,1,93,93,93,0,93,
1,93,0,93,1,20,14,2,35,34,46,2,53,52,54,55,35,14,3,35,34,46,2,53,52,62,2,
51,50,30,2,23,51,55,51,3,14,1,21,20,22,51,50,62,2,53,52,46,2,35,34,14,4,21,
20,30,2,51,50,62,2,55,23,14,3,35,34,36,38,2,53,52,18,62,2,36,51,50,4,22,18,
5,52,46,2,35,34,14,2,21,20,22,51,50,62,2,55,62,1,7,110,67,118,165,97,56,79,
50,22,2,1,6,24,69,93,117,71,84,125,81,40,71,132,185,114,60,96,73,54,18,6,
39,156,116,19,18,43,38,62,107,79,45,83,161,238,156,134,227,184,139,94,48,
86,165,243,158,105,182,152,120,44,55,50,135,166,196,111,190,254,217,203,105,
63,118,170,215,0,255,144,201,1,36,191,92,253,162,34,63,89,56,86,130,87,45,
95,99,69,120,96,70,18,9,14,2,243,144,239,172,96,27,47,64,38,15,43,12,45,89,
69,43,58,103,141,83,120,221,169,102,27,48,67,40,160,254,6,84,120,49,48,46,
81,142,192,112,129,222,162,92,64,116,161,192,219,115,141,238,171,96,33,48,
57,24,112,30,63,52,33,115,206,1,28,169,139,1,0,220,180,128,70,118,200,254,
248,155,50,84,60,33,85,138,173,87,120,136,62,102,132,71,36,80,0,0,0,0,2,0,
4,0,0,5,82,5,129,0,7,0,20,1,18,64,206,102,2,118,2,134,2,3,102,19,118,19,134,
19,3,105,1,121,1,137,1,3,105,20,121,20,137,20,3,115,6,131,6,2,101,6,1,124,
5,140,5,2,106,5,1,122,0,138,0,2,57,0,89,0,105,0,3,117,3,133,3,2,54,3,86,3,
102,3,3,90,4,1,72,4,1,85,7,1,71,7,1,19,2,3,1,20,0,21,6,37,6,53,6,3,6,6,1,
230,6,246,6,2,26,5,42,5,58,5,3,9,5,1,233,5,249,5,2,6,5,13,13,4,26,0,42,0,
58,0,3,9,0,1,233,0,249,0,2,0,16,7,32,7,48,7,3,32,7,1,7,7,22,21,3,37,3,53,
3,3,6,3,1,230,3,246,3,2,3,175,4,191,4,2,4,80,22,176,22,2,48,22,96,22,144,
22,192,22,240,22,5,47,22,1,1,2,95,20,19,19,118,13,1,13,5,3,4,0,18,0,63,50,
63,51,93,57,47,51,237,50,1,93,93,113,47,93,51,93,113,113,17,51,47,93,113,
51,93,113,113,18,57,61,47,51,51,93,113,113,93,113,113,18,57,57,18,57,57,49,
48,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,33,3,33,3,35,1,51,9,1,
46,3,39,14,3,7,3,33,4,143,161,253,126,162,198,2,63,217,2,54,253,174,16,29,
22,15,1,2,14,23,29,15,180,2,15,1,156,254,100,5,129,250,127,4,2,40,82,67,45,
5,5,46,68,82,40,254,49,0,3,0,168,0,0,4,234,5,129,0,22,0,33,0,46,0,155,64,
108,155,24,171,24,2,147,32,1,133,32,1,147,45,1,117,45,133,45,2,122,36,138,
36,154,36,3,5,11,21,11,37,11,3,6,2,22,2,38,2,3,171,18,1,159,18,1,107,18,123,
18,139,18,3,18,28,13,90,23,64,13,17,72,23,23,41,0,90,64,31,34,47,34,2,175,
34,1,34,48,128,28,41,90,0,6,16,6,64,6,3,7,6,18,40,95,127,28,1,28,28,41,27,
95,7,3,41,95,6,18,0,63,237,63,237,18,57,47,113,237,57,1,47,94,93,237,50,26,
16,220,93,113,26,237,18,57,47,43,237,17,57,93,93,93,49,48,93,93,0,93,93,93,
93,93,93,1,20,14,2,35,33,17,33,50,30,2,21,20,14,2,7,30,3,1,52,38,35,33,17,
33,50,62,2,19,52,46,2,35,33,17,33,50,62,2,4,234,84,142,188,104,253,196,2,
0,117,184,128,67,33,67,101,67,85,131,88,46,254,238,156,148,254,191,1,65,84,
116,72,32,81,49,92,129,80,254,156,1,115,73,123,89,50,1,141,107,151,95,44,
5,129,39,84,129,90,59,104,85,61,15,10,58,90,119,2,66,114,98,254,66,33,61,
86,253,190,67,94,60,28,254,4,24,60,100,0,1,0,104,255,236,5,121,5,150,0,39,
0,173,64,79,121,14,137,14,2,117,13,133,13,2,123,37,139,37,2,106,38,1,124,
36,140,36,2,106,36,1,106,28,1,85,7,1,90,3,1,42,29,106,29,2,134,23,1,42,23,
106,23,2,5,8,21,8,2,5,2,21,2,2,5,91,80,26,96,26,2,175,26,191,26,2,32,26,1,
15,26,1,26,34,16,184,255,192,64,42,7,13,72,16,16,41,32,41,1,79,35,1,35,35,
0,95,31,4,0,15,16,15,2,48,15,64,15,112,15,128,15,192,15,208,15,6,15,15,10,
95,21,19,0,63,237,51,47,93,113,63,237,51,47,93,1,93,17,51,47,43,51,47,93,
93,93,113,237,49,48,93,93,93,93,93,0,93,93,1,93,93,93,93,0,93,93,1,93,1,34,
14,2,21,20,30,2,51,50,62,2,55,23,14,3,35,34,36,38,2,53,52,18,54,36,51,50,
4,23,7,46,3,3,24,120,185,125,64,69,129,187,117,82,135,109,86,33,156,38,112,
151,191,118,171,254,255,173,86,91,175,1,0,164,225,1,46,71,181,20,68,102,137,
4,250,80,148,208,127,127,211,152,84,43,78,107,65,78,79,136,100,57,109,195,
1,12,159,165,1,10,187,101,176,173,60,50,91,70,42,0,2,0,168,0,0,5,101,5,129,
0,12,0,25,0,100,64,70,169,24,1,123,24,1,172,23,1,27,23,43,23,59,23,123,23,
4,169,16,1,27,16,43,16,59,16,123,16,4,123,15,1,153,3,1,121,2,1,0,90,64,47,
13,1,13,27,128,64,27,1,20,90,0,6,16,6,64,6,3,7,6,19,95,7,3,20,95,6,18,0,63,
237,63,237,1,47,94,93,237,93,26,16,220,113,26,237,49,48,93,93,93,93,93,93,
93,93,93,1,20,2,14,1,35,33,17,33,50,4,22,18,7,52,46,2,35,33,17,33,50,62,2,
5,101,106,184,251,145,253,241,1,210,163,1,19,198,111,192,82,148,206,123,254,
241,1,58,111,189,138,78,2,207,176,254,243,181,93,5,129,81,169,254,252,180,
143,203,130,61,251,177,72,142,212,0,0,1,0,168,0,0,4,254,5,129,0,11,0,77,181,
7,3,7,3,0,10,184,255,192,64,37,7,11,72,10,10,13,5,9,90,0,0,16,0,64,0,3,7,
0,32,13,1,8,95,127,5,1,5,5,9,4,95,1,3,9,95,0,18,0,63,237,63,237,18,57,47,
113,237,1,93,47,94,93,237,50,17,51,47,43,18,57,57,47,47,49,48,51,17,33,21,
33,17,33,21,33,17,33,21,168,4,45,252,146,3,50,252,206,3,151,5,129,156,254,
60,154,254,21,156,0,0,1,0,168,0,0,4,145,5,129,0,9,0,105,185,0,2,255,192,182,
13,24,72,2,2,6,8,184,255,192,64,58,7,12,72,8,8,11,1,5,90,0,6,16,6,64,6,3,
7,6,48,11,1,4,95,239,1,1,15,1,63,1,111,1,127,1,159,1,175,1,207,1,223,1,8,
8,1,64,23,30,72,1,1,5,0,95,7,3,5,18,0,63,63,237,18,57,47,43,94,93,113,237,
1,93,47,94,93,237,50,17,51,47,43,18,57,47,43,49,48,1,17,33,21,33,17,35,17,
33,21,1,103,3,18,252,238,191,3,233,4,229,253,244,158,253,197,5,129,156,0,
1,0,103,255,236,5,160,5,150,0,45,0,185,64,130,134,43,1,106,43,1,66,37,82,
37,2,5,24,21,24,85,24,3,86,23,1,86,19,1,5,18,21,18,85,18,3,122,12,138,12,
2,89,12,105,12,2,106,3,1,106,2,1,73,37,89,37,2,53,29,1,123,13,139,13,2,64,
10,1,10,10,36,92,31,64,33,33,0,127,31,143,31,2,31,47,128,32,47,96,47,128,
47,3,21,91,175,0,191,0,2,32,0,1,15,0,1,0,33,95,240,34,1,34,34,5,26,95,41,
19,16,95,5,48,11,64,11,2,144,11,224,11,2,11,11,5,4,0,63,51,47,93,113,16,237,
63,237,17,57,47,93,237,1,47,93,93,93,237,93,26,16,204,93,17,57,47,26,16,237,
50,47,93,49,48,0,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,19,52,18,54,
36,51,50,30,2,23,7,46,3,35,34,14,2,21,20,30,2,51,50,62,2,55,53,33,53,33,17,
14,3,35,34,36,38,2,103,89,177,1,6,173,130,196,144,100,35,182,26,73,104,137,
88,128,189,124,61,66,130,193,127,83,140,113,86,29,254,91,2,85,47,127,158,
188,107,178,254,246,177,89,2,199,165,1,10,187,101,46,86,123,77,54,52,85,60,
33,80,148,208,127,127,211,153,85,28,45,55,28,254,160,254,26,48,87,66,38,109,
195,1,12,0,0,0,0,1,0,168,0,0,5,32,5,129,0,11,0,103,64,29,11,90,64,8,143,0,
159,0,175,0,223,0,4,0,13,128,64,13,1,64,13,192,13,208,13,224,13,4,13,184,
255,192,64,37,14,17,72,7,3,90,0,4,16,4,64,4,3,7,4,2,95,80,7,1,176,7,224,7,
2,15,7,1,8,7,7,9,5,3,4,0,18,0,63,50,63,51,57,47,94,93,93,113,237,1,47,94,
93,237,50,43,93,113,26,16,220,93,50,26,237,49,48,33,17,33,17,35,17,51,17,
33,17,51,17,4,97,253,6,191,191,2,250,191,2,141,253,115,5,129,253,172,2,84,
250,127,0,0,0,1,0,189,0,0,1,124,5,129,0,3,0,122,64,70,3,90,15,0,1,12,0,0,
1,61,16,0,32,0,208,0,3,96,0,112,0,2,0,0,16,0,64,0,80,0,176,0,5,7,0,175,5,
1,0,5,160,5,176,5,3,0,5,16,5,64,5,80,5,160,5,176,5,192,5,240,5,8,32,5,144,
5,240,5,3,5,184,255,192,179,56,61,72,5,184,255,192,179,45,48,72,5,184,255,
192,182,13,16,72,1,3,0,18,0,63,63,1,43,43,43,93,113,114,93,47,94,93,113,114,
94,93,94,93,237,49,48,51,17,51,17,189,191,5,129,250,127,0,0,0,1,0,32,255,
236,3,104,5,129,0,21,0,124,64,15,137,2,1,130,5,1,123,10,1,100,6,116,6,2,6,
184,255,224,64,66,14,17,72,0,14,32,14,2,128,14,144,14,224,14,240,14,4,14,
14,3,17,90,64,64,12,80,12,96,12,3,111,12,1,12,23,128,15,3,1,3,32,23,1,32,
23,64,23,80,23,96,23,4,14,95,15,3,9,95,0,64,4,1,4,4,0,19,0,63,50,47,93,16,
237,63,237,1,93,113,47,113,26,16,220,93,113,26,237,18,57,47,93,113,49,48,
0,43,1,93,93,93,0,93,5,34,38,39,55,30,3,51,50,54,53,17,33,53,33,17,20,14,
2,1,201,171,219,35,187,10,46,64,78,41,104,120,254,241,1,205,56,107,154,20,
178,192,31,65,93,60,28,143,138,3,69,156,252,35,101,162,115,62,0,1,0,168,0,
0,5,63,5,129,0,11,0,154,64,103,171,1,1,157,1,1,138,8,154,8,2,138,1,154,1,
170,1,3,102,2,1,131,7,147,7,2,100,7,1,157,0,173,0,2,107,0,123,0,139,0,3,89,
0,1,86,10,1,155,10,1,36,10,1,1,10,106,8,250,8,2,8,10,144,9,160,9,2,9,9,0,
11,16,0,11,1,11,11,13,7,2,3,90,0,4,16,4,64,4,3,7,4,7,10,1,2,4,4,8,5,3,0,4,
18,0,63,51,63,51,18,23,57,1,47,94,93,237,50,50,17,51,47,93,56,51,57,47,93,
57,51,113,17,51,49,48,0,93,93,1,93,93,93,93,0,93,93,93,1,93,93,0,93,93,33,
1,7,17,35,17,51,17,1,51,9,1,4,82,253,205,184,191,191,2,167,225,253,168,2,
168,2,168,140,253,228,5,129,253,62,2,194,253,156,252,227,0,0,0,0,1,0,168,
0,0,4,47,5,129,0,5,0,56,64,40,16,4,48,4,2,0,4,16,4,32,4,64,4,96,4,128,4,160,
4,240,4,8,4,3,90,0,0,16,0,64,0,3,7,0,1,3,3,95,0,18,0,63,237,63,1,47,94,93,
237,47,93,113,49,48,51,17,51,17,33,21,168,191,2,200,5,129,251,27,156,0,0,
0,0,1,0,168,0,0,6,2,5,129,0,44,2,44,64,12,152,41,1,151,31,1,12,16,18,24,72,
12,184,255,240,179,13,17,72,13,184,255,240,64,27,18,24,72,40,13,1,13,16,13,
17,72,42,32,33,37,72,42,32,18,28,72,42,32,9,17,72,30,184,255,224,179,33,37,
72,30,184,255,224,179,18,28,72,30,184,255,224,64,255,9,17,72,13,12,36,36,
27,44,92,42,36,0,52,0,2,212,0,1,139,0,155,0,2,4,0,1,8,0,46,139,46,1,116,46,
1,59,46,1,203,46,1,180,46,1,11,46,1,207,171,46,1,52,46,1,32,46,1,20,46,1,
0,46,1,244,46,1,208,46,1,196,46,1,176,46,1,116,46,132,46,164,46,3,96,46,1,
84,46,1,64,46,1,52,46,1,16,46,1,4,46,1,151,240,46,1,180,46,196,46,228,46,
3,160,46,1,116,46,148,46,2,80,46,1,68,46,1,48,46,1,4,46,36,46,2,244,46,1,
224,46,1,180,46,212,46,2,144,46,1,132,46,1,112,46,1,52,46,68,46,100,46,3,
32,46,1,20,46,1,244,46,1,208,46,1,116,46,132,46,164,46,196,46,4,96,46,1,52,
46,84,46,2,16,46,1,4,46,1,103,116,46,148,46,180,46,196,46,228,46,5,80,46,
1,4,46,36,46,68,46,3,20,46,52,46,68,46,100,46,132,46,180,46,212,46,244,46,
8,164,46,196,46,244,46,3,139,46,1,4,46,52,46,84,46,116,46,4,55,64,83,228,
46,1,203,46,1,36,46,68,46,116,46,148,46,180,46,5,11,46,1,212,46,244,46,2,
187,46,1,100,46,132,46,2,75,46,1,20,46,52,46,2,251,46,1,164,46,196,46,228,
46,3,128,46,1,2,64,46,80,46,112,46,3,63,46,1,0,46,32,46,2,30,27,92,0,28,64,
28,2,7,28,6,21,21,184,255,192,64,16,18,37,72,42,21,29,3,75,36,1,0,13,36,3,
28,18,0,63,23,51,93,63,51,51,43,17,51,1,47,94,93,237,50,93,93,93,95,93,93,
93,113,113,113,113,113,114,114,114,114,94,93,93,93,113,114,114,114,94,93,
93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,114,114,114,114,114,
114,114,114,94,93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,94,93,
93,93,113,113,113,16,220,94,93,93,93,113,50,237,18,57,61,47,51,51,49,48,43,
43,43,43,43,43,43,93,43,43,43,93,93,33,17,52,54,55,54,55,6,7,14,1,7,1,35,
1,46,3,39,38,39,22,23,30,1,21,17,35,17,51,1,30,3,23,62,3,55,1,51,17,5,86,
2,2,2,3,14,15,13,31,15,254,148,134,254,143,6,13,15,15,7,17,16,1,2,2,2,170,
251,1,119,7,20,18,15,3,3,16,21,20,8,1,112,245,3,172,51,106,44,51,48,51,50,
43,97,39,252,64,3,192,15,40,45,47,23,53,57,56,55,47,103,39,252,84,5,129,252,
47,20,63,66,59,16,16,60,66,62,20,3,209,250,127,0,0,0,0,1,0,168,0,0,5,32,5,
129,0,19,0,196,185,0,10,255,224,64,39,12,43,72,54,10,70,10,2,0,32,12,43,72,
41,0,57,0,73,0,3,11,16,29,33,72,11,32,18,28,72,150,11,166,11,2,41,11,1,1,
184,255,240,179,29,33,72,1,184,255,224,64,53,18,28,72,154,1,170,1,2,3,38,
1,1,19,92,0,68,16,84,16,148,16,3,224,16,1,2,0,16,48,16,64,16,112,16,192,16,
208,16,6,16,64,21,1,64,21,192,21,208,21,224,21,4,21,184,255,192,64,16,14,
17,72,10,7,92,0,8,16,8,64,8,3,7,8,1,184,255,192,64,16,29,43,72,17,1,9,3,11,
64,29,43,72,11,0,8,18,0,63,51,51,43,63,51,51,43,1,47,94,93,237,50,43,93,113,
47,93,95,93,113,51,237,49,48,0,93,95,93,43,43,93,93,43,43,1,93,43,93,43,33,
1,22,23,30,1,21,17,35,17,51,1,38,39,46,1,53,17,51,17,4,58,253,14,2,3,2,3,
170,222,2,250,3,3,2,4,172,4,176,49,48,41,91,35,252,88,5,129,251,72,49,49,
42,99,45,3,156,250,127,0,0,0,0,2,0,97,255,236,5,215,5,150,0,19,0,39,0,108,
64,74,91,37,1,26,37,1,9,37,1,82,33,1,21,33,1,7,33,1,84,27,1,21,27,1,91,23,
1,25,23,1,102,17,1,104,12,1,0,91,64,15,20,1,20,41,128,32,41,128,41,2,30,91,
175,10,191,10,2,32,10,1,15,10,31,10,2,10,25,95,15,4,35,95,5,19,0,63,237,63,
237,1,47,93,93,93,237,93,26,16,220,113,26,237,49,48,93,93,93,93,93,93,93,
93,93,93,93,93,1,20,2,6,4,35,34,36,38,2,53,52,18,54,36,51,50,4,22,18,7,52,
46,2,35,34,14,2,21,20,30,2,51,50,62,2,5,215,95,180,254,252,165,174,254,250,
174,88,92,178,1,5,169,168,1,5,177,92,195,65,127,188,123,126,190,127,63,65,
127,189,123,132,191,123,59,2,199,165,254,242,192,104,109,195,1,12,159,165,
1,10,187,101,102,188,254,246,163,127,208,148,80,80,148,208,127,127,211,153,
85,86,153,212,0,2,0,168,0,0,4,234,5,129,0,14,0,23,0,117,64,83,169,2,1,147,
23,1,155,16,171,16,2,10,3,26,3,42,3,3,5,12,21,12,37,12,3,0,90,64,15,25,128,
64,25,1,64,25,1,20,7,90,0,8,16,8,64,8,3,8,6,95,31,20,47,20,79,20,95,20,127,
20,5,15,20,207,20,255,20,3,7,20,64,9,17,72,20,20,7,19,95,9,3,7,18,0,63,63,
237,18,57,47,43,94,93,113,237,1,47,93,237,50,93,113,26,16,220,26,237,49,48,
0,93,93,93,93,93,1,20,14,2,35,33,17,35,17,33,50,30,2,7,52,38,35,33,17,33,
50,54,4,234,61,121,182,121,254,98,191,2,81,125,186,124,62,192,164,164,254,
133,1,131,165,155,3,217,92,159,117,68,253,219,5,129,61,111,157,97,134,139,
253,212,146,0,0,0,2,0,97,254,125,5,215,5,150,0,36,0,56,0,162,64,113,108,20,
124,20,140,20,3,104,24,1,104,29,1,101,34,1,87,6,1,85,49,1,90,39,1,90,45,1,
108,19,124,19,140,19,3,26,19,90,19,2,26,40,90,40,2,21,44,85,44,2,26,54,90,
54,2,8,54,1,21,50,85,50,2,7,50,1,13,13,22,5,27,0,91,64,15,37,1,37,58,128,
47,91,175,27,191,27,2,32,27,1,15,27,31,27,2,27,32,58,128,58,2,42,95,32,4,
52,95,5,22,19,10,95,17,0,47,237,63,51,237,63,237,1,93,47,93,93,93,237,26,
16,220,113,26,237,17,57,57,50,47,49,48,93,93,93,93,93,93,0,93,93,93,93,93,
1,93,93,93,0,93,93,1,20,14,2,7,30,3,51,50,54,55,21,14,1,35,34,46,2,39,46,
2,2,53,52,18,54,36,51,50,4,22,18,7,52,46,2,35,34,14,2,21,20,30,2,51,50,62,
2,5,215,77,145,211,134,21,53,68,83,51,28,64,23,38,91,49,86,128,97,70,27,158,
239,159,80,92,178,1,5,169,168,1,5,177,92,195,65,127,188,123,126,190,127,63,
65,127,189,123,132,191,123,59,2,199,149,247,186,117,18,64,90,57,27,8,5,134,
9,13,51,95,138,87,8,115,193,1,3,152,165,1,10,187,101,102,188,254,246,163,
127,208,148,80,80,148,208,127,127,211,153,85,86,153,212,0,0,0,2,0,168,0,0,
5,104,5,129,0,17,0,30,0,210,64,62,169,13,1,138,20,154,20,170,20,3,148,29,
1,117,29,133,29,2,174,0,1,157,0,1,124,0,140,0,2,74,0,90,0,106,0,3,3,160,1,
1,114,1,130,1,146,1,3,2,99,1,1,64,1,1,51,1,1,37,1,1,3,16,184,255,112,64,87,
17,73,112,16,128,16,144,16,3,84,16,100,16,2,66,16,1,2,35,16,51,16,2,1,16,
16,25,18,90,11,11,0,0,17,48,17,64,17,96,17,144,17,160,17,6,17,64,32,144,32,
160,32,3,25,3,90,0,4,16,4,64,4,3,7,4,16,2,95,47,25,95,25,111,25,143,25,4,
25,25,0,24,95,5,3,4,0,18,0,63,50,63,237,18,57,47,93,237,50,1,47,94,93,237,
50,93,47,93,51,57,47,237,18,57,17,51,49,48,93,95,93,93,93,43,95,93,93,93,
93,95,93,93,95,93,93,93,93,0,93,93,93,93,33,1,33,17,35,17,33,50,30,2,21,20,
14,2,7,1,3,52,46,2,35,33,17,33,50,62,2,4,140,254,146,254,73,191,2,151,120,
185,126,66,39,84,130,91,1,144,248,44,84,120,76,254,59,1,205,82,120,77,37,
2,73,253,183,5,129,55,104,150,94,67,130,108,78,16,253,161,3,236,64,94,63,
31,253,248,41,72,98,0,0,0,0,1,0,93,255,236,4,248,5,150,0,63,0,226,64,110,
150,62,1,68,62,1,166,59,1,134,54,1,132,49,1,151,40,1,169,33,1,11,33,27,33,
43,33,155,33,4,89,29,169,29,2,139,17,1,139,7,1,150,2,1,4,2,20,2,2,132,58,
1,96,54,1,105,21,1,118,17,1,42,90,41,41,0,90,64,176,19,1,19,65,128,9,90,8,
64,16,19,72,8,8,52,90,0,31,16,31,64,31,3,7,31,19,16,19,22,72,120,19,136,19,
152,19,3,59,19,1,52,184,255,240,64,47,19,22,72,119,52,135,52,151,52,3,58,
52,1,19,52,5,47,95,111,42,1,89,42,1,75,42,1,6,42,1,42,36,4,14,95,96,9,1,82,
9,1,68,9,1,9,5,19,0,63,51,93,93,93,237,63,51,93,93,93,93,237,18,57,57,93,
93,43,93,93,43,1,47,94,93,237,51,47,43,237,26,16,220,93,26,237,50,47,237,
49,48,0,93,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93,93,1,20,14,2,35,
32,36,39,55,30,3,51,50,62,2,53,52,46,2,39,46,5,53,52,62,2,51,50,30,2,23,7,
46,3,35,34,14,2,21,20,30,2,23,30,5,4,248,69,144,219,150,254,249,254,218,40,
185,14,58,99,146,102,85,142,102,57,63,114,158,96,59,119,109,96,70,40,81,144,
196,114,131,186,128,77,23,188,14,53,86,123,83,98,133,81,35,63,108,142,80,
65,129,118,103,76,43,1,133,89,150,109,61,184,174,37,55,90,65,36,29,60,95,
66,69,86,56,38,22,13,31,43,58,81,107,70,100,143,92,42,41,82,121,80,33,51,
80,54,28,35,60,81,47,63,81,54,36,18,15,31,43,58,84,114,0,0,0,1,0,46,0,0,4,
180,5,129,0,7,1,212,64,255,9,9,1,201,9,217,9,249,9,3,187,9,1,73,9,89,9,121,
9,137,9,4,59,9,1,9,9,25,9,2,246,9,1,153,9,201,9,2,139,9,1,9,9,25,9,73,9,105,
9,4,199,217,9,233,9,2,203,9,1,182,9,1,41,9,89,9,105,9,137,9,153,9,5,27,9,
1,6,9,1,25,9,41,9,89,9,121,9,153,9,169,9,217,9,7,233,9,249,9,2,219,9,1,169,
9,1,150,9,1,57,9,105,9,2,45,9,1,1,11,9,1,151,107,9,123,9,139,9,171,9,187,
9,235,9,251,9,7,84,9,1,11,9,43,9,59,9,3,187,9,251,9,2,164,9,1,59,9,75,9,123,
9,3,36,9,1,139,9,155,9,187,9,203,9,251,9,5,127,9,1,2,79,9,95,9,2,48,9,1,15,
9,1,103,207,9,223,9,2,176,9,1,15,9,79,9,95,9,143,9,4,240,9,1,159,9,175,9,
207,9,223,9,4,112,9,1,95,9,1,64,9,1,31,9,1,31,9,63,9,95,9,111,9,159,9,223,
9,239,9,7,0,9,1,55,239,9,1,128,64,93,9,144,9,208,9,3,111,9,1,80,9,1,47,9,
1,0,9,1,208,9,1,175,9,1,144,9,1,111,9,127,9,2,16,9,32,9,64,9,80,9,4,255,9,
1,224,9,1,191,9,1,64,9,96,9,144,9,160,9,4,63,9,1,32,9,1,15,9,1,7,3,5,4,14,
1,90,2,64,2,7,14,112,7,160,7,176,7,3,32,7,128,7,2,7,184,255,192,64,15,23,
28,72,7,32,2,1,2,0,4,95,5,3,1,18,0,63,63,237,50,1,47,93,204,43,93,113,43,
1,26,24,16,77,253,228,50,95,94,93,93,93,93,93,93,93,113,113,113,113,113,114,
114,114,114,114,114,94,93,93,113,113,113,113,113,113,114,114,114,94,93,93,
93,95,93,93,113,113,113,113,114,114,114,94,93,95,93,93,93,93,93,93,113,114,
114,114,114,114,114,94,93,93,93,93,113,113,113,113,113,114,49,48,1,17,35,
17,33,53,33,21,2,208,190,254,28,4,134,4,229,251,27,4,229,156,156,0,0,0,0,
1,0,158,255,236,5,41,5,129,0,25,0,136,64,61,89,23,105,23,2,89,3,105,3,2,89,
2,105,2,2,69,16,1,69,10,1,21,90,64,64,18,80,18,160,18,3,48,18,144,18,240,
18,3,143,18,159,18,175,18,3,18,27,128,64,27,1,64,27,192,27,208,27,224,27,
4,27,184,255,192,64,36,14,17,72,8,90,79,5,95,5,111,5,3,143,5,159,5,2,207,
5,1,0,5,16,5,64,5,3,7,5,19,6,3,13,95,0,19,0,63,237,63,51,1,47,94,93,93,113,
114,237,43,93,113,26,16,220,93,113,114,26,237,49,48,0,93,93,93,93,93,5,34,
46,2,53,17,51,17,20,30,2,51,50,62,2,53,17,51,17,20,14,2,2,219,116,208,157,
92,191,57,102,139,83,82,146,110,63,190,93,160,215,20,62,131,201,138,3,129,
252,143,107,149,94,43,44,96,155,111,3,100,252,145,141,207,136,66,0,1,0,9,
0,0,5,77,5,129,0,16,0,235,64,181,74,14,90,14,106,14,3,69,4,85,4,101,4,3,140,
15,1,58,15,90,15,106,15,122,15,4,131,3,1,53,3,85,3,101,3,117,3,4,116,0,132,
0,2,9,0,1,140,1,1,123,1,1,6,1,1,26,1,42,1,58,1,3,9,1,1,233,1,249,1,2,21,0,
37,0,53,0,3,6,0,1,230,0,246,0,2,1,0,9,9,2,26,15,42,15,58,15,3,3,8,15,1,232,
15,248,15,2,15,52,16,84,16,2,32,16,1,2,16,16,1,48,16,96,16,144,16,192,16,
240,16,5,16,21,3,37,3,53,3,3,6,3,1,230,3,246,3,2,3,175,2,191,2,2,2,32,18,
80,18,2,48,18,96,18,144,18,192,18,240,18,5,47,18,1,15,2,3,121,9,1,9,1,18,
0,63,51,93,63,51,1,93,93,113,47,93,51,93,113,113,47,93,113,95,113,113,51,
93,113,95,113,18,57,61,47,51,51,93,113,113,93,113,113,49,48,93,93,93,93,93,
93,93,93,93,93,93,33,35,1,51,1,30,1,23,22,23,54,55,62,1,55,1,51,3,14,198,
253,193,201,1,134,15,30,12,14,13,12,14,12,29,17,1,132,201,5,129,252,32,45,
89,35,41,39,37,41,35,88,48,3,224,0,0,1,0,9,0,0,7,134,5,129,0,46,4,87,64,73,
121,44,1,117,17,1,123,2,139,2,2,73,2,1,116,12,132,12,2,70,12,1,122,30,138,
30,2,73,30,89,30,105,30,3,117,31,133,31,2,71,31,87,31,103,31,3,142,45,1,91,
45,107,45,123,45,3,129,16,1,100,16,116,16,2,85,16,1,1,32,13,17,72,13,184,
255,224,64,255,13,17,72,131,0,1,117,0,1,68,0,84,0,100,0,3,54,0,1,140,14,1,
122,14,1,75,14,91,14,107,14,3,14,16,9,12,72,26,14,42,14,58,14,3,9,14,1,233,
14,249,14,2,21,13,37,13,53,13,3,6,13,1,230,13,246,13,2,14,13,22,26,30,42,
30,58,30,3,9,30,1,233,30,249,30,2,21,31,37,31,53,31,3,6,31,1,230,31,246,31,
2,31,30,7,26,1,42,1,58,1,3,9,1,1,233,1,249,1,2,21,0,37,0,53,0,3,6,0,1,230,
0,246,0,2,1,0,39,123,39,1,116,22,132,22,2,22,7,39,39,7,22,3,15,26,45,42,45,
58,45,3,3,8,45,1,232,45,248,45,2,45,219,46,1,207,46,1,187,46,1,175,46,1,155,
46,1,143,46,1,123,46,1,111,46,1,91,46,1,79,46,1,2,79,46,143,46,175,46,3,46,
64,25,28,72,32,46,48,46,2,15,46,1,9,46,5,16,1,229,16,245,16,2,182,16,198,
16,214,16,3,3,16,8,15,56,15,120,15,136,15,152,15,184,15,6,12,15,64,64,255,
25,38,72,15,119,48,151,48,215,48,3,54,48,70,48,86,48,3,23,48,39,48,2,6,48,
1,55,48,103,48,119,48,167,48,183,48,199,48,231,48,247,48,8,38,48,1,7,48,23,
48,2,201,199,48,215,48,231,48,3,120,48,152,48,168,48,184,48,4,105,48,1,40,
48,56,48,88,48,3,25,48,1,7,48,1,232,48,1,217,48,1,168,48,200,48,2,153,48,
1,138,48,1,88,48,104,48,2,73,48,1,55,48,1,8,48,24,48,2,231,48,1,200,48,1,
167,48,1,8,48,24,48,40,48,72,48,136,48,5,153,199,48,1,88,48,104,48,136,48,
152,48,168,48,5,73,48,1,40,48,1,9,48,25,48,2,216,48,232,48,2,203,48,1,154,
48,170,48,186,48,3,139,48,1,48,192,124,127,72,57,48,1,42,48,1,25,48,1,10,
48,1,249,48,1,234,48,1,217,48,1,202,48,1,184,48,1,137,48,153,48,169,48,3,
120,48,1,105,48,1,58,48,74,48,90,48,3,41,48,1,26,48,1,12,48,1,104,253,48,
1,236,48,1,221,48,1,204,48,1,64,255,189,48,1,171,48,1,156,48,1,139,48,1,124,
48,1,107,48,1,92,48,1,75,48,1,60,48,1,43,48,1,28,48,1,11,48,1,252,48,1,235,
48,1,220,48,1,203,48,1,188,48,1,171,48,1,156,48,1,0,141,48,1,127,48,1,109,
48,1,95,48,1,77,48,1,47,48,63,48,2,29,48,1,15,48,1,253,48,1,239,48,1,221,
48,1,207,48,1,189,48,1,175,48,1,157,48,1,143,48,1,109,48,125,48,2,91,48,1,
77,48,1,59,48,1,45,48,1,27,48,1,13,48,1,56,251,48,1,237,48,1,219,48,1,205,
48,1,187,48,1,173,48,1,155,48,1,141,48,1,123,48,1,109,48,1,75,48,91,48,2,
57,48,1,43,48,1,25,48,1,11,48,1,249,48,1,235,48,1,221,48,1,203,48,1,189,48,
1,171,48,1,157,48,1,139,48,1,125,48,1,107,48,1,93,48,1,75,48,1,61,48,1,1,
43,48,1,31,48,1,2,95,48,127,48,159,48,191,48,223,48,255,48,6,0,48,1,8,68,
7,84,7,2,7,30,45,3,15,3,39,64,15,22,123,22,139,22,2,22,32,9,14,72,22,1,14,
18,0,63,51,51,43,93,17,51,63,23,51,93,1,94,93,93,95,113,113,95,113,113,113,
113,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114,
114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,113,
113,113,113,113,113,113,113,95,113,113,113,113,113,113,113,114,114,114,114,
114,114,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,
93,93,93,93,113,113,113,113,43,113,113,113,113,114,114,114,114,114,94,93,
93,93,93,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,94,93,
93,93,113,113,113,113,47,43,94,93,51,95,93,93,113,47,94,93,93,43,93,95,113,
113,113,113,113,113,113,113,113,113,51,93,113,95,113,18,23,57,61,47,47,47,
93,93,17,51,51,93,113,113,93,113,113,17,51,51,93,113,113,93,113,113,17,51,
51,93,113,113,93,113,113,49,48,43,93,93,93,93,93,93,93,43,43,93,93,93,93,
93,93,93,93,93,93,93,93,93,93,93,33,35,3,46,1,39,38,39,6,7,14,1,7,3,35,1,
51,19,30,1,23,22,23,54,55,62,3,55,19,51,19,30,3,23,22,23,50,62,2,55,19,51,
5,231,228,244,11,25,10,12,12,13,12,11,24,11,246,228,254,97,199,253,17,31,
11,13,11,15,16,7,14,15,15,6,245,183,245,6,15,15,14,7,16,15,1,16,24,29,15,
249,199,3,127,38,104,47,55,57,58,55,48,102,38,252,129,5,129,252,129,63,124,
49,58,52,69,67,28,62,60,55,23,3,109,252,147,23,55,59,62,28,67,70,69,104,121,
52,3,127,0,0,1,0,46,0,0,5,43,5,129,0,11,2,119,64,255,92,4,1,73,4,1,59,4,1,
38,11,1,75,0,91,0,2,41,0,57,0,2,68,2,84,2,2,38,2,54,2,2,9,3,25,3,41,3,3,81,
10,1,69,10,1,51,10,1,6,10,22,10,2,93,8,1,76,8,1,43,8,59,8,2,9,8,25,8,2,82,
6,1,67,6,1,3,38,6,54,6,2,7,6,23,6,2,12,219,13,1,196,13,1,171,13,1,144,13,
1,132,13,1,96,13,1,84,13,1,48,13,1,36,13,1,0,13,1,244,13,1,208,13,1,196,13,
1,160,13,1,148,13,1,112,13,1,100,13,1,64,13,1,52,13,1,16,13,1,4,13,1,204,
224,13,1,212,13,1,176,13,1,164,13,1,128,13,1,116,13,1,80,13,1,68,13,1,32,
13,1,20,13,1,36,13,84,13,132,13,180,13,228,13,5,4,13,52,13,100,13,148,13,
196,13,244,13,6,156,52,13,100,13,148,13,196,13,244,13,5,11,13,1,27,13,75,
13,123,13,171,13,219,13,5,139,13,187,13,235,13,3,4,13,20,13,52,13,68,13,4,
106,84,13,100,13,132,13,148,64,156,13,180,13,196,13,228,13,244,13,8,59,13,
1,36,13,1,11,13,1,244,13,1,219,13,1,196,13,1,171,13,1,148,13,1,123,13,1,100,
13,1,48,13,1,36,13,1,0,13,1,244,13,1,208,13,1,196,13,1,160,13,1,148,13,1,
112,13,1,100,13,1,64,13,1,52,13,1,16,13,1,4,13,1,57,224,13,1,212,13,1,176,
13,1,164,13,1,128,13,1,20,13,68,13,116,13,3,36,13,84,13,132,13,180,13,228,
13,5,84,13,100,13,148,13,244,13,4,64,13,1,2,0,13,48,13,2,6,8,10,7,1,4,4,9,
5,9,5,9,3,0,11,16,192,11,240,11,2,11,184,255,192,64,16,26,30,72,175,11,1,
144,11,1,127,11,1,0,11,1,11,184,255,192,181,11,15,72,11,2,3,184,255,240,64,
41,16,3,32,3,2,224,3,240,3,2,31,3,175,3,191,3,207,3,4,3,114,7,1,52,7,68,7,
84,7,3,4,7,10,1,4,8,5,3,3,0,18,0,63,50,63,51,23,57,93,93,1,47,93,93,113,56,
51,47,43,93,93,93,93,43,93,56,51,18,57,57,47,47,18,23,57,50,51,93,95,93,93,
113,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,93,93,93,113,113,113,
113,113,113,113,113,113,113,114,114,114,114,94,93,93,113,114,114,94,93,113,
114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,93,93,
93,113,113,113,113,113,113,113,113,113,113,49,48,94,93,93,95,93,93,93,93,
93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,33,9,1,35,9,1,51,9,1,51,9,1,
4,88,254,89,254,80,211,2,24,254,17,211,1,136,1,125,211,254,30,2,11,2,104,
253,152,2,220,2,165,253,215,2,41,253,98,253,29,0,0,0,1,0,45,0,0,5,41,5,129,
0,8,2,83,64,20,30,7,1,12,7,1,7,24,12,15,72,17,5,1,3,5,1,16,3,5,184,255,232,
64,255,12,15,72,5,4,14,2,1,8,14,7,105,8,169,8,2,6,8,22,8,54,8,70,8,4,14,8,
6,1,90,38,2,86,2,150,2,3,118,2,230,2,2,57,2,73,2,2,6,2,1,16,2,153,10,169,
10,201,10,3,86,10,1,9,10,57,10,2,25,10,89,10,137,10,249,10,4,6,10,1,202,249,
10,1,230,10,1,9,10,25,10,185,10,201,10,4,198,10,1,89,10,121,10,169,10,3,54,
10,1,41,10,57,10,185,10,233,10,4,11,10,1,153,249,10,1,198,10,214,10,2,178,
10,1,164,10,1,150,10,1,130,10,1,116,10,1,86,10,102,10,2,66,10,1,36,10,52,
10,2,18,10,1,4,10,1,244,10,1,230,10,1,196,10,212,10,2,166,10,182,10,2,146,
10,1,132,10,1,118,10,1,98,10,1,84,10,1,54,10,70,10,2,36,10,1,22,10,1,4,10,
1,242,10,1,1,208,10,224,10,2,196,10,1,160,10,176,10,2,148,10,1,112,10,1,100,
10,1,64,10,1,20,10,36,10,52,10,3,0,10,1,105,228,10,244,10,2,208,10,64,182,
1,164,10,180,10,196,10,3,128,10,144,10,2,116,10,1,80,10,96,10,2,68,10,1,32,
10,1,4,10,20,10,2,244,10,1,224,10,1,196,10,212,10,2,176,10,1,84,10,100,10,
116,10,148,10,164,10,5,48,10,64,10,2,36,10,1,0,10,1,196,10,244,10,2,144,10,
1,4,10,20,10,36,10,68,10,84,10,116,10,132,10,7,57,224,10,1,132,10,164,10,
212,10,3,112,10,1,4,10,36,10,52,10,84,10,100,10,5,228,10,244,10,2,192,10,
1,180,10,1,144,10,1,4,10,20,10,52,10,84,10,132,10,5,212,10,228,10,2,187,10,
1,164,10,1,112,10,1,2,48,10,96,10,2,15,10,47,10,2,0,3,59,3,75,3,123,3,3,3,
1,8,4,3,1,18,0,63,63,51,18,57,93,17,51,1,93,93,95,93,93,93,93,113,113,113,
113,113,114,114,114,114,94,93,93,93,113,113,113,113,113,113,113,113,114,114,
114,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,93,95,93,113,113,113,
113,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114,
114,114,114,94,93,93,113,113,113,114,114,114,94,93,93,113,113,113,47,94,93,
93,93,113,253,57,206,94,93,93,50,43,1,24,16,77,230,50,49,48,43,95,94,93,93,
43,93,93,1,17,35,17,1,51,9,1,51,3,9,190,253,226,210,1,173,1,171,210,2,72,
253,184,2,72,3,57,253,97,2,159,0,0,0,0,1,0,65,0,0,4,163,5,129,0,9,0,122,64,
35,100,4,116,4,132,4,3,109,3,125,3,141,3,3,91,3,1,41,3,57,3,73,3,3,114,8,
130,8,2,84,8,100,8,2,8,184,255,240,64,9,10,13,72,9,3,16,7,1,7,184,255,192,
64,18,12,17,72,7,8,4,15,2,31,2,2,2,64,12,15,72,2,11,184,255,192,64,14,13,
17,72,7,3,4,95,5,3,2,8,95,1,18,0,63,237,50,63,237,50,50,1,43,47,43,93,51,
51,47,43,93,51,51,49,48,43,93,93,93,93,93,93,41,1,53,1,33,53,33,21,1,33,4,
163,251,158,3,90,252,239,3,234,252,166,3,137,143,4,86,156,139,251,166,0,0,
1,0,146,254,87,2,41,5,204,0,7,0,49,64,30,7,48,2,1,224,2,1,2,4,241,63,1,1,
143,1,191,1,2,32,1,1,1,4,245,1,0,5,245,0,27,0,63,237,63,237,1,47,93,93,113,
237,205,93,113,50,49,48,19,17,33,21,35,17,51,21,146,1,151,233,233,254,87,
7,117,129,249,141,129,0,1,0,0,255,236,2,57,5,204,0,3,0,71,64,40,120,1,136,
1,2,0,24,13,17,72,9,3,25,3,73,3,3,70,2,1,10,2,26,2,42,2,3,3,16,0,3,16,3,32,
3,128,3,4,3,1,184,255,240,183,143,1,1,1,1,0,0,19,0,63,63,1,47,93,56,205,93,
56,49,48,93,93,93,43,93,5,1,51,1,1,151,254,105,158,1,155,20,5,224,250,32,
0,0,0,0,1,0,16,254,87,1,167,5,204,0,7,0,49,64,31,4,63,0,1,239,0,1,0,7,241,
64,2,80,2,2,192,2,208,2,224,2,3,2,4,245,5,0,1,245,0,27,0,63,237,63,237,1,
47,93,113,253,205,93,113,50,49,48,19,53,51,17,35,53,33,17,16,233,233,1,151,
254,87,129,6,115,129,248,139,0,1,0,10,2,161,3,183,5,129,0,6,2,243,181,0,24,
18,22,72,2,184,255,232,179,18,22,72,5,184,255,232,64,47,18,22,72,118,5,134,
5,2,4,24,18,22,72,121,4,137,4,2,3,54,6,70,6,2,102,6,118,6,134,6,230,6,4,6,
6,22,6,38,6,70,6,86,6,102,6,6,6,184,255,192,179,48,65,72,6,184,255,192,64,
57,18,22,72,6,5,4,57,3,73,3,2,105,3,121,3,137,3,3,9,3,25,3,41,3,89,3,105,
3,5,9,3,64,18,22,72,3,6,1,22,1,134,1,3,57,38,1,54,1,70,1,246,1,4,230,1,1,
1,184,255,192,182,60,63,72,153,1,1,1,184,255,224,64,255,30,33,72,56,1,72,
1,2,39,1,1,22,1,1,183,1,199,1,2,6,1,70,1,86,1,102,1,150,1,166,1,6,9,1,6,8,
1,246,8,1,164,8,1,121,8,1,6,8,1,246,8,1,201,8,217,8,2,187,8,1,9,8,25,8,41,
8,169,8,4,201,201,8,217,8,2,54,8,118,8,134,8,150,8,4,153,8,233,8,2,102,8,
118,8,2,9,8,25,8,57,8,3,198,8,1,139,8,1,57,8,73,8,121,8,3,43,8,1,4,8,1,152,
228,8,244,8,2,208,8,1,162,8,178,8,194,8,3,132,8,148,8,2,82,8,98,8,114,8,3,
64,8,1,50,8,1,36,8,1,2,8,18,8,2,228,8,244,8,2,214,8,1,196,8,1,146,8,162,8,
178,8,3,116,8,132,8,2,102,8,1,50,8,66,8,82,8,3,20,8,36,8,2,6,8,1,242,8,1,
212,8,228,8,2,166,8,182,8,2,130,8,146,8,2,100,8,116,8,2,86,8,1,52,8,68,8,
2,32,8,1,4,8,20,8,2,104,230,8,246,8,2,192,8,1,146,8,162,8,64,24,178,8,3,116,
8,132,8,2,82,8,98,8,2,52,8,68,8,2,22,8,38,8,2,8,184,255,128,64,24,85,88,72,
182,8,198,8,2,132,8,148,8,164,8,3,102,8,118,8,2,68,8,1,8,184,255,192,182,
72,75,72,228,8,1,8,184,255,192,64,12,66,69,72,148,8,1,114,8,130,8,2,8,184,
255,128,64,120,59,62,72,18,8,34,8,2,1,0,8,1,56,240,8,1,212,8,228,8,2,176,
8,1,100,8,132,8,148,8,164,8,4,64,8,80,8,2,36,8,52,8,2,228,8,244,8,2,171,8,
187,8,2,116,8,132,8,148,8,3,75,8,1,52,8,1,11,8,1,235,8,251,8,2,208,8,1,196,
8,1,176,8,1,132,8,148,8,164,8,3,96,8,112,8,2,2,0,8,16,8,64,8,80,8,4,8,34,
1,1,3,1,19,1,2,1,4,3,3,3,0,0,47,50,47,63,51,93,93,1,94,93,95,93,93,93,93,
93,93,113,113,113,113,113,113,114,114,114,114,114,114,94,93,95,93,43,93,93,
43,93,43,113,113,113,113,43,114,114,114,114,114,114,114,94,93,93,93,93,93,
93,93,93,93,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,
114,114,94,93,93,93,93,93,113,113,113,114,114,94,93,93,93,93,113,113,113,
113,114,25,47,94,93,93,113,113,113,43,113,43,113,114,94,93,205,43,94,93,113,
114,51,51,205,43,43,93,113,114,49,48,95,93,43,93,43,43,43,9,2,35,1,51,1,3,
19,254,203,254,206,162,1,112,203,1,114,2,161,2,121,253,135,2,224,253,32,0,
0,0,0,1,255,225,254,105,4,138,254,235,0,3,0,35,64,23,16,2,96,2,128,2,160,
2,208,2,5,96,2,128,2,240,2,3,2,0,0,186,1,0,47,237,1,47,47,93,113,49,48,3,
53,33,21,31,4,169,254,105,130,130,0,1,0,106,4,177,2,18,5,228,0,5,0,47,64,
31,117,3,133,3,2,64,4,128,4,2,4,64,16,1,1,1,2,149,128,15,0,47,0,63,0,127,
0,239,0,5,0,0,47,93,26,237,1,47,93,26,205,93,49,48,93,9,1,53,51,19,21,1,180,
254,182,207,217,4,177,1,22,29,254,225,20,0,0,0,0,2,0,87,255,236,4,115,4,78,
0,50,0,65,0,161,64,50,121,61,137,61,2,121,12,137,12,2,2,40,9,13,72,10,5,26,
5,2,43,24,9,17,72,5,28,21,28,2,37,37,30,70,64,46,9,111,56,127,56,143,56,3,
56,67,128,20,71,21,184,255,192,64,20,21,28,72,21,21,63,71,31,3,1,3,48,67,
192,67,2,160,67,1,67,184,255,192,64,32,30,35,72,33,81,40,22,57,81,9,9,26,
51,95,20,1,47,20,143,20,2,20,20,15,80,26,16,46,51,80,0,22,0,63,237,50,63,
237,51,47,93,113,17,18,57,47,237,63,237,1,43,93,113,47,93,237,51,47,43,237,
26,16,220,93,50,50,26,237,50,47,49,48,93,43,93,43,0,93,93,5,34,38,53,52,62,
2,63,1,53,52,46,2,35,34,14,2,7,39,62,3,51,50,22,21,17,20,22,51,50,54,55,21,
14,1,35,34,46,2,39,35,14,3,39,50,62,2,61,1,7,14,3,21,20,22,1,158,163,164,
81,131,168,87,243,28,58,87,59,52,84,62,38,6,188,10,56,103,155,110,204,206,
42,59,15,30,14,34,67,38,51,73,46,24,3,6,29,69,92,117,35,86,129,85,42,197,
66,119,90,53,95,20,172,150,107,137,78,30,2,4,59,67,94,58,27,15,39,67,51,17,
64,107,78,43,187,177,254,46,80,81,4,3,112,8,8,27,55,81,54,52,84,59,32,135,
63,98,116,53,89,4,1,17,50,90,73,88,96,0,0,2,0,132,255,236,4,29,5,204,0,31,
0,51,0,146,64,9,105,49,121,49,2,121,35,1,31,184,255,224,64,24,7,10,72,134,
30,150,30,2,73,27,89,27,2,73,4,89,4,2,134,1,150,1,2,1,184,255,224,64,63,7,
10,72,0,71,64,160,32,1,32,53,128,42,5,19,70,0,18,16,18,48,18,240,18,4,8,18,
176,53,1,63,53,1,112,53,144,53,2,31,53,1,255,53,1,192,53,224,53,2,25,37,80,
29,16,18,0,12,21,5,47,80,2,22,0,63,237,50,63,63,63,237,50,1,93,93,113,113,
114,114,47,94,93,237,50,50,26,16,220,93,26,237,49,48,43,93,93,93,93,43,93,
93,1,16,33,34,38,39,35,20,14,2,7,35,62,3,53,17,51,17,20,6,7,6,7,51,62,1,51,
50,18,3,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,4,29,254,114,123,163,51,
2,3,3,3,1,174,1,2,2,1,180,1,1,1,1,4,50,165,122,205,193,189,28,62,96,69,71,
109,73,38,38,73,108,70,66,96,64,31,2,34,253,202,89,99,26,56,48,34,4,9,43,
60,72,39,4,237,254,89,30,55,21,25,22,104,90,254,236,254,226,112,160,103,48,
46,102,166,120,116,158,99,43,46,102,163,0,0,0,1,0,87,255,236,3,202,4,78,0,
39,0,117,64,81,121,16,1,121,23,1,99,37,1,99,3,1,32,70,31,31,8,70,160,9,1,
9,9,41,0,71,31,19,1,19,35,80,26,31,32,127,32,143,32,223,32,4,32,32,26,16,
32,8,112,8,128,8,208,8,224,8,5,0,8,16,8,96,8,112,8,128,8,192,8,208,8,7,8,
8,5,80,14,22,31,41,1,93,0,63,237,51,47,93,113,63,51,47,93,16,237,1,47,93,
237,17,51,125,47,113,24,237,51,47,237,49,48,93,93,93,93,1,20,30,2,51,50,54,
55,23,14,3,35,34,46,2,53,52,62,4,51,50,30,2,23,7,46,1,35,34,14,2,1,19,27,
64,105,77,96,129,15,182,9,60,103,148,97,127,178,111,50,36,65,88,103,114,58,
91,142,103,64,13,185,14,114,105,77,103,64,27,2,34,93,156,113,62,104,108,12,
67,124,94,57,86,151,205,120,109,167,125,85,51,23,50,87,118,68,14,90,106,51,
103,156,0,0,0,0,2,0,86,255,236,3,239,5,204,0,31,0,51,0,123,64,87,85,34,101,
34,2,90,50,106,50,2,57,1,73,1,2,54,10,70,10,2,9,4,25,4,121,4,137,4,4,6,7,
22,7,118,7,134,7,4,19,70,64,42,0,143,18,239,18,2,18,53,128,32,71,31,6,1,6,
112,53,144,53,2,31,53,1,255,53,1,192,53,224,53,2,25,21,18,0,11,47,80,8,16,
0,37,80,3,22,0,63,237,50,63,237,50,63,63,1,93,93,113,113,47,93,237,26,16,
220,93,50,50,26,237,49,48,0,93,93,93,93,93,93,37,14,1,35,34,2,17,16,33,50,
22,23,51,52,46,1,52,53,17,51,17,20,30,2,23,35,46,3,53,1,20,30,2,51,50,62,
2,53,52,46,2,35,34,14,2,3,53,50,165,122,205,193,1,142,123,164,50,2,1,1,180,
1,2,2,1,172,2,3,3,2,253,218,28,62,96,69,71,109,73,38,38,74,107,70,66,96,64,
31,174,104,90,1,20,1,24,2,54,90,98,10,43,47,42,9,1,163,251,19,39,72,60,43,
9,10,37,48,53,26,1,112,112,160,103,48,46,103,166,120,115,159,98,43,46,102,
163,0,0,0,2,0,87,255,236,4,24,4,78,0,28,0,37,0,107,64,46,90,35,106,35,2,90,
30,106,30,2,85,3,101,3,2,8,73,9,9,27,71,64,31,29,1,144,29,1,29,39,128,37,
0,71,31,17,1,17,48,39,192,39,208,39,3,39,184,255,192,64,19,30,35,72,8,8,5,
0,80,37,37,5,32,80,22,16,5,80,14,22,0,63,237,63,237,18,57,47,237,17,57,47,
1,43,113,47,93,237,50,26,16,220,93,113,26,237,50,47,237,49,48,93,0,93,93,
1,20,30,2,51,50,54,55,23,14,3,35,34,2,17,52,62,2,51,50,30,2,29,1,39,46,1,
35,34,14,2,7,1,20,35,73,114,80,117,141,25,158,17,61,102,153,108,240,251,76,
132,176,100,136,183,111,47,186,15,144,135,45,99,84,58,4,1,247,85,143,103,
57,94,72,45,45,91,73,47,1,30,1,26,152,211,132,59,88,155,210,122,24,138,171,
157,29,74,127,98,0,0,0,1,0,29,0,0,2,60,5,202,0,27,0,161,64,11,3,10,19,10,
51,10,67,10,4,13,10,184,255,224,64,106,8,12,72,26,15,16,1,14,16,25,16,1,70,
5,0,2,1,18,2,31,29,47,29,79,29,95,29,127,29,143,29,159,29,7,15,29,63,29,127,
29,175,29,191,29,223,29,239,29,7,59,95,29,191,29,2,127,29,143,29,159,29,3,
29,64,86,100,72,29,64,39,44,72,32,29,48,29,96,29,3,175,29,223,29,239,29,3,
64,29,1,15,29,47,29,2,19,80,12,0,0,3,80,25,6,15,1,21,0,63,63,51,237,50,63,
237,1,93,93,93,113,43,43,113,114,94,93,113,47,94,93,51,237,50,50,47,94,93,
51,49,48,0,43,94,93,1,17,35,17,35,53,51,53,52,62,2,51,50,22,23,21,46,1,35,
34,14,2,29,1,51,21,1,105,180,152,152,22,59,102,81,32,69,26,17,45,18,40,51,
29,11,211,3,183,252,73,3,183,131,122,59,101,75,43,6,6,137,3,5,22,41,60,39,
97,131,0,2,0,86,254,87,3,239,4,75,0,49,0,69,0,217,64,72,122,49,138,49,2,118,
7,134,7,2,101,62,1,85,12,101,12,2,90,58,106,58,2,38,3,54,3,2,38,18,1,41,33,
1,9,23,25,23,121,23,137,23,4,6,29,22,29,118,29,134,29,4,9,47,70,64,50,34,
48,14,1,127,14,223,14,2,14,71,128,6,70,5,184,255,192,64,81,23,28,72,5,5,60,
71,15,26,1,10,26,32,71,64,71,2,207,71,1,0,71,32,71,144,71,176,71,4,80,223,
71,1,192,71,1,79,71,1,128,71,160,71,2,15,71,47,71,2,208,71,240,71,2,15,71,
1,8,41,15,34,55,80,31,16,15,65,80,21,22,9,80,53,6,1,38,6,1,6,0,27,0,63,50,
93,93,237,63,237,50,63,237,50,63,1,94,93,93,113,113,114,114,114,94,93,93,
113,47,94,93,237,51,47,43,237,26,16,220,93,113,50,50,26,237,49,48,0,94,93,
93,93,93,93,93,93,93,93,93,1,34,46,2,39,55,30,1,51,50,62,2,61,1,35,14,3,35,
34,46,2,53,52,62,2,51,50,22,23,51,52,62,2,55,51,14,3,21,17,20,6,19,52,46,
2,35,34,14,2,21,20,30,2,51,50,62,2,2,36,93,144,102,64,14,181,18,123,100,61,
100,70,38,2,20,59,85,112,72,103,147,93,43,43,97,155,111,115,169,46,2,3,3,
4,2,171,1,2,2,1,223,44,49,80,103,54,69,99,65,31,31,64,98,68,54,103,82,50,
254,87,38,71,98,60,26,75,81,34,75,120,86,174,41,75,58,35,69,138,205,135,130,
208,145,77,105,97,25,62,55,40,3,9,43,60,73,39,252,197,227,229,3,198,113,161,
102,48,48,103,161,112,117,159,98,42,46,100,158,0,0,0,0,1,0,142,0,0,3,238,
5,204,0,33,0,109,185,0,8,255,192,64,36,7,11,72,11,70,64,80,12,1,159,12,255,
12,2,12,35,128,0,35,192,35,208,35,224,35,4,192,35,1,15,35,1,128,35,1,35,184,
255,192,64,32,19,23,72,28,24,70,192,25,1,0,25,16,25,48,25,224,25,240,25,5,
8,25,26,0,25,11,21,0,18,80,5,16,0,63,237,50,63,51,63,1,47,94,93,113,237,50,
43,93,113,113,114,26,16,220,93,113,26,237,49,48,43,1,62,3,51,50,30,2,21,17,
35,17,52,46,2,35,34,14,2,21,17,35,17,51,17,20,14,2,7,1,61,30,70,84,100,62,
104,133,77,29,181,17,48,88,70,64,103,73,40,180,180,2,3,2,1,3,129,55,77,50,
23,56,101,140,84,253,47,2,174,69,104,69,35,46,84,120,75,253,130,5,204,254,
126,33,66,56,39,7,0,0,0,2,0,137,0,0,1,61,5,204,0,3,0,7,0,115,64,13,3,7,70,
0,0,4,16,4,48,4,3,8,4,184,255,192,64,42,21,24,72,4,4,8,9,255,9,1,224,9,1,
223,9,1,176,9,192,9,2,159,9,1,112,9,128,9,2,31,9,1,0,9,1,240,9,1,223,9,1,
9,184,255,192,64,17,34,37,72,79,9,1,31,9,1,5,15,4,21,0,83,1,0,0,63,237,63,
63,1,93,113,43,113,113,114,114,114,114,114,114,114,114,17,18,57,47,43,94,
93,51,237,50,49,48,19,53,51,21,3,17,51,17,137,180,180,180,5,32,172,172,250,
224,4,58,251,198,0,0,0,0,2,255,206,254,87,1,61,5,204,0,3,0,23,1,51,64,151,
7,24,12,16,72,7,40,8,11,72,3,4,70,21,12,12,0,0,21,16,21,32,21,64,21,4,7,21,
21,24,25,144,25,1,63,25,1,0,25,16,25,2,219,25,64,210,213,72,208,25,224,25,
2,143,25,1,64,25,80,25,2,15,25,31,25,95,25,111,25,255,25,5,144,25,160,25,
224,25,240,25,4,79,25,1,0,25,1,160,63,25,175,25,191,25,207,25,4,239,25,1,
176,25,192,25,208,25,3,63,25,79,25,95,25,3,32,25,1,143,25,191,25,207,25,3,
0,25,1,111,239,25,1,208,25,1,63,25,143,25,2,111,25,143,25,159,25,175,25,255,
25,5,25,184,255,192,64,84,79,82,72,223,25,1,144,25,160,25,176,25,3,47,25,
63,25,79,25,3,0,25,1,61,25,64,53,56,72,112,25,128,25,144,25,176,25,4,15,25,
31,25,2,255,25,1,25,64,35,38,72,144,25,1,79,25,1,255,25,1,112,25,128,25,192,
25,208,25,224,25,5,31,25,1,22,15,16,80,9,27,0,83,1,0,0,63,237,63,237,63,1,
93,93,93,113,113,43,113,114,114,43,94,93,93,93,93,43,113,114,114,114,94,93,
93,113,113,113,113,114,94,93,93,93,113,114,114,114,43,94,93,93,93,17,18,57,
47,94,93,51,51,47,16,237,50,49,48,0,43,43,19,53,51,21,17,20,14,2,35,34,38,
39,53,30,1,51,50,62,2,53,17,51,137,180,21,54,93,72,34,65,28,13,36,13,38,49,
28,10,180,5,32,172,172,250,90,62,106,78,45,4,5,139,2,4,20,43,67,46,4,165,
0,0,1,0,138,0,0,4,3,5,204,0,11,0,251,64,84,124,2,1,122,8,1,118,7,1,86,9,102,
9,134,9,150,9,4,139,0,155,0,2,89,0,105,0,121,0,3,116,10,132,10,148,10,3,68,
10,1,1,10,10,11,42,8,1,3,8,9,16,116,9,1,9,9,0,11,16,84,11,116,11,148,11,3,
116,11,148,11,180,11,212,11,228,11,244,11,6,48,11,1,2,11,184,255,192,64,105,
7,10,72,11,7,3,70,0,4,16,4,48,4,240,4,4,8,4,31,13,63,13,2,31,13,63,13,95,
13,255,13,4,15,13,31,13,63,13,95,13,127,13,5,57,13,64,83,86,72,96,13,128,
13,160,13,192,13,208,13,5,223,13,1,0,13,96,13,128,13,160,13,4,0,13,16,13,
48,13,64,13,128,13,160,13,192,13,224,13,240,13,9,7,2,1,7,10,4,8,15,5,0,4,
21,0,21,0,63,63,63,63,23,57,1,94,93,113,113,114,43,94,93,113,114,47,94,93,
237,50,47,43,95,93,93,113,56,51,51,47,93,56,51,95,114,17,57,17,51,49,48,93,
93,93,93,93,0,93,1,93,0,93,33,1,7,17,35,17,51,17,1,51,9,1,3,48,254,146,132,
180,180,1,219,211,254,73,1,206,1,238,109,254,127,5,204,252,97,2,13,254,47,
253,151,0,0,0,1,0,138,0,0,1,62,5,204,0,3,0,111,64,52,3,70,192,0,1,208,0,1,
0,0,16,0,48,0,240,0,4,8,0,224,5,240,5,2,223,5,1,176,5,192,5,2,159,5,1,112,
5,128,5,2,15,5,31,5,2,240,5,1,223,5,1,5,184,255,192,64,27,34,37,72,79,5,1,
255,5,1,112,5,128,5,192,5,208,5,224,5,5,31,5,1,1,0,0,21,0,63,63,1,93,93,93,
113,43,113,113,114,114,114,114,114,114,47,94,93,113,114,237,49,48,51,17,51,
17,138,180,5,204,250,52,0,0,1,0,136,0,0,6,35,4,78,0,59,2,194,185,0,42,255,
224,179,8,11,72,32,184,255,224,64,255,8,11,72,34,59,70,0,0,13,46,70,217,47,
249,47,2,182,47,1,41,47,89,47,137,47,3,6,47,1,166,47,182,47,214,47,230,47,
4,137,47,1,118,47,1,89,47,1,6,47,22,47,70,47,3,7,47,25,12,70,198,13,1,6,13,
22,13,54,13,230,13,246,13,5,8,13,251,61,1,201,61,217,61,233,61,3,187,61,1,
153,61,1,139,61,1,105,61,121,61,2,91,61,1,73,61,1,43,61,59,61,2,249,61,1,
235,61,1,217,61,1,203,61,1,189,61,1,153,61,1,139,61,1,105,61,1,91,61,1,41,
61,57,61,2,27,61,1,9,61,1,202,235,61,251,61,2,105,61,137,61,153,61,185,61,
201,61,5,91,61,1,77,61,1,41,61,57,61,2,27,61,1,249,61,1,235,61,1,201,61,217,
61,2,187,61,1,153,61,1,139,61,1,125,61,1,1,43,61,75,61,91,61,107,61,4,31,
61,1,4,61,1,203,61,235,61,2,175,61,191,61,2,139,61,1,127,61,1,43,61,75,61,
91,61,107,61,4,31,61,1,11,61,1,154,255,61,1,235,61,64,255,1,223,61,1,187,
61,1,175,61,1,139,61,155,61,2,127,61,1,91,61,107,61,2,79,61,1,59,61,1,36,
61,1,11,61,1,235,61,1,223,61,1,187,61,1,175,61,1,155,61,1,127,61,143,61,2,
100,61,1,75,61,1,63,61,1,43,61,1,15,61,31,61,2,235,61,1,223,61,1,123,61,139,
61,171,61,187,61,4,111,61,1,59,61,1,31,61,1,11,61,1,106,187,61,203,61,235,
61,3,175,61,1,139,61,1,127,61,1,91,61,1,79,61,1,27,61,1,251,61,1,223,61,239,
61,2,187,61,203,61,2,175,61,1,100,61,148,61,2,27,61,43,61,75,61,3,4,61,1,
244,61,1,139,61,171,61,219,61,3,127,61,1,107,61,1,52,61,1,27,61,1,15,61,1,
57,187,61,219,61,251,61,3,160,61,1,116,61,148,61,2,43,61,75,61,91,61,3,31,
61,1,11,61,1,203,61,235,61,251,61,3,164,61,1,27,61,75,61,91,61,123,61,4,244,
61,1,208,61,1,2,96,61,144,61,160,61,192,61,4,79,61,1,48,61,1,47,61,1,0,64,
19,61,1,8,34,53,80,40,16,25,6,80,31,16,19,15,47,13,0,21,0,63,50,50,63,63,
237,50,63,237,50,1,94,93,93,93,93,93,95,93,93,113,113,113,114,114,114,114,
114,114,94,93,93,93,93,93,93,93,113,113,113,113,113,113,113,114,114,114,114,
114,114,114,94,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,113,
113,114,114,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93,
93,113,113,113,95,113,113,113,113,113,113,113,114,114,114,114,114,114,94,
93,93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,47,
94,93,113,237,50,47,94,93,93,93,93,93,113,113,113,113,237,18,57,47,237,57,
49,48,0,43,43,33,17,52,46,2,35,34,14,2,21,17,35,17,52,46,2,39,51,30,3,21,
51,62,3,51,50,22,23,51,62,3,51,50,30,2,21,17,35,17,52,46,2,35,34,14,2,21,
17,3,0,20,47,76,55,57,92,65,35,179,1,2,2,1,170,1,2,3,2,3,24,56,75,97,64,123,
143,28,3,24,60,80,100,64,82,119,76,36,178,20,47,76,55,57,92,65,35,2,174,79,
106,65,27,45,85,125,81,253,141,3,83,34,75,67,48,7,5,44,57,59,20,47,76,53,
29,98,107,47,76,53,29,44,92,145,100,253,47,2,174,79,106,65,27,43,84,126,83,
253,141,0,1,0,136,0,0,3,238,4,78,0,37,0,109,185,0,34,255,224,64,36,7,11,72,
37,70,64,80,0,1,159,0,255,0,2,0,39,128,0,39,192,39,208,39,224,39,4,192,39,
1,15,39,1,128,39,1,39,184,255,192,64,32,19,23,72,25,12,70,192,13,1,0,13,16,
13,48,13,224,13,240,13,5,8,13,25,6,80,31,16,19,15,13,0,21,0,63,50,63,63,237,
50,1,47,94,93,113,237,50,43,93,113,113,114,26,16,220,93,113,26,237,49,48,
43,33,17,52,46,2,35,34,14,2,21,17,35,17,52,46,2,39,51,30,3,21,51,62,3,51,
50,30,2,21,17,3,57,23,52,85,63,64,103,73,40,180,1,2,2,1,170,1,2,3,2,3,26,
62,82,106,70,90,130,84,39,2,174,79,106,65,27,45,85,125,81,253,141,3,83,34,
75,67,48,7,5,44,57,59,20,47,76,53,29,44,92,145,100,253,47,0,0,0,0,2,0,86,
255,236,4,29,4,78,0,14,0,34,0,116,64,59,121,32,137,32,2,116,28,132,28,2,118,
22,134,22,2,121,18,137,18,2,150,12,166,12,2,4,12,20,12,2,11,9,27,9,2,11,5,
27,5,2,4,2,20,2,2,7,0,71,64,144,15,1,15,36,128,48,36,1,36,184,255,192,64,
20,30,35,72,223,36,1,25,71,31,8,1,8,20,80,10,16,30,80,3,22,0,63,237,63,237,
1,47,93,237,93,43,113,26,16,220,93,26,237,49,48,94,93,93,93,93,93,93,93,93,
93,1,16,2,35,34,46,2,53,16,33,50,30,2,7,52,46,2,35,34,14,2,21,20,30,2,51,
50,62,2,4,29,250,238,113,178,123,65,1,229,126,183,117,56,189,39,75,108,68,
69,111,78,41,44,77,105,62,69,112,78,42,2,30,254,228,254,234,68,140,211,143,
2,48,70,140,210,140,126,164,98,39,41,99,164,123,126,165,98,40,39,98,166,0,
0,2,0,132,254,87,4,29,4,77,0,38,0,58,0,148,64,16,105,56,121,56,2,105,42,121,
42,2,134,36,150,36,2,36,184,255,224,64,19,7,10,72,73,31,89,31,2,73,7,89,7,
2,134,3,150,3,2,3,184,255,224,64,63,7,10,72,0,71,64,160,39,1,39,60,128,49,
28,15,70,0,16,16,16,48,16,240,16,4,8,16,176,60,1,63,60,1,112,60,144,60,2,
31,60,1,255,60,1,192,60,224,60,2,28,44,80,34,16,22,15,15,27,8,54,80,5,22,
0,63,237,50,63,63,63,237,50,1,93,93,113,113,114,114,47,94,93,237,50,50,26,
16,220,93,26,237,49,48,43,93,93,93,43,93,93,93,1,20,14,2,35,34,38,39,35,30,
3,21,17,35,17,52,46,2,39,51,30,3,21,51,62,3,51,50,30,2,7,52,46,2,35,34,14,
2,21,20,30,2,51,50,62,2,4,29,40,93,153,112,116,174,46,5,1,1,1,1,180,1,2,2,
1,174,1,3,3,3,4,25,64,82,101,63,112,153,93,40,189,24,59,98,74,60,106,79,46,
38,73,108,70,75,99,59,24,2,34,123,208,150,85,88,100,2,32,48,59,29,254,89,
5,6,39,72,59,42,9,3,36,51,58,26,52,73,47,21,80,145,205,129,100,156,108,56,
34,96,169,135,115,159,98,43,58,110,159,0,0,2,0,86,254,87,3,240,4,78,0,34,
0,54,0,165,64,119,85,47,101,47,2,90,43,106,43,2,57,32,73,32,2,54,9,70,9,2,
9,1,25,1,121,1,137,1,4,6,5,22,5,118,5,134,5,4,9,22,70,64,35,11,127,23,223,
23,2,23,56,128,45,71,15,3,1,10,3,32,56,64,56,2,207,56,1,0,56,32,56,144,56,
176,56,4,80,223,56,1,192,56,1,79,56,1,128,56,160,56,2,15,56,47,56,2,208,56,
240,56,2,15,56,1,8,22,27,17,16,11,40,80,6,16,29,50,80,0,22,0,63,237,50,63,
237,50,63,63,1,94,93,93,113,113,114,114,114,94,93,93,113,47,94,93,237,26,
16,220,93,50,50,26,237,49,48,0,94,93,93,93,93,93,93,5,34,2,17,16,18,51,50,
30,2,23,51,52,62,2,55,51,14,1,21,17,35,17,52,54,55,54,55,35,14,3,1,52,46,
2,35,34,14,2,21,20,30,2,51,50,62,2,1,228,206,192,197,201,67,103,81,61,25,
2,3,3,4,2,173,2,5,180,1,1,1,1,2,26,63,82,103,1,16,41,75,107,66,69,98,61,29,
27,61,97,70,60,106,79,46,20,1,22,1,22,1,26,1,28,24,47,70,47,25,61,54,39,3,
17,144,134,251,54,1,183,26,56,25,28,29,51,75,49,23,2,62,118,160,96,41,51,
105,161,110,108,160,104,51,37,97,169,0,0,0,1,0,136,0,0,2,136,4,78,0,31,0,
62,64,40,16,21,48,21,2,21,21,33,12,31,70,192,0,1,0,0,16,0,48,0,224,0,240,
0,5,8,0,25,40,19,22,72,25,12,18,16,7,15,0,21,0,63,63,63,51,205,43,1,47,94,
93,113,237,50,17,51,47,93,49,48,51,17,52,46,2,39,51,30,3,21,51,62,3,51,50,
22,23,21,46,1,35,34,14,2,21,17,142,1,2,2,1,170,1,3,3,1,4,19,43,58,80,57,22,
40,11,18,48,30,62,87,55,26,3,62,34,71,66,58,23,23,59,62,57,20,62,91,59,29,
7,3,165,5,5,56,99,137,81,253,204,0,0,1,0,57,255,236,3,182,4,75,0,55,0,189,
64,85,116,46,132,46,2,111,21,127,21,143,21,3,107,22,1,37,54,1,42,27,1,21,
52,1,5,2,21,2,2,11,30,27,30,2,36,73,35,35,0,72,64,32,19,48,19,2,144,19,160,
19,176,19,3,19,57,128,11,73,10,64,25,30,72,10,10,44,72,79,29,95,29,2,32,29,
1,29,96,57,192,57,2,128,57,1,57,184,255,192,64,42,39,42,72,63,57,1,16,57,
1,19,44,5,41,80,32,0,36,1,144,36,240,36,2,36,36,32,16,14,80,5,96,11,112,11,
2,128,11,1,11,11,5,22,0,63,51,47,93,113,16,237,63,51,47,93,113,16,237,18,
57,57,1,93,93,43,93,113,47,93,113,237,51,47,43,237,26,16,220,93,113,26,237,
50,47,237,49,48,93,93,0,93,1,93,93,0,93,93,93,1,20,14,2,35,34,46,2,39,55,
30,1,51,50,62,2,53,52,46,2,39,46,3,53,52,54,51,50,22,23,7,46,3,35,34,6,21,
20,30,2,23,30,5,3,182,59,112,163,105,94,151,114,77,18,159,23,144,128,58,97,
70,39,46,82,117,70,65,128,103,64,211,202,179,211,28,162,9,48,68,85,46,122,
116,43,77,108,65,43,90,85,75,56,33,1,43,76,119,81,43,29,64,105,76,31,87,81,
16,39,65,48,49,63,42,31,19,17,42,69,102,77,148,155,126,139,20,42,57,35,15,
74,75,44,57,39,29,16,11,25,35,47,66,88,0,0,0,0,1,0,31,255,240,2,42,5,44,0,
22,0,123,64,87,40,14,1,105,14,121,14,137,14,3,40,13,1,105,13,121,13,137,13,
3,139,4,1,4,32,9,13,72,108,4,124,4,156,4,172,4,4,4,32,9,12,72,111,22,127,
22,2,22,12,13,22,3,16,70,9,8,143,5,1,0,5,16,5,32,5,64,5,4,7,5,128,24,1,15,
6,80,12,63,10,1,10,9,15,19,80,3,22,0,63,237,63,205,93,51,237,50,1,93,47,94,
93,113,51,51,237,23,50,47,93,49,48,0,43,93,1,43,93,93,113,93,113,37,14,1,
35,34,53,17,35,53,51,55,51,21,51,21,35,17,20,22,51,50,54,55,2,42,41,85,56,
216,125,132,53,120,200,200,51,63,26,49,29,8,11,13,245,2,210,131,242,242,131,
253,85,78,63,8,6,0,0,0,0,1,0,133,255,236,3,235,4,58,0,37,0,121,64,69,150,
3,1,26,33,42,33,58,33,3,25,14,70,64,47,11,143,11,2,191,11,1,143,11,159,11,
255,11,3,11,39,128,1,70,223,36,239,36,2,0,36,16,36,48,36,240,36,4,8,36,176,
39,192,39,208,39,3,176,39,240,39,2,255,39,1,112,39,1,39,184,255,192,64,13,
19,23,72,25,6,80,31,22,19,21,12,0,15,0,63,50,63,63,237,50,1,43,93,93,113,
114,47,94,93,113,237,26,16,220,93,113,114,26,237,51,49,48,0,93,93,1,17,20,
30,2,51,50,62,2,53,17,51,17,20,30,2,23,35,46,3,53,35,14,3,35,34,46,2,53,17,
1,58,23,52,85,63,64,103,73,40,180,1,2,2,1,170,1,2,3,2,3,26,62,82,106,70,90,
130,84,39,4,58,253,82,79,106,65,27,45,85,125,81,2,115,252,173,34,75,67,48,
7,5,44,57,59,20,47,76,53,29,44,92,144,101,2,209,0,0,1,0,7,0,0,3,249,4,58,
0,16,2,91,64,55,57,1,73,1,2,153,1,1,54,0,70,0,2,134,0,150,0,2,58,15,74,15,
2,154,15,1,105,15,121,15,137,15,3,53,3,69,3,2,149,3,1,3,103,3,119,3,135,3,
3,14,16,13,17,72,4,184,255,240,64,62,13,17,72,1,0,9,9,2,15,16,16,43,16,123,
16,2,4,16,20,16,2,4,16,20,16,68,16,84,16,132,16,148,16,196,16,212,16,8,219,
16,1,68,16,84,16,132,16,148,16,196,16,5,27,16,1,4,16,1,8,16,3,2,184,255,240,
64,255,11,2,91,2,2,42,2,11,18,27,18,2,11,18,27,18,75,18,91,18,139,18,155,
18,203,18,219,18,8,255,18,1,196,18,212,18,2,160,18,1,132,18,148,18,2,96,18,
1,68,18,84,18,2,32,18,1,4,18,20,18,2,199,224,18,1,196,18,212,18,2,160,18,
1,4,18,20,18,68,18,84,18,132,18,148,18,6,68,18,84,18,132,18,148,18,196,18,
212,18,6,27,18,1,4,18,1,219,18,1,196,18,1,155,18,1,132,18,1,91,18,1,68,18,
1,27,18,1,4,18,1,151,11,18,27,18,75,18,91,18,139,18,155,18,203,18,219,18,
8,155,18,203,18,219,18,3,132,18,1,96,18,1,68,18,84,18,2,32,18,1,4,18,20,18,
2,224,18,1,196,18,212,18,2,160,18,1,132,18,148,18,2,96,18,1,4,18,20,18,68,
18,84,18,4,103,4,18,20,18,68,18,84,18,132,18,148,18,196,18,212,18,8,219,18,
1,196,18,1,155,18,1,132,18,1,91,18,1,68,18,1,27,18,1,4,18,1,219,18,1,196,
18,1,11,18,27,18,75,18,64,99,91,18,139,18,155,18,6,55,75,18,91,18,139,18,
155,18,203,18,219,18,6,63,18,1,32,18,1,4,18,20,18,2,224,18,1,196,18,212,18,
2,160,18,1,132,18,148,18,2,96,18,1,68,18,84,18,2,32,18,1,4,18,20,18,2,196,
18,212,18,2,160,18,1,132,18,148,18,2,96,18,1,2,80,18,1,47,18,1,0,18,16,18,
2,7,15,2,15,9,1,21,0,63,51,63,51,1,94,93,93,93,95,93,93,93,93,113,113,113,
113,113,113,113,113,114,114,114,114,94,93,93,93,113,113,113,113,113,113,113,
113,114,94,93,93,93,93,93,93,113,113,113,113,113,113,114,94,93,93,93,93,93,
93,93,93,113,113,113,114,114,114,114,94,93,93,93,93,93,93,93,93,113,114,47,
94,93,56,51,47,94,93,93,93,93,113,114,114,56,51,18,57,61,47,51,51,49,48,43,
43,93,95,93,113,93,93,113,93,113,93,113,33,35,1,51,19,30,3,23,62,3,55,19,
51,2,101,213,254,119,192,238,7,19,20,17,6,6,19,20,21,8,246,191,4,58,253,64,
22,63,68,63,21,21,63,66,63,22,2,194,0,0,0,0,1,255,253,0,0,5,204,4,58,0,42,
3,177,64,36,229,23,1,58,41,74,41,2,122,41,138,41,154,41,3,53,16,69,16,2,117,
16,133,16,149,16,3,54,29,70,29,2,54,29,1,29,184,255,240,64,22,13,17,72,57,
28,73,28,2,57,28,1,28,16,13,17,72,54,0,70,0,2,0,184,255,240,64,9,11,17,72,
54,13,70,13,2,13,184,255,240,64,51,11,17,72,57,1,73,1,2,1,16,11,17,72,57,
14,73,14,2,3,14,16,9,17,72,14,13,22,29,28,7,1,0,35,40,35,1,88,35,1,22,7,35,
35,7,22,3,15,41,42,16,42,184,255,192,64,73,47,50,72,73,42,1,52,42,1,38,42,
1,249,42,1,198,42,230,42,2,164,42,1,150,42,1,121,42,1,54,42,70,42,102,42,
3,25,42,1,244,42,1,182,42,230,42,2,132,42,148,42,2,102,42,118,42,2,57,42,
1,38,42,1,20,42,1,6,42,1,8,42,16,15,184,255,240,64,255,9,15,89,15,105,15,
121,15,4,10,15,198,44,230,44,246,44,3,164,44,1,150,44,1,121,44,1,102,44,1,
84,44,1,54,44,70,44,2,25,44,1,244,44,1,230,44,1,196,44,1,182,44,1,153,44,
1,134,44,1,116,44,1,102,44,1,57,44,1,20,44,36,44,2,6,44,1,202,249,44,1,150,
44,182,44,198,44,230,44,4,105,44,1,54,44,70,44,2,9,44,25,44,2,230,44,1,185,
44,1,86,44,102,44,134,44,3,57,44,1,43,44,1,20,44,1,6,44,1,228,44,1,214,44,
1,196,44,1,182,44,1,162,44,1,148,44,1,134,44,1,114,44,1,100,44,1,86,44,1,
52,44,68,44,2,34,44,1,20,44,1,6,44,1,153,246,44,1,194,44,210,44,2,180,44,
1,166,44,1,132,44,1,118,44,1,84,44,100,44,2,66,44,1,52,44,1,22,44,38,44,2,
4,44,1,226,44,242,44,2,212,44,1,198,44,1,164,44,1,146,44,1,132,44,1,102,44,
118,44,2,84,44,1,54,44,70,44,2,36,44,1,22,44,1,4,44,1,244,44,64,213,1,230,
44,1,196,44,1,178,44,1,164,44,1,102,44,134,44,150,44,3,68,44,84,44,2,54,44,
1,20,44,1,6,44,1,105,246,44,1,226,44,1,212,44,1,150,44,182,44,198,44,3,116,
44,132,44,2,54,44,70,44,102,44,3,36,44,1,6,44,22,44,2,244,44,1,182,44,230,
44,2,148,44,164,44,2,134,44,1,105,44,1,86,44,1,68,44,1,6,44,54,44,2,228,44,
1,214,44,1,196,44,1,166,44,182,44,2,137,44,1,114,44,1,1,96,44,1,4,44,36,44,
84,44,3,56,164,44,196,44,212,44,244,44,4,128,44,1,116,44,1,75,44,1,48,44,
1,20,44,36,44,2,251,44,1,196,44,1,160,44,1,148,44,1,123,44,1,52,44,68,44,
100,44,3,27,44,1,240,44,1,228,44,1,203,44,1,100,44,132,44,148,44,180,44,4,
63,44,1,2,0,44,16,44,2,8,7,184,255,224,64,40,14,17,72,66,7,1,52,7,1,34,7,
1,7,28,41,3,15,15,35,40,12,17,72,45,35,1,22,40,12,17,72,45,22,1,1,22,35,3,
14,21,0,63,23,51,93,43,93,43,63,23,51,93,93,93,43,1,94,93,95,93,93,93,93,
93,113,113,113,113,113,113,113,114,114,114,114,114,114,94,93,93,95,93,93,
93,93,93,93,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,
94,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,113,
113,113,114,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93,
93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,114,114,114,114,114,94,
93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,47,94,93,
56,51,47,94,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,114,114,114,
43,56,51,18,23,57,61,47,47,47,113,114,17,51,51,17,51,51,17,51,51,49,48,43,
95,113,43,113,43,113,43,113,43,93,113,43,93,113,93,113,93,113,113,33,35,3,
46,1,39,38,39,6,7,14,1,7,3,35,1,51,19,30,1,23,22,23,54,55,62,1,55,19,51,19,
30,1,23,22,23,54,55,62,1,55,19,51,4,150,209,173,8,17,8,10,9,9,10,8,19,8,178,
208,254,209,178,183,7,14,7,7,8,8,9,8,16,6,196,193,189,7,16,7,8,8,8,8,7,15,
7,191,176,2,186,27,80,38,44,47,45,44,38,82,31,253,74,4,58,253,33,23,67,32,
37,39,38,36,31,64,21,2,231,253,25,26,66,29,34,35,38,36,31,67,26,2,223,0,0,
1,0,23,0,0,3,234,4,58,0,11,2,214,64,72,148,2,1,134,2,1,141,8,157,8,2,121,
8,1,130,6,146,6,2,118,6,1,141,0,157,0,2,121,0,1,55,10,119,10,2,28,10,1,122,
4,1,19,4,1,3,24,1,120,1,136,1,152,1,4,23,7,135,7,151,7,3,6,8,10,1,7,4,4,9,
9,16,5,184,255,240,64,59,5,9,5,9,3,0,11,16,41,11,57,11,2,4,11,20,11,2,214,
11,230,11,246,11,3,196,11,1,150,11,166,11,182,11,3,132,11,1,6,11,38,11,70,
11,102,11,134,11,150,11,166,11,198,11,230,11,9,8,11,184,255,192,181,24,31,
72,11,2,3,184,255,240,64,11,9,3,1,9,3,57,3,2,10,3,13,184,255,128,64,116,223,
233,72,118,13,1,100,13,1,86,13,1,68,13,1,54,13,1,36,13,1,22,13,1,4,13,1,230,
13,246,13,2,210,13,1,192,13,1,178,13,1,132,13,148,13,164,13,3,118,13,1,100,
13,1,86,13,1,68,13,1,54,13,1,36,13,1,22,13,1,4,13,1,199,246,13,1,228,13,1,
214,13,1,196,13,1,182,13,1,164,13,1,6,13,70,13,86,13,134,13,150,13,166,13,
198,13,214,13,230,13,9,150,13,198,13,2,13,184,255,192,64,187,183,192,72,132,
13,1,86,13,102,13,118,13,3,68,13,1,38,13,54,13,2,4,13,1,151,38,13,54,13,102,
13,118,13,166,13,182,13,198,13,230,13,246,13,9,230,13,1,132,13,1,118,13,1,
68,13,84,13,100,13,3,54,13,1,36,13,1,22,13,1,4,13,1,246,13,1,228,13,1,214,
13,1,196,13,1,182,13,1,164,13,1,118,13,134,13,150,13,3,100,13,1,6,13,22,13,
38,13,70,13,86,13,5,103,6,13,70,13,86,13,134,13,150,13,198,13,214,13,230,
13,8,153,13,217,13,2,100,13,1,86,13,1,68,13,1,54,13,1,36,13,1,22,13,1,4,13,
1,214,13,230,13,246,13,3,196,13,1,6,13,38,13,54,13,70,13,4,55,102,13,166,
13,182,13,230,13,246,13,5,13,184,255,192,64,54,61,66,72,57,13,1,34,13,1,1,
0,13,16,13,2,244,13,1,192,13,208,13,224,13,3,180,13,1,128,13,144,13,160,13,
3,116,13,1,96,13,1,84,13,1,64,13,1,52,13,1,32,13,1,13,184,255,192,64,34,18,
24,72,160,13,1,2,0,13,16,13,80,13,112,13,128,13,144,13,6,7,10,4,4,7,1,3,2,
8,6,15,0,2,21,0,63,51,63,51,18,23,57,17,1,51,94,93,95,93,43,113,113,113,113,
113,113,113,113,113,113,114,95,114,114,43,114,94,93,93,93,113,113,113,113,
113,113,113,113,114,94,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,
113,113,114,94,93,93,93,93,93,43,93,113,114,114,114,114,114,114,94,93,93,
93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,43,47,94,
93,114,56,51,47,43,94,93,113,113,113,113,114,114,56,51,18,57,57,47,47,56,
56,18,23,57,50,51,49,48,0,93,93,1,95,93,93,93,93,93,93,93,93,93,93,93,93,
33,9,1,35,9,1,51,9,1,51,9,1,3,33,254,221,254,219,194,1,129,254,145,199,1,
14,1,12,201,254,145,1,134,1,188,254,68,2,44,2,14,254,91,1,165,253,244,253,
210,0,0,0,0,1,0,5,254,87,3,252,4,58,0,31,2,207,64,59,147,3,1,147,2,1,153,
16,1,150,0,1,141,16,157,16,2,141,0,157,0,2,122,29,138,29,154,29,3,105,29,
1,157,30,1,30,16,13,16,72,146,19,1,134,19,1,114,19,1,86,19,102,19,2,146,18,
1,3,18,184,255,240,64,36,13,16,72,16,0,24,8,24,8,24,17,30,31,16,153,31,1,
134,31,1,89,31,1,70,31,1,25,31,1,6,31,1,8,31,18,17,184,255,240,64,36,17,6,
33,1,6,33,38,33,54,33,70,33,102,33,118,33,134,33,166,33,182,33,198,33,230,
33,246,33,12,199,230,33,246,33,2,33,184,255,192,64,255,217,233,72,196,33,
1,166,33,182,33,2,132,33,1,6,33,38,33,54,33,70,33,102,33,118,33,6,6,33,38,
33,54,33,70,33,102,33,118,33,134,33,166,33,182,33,198,33,230,33,246,33,12,
6,33,22,33,38,33,70,33,86,33,102,33,134,33,166,33,198,33,230,33,246,33,11,
151,244,33,1,224,33,1,194,33,210,33,2,180,33,1,160,33,1,130,33,146,33,2,116,
33,1,96,33,1,66,33,82,33,2,52,33,1,32,33,1,2,33,18,33,2,228,33,244,33,2,194,
33,210,33,2,164,33,180,33,2,130,33,146,33,2,100,33,116,33,2,66,33,82,33,2,
36,33,52,33,2,2,33,18,33,2,228,33,244,33,2,194,33,210,33,2,164,33,180,33,
2,130,33,146,33,2,100,33,116,33,2,86,33,1,66,33,1,36,33,52,33,2,22,33,1,2,
33,1,103,228,33,244,33,2,214,33,1,194,33,1,164,33,180,33,2,150,33,1,130,33,
1,100,33,116,33,2,86,33,1,66,33,1,36,33,52,33,2,22,33,1,2,33,1,228,33,244,
33,2,214,33,1,64,166,194,33,1,1,160,33,176,33,2,132,33,148,33,2,96,33,112,
33,2,68,33,84,33,2,32,33,48,33,2,4,33,20,33,2,224,33,240,33,2,196,33,212,
33,2,160,33,176,33,2,132,33,148,33,2,96,33,112,33,2,68,33,84,33,2,32,33,48,
33,2,4,33,20,33,2,55,224,33,1,196,33,212,33,2,160,33,1,132,33,148,33,2,96,
33,1,68,33,84,33,2,32,33,1,4,33,20,33,2,224,33,1,196,33,212,33,2,160,33,1,
132,33,148,33,2,96,33,1,2,0,33,32,33,48,33,80,33,4,80,33,128,33,144,33,192,
33,4,47,33,1,0,33,16,33,2,7,16,0,24,0,32,30,17,15,12,80,5,27,0,63,237,63,
51,17,51,51,17,51,1,94,93,93,93,113,95,113,113,113,113,113,114,114,114,114,
114,114,114,114,94,93,93,93,93,93,93,93,93,113,113,113,113,113,113,95,113,
113,113,114,114,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,
93,93,93,93,93,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,
114,114,114,114,114,94,93,113,114,114,114,114,43,114,94,93,113,47,56,51,47,
94,93,93,93,93,93,93,56,51,18,57,57,61,47,24,47,17,51,51,49,48,43,95,93,93,
93,93,93,43,93,93,93,0,93,93,1,93,93,93,93,33,14,3,35,34,38,39,53,30,1,51,
50,54,63,1,1,51,19,30,3,23,62,3,55,19,51,2,92,38,79,98,120,78,34,58,32,19,
48,17,79,136,51,17,254,83,192,228,10,31,31,24,2,3,23,29,30,10,212,190,98,
157,111,59,4,7,135,3,3,118,129,43,4,53,253,170,27,90,90,72,9,11,65,80,82,
30,2,106,0,1,0,49,0,0,3,182,4,58,0,9,1,11,64,78,157,2,173,2,2,139,2,1,89,
2,105,2,2,146,7,162,7,2,116,7,132,7,2,70,7,86,7,102,7,3,40,8,1,3,8,2,123,
6,1,4,6,20,6,36,6,164,6,180,6,212,6,228,6,7,7,6,7,3,11,1,59,1,91,1,3,10,1,
64,39,55,72,1,64,17,20,72,1,11,184,255,192,64,40,92,100,72,192,11,1,180,11,
1,160,11,1,148,11,1,128,11,1,116,11,1,96,11,1,84,11,1,64,11,1,52,11,68,11,
100,11,132,11,4,11,184,255,192,64,32,73,82,72,32,11,1,20,11,1,0,11,1,63,68,
11,100,11,132,11,164,11,4,4,11,36,11,68,11,100,11,4,11,184,255,192,179,51,
62,72,11,184,255,192,64,18,31,39,72,224,11,1,2,0,11,32,11,80,11,112,11,4,
7,11,184,255,192,64,13,16,20,72,6,3,80,4,15,1,7,80,0,21,0,63,237,50,63,237,
50,1,43,94,93,95,93,43,43,113,114,94,93,93,93,43,93,113,113,113,113,113,113,
113,113,113,43,47,43,43,94,93,51,51,47,94,93,113,51,51,95,113,49,48,93,93,
93,93,93,93,51,53,1,33,53,33,21,1,33,21,49,2,149,253,147,3,56,253,106,2,187,
137,3,38,139,137,252,218,139,0,0,0,1,0,34,254,87,2,136,5,204,0,45,0,96,64,
65,3,32,9,12,72,19,32,9,13,72,23,45,33,28,40,240,17,11,31,5,63,5,2,143,5,
1,64,5,1,5,33,11,245,47,12,111,12,2,15,12,79,12,223,12,239,12,4,47,12,79,
12,111,12,3,12,12,0,24,245,21,0,43,245,0,27,0,63,237,63,237,18,57,47,93,113,
114,237,57,1,47,93,93,113,51,51,237,50,50,205,50,49,48,43,43,1,34,46,2,53,
17,52,46,2,39,53,62,3,53,17,52,54,59,1,21,35,34,6,21,17,20,14,2,7,21,30,3,
21,17,20,22,59,1,21,2,1,65,99,66,34,29,55,80,51,51,80,55,29,133,131,135,63,
91,77,30,52,71,41,43,71,51,29,77,91,63,254,87,41,76,108,68,1,105,63,88,56,
28,2,127,2,28,56,88,62,1,106,141,152,129,107,108,254,156,50,84,64,44,10,2,
10,44,65,84,51,254,155,106,109,129,0,1,0,183,254,78,1,93,5,204,0,3,1,207,
64,21,3,171,6,0,1,11,0,0,4,5,214,5,230,5,246,5,3,194,5,1,5,184,255,128,179,
226,229,72,5,184,255,192,64,10,222,225,72,2,5,18,5,2,218,5,184,255,128,179,
214,217,72,5,184,255,192,64,20,210,213,72,180,5,196,5,2,162,5,1,1,112,5,128,
5,144,5,3,5,184,255,192,64,20,199,202,72,0,5,1,240,5,1,212,5,228,5,2,176,
5,192,5,2,5,184,255,192,64,43,187,190,72,48,5,64,5,80,5,3,4,5,20,5,36,5,3,
240,5,1,196,5,212,5,228,5,3,128,5,144,5,160,5,3,4,5,20,5,36,5,3,164,5,184,
255,192,179,168,171,72,5,184,255,128,179,160,163,72,5,184,255,192,64,14,156,
159,72,112,5,128,5,144,5,3,228,5,1,5,184,255,192,64,11,145,148,72,176,5,192,
5,208,5,3,5,184,255,192,64,15,133,136,72,48,5,1,20,5,36,5,2,0,5,1,5,184,255,
192,64,15,122,125,72,128,5,1,4,5,20,5,36,5,3,110,5,184,255,192,64,10,114,
117,72,192,5,1,84,5,1,5,184,255,192,182,102,105,72,16,5,1,5,184,255,192,64,
9,91,94,72,80,5,96,5,2,5,184,255,192,64,15,79,82,72,203,5,219,5,2,160,5,176,
5,2,2,5,184,255,192,64,10,68,71,72,15,5,31,5,2,62,5,184,255,192,64,29,56,
61,72,207,5,1,96,5,112,5,160,5,176,5,4,31,5,1,0,5,1,160,5,224,5,240,5,3,5,
184,255,192,64,28,25,28,72,5,64,17,21,72,64,5,112,5,128,5,144,5,4,15,5,31,
5,47,5,3,7,1,0,0,0,47,63,1,94,93,93,43,43,113,114,114,114,114,43,94,93,43,
95,93,93,43,113,43,114,43,114,114,43,94,93,93,43,113,113,113,43,113,43,113,
114,43,43,43,94,93,93,93,93,113,113,43,113,113,113,114,43,114,95,114,114,
43,43,94,93,43,43,93,93,17,18,57,47,94,93,237,49,48,19,17,51,17,183,166,254,
78,7,126,248,130,0,0,0,0,1,0,34,254,87,2,135,5,204,0,45,0,98,185,0,40,255,
224,179,9,12,72,24,184,255,224,64,55,9,13,72,20,44,32,26,38,240,15,9,48,3,
1,192,3,208,3,2,3,9,32,245,47,31,111,31,2,15,31,79,31,223,31,239,31,4,47,
31,79,31,111,31,3,31,31,21,45,245,44,27,20,245,21,0,0,63,237,63,237,18,57,
47,93,113,114,237,57,1,47,93,113,51,51,253,50,50,205,50,49,48,43,43,19,50,
54,53,17,52,62,2,55,53,46,3,53,17,52,38,43,1,53,51,50,22,21,17,20,30,2,23,
21,14,3,21,17,20,14,2,43,1,53,94,91,79,28,51,71,43,42,70,52,29,79,91,60,132,
131,133,29,55,81,52,52,81,55,29,34,66,99,65,132,254,216,109,106,1,101,51,
84,65,44,10,2,10,44,64,84,50,1,100,108,107,129,152,141,254,150,62,88,56,28,
2,127,2,28,56,88,63,254,151,68,108,76,41,129,0,0,0,0,1,0,92,2,41,4,80,3,39,
0,32,0,154,64,26,90,3,138,3,2,25,2,41,2,57,2,3,30,48,10,16,72,13,31,1,25,
48,9,12,72,13,184,255,208,179,9,13,72,7,184,255,208,64,19,9,13,72,0,27,32,
27,112,27,3,27,32,10,1,10,24,173,64,10,184,255,192,180,38,60,72,10,0,184,
255,192,179,23,28,72,0,184,255,192,64,41,14,20,72,0,128,27,64,41,60,72,27,
5,173,31,14,79,14,159,14,3,111,14,127,14,159,14,175,14,207,14,239,14,255,
14,7,14,64,9,13,72,14,0,47,43,93,113,237,196,43,26,221,43,43,196,43,26,237,
1,47,93,47,93,49,48,0,43,43,43,93,43,93,93,1,34,38,39,38,35,34,14,2,7,53,
62,1,51,50,30,2,23,30,3,51,50,54,55,21,14,3,3,76,69,145,73,129,88,38,65,60,
56,29,50,132,81,40,80,77,75,37,21,50,51,51,23,69,123,52,32,59,61,68,2,41,
44,26,45,12,23,32,21,143,38,46,13,20,26,13,8,15,14,8,50,42,149,23,30,19,8,
0,0,0,2,0,242,254,185,1,184,4,58,0,3,0,7,2,19,64,133,2,91,3,3,166,5,182,5,
2,5,150,105,6,185,6,2,70,6,86,6,2,57,6,1,6,64,23,27,72,182,6,198,6,2,73,6,
89,6,105,6,3,22,6,54,6,2,9,6,1,10,6,121,9,137,9,153,9,201,9,4,70,9,1,9,9,
57,9,2,249,9,1,182,9,1,105,9,121,9,169,9,3,38,9,1,9,9,1,204,217,9,233,9,2,
150,9,1,73,9,89,9,121,9,3,6,9,1,185,9,201,9,2,134,9,1,116,9,1,86,9,102,9,
2,68,9,1,22,9,38,9,54,9,3,9,184,255,192,64,14,168,171,72,180,9,1,134,9,150,
9,166,9,3,9,184,255,192,64,22,159,162,72,36,9,1,6,9,22,9,2,156,182,9,198,
9,214,9,246,9,4,9,184,255,64,64,14,147,150,72,102,9,1,150,9,166,9,182,9,3,
9,184,255,192,64,24,137,144,72,98,9,114,9,130,9,3,64,9,80,9,2,34,9,50,9,2,
16,9,1,9,184,255,64,182,117,124,72,128,9,1,9,184,255,64,64,10,110,115,72,
4,9,20,9,2,108,9,184,255,64,64,62,101,107,72,180,9,196,9,212,9,3,150,9,166,
9,2,132,9,1,118,9,1,82,9,98,9,2,36,9,52,9,68,9,3,6,9,22,9,2,246,9,1,194,9,
210,9,2,1,144,9,160,9,176,9,3,100,9,116,9,132,9,3,9,184,255,128,64,16,71,
75,72,212,9,228,9,244,9,3,160,9,176,9,2,9,184,255,192,64,61,59,64,72,16,9,
32,9,2,4,9,1,55,180,9,228,9,244,9,3,128,9,144,9,2,84,9,100,9,116,9,3,27,9,
1,0,9,1,240,9,1,196,9,212,9,228,9,3,84,9,100,9,164,9,212,9,228,9,244,9,6,
9,184,255,192,64,20,26,31,72,64,9,1,2,15,9,1,7,0,6,156,7,15,0,3,1,3,0,47,
93,63,253,206,1,94,93,95,93,43,93,113,113,114,114,114,114,114,94,93,93,43,
93,93,43,113,113,95,113,113,114,114,114,114,114,114,114,43,94,93,43,93,43,
113,113,113,113,43,113,114,43,114,94,93,93,43,93,93,43,113,113,113,113,113,
113,114,114,114,114,94,93,93,93,93,93,113,113,113,47,94,93,93,93,93,43,113,
113,113,237,113,51,47,237,49,48,1,51,19,35,19,21,35,53,1,10,148,24,196,198,
194,2,173,252,12,5,129,201,201,0,0,0,1,0,135,255,225,3,250,5,129,0,43,0,137,
64,31,88,14,104,14,2,87,20,103,20,2,26,28,1,21,6,1,6,3,1,25,10,22,0,11,1,
11,11,3,39,71,17,184,255,192,64,56,8,11,72,17,31,70,30,30,3,70,4,34,80,217,
31,1,124,31,140,31,2,25,31,1,31,22,96,25,112,25,2,160,25,1,25,23,3,12,213,
3,1,112,3,128,3,2,21,3,101,3,2,3,0,80,9,10,0,47,221,237,51,93,93,93,51,63,
221,93,113,50,50,93,93,93,237,1,47,237,51,47,237,47,43,237,18,57,47,113,51,
205,50,49,48,0,93,93,93,93,93,1,50,54,55,23,14,3,7,21,35,53,46,3,53,52,62,
2,55,53,51,21,30,3,23,7,46,1,35,34,14,2,21,20,30,2,2,84,96,129,15,182,8,51,
88,126,83,124,111,154,95,43,66,111,146,80,124,78,120,86,54,12,185,14,114,
105,77,103,64,27,27,64,105,1,21,104,108,12,62,116,92,62,8,168,168,10,93,149,
195,113,150,206,131,63,7,155,155,8,55,85,109,63,14,90,106,51,103,156,105,
93,156,113,62,0,0,1,0,58,0,0,4,80,5,150,0,50,0,210,64,83,70,23,1,54,2,70,
2,2,21,18,37,18,53,18,3,36,0,39,13,6,26,111,25,25,39,0,44,110,6,35,39,110,
14,95,10,1,10,10,0,79,6,95,6,111,6,3,6,50,111,0,0,32,0,2,0,0,32,0,48,0,80,
0,112,0,144,0,176,0,208,0,8,0,0,16,0,48,0,192,0,224,0,5,0,184,255,192,64,
64,14,18,72,0,38,11,81,35,15,14,31,14,175,14,3,15,14,63,14,111,14,127,14,
159,14,175,14,207,14,223,14,8,8,14,64,37,42,72,14,64,27,32,72,14,14,44,31,
115,26,20,7,7,44,116,22,50,118,50,134,50,3,50,6,24,0,63,51,93,237,50,63,51,
237,18,57,47,43,43,94,93,113,51,237,50,1,47,43,93,113,114,237,47,93,18,57,
47,113,51,237,50,16,237,17,18,57,47,237,17,51,17,18,57,49,48,0,93,1,93,0,
93,1,14,3,35,33,53,62,1,61,1,35,53,51,17,52,62,2,51,50,30,2,23,7,46,3,35,
34,6,21,17,33,21,33,21,20,14,2,7,33,50,62,2,55,4,80,9,57,89,115,67,253,70,
89,86,186,186,48,99,152,103,70,123,99,71,18,174,10,39,53,65,36,114,112,1,
152,254,104,22,44,63,40,1,227,38,67,53,37,8,1,55,80,117,77,37,154,46,160,
121,144,129,1,24,92,147,102,55,29,58,86,57,57,31,52,36,20,115,125,254,224,
129,126,56,106,92,71,21,19,42,67,48,0,0,0,2,0,113,0,225,4,2,4,115,0,35,0,
55,0,153,64,119,74,29,90,29,106,29,3,44,29,60,29,2,74,25,90,25,106,25,3,44,
25,60,25,2,69,11,85,11,101,11,3,35,11,51,11,2,69,7,85,7,101,7,3,35,7,51,7,
2,74,34,90,34,106,34,3,45,34,61,34,2,69,20,85,20,101,20,3,35,20,51,20,2,69,
16,85,16,101,16,3,35,16,51,16,2,74,2,90,2,106,2,3,45,2,61,2,2,46,176,18,36,
176,207,0,223,0,2,0,0,1,0,47,57,1,41,176,27,51,176,9,0,47,237,220,237,1,93,
47,93,93,237,220,237,49,48,93,93,93,93,93,93,93,93,0,93,93,93,93,93,93,93,
93,19,52,54,55,39,55,23,62,1,51,50,22,23,55,23,7,30,1,21,20,6,7,23,7,39,14,
1,35,34,38,39,7,39,55,46,1,55,20,30,2,51,50,62,2,53,52,46,2,35,34,14,2,137,
41,37,100,104,99,54,127,73,71,126,54,97,104,96,37,43,44,38,100,102,101,54,
126,71,72,128,52,105,102,102,37,41,154,44,77,102,58,57,102,77,44,44,77,102,
57,58,102,77,44,2,172,71,127,54,100,103,101,39,43,42,38,97,105,96,54,127,
71,71,128,53,100,105,101,37,41,42,38,105,105,102,54,127,73,58,102,76,44,44,
76,102,58,58,102,76,45,45,76,102,0,1,255,254,0,0,4,118,5,129,0,22,0,185,64,
134,151,0,167,0,2,152,17,168,17,2,73,22,1,70,18,1,155,21,171,21,2,74,21,106,
21,122,21,138,21,4,148,19,164,19,2,69,19,101,19,117,19,133,19,4,19,15,18,
31,18,79,18,143,18,4,18,9,21,0,22,16,22,64,22,128,22,4,22,20,4,0,8,92,17,
13,0,9,16,9,64,9,128,9,4,7,9,3,15,81,16,7,11,81,4,47,12,159,12,175,12,3,12,
64,41,45,72,0,12,16,12,32,12,160,12,4,12,20,0,0,16,1,15,16,175,16,2,8,16,
16,8,21,18,3,8,18,0,63,63,51,18,57,47,94,93,113,51,51,222,93,43,113,50,237,
50,16,237,50,1,47,94,93,51,51,253,50,50,57,204,93,50,16,204,93,50,49,48,93,
93,93,93,93,93,93,93,1,33,21,33,21,33,21,33,17,35,17,33,53,33,55,33,53,33,
1,51,9,1,51,2,208,1,65,254,129,1,127,254,129,178,254,131,1,125,2,254,129,
1,64,254,91,199,1,115,1,119,199,2,197,125,154,127,254,209,1,47,127,154,125,
2,188,253,121,2,135,0,2,0,183,254,78,1,93,5,204,0,3,0,7,1,221,64,23,3,7,171,
0,6,4,1,11,4,4,8,9,214,9,230,9,246,9,3,194,9,1,9,184,255,128,179,226,229,
72,9,184,255,192,64,10,222,225,72,2,9,18,9,2,218,9,184,255,128,179,214,217,
72,9,184,255,192,64,20,210,213,72,180,9,196,9,2,162,9,1,1,112,9,128,9,144,
9,3,9,184,255,192,64,20,199,202,72,0,9,1,240,9,1,212,9,228,9,2,176,9,192,
9,2,9,184,255,192,64,43,187,190,72,48,9,64,9,80,9,3,4,9,20,9,36,9,3,240,9,
1,196,9,212,9,228,9,3,128,9,144,9,160,9,3,4,9,20,9,36,9,3,164,9,184,255,192,
179,168,171,72,9,184,255,128,179,160,163,72,9,184,255,192,64,14,156,159,72,
112,9,128,9,144,9,3,228,9,1,9,184,255,192,64,11,145,148,72,176,9,192,9,208,
9,3,9,184,255,192,64,15,133,136,72,48,9,1,20,9,36,9,2,0,9,1,9,184,255,192,
64,15,122,125,72,128,9,1,4,9,20,9,36,9,3,110,9,184,255,192,64,10,114,117,
72,192,9,1,84,9,1,9,184,255,192,182,102,105,72,16,9,1,9,184,255,192,64,9,
91,94,72,80,9,96,9,2,9,184,255,192,64,15,79,82,72,203,9,219,9,2,160,9,176,
9,2,2,9,184,255,192,64,10,68,71,72,15,9,31,9,2,62,9,184,255,192,64,29,56,
61,72,207,9,1,96,9,112,9,160,9,176,9,4,31,9,1,0,9,1,160,9,224,9,240,9,3,9,
184,255,192,64,33,25,28,72,9,64,17,21,72,64,9,112,9,128,9,144,9,4,15,9,31,
9,47,9,3,7,5,0,5,0,1,4,1,0,0,63,47,18,57,57,47,47,1,94,93,93,43,43,113,114,
114,114,114,43,94,93,43,95,93,93,43,113,43,114,43,114,114,43,94,93,93,43,
113,113,113,43,113,43,113,114,43,43,43,94,93,93,93,93,113,113,43,113,113,
113,114,43,114,95,114,114,43,43,94,93,43,43,93,93,17,18,57,47,94,93,51,237,
50,49,48,19,17,51,17,3,17,51,17,183,166,166,166,2,194,3,10,252,246,251,140,
3,11,252,245,0,0,0,0,2,0,115,255,84,4,0,5,204,0,77,0,97,1,79,64,144,117,47,
133,47,2,122,8,138,8,2,100,85,1,43,85,107,85,2,45,81,109,81,2,45,57,109,57,
125,57,141,57,4,85,96,117,96,133,96,3,83,62,115,62,131,62,3,83,90,115,90,
131,90,3,121,80,137,80,2,111,80,1,90,80,1,45,80,1,116,16,132,16,2,54,16,70,
16,2,42,73,1,37,42,1,37,45,1,43,3,1,25,3,1,5,31,21,31,2,5,36,21,36,2,11,76,
27,76,2,14,73,75,34,73,55,144,75,1,75,55,75,55,78,70,29,65,24,6,73,5,5,24,
73,160,78,1,0,78,32,78,64,78,144,78,4,78,184,255,192,179,29,33,72,78,184,
255,192,64,18,21,26,72,78,45,73,44,44,88,73,0,65,32,65,176,65,3,65,184,255,
192,64,68,34,38,72,65,217,55,1,203,55,1,188,55,1,152,55,1,245,3,1,230,3,1,
149,3,1,121,83,1,106,83,1,218,83,1,155,83,1,228,14,244,14,2,166,14,1,119,
14,135,14,2,104,14,1,14,83,93,55,4,0,50,81,45,39,11,81,6,0,0,0,63,50,237,
47,51,237,18,23,57,93,93,93,93,93,93,113,113,93,93,93,93,93,93,93,1,47,43,
93,237,51,47,237,47,43,43,93,113,237,50,16,237,17,18,57,57,17,57,57,47,47,
114,16,237,16,237,49,48,93,93,93,93,93,0,93,93,1,93,0,93,93,93,93,93,93,93,
93,93,93,93,93,1,93,93,93,1,50,30,2,23,7,46,3,35,34,6,21,20,30,2,23,30,3,
21,20,14,2,7,30,3,21,20,14,2,35,34,46,2,39,55,30,3,51,50,62,2,53,52,46,2,
39,46,3,53,52,62,2,55,46,3,53,52,54,1,52,46,2,39,14,3,21,20,30,2,23,62,3,
2,76,79,138,108,73,15,161,8,46,68,84,46,125,129,50,83,109,59,68,139,112,70,
28,55,82,54,49,79,55,30,58,112,164,107,93,154,117,79,19,161,12,54,78,100,
57,58,102,76,45,57,95,123,65,65,131,104,65,32,59,84,53,42,75,57,33,211,1,
225,53,88,113,61,58,89,60,31,49,82,108,60,54,93,68,39,5,204,30,63,98,69,20,
45,58,34,13,79,71,45,64,46,32,14,16,46,73,106,76,45,87,73,55,13,21,51,64,
81,51,73,117,83,44,27,64,104,77,31,55,67,37,13,18,40,65,47,54,72,51,36,16,
15,46,73,105,74,45,83,71,53,15,14,46,64,80,48,139,155,252,203,48,69,51,35,
14,3,33,52,69,39,46,66,48,34,15,1,24,47,70,0,0,0,0,2,0,45,4,195,2,90,5,123,
0,3,0,7,0,193,178,3,133,0,184,255,192,179,19,22,72,0,184,255,192,64,131,13,
16,72,0,7,133,4,64,19,22,72,4,64,14,17,72,4,1,5,145,0,59,4,1,45,4,1,11,4,
27,4,2,57,253,4,1,235,4,1,219,4,1,201,4,1,171,4,187,4,2,153,4,1,141,4,1,1,
4,128,44,48,72,27,4,43,4,2,15,4,1,235,4,251,4,2,191,4,207,4,223,4,3,171,4,
1,159,4,1,123,4,139,4,2,111,4,1,91,4,1,79,4,1,59,4,1,31,4,47,4,2,2,15,4,63,
4,175,4,191,4,4,4,64,22,25,72,4,64,14,17,72,4,0,47,43,43,93,95,113,113,113,
113,113,113,113,113,113,113,114,114,43,95,114,114,114,114,114,114,114,94,
93,93,93,51,237,50,1,47,43,43,237,220,43,43,237,49,48,1,53,51,21,33,53,51,
21,1,183,163,253,211,165,4,195,184,184,184,184,0,0,0,0,3,0,31,255,240,5,197,
5,150,0,25,0,49,0,91,0,245,64,111,138,81,1,10,73,26,73,42,73,3,10,69,26,69,
42,69,3,76,60,1,57,47,73,47,2,54,40,70,40,2,54,36,70,36,2,57,29,73,29,2,138,
90,154,90,2,53,81,69,81,2,58,61,1,133,52,149,52,2,54,46,70,46,2,54,41,70,
41,2,57,35,73,35,2,57,30,73,30,2,50,196,81,61,95,71,111,71,2,71,61,71,61,
14,0,195,0,26,16,26,48,26,64,26,4,16,26,32,26,64,26,3,26,184,255,192,64,68,
15,23,72,26,38,195,111,14,127,14,2,14,60,55,201,66,87,201,76,82,76,15,66,
127,66,2,15,66,31,66,127,66,143,66,159,66,255,66,6,0,76,1,0,76,16,76,112,
76,128,76,144,76,240,76,6,66,76,66,76,7,33,200,21,4,43,200,7,19,0,63,237,
63,237,18,57,57,47,47,93,113,93,113,17,51,16,237,16,237,51,1,47,113,237,47,
43,93,113,237,17,57,57,47,47,93,17,51,237,49,48,0,93,93,93,93,93,93,93,93,
1,93,93,93,93,113,93,93,113,1,20,14,4,35,34,46,4,53,52,62,4,51,50,4,22,18,
7,52,46,4,35,34,14,2,21,20,30,2,51,50,62,4,37,20,30,2,51,50,62,2,55,23,14,
3,35,34,46,2,53,52,62,2,51,50,30,2,23,7,46,3,35,34,14,2,5,197,52,94,131,161,
185,100,99,185,160,133,94,52,52,94,132,161,184,100,150,1,7,197,113,92,45,
82,116,140,161,87,130,228,171,99,99,171,228,130,87,161,140,116,82,45,252,
137,33,67,100,67,49,75,56,39,14,115,22,58,82,111,75,101,149,98,48,48,97,146,
98,75,112,80,55,18,114,12,38,55,72,47,69,99,64,30,2,195,100,185,161,131,94,
52,52,94,131,161,185,100,100,184,161,132,94,52,114,196,254,249,150,86,161,
139,115,82,45,99,171,228,130,131,229,171,98,45,81,115,140,161,89,72,120,86,
48,27,45,55,29,35,43,81,63,38,64,114,158,94,97,157,111,59,36,59,75,39,33,
26,50,38,23,46,83,118,0,2,0,26,2,139,2,253,5,152,0,50,0,65,0,203,64,21,45,
40,10,17,72,46,40,10,17,72,3,40,11,17,72,7,24,11,14,72,29,184,255,216,64,
16,9,17,72,23,51,1,39,39,32,226,47,11,212,56,1,56,184,255,192,64,18,19,22,
72,144,56,1,100,56,116,56,132,56,3,80,56,1,2,56,184,255,192,64,20,10,13,72,
56,20,227,21,21,63,227,5,64,22,38,72,5,192,67,1,67,184,255,192,64,51,13,18,
72,26,57,1,11,57,1,57,228,152,20,1,20,8,10,13,72,20,16,11,1,2,11,1,11,11,
26,35,7,51,1,51,228,0,42,42,0,0,32,0,80,0,3,0,0,17,228,26,222,0,63,237,51,
47,93,51,47,16,237,93,50,17,57,47,93,93,51,43,93,237,93,93,1,43,93,47,43,
237,51,47,237,47,43,95,93,93,93,43,113,51,51,237,50,47,0,93,49,48,1,43,43,
43,43,43,1,34,46,2,53,52,62,2,63,1,53,52,46,2,35,34,6,7,39,62,3,51,50,30,
2,21,17,20,22,51,50,54,55,21,14,1,35,34,46,2,39,35,14,1,39,50,62,2,61,1,7,
14,3,21,20,22,1,4,53,86,62,33,51,86,113,62,178,21,39,56,35,67,81,9,149,7,
43,75,108,71,68,109,77,42,28,35,12,22,9,19,42,22,41,57,38,20,2,4,38,132,51,
48,80,57,32,138,41,74,55,32,58,2,139,29,56,82,52,69,92,56,24,1,4,60,46,60,
35,14,59,76,10,47,82,62,35,29,60,95,66,254,204,58,50,5,3,104,5,8,22,39,51,
29,77,70,111,34,55,71,37,65,4,2,11,29,52,43,56,65,0,0,2,0,83,0,141,4,32,3,
172,0,8,0,17,0,113,64,84,106,12,122,12,138,12,3,106,9,122,9,138,9,3,106,3,
122,3,138,3,3,106,0,122,0,138,0,3,17,236,15,235,14,236,95,10,127,10,143,10,
3,64,10,96,10,2,31,10,1,10,7,236,6,235,5,236,176,1,1,95,1,1,32,1,96,1,128,
1,3,1,9,0,239,12,15,3,47,3,111,3,127,3,4,3,0,47,93,51,228,50,1,47,93,113,
113,237,237,237,47,93,93,113,237,237,237,49,48,93,93,93,93,37,1,53,1,51,21,
9,1,21,33,1,53,1,51,21,9,1,21,3,118,254,174,1,82,168,254,174,1,84,253,131,
254,176,1,80,167,254,177,1,81,141,1,109,63,1,115,31,254,140,254,145,29,1,
109,63,1,115,31,254,140,254,145,29,0,1,0,100,0,180,4,71,2,242,0,5,0,51,64,
19,223,2,1,32,2,1,2,5,170,224,0,1,159,0,1,80,0,1,0,184,255,192,64,9,9,12,
72,0,2,173,0,3,179,0,63,204,237,1,47,43,93,93,93,237,47,93,93,49,48,37,17,
33,53,33,17,3,182,252,174,3,227,180,1,172,146,253,194,0,0,4,0,31,255,240,
5,197,5,150,0,25,0,49,0,63,0,72,0,240,183,4,61,20,61,36,61,3,58,184,255,224,
64,94,11,16,72,57,47,73,47,2,54,40,70,40,2,54,36,70,36,2,57,29,73,29,2,61,
32,9,13,72,54,46,70,46,2,54,41,70,41,2,57,35,73,35,2,57,30,73,30,2,6,69,22,
69,2,51,62,62,69,63,69,53,196,54,64,196,59,59,50,63,63,16,54,63,54,63,14,
0,195,0,26,16,26,48,26,64,26,4,16,26,32,26,64,26,3,26,184,255,192,64,60,15,
23,72,26,38,195,111,14,127,14,2,14,50,50,54,62,52,201,69,9,68,25,68,2,68,
201,55,15,54,31,54,127,54,3,223,55,1,0,55,16,55,112,55,3,54,69,55,55,69,54,
3,7,33,200,21,4,43,200,7,19,0,63,237,63,237,18,23,57,47,47,47,93,113,93,16,
237,93,16,237,50,17,51,47,1,47,113,237,47,43,93,113,237,17,57,57,47,47,56,
17,51,51,47,237,16,237,50,17,18,57,17,51,0,93,49,48,93,93,93,93,43,1,93,93,
93,93,43,93,1,20,14,4,35,34,46,4,53,52,62,4,51,50,4,22,18,7,52,46,4,35,34,
14,2,21,20,30,2,51,50,62,4,1,3,35,17,35,17,33,50,22,21,20,6,7,19,3,52,38,
43,1,17,51,50,54,5,197,52,94,131,161,185,100,99,185,160,133,94,52,52,94,132,
161,184,100,150,1,7,197,113,92,45,82,116,140,161,87,130,228,171,99,99,171,
228,130,87,161,140,116,82,45,254,82,199,161,127,1,51,142,151,104,85,221,159,
95,81,170,182,80,84,2,195,100,185,161,131,94,52,52,94,131,161,185,100,100,
184,161,132,94,52,114,196,254,249,150,86,161,139,115,82,45,99,171,228,130,
131,229,171,98,45,81,115,140,161,254,181,1,80,254,176,3,63,126,111,102,123,
19,254,162,2,80,69,72,254,211,85,0,0,1,255,239,5,172,4,124,6,10,0,3,0,14,
180,1,0,2,140,1,0,47,237,1,47,47,49,48,1,33,53,33,4,124,251,115,4,141,5,172,
94,0,0,0,0,2,0,122,3,92,2,184,5,150,0,19,0,39,0,66,185,0,17,255,232,179,9,
12,72,13,184,255,232,64,33,9,12,72,7,24,9,12,72,3,24,9,12,72,20,172,0,30,
172,0,10,16,10,32,10,3,10,35,175,5,25,175,15,4,0,63,237,220,237,1,47,93,237,
220,237,49,48,0,43,43,43,43,1,20,14,2,35,34,46,2,53,52,62,2,51,50,30,2,7,
52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,2,184,45,78,105,59,59,104,78,46,
46,78,104,59,59,105,78,45,109,27,48,65,38,37,65,48,28,28,48,65,37,38,65,48,
27,4,121,59,104,77,45,45,77,104,59,60,104,77,44,44,77,104,60,37,66,49,28,
28,49,66,37,37,65,49,29,29,49,65,0,0,0,2,0,65,0,0,4,36,4,195,0,11,0,15,0,
85,64,53,13,222,4,1,140,4,1,4,2,14,209,11,1,131,11,1,11,9,1,170,6,32,2,1,
2,13,173,12,151,2,1,2,0,4,173,9,152,7,1,7,239,5,1,80,5,128,5,160,5,208,5,
4,5,0,47,93,93,51,93,51,237,50,50,93,47,237,1,47,93,51,253,50,222,93,93,196,
16,222,93,93,196,49,48,1,17,35,17,33,53,33,17,51,17,33,21,1,53,33,21,2,124,
147,254,88,1,168,147,1,168,252,29,3,227,2,168,254,117,1,139,145,1,138,254,
118,145,253,88,145,145,0,0,1,0,41,2,51,2,131,5,141,0,34,0,142,64,56,6,18,
1,6,17,1,6,12,1,106,31,122,31,138,31,3,89,15,105,15,2,106,14,1,73,14,89,14,
2,10,3,26,3,2,10,2,26,2,58,2,74,2,4,58,17,90,17,106,17,3,6,23,22,23,2,23,
184,255,224,64,40,9,15,72,33,25,225,32,8,1,32,8,96,8,160,8,224,8,4,8,14,224,
15,15,32,191,0,1,0,8,32,14,11,228,20,222,1,32,229,0,223,0,63,237,50,63,237,
51,18,57,1,47,93,51,51,47,237,47,93,113,237,50,49,48,43,0,93,93,1,93,93,0,
93,93,93,93,1,113,113,113,19,39,62,5,53,52,38,35,34,6,7,39,62,3,51,50,30,
2,21,20,14,4,7,33,21,43,2,27,88,100,103,82,52,71,74,68,88,8,133,6,46,76,107,
68,65,103,71,37,54,83,102,95,78,18,1,187,2,51,103,61,96,81,72,73,80,49,62,
75,73,68,8,51,87,64,37,33,60,86,54,62,100,86,75,73,74,42,113,0,0,1,0,27,2,
39,2,130,5,141,0,53,0,150,64,17,102,6,1,102,8,1,86,9,102,9,2,89,34,105,34,
2,42,184,255,232,64,80,11,15,72,2,32,9,13,72,48,45,21,21,15,8,28,225,45,45,
0,225,32,15,96,15,2,32,15,96,15,160,15,224,15,4,15,34,225,8,35,1,35,35,9,
225,191,8,1,8,64,24,37,72,8,49,21,228,22,22,12,105,34,1,72,34,88,34,2,34,
31,228,40,222,12,228,71,9,1,9,3,221,0,63,51,93,237,63,237,51,93,93,18,57,
47,237,57,1,47,43,93,237,51,47,113,237,47,93,113,237,50,47,237,17,18,57,47,
18,57,49,48,0,43,43,93,93,93,93,1,20,6,35,34,46,2,39,55,30,1,51,50,54,53,
52,46,2,43,1,53,51,50,62,2,53,52,38,35,34,6,7,39,62,3,51,50,30,2,21,20,6,
7,21,30,3,2,130,155,142,87,116,73,36,6,136,9,88,85,77,83,37,56,67,29,61,57,
29,61,50,32,74,71,68,84,6,135,7,50,79,102,59,69,104,70,35,86,90,52,75,48,
22,3,27,116,128,39,64,81,43,13,67,69,72,76,45,54,29,9,109,13,31,53,40,60,
69,70,65,12,58,86,57,28,33,59,79,46,75,110,20,2,5,37,54,69,0,0,1,0,72,4,177,
1,240,5,228,0,5,0,55,64,37,70,4,1,122,2,138,2,2,128,3,1,3,64,143,0,1,0,64,
9,13,72,0,2,149,128,15,0,47,0,63,0,127,0,239,0,5,0,0,47,93,26,237,1,47,43,
93,26,205,93,49,48,93,93,19,53,19,51,21,1,72,217,207,254,182,4,177,20,1,31,
29,254,234,0,1,0,140,254,87,4,109,4,58,0,39,0,136,64,74,29,32,9,17,72,138,
37,154,37,2,108,37,124,37,2,37,24,14,17,72,22,22,13,70,64,31,79,12,1,127,
12,143,12,159,12,3,12,64,32,35,72,12,64,20,23,72,0,12,1,12,41,128,39,2,70,
0,1,16,1,48,1,224,1,240,1,5,8,1,96,41,128,41,2,41,184,255,192,64,17,20,23,
72,31,8,80,35,22,19,80,26,22,12,1,15,0,27,0,63,63,51,63,237,63,237,50,1,43,
93,47,94,93,237,50,26,16,220,93,43,43,93,113,50,26,237,50,47,49,48,43,0,93,
93,1,43,19,17,51,17,20,30,2,51,50,54,53,17,51,17,20,30,2,51,50,54,55,21,14,
1,35,34,46,2,39,35,14,1,35,34,38,39,17,140,181,32,58,84,52,128,146,180,11,
20,29,18,11,32,11,26,51,36,54,71,44,20,2,3,52,147,100,67,109,31,254,87,5,
227,253,82,78,106,65,28,174,162,2,115,252,208,44,56,32,13,5,3,129,8,12,30,
52,71,41,95,99,41,38,254,28,0,0,0,0,1,0,80,254,248,3,245,5,129,0,19,0,61,
64,39,12,1,15,2,191,2,207,2,3,2,5,95,6,111,6,127,6,175,6,191,6,5,0,6,16,6,
48,6,3,6,7,7,1,0,4,17,3,6,1,0,47,51,63,205,50,18,57,47,1,47,93,93,205,220,
93,205,47,49,48,1,17,35,17,35,17,35,17,34,46,2,53,52,62,2,51,33,21,3,116,
112,217,113,80,133,96,53,50,95,138,87,2,51,5,27,249,221,6,35,249,221,3,190,
45,88,133,89,84,133,93,50,102,0,0,1,0,187,1,190,1,126,2,154,0,3,0,38,64,24,
3,150,0,0,16,0,176,0,3,7,0,0,155,15,1,31,1,2,1,64,15,38,72,1,0,47,43,93,237,
1,47,94,93,237,49,48,19,53,51,21,187,195,1,190,220,220,0,0,0,1,0,119,254,
78,1,227,0,0,0,27,0,126,64,16,24,32,20,23,72,25,32,20,23,72,70,26,86,26,2,
2,184,255,232,179,9,17,72,27,184,255,224,64,62,9,17,72,24,16,25,32,25,48,
25,3,25,131,23,22,22,8,16,131,47,0,1,31,0,1,15,0,111,0,2,8,0,239,8,1,8,19,
25,64,9,13,72,25,25,5,23,11,140,32,5,80,5,96,5,112,5,176,5,192,5,6,5,0,47,
93,237,47,18,57,47,43,205,1,47,93,221,94,93,113,114,237,18,57,47,51,237,93,
50,49,48,43,43,93,43,43,5,20,14,2,35,34,38,39,53,22,51,50,62,2,53,52,38,35,
42,1,7,55,51,7,30,1,1,227,30,65,104,75,20,45,25,49,37,41,56,35,15,61,72,14,
29,14,65,107,39,94,94,253,41,67,48,25,1,3,98,6,12,21,30,18,37,40,2,182,100,
3,81,0,0,1,0,80,2,51,2,125,5,129,0,10,0,75,64,44,32,5,48,5,2,96,9,1,9,9,8,
224,2,32,4,48,4,2,4,111,0,1,0,0,4,6,3,32,2,144,2,2,2,5,4,4,3,6,220,8,1,228,
0,223,0,63,237,50,63,51,51,47,51,1,47,93,23,51,47,93,47,0,93,1,16,237,50,
47,93,49,48,0,93,19,53,51,17,7,53,55,51,17,51,21,80,211,202,210,123,215,2,
51,107,2,108,138,120,137,253,29,107,0,0,0,0,2,0,27,2,139,2,211,5,152,0,15,
0,35,0,130,185,0,13,255,232,179,7,12,72,9,184,255,224,64,43,7,12,72,4,32,
7,12,72,2,32,7,12,72,0,227,4,16,36,16,52,16,100,16,4,148,16,180,16,196,16,
212,16,244,16,5,128,16,1,2,0,16,1,16,184,255,192,64,38,12,16,72,16,26,227,
6,64,22,33,72,6,239,37,1,112,37,128,37,2,47,37,1,31,228,0,3,32,3,80,3,3,3,
3,21,228,11,222,0,63,237,51,47,93,237,1,93,93,93,47,43,237,47,43,93,95,93,
93,113,237,49,48,0,43,43,43,43,1,20,6,35,34,38,53,52,62,2,51,50,30,2,7,52,
46,2,35,34,14,2,21,20,30,2,51,50,62,2,2,211,176,175,168,177,43,87,131,88,
93,131,84,39,149,25,50,72,48,48,75,51,26,28,51,70,43,49,75,52,27,4,18,188,
203,201,190,91,145,101,53,53,100,145,92,83,110,65,27,27,66,110,82,84,110,
66,26,26,66,110,0,2,0,83,0,141,4,32,3,172,0,8,0,17,0,133,64,100,101,15,117,
15,133,15,3,101,9,117,9,133,9,3,101,6,117,6,133,6,3,101,0,117,0,133,0,3,13,
236,10,236,17,235,15,12,1,239,12,1,112,12,128,12,2,208,12,1,63,12,111,12,
127,12,3,0,12,1,12,4,236,1,236,8,235,112,3,128,3,176,3,3,176,3,208,3,2,63,
3,1,0,3,32,3,2,3,10,0,239,14,15,5,47,5,111,5,127,5,4,5,0,47,93,51,228,50,
1,47,93,93,93,113,253,237,237,47,93,93,93,113,113,114,253,237,237,49,48,93,
93,93,93,37,35,53,9,1,53,51,1,21,1,35,53,9,1,53,51,1,21,2,206,168,1,82,254,
176,166,1,82,252,221,170,1,82,254,176,168,1,79,141,29,1,111,1,116,31,254,
141,63,254,147,29,1,111,1,116,31,254,141,63,255,255,0,56,0,0,6,78,5,129,16,
38,0,121,232,0,16,39,2,20,2,249,0,0,17,7,2,141,3,184,253,207,0,31,64,18,1,
191,12,1,112,12,1,96,12,1,16,12,1,12,3,2,17,24,0,63,53,53,1,17,93,93,93,93,
53,0,0,0,255,255,0,56,0,0,6,117,5,129,16,38,0,121,232,0,16,39,2,20,2,249,
0,0,17,7,0,114,3,242,253,207,0,47,64,30,2,111,15,1,47,15,1,15,1,191,12,1,
112,12,1,96,12,1,16,12,1,12,51,64,11,11,72,2,15,24,0,63,53,1,43,17,93,93,
93,93,53,17,93,93,53,0,0,0,255,255,0,73,0,0,6,78,5,141,16,39,2,20,3,13,0,
0,16,39,2,141,3,184,253,207,17,6,0,115,46,0,0,33,64,20,0,112,0,1,96,0,1,16,
0,1,0,83,64,11,11,72,1,2,6,24,0,63,53,53,1,43,17,93,93,93,53,0,0,2,0,131,
254,164,4,86,4,58,0,37,0,41,0,159,64,112,121,4,137,4,2,122,35,138,35,2,122,
36,138,36,2,84,26,100,26,2,58,6,74,6,122,6,138,6,4,10,72,9,9,176,39,192,39,
2,39,150,40,40,0,28,70,95,27,127,27,2,27,64,29,60,72,27,64,23,27,72,32,27,
1,27,19,70,0,64,29,60,72,0,64,23,27,72,0,64,13,17,72,32,0,1,0,32,43,1,19,
33,9,40,156,41,15,67,27,1,27,24,95,47,33,63,33,2,111,33,207,33,2,33,0,47,
93,113,237,51,93,63,253,206,17,57,1,93,47,93,43,43,43,237,47,93,43,43,93,
237,18,57,47,237,113,51,47,237,49,48,93,0,93,1,93,0,93,1,93,55,52,62,6,55,
51,14,7,21,20,30,2,51,50,54,55,23,14,3,35,34,46,2,1,21,35,53,131,37,62,79,
82,79,63,39,1,175,2,39,62,78,80,77,60,37,42,77,109,67,140,164,14,184,11,67,
121,179,122,114,178,123,64,2,113,195,50,71,108,85,67,60,58,68,83,55,69,104,
80,63,57,57,70,88,59,59,92,63,32,140,122,12,84,149,112,65,56,103,147,4,100,
201,201,0,0,0,255,255,0,4,0,0,5,82,6,240,18,38,0,36,0,0,17,7,2,148,1,78,0,
0,0,21,180,2,21,5,38,2,184,255,225,180,22,25,4,7,37,1,43,53,0,43,53,0,255,
255,0,4,0,0,5,82,6,240,18,38,0,36,0,0,17,7,2,149,1,219,0,0,0,19,64,11,2,21,
5,38,2,76,21,24,4,7,37,1,43,53,0,43,53,0,0,0,255,255,0,4,0,0,5,82,6,254,18,
38,0,36,0,0,17,7,2,150,1,96,0,0,0,19,64,11,2,22,5,38,2,0,27,21,4,7,37,1,43,
53,0,43,53,0,0,0,255,255,0,4,0,0,5,82,7,6,18,38,0,36,0,0,17,7,2,153,1,94,
0,0,0,19,64,11,2,21,5,38,2,2,30,44,4,7,37,1,43,53,0,43,53,0,0,0,255,255,0,
4,0,0,5,82,6,178,18,38,0,36,0,0,17,7,2,152,1,108,0,0,0,23,64,13,3,2,21,5,
38,3,2,4,25,23,4,7,37,1,43,53,53,0,43,53,53,0,0,0,255,255,0,4,0,0,5,82,6,
251,18,38,0,36,0,0,17,7,1,76,1,137,0,136,0,22,64,12,3,2,56,3,3,2,3,31,21,
4,7,37,1,43,53,53,0,63,53,53,0,2,0,24,0,0,7,168,5,129,0,15,0,26,0,136,64,
86,116,25,1,114,2,1,86,2,102,2,2,115,3,131,3,2,85,3,101,3,2,127,5,143,5,2,
109,5,1,92,5,1,25,5,41,5,2,0,7,1,11,7,11,7,0,16,14,32,14,2,14,2,25,3,17,3,
4,17,9,13,90,26,5,0,2,95,25,25,5,4,12,95,9,9,13,16,8,95,5,3,4,18,13,95,0,
18,0,63,237,63,63,237,50,18,57,47,237,17,18,57,47,237,1,47,51,51,237,50,51,
47,51,17,18,57,57,47,93,18,57,57,47,47,113,49,48,93,93,93,93,93,93,93,93,
93,33,17,33,3,35,1,33,21,33,17,33,21,33,17,33,21,1,35,14,5,7,3,33,3,201,253,
220,198,199,2,174,4,185,253,9,2,187,253,69,3,32,252,33,151,1,16,22,27,24,
18,2,217,1,222,1,156,254,100,5,129,156,254,60,154,254,21,156,4,238,3,35,50,
58,51,38,5,254,51,0,0,255,255,0,104,254,78,5,121,5,150,18,38,0,38,0,0,17,
7,0,120,1,254,0,0,0,11,182,1,58,48,40,26,16,37,1,43,53,0,0,0,255,255,0,168,
0,0,4,254,6,240,18,38,0,40,0,0,17,7,2,148,1,63,0,0,0,21,180,1,12,5,38,1,184,
255,170,180,13,16,0,10,37,1,43,53,0,43,53,0,255,255,0,168,0,0,4,254,6,240,
18,38,0,40,0,0,17,7,2,149,1,223,0,0,0,19,64,11,1,12,5,38,1,40,12,15,0,10,
37,1,43,53,0,43,53,0,0,0,255,255,0,168,0,0,4,254,6,254,18,38,0,40,0,0,17,
7,2,150,1,119,0,0,0,21,180,1,13,5,38,1,184,255,239,180,18,12,0,10,37,1,43,
53,0,43,53,0,255,255,0,168,0,0,4,254,6,178,18,38,0,40,0,0,17,7,2,152,1,121,
0,0,0,25,182,2,1,12,5,38,2,1,184,255,234,180,16,14,0,10,37,1,43,53,53,0,43,
53,53,0,255,255,0,9,0,0,1,177,6,240,18,38,0,44,0,0,17,6,2,148,159,0,0,21,
180,1,4,5,38,1,184,255,193,180,5,8,0,2,37,1,43,53,0,43,53,0,0,0,255,255,0,
142,0,0,2,54,6,240,18,38,0,44,0,0,17,6,2,149,70,0,0,19,64,11,1,4,5,38,1,69,
4,7,0,2,37,1,43,53,0,43,53,0,255,255,255,210,0,0,2,104,6,254,18,38,0,44,0,
0,17,6,2,150,210,0,0,19,64,11,1,5,5,38,1,0,10,4,0,2,37,1,43,53,0,43,53,0,
255,255,0,7,0,0,2,52,6,178,18,38,0,44,0,0,17,6,2,152,218,0,0,23,64,13,2,1,
4,5,38,2,1,1,8,6,0,2,37,1,43,53,53,0,43,53,53,0,0,2,0,14,0,0,5,101,5,129,
0,16,0,33,0,112,64,69,117,10,1,91,32,139,32,2,91,31,139,31,2,90,20,138,20,
2,91,19,1,10,31,26,31,2,10,20,26,20,2,26,26,28,8,90,64,15,17,1,17,35,128,
24,28,90,14,16,16,1,14,27,16,95,24,127,0,1,0,0,2,28,95,14,18,23,95,2,3,0,
63,237,63,237,17,57,47,113,51,237,50,1,47,51,51,47,16,237,50,26,16,220,113,
26,237,18,57,47,49,48,93,93,93,0,93,1,93,93,0,93,19,51,17,33,50,4,22,18,21,
20,2,14,1,35,33,17,35,37,52,46,2,35,33,17,33,21,33,17,33,50,62,2,14,154,1,
210,163,1,19,198,111,106,184,251,145,253,241,154,4,151,82,148,206,123,254,
241,1,150,254,106,1,58,111,189,138,78,3,33,2,96,81,169,254,252,180,176,254,
243,181,93,2,135,72,143,203,130,61,254,57,154,254,18,72,142,212,0,255,255,
0,168,0,0,5,32,7,6,18,38,0,49,0,0,17,7,2,153,1,161,0,0,0,19,64,11,1,20,5,
38,1,12,29,43,8,18,37,1,43,53,0,43,53,0,0,0,255,255,0,97,255,236,5,215,6,
240,18,38,0,50,0,0,17,7,2,148,1,182,0,0,0,21,180,2,40,5,38,2,184,255,216,
180,41,44,10,0,37,1,43,53,0,43,53,0,255,255,0,97,255,236,5,215,6,240,18,38,
0,50,0,0,17,7,2,149,2,37,0,0,0,19,64,11,2,40,5,38,2,37,40,43,10,0,37,1,43,
53,0,43,53,0,0,0,255,255,0,97,255,236,5,215,6,254,18,38,0,50,0,0,17,7,2,150,
1,213,0,0,0,19,64,11,2,41,5,38,2,4,46,40,10,0,37,1,43,53,0,43,53,0,0,0,255,
255,0,97,255,236,5,215,7,6,18,38,0,50,0,0,17,7,2,153,1,193,0,0,0,21,180,2,
40,5,38,2,184,255,245,180,49,63,10,0,37,1,43,53,0,43,53,0,255,255,0,97,255,
236,5,215,6,178,18,38,0,50,0,0,17,7,2,152,1,215,0,0,0,25,182,3,2,40,5,38,
3,2,184,255,255,180,44,42,10,0,37,1,43,53,53,0,43,53,53,0,0,1,0,142,0,225,
4,31,4,115,0,11,0,129,185,0,5,255,232,179,18,22,72,3,184,255,232,64,14,18,
22,72,11,24,18,22,72,9,24,18,22,72,8,184,255,232,179,18,22,72,6,184,255,232,
64,14,18,22,72,2,24,18,22,72,0,24,18,22,72,7,184,255,232,64,14,18,22,72,1,
24,18,22,72,10,24,18,22,72,4,184,255,232,64,23,18,22,72,212,4,228,4,2,180,
4,196,4,212,4,3,32,4,1,4,0,7,1,7,0,25,47,113,1,47,93,93,113,49,48,0,43,43,
1,43,43,43,43,43,43,0,43,43,43,43,19,9,1,55,9,1,23,9,1,7,9,1,142,1,98,254,
160,104,1,94,1,94,105,254,162,1,96,102,254,159,254,156,1,74,1,98,1,96,103,
254,159,1,95,105,254,164,254,160,105,1,97,254,157,0,3,0,71,255,203,5,244,
5,186,0,27,0,39,0,51,0,196,64,141,89,44,1,8,37,1,84,33,1,5,26,21,26,101,26,
3,139,23,1,123,22,139,22,2,108,22,1,90,22,1,105,16,1,10,12,26,12,2,132,9,
1,116,8,132,8,2,99,8,1,85,8,1,27,50,91,50,2,114,43,130,43,2,84,43,1,20,38,
84,38,2,85,37,1,140,31,1,74,31,90,31,122,31,3,4,21,20,21,100,21,3,11,7,27,
7,107,7,3,32,44,40,0,91,64,15,28,1,28,53,128,32,53,1,40,91,175,14,191,14,
2,32,14,1,15,14,31,14,2,14,43,31,35,47,95,23,19,4,35,95,9,5,19,0,63,51,237,
63,51,237,17,57,57,1,47,93,93,93,237,93,26,16,220,113,26,237,18,57,57,49,
48,0,93,93,93,93,93,93,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93,93,
93,1,20,2,6,4,35,34,38,39,7,35,55,38,2,53,52,18,54,36,51,50,22,23,55,51,7,
22,18,7,52,38,39,1,30,1,51,50,62,2,37,20,22,23,1,46,1,35,34,14,2,5,215,95,
180,254,252,165,127,206,81,120,190,200,88,86,92,178,1,5,169,125,207,82,121,
192,201,85,87,195,49,49,253,59,59,150,93,132,191,123,59,252,15,50,51,2,195,
59,151,92,126,190,127,63,2,199,165,254,242,192,104,58,54,145,241,97,1,10,
160,165,1,10,187,101,56,54,146,242,94,254,253,160,112,184,72,252,171,44,47,
86,153,212,125,113,190,75,3,85,42,46,80,148,208,0,0,255,255,0,158,255,236,
5,41,6,240,18,38,0,56,0,0,17,7,2,148,1,141,0,0,0,21,180,1,26,5,38,1,184,255,
232,180,27,30,5,20,37,1,43,53,0,43,53,0,255,255,0,158,255,236,5,41,6,240,
18,38,0,56,0,0,17,7,2,149,1,237,0,0,0,19,64,11,1,26,5,38,1,37,26,29,5,20,
37,1,43,53,0,43,53,0,0,0,255,255,0,158,255,236,5,41,6,254,18,38,0,56,0,0,
17,7,2,150,1,152,0,0,0,19,64,11,1,27,5,38,1,0,32,26,5,20,37,1,43,53,0,43,
53,0,0,0,255,255,0,158,255,236,5,41,6,178,18,38,0,56,0,0,17,7,2,152,1,158,
0,0,0,25,182,2,1,26,5,38,2,1,184,255,254,180,30,28,5,20,37,1,43,53,53,0,43,
53,53,0,255,255,0,45,0,0,5,41,6,240,18,38,0,60,0,0,17,7,2,149,1,208,0,0,0,
19,64,11,1,9,5,38,1,65,9,12,4,8,37,1,43,53,0,43,53,0,0,0,0,2,0,168,0,0,4,
234,5,129,0,16,0,27,0,95,64,63,150,15,1,116,26,132,26,2,123,18,139,18,2,0,
90,16,17,48,17,144,17,3,255,17,1,0,17,16,17,32,17,64,17,4,17,22,11,7,90,0,
8,16,8,64,8,3,7,8,22,95,6,21,95,11,6,11,6,11,7,9,3,7,18,0,63,63,18,57,57,
47,47,16,237,16,237,1,47,94,93,237,50,50,47,93,93,113,237,49,48,0,93,93,93,
1,20,14,2,35,33,17,35,17,51,21,33,50,30,2,7,52,38,35,33,17,33,50,62,2,4,234,
59,121,182,123,254,98,191,191,1,146,125,186,124,62,192,164,164,254,133,1,
131,82,121,79,38,2,223,88,159,120,71,254,215,5,129,252,60,111,156,99,134,
149,253,192,44,79,107,0,0,0,0,1,0,142,255,236,4,143,5,204,0,67,0,214,64,150,
149,51,1,133,63,149,63,2,133,47,149,47,2,133,46,149,46,2,118,65,1,118,56,
1,83,26,131,26,147,26,3,92,39,108,39,124,39,3,107,22,1,58,22,1,145,52,1,21,
52,37,52,2,22,66,38,66,118,66,3,26,3,42,3,2,61,72,24,54,72,31,32,24,1,31,
31,1,9,24,31,31,24,9,3,43,0,72,64,48,17,160,17,2,160,17,176,17,2,17,69,128,
42,70,0,43,16,43,48,43,3,8,43,112,69,1,63,69,79,69,2,212,31,1,197,31,1,182,
31,1,219,17,1,202,17,1,185,17,1,31,17,5,36,80,49,0,43,21,14,80,5,22,0,63,
237,63,63,237,18,57,57,93,93,93,93,93,93,1,93,93,47,94,93,237,26,16,220,93,
113,26,237,18,23,57,47,47,47,93,93,16,237,16,237,49,48,0,93,1,93,93,93,93,
93,0,93,93,1,93,93,0,93,93,93,93,1,20,14,2,35,34,38,47,1,30,3,51,50,54,53,
52,46,4,53,52,62,4,53,52,46,2,35,34,14,2,21,17,35,17,52,62,2,51,50,30,2,21,
20,14,4,21,20,30,4,4,143,41,87,136,94,80,148,55,2,25,67,74,78,37,92,98,54,
81,95,81,54,33,49,58,49,33,33,63,90,57,68,107,73,39,180,63,120,174,110,102,
155,105,53,33,51,58,51,33,55,82,95,82,55,1,39,66,115,85,49,25,24,164,14,25,
19,11,86,79,56,77,62,57,73,98,73,51,73,58,48,52,63,43,37,62,45,26,35,77,122,
88,252,3,4,3,118,173,112,54,46,80,109,62,61,90,69,53,47,48,28,38,59,57,64,
85,114,0,0,0,255,255,0,87,255,236,4,115,5,228,18,38,0,68,0,0,17,7,0,67,0,
188,0,0,0,21,180,2,66,17,38,2,184,255,149,180,67,70,3,36,37,1,43,53,0,43,
53,0,255,255,0,87,255,236,4,115,5,228,18,38,0,68,0,0,17,7,0,116,1,84,0,0,
0,19,64,11,2,66,17,38,2,11,66,69,3,36,37,1,43,53,0,43,53,0,0,0,255,255,0,
87,255,236,4,115,5,211,18,38,0,68,0,0,17,7,1,71,0,218,0,0,0,21,180,2,67,17,
38,2,184,255,192,180,72,66,3,36,37,1,43,53,0,43,53,0,255,255,0,87,255,236,
4,115,5,189,18,38,0,68,0,0,17,7,1,78,0,245,0,0,0,21,180,2,66,17,38,2,184,
255,224,180,75,89,3,36,37,1,43,53,0,43,53,0,255,255,0,87,255,236,4,115,5,
123,18,38,0,68,0,0,17,7,0,105,0,235,0,0,0,25,182,3,2,66,17,38,3,2,184,255,
202,180,70,68,3,36,37,1,43,53,53,0,43,53,53,0,255,255,0,87,255,236,4,115,
6,115,18,38,0,68,0,0,17,7,1,76,1,8,0,0,0,25,182,3,2,71,17,38,3,2,184,255,
200,180,76,66,3,36,37,1,43,53,53,0,43,53,53,0,0,3,0,66,255,236,6,194,4,78,
0,62,0,79,0,88,0,251,64,96,134,54,1,122,36,1,123,58,1,117,8,133,8,2,101,68,
117,68,133,68,3,124,86,1,106,86,1,126,81,1,106,81,1,101,4,117,4,2,41,47,1,
41,44,1,24,40,9,13,72,10,28,26,28,2,17,53,88,1,70,33,31,79,79,79,95,79,127,
79,4,79,79,80,25,9,73,10,10,61,71,64,31,80,47,80,63,80,3,144,80,1,80,90,128,
44,71,45,184,255,192,64,19,21,28,72,45,45,71,71,25,64,12,15,72,25,62,80,80,
80,6,53,184,255,184,64,43,17,73,53,83,80,56,16,63,81,33,33,74,50,143,44,1,
43,44,1,44,44,39,80,50,16,17,74,80,22,22,6,80,15,239,9,1,128,9,1,9,9,15,22,
0,63,51,47,93,93,16,237,63,237,50,63,237,51,47,93,93,17,18,57,47,237,63,237,
50,43,18,57,47,237,1,47,43,237,51,47,43,237,26,16,220,93,113,26,237,50,47,
237,17,18,57,47,93,51,237,50,57,57,49,48,93,43,0,93,93,1,93,0,93,93,93,93,
1,93,0,93,1,93,0,93,93,1,21,30,3,51,50,54,55,23,14,3,35,32,3,14,3,35,34,38,
53,52,62,4,63,1,53,52,46,2,35,34,14,2,7,39,62,3,51,50,22,23,62,1,51,50,30,
2,29,1,37,7,14,5,21,20,22,51,50,62,2,53,37,46,1,35,34,14,2,7,3,200,1,34,70,
109,78,117,141,25,158,17,61,102,153,108,254,191,102,29,74,102,137,93,167,
169,38,67,91,107,117,60,240,26,57,88,61,54,88,64,39,7,188,10,58,105,159,112,
128,172,49,63,177,106,136,183,111,47,252,80,195,40,81,76,66,49,28,100,93,
90,129,83,40,2,246,15,144,135,45,96,81,54,4,1,247,17,82,136,98,55,94,72,45,
45,91,73,47,1,1,51,93,71,42,172,150,71,108,78,51,32,13,1,4,59,67,94,58,27,
15,39,67,51,17,64,107,78,43,70,69,74,65,88,155,210,122,24,31,4,1,6,18,31,
51,73,51,87,97,63,98,116,53,196,171,157,29,74,127,98,255,255,0,87,254,78,
3,202,4,78,18,38,0,70,0,0,17,7,0,120,1,12,0,0,0,11,182,1,40,48,40,19,9,37,
1,43,53,0,0,0,255,255,0,87,255,236,4,24,5,228,18,38,0,72,0,0,17,7,0,67,0,
221,0,0,0,21,180,2,38,17,38,2,184,255,228,180,39,42,17,27,37,1,43,53,0,43,
53,0,255,255,0,87,255,236,4,24,5,228,18,38,0,72,0,0,17,7,0,116,1,112,0,0,
0,19,64,11,2,38,17,38,2,84,38,41,17,27,37,1,43,53,0,43,53,0,0,0,255,255,0,
87,255,236,4,24,5,211,18,38,0,72,0,0,17,7,1,71,0,245,0,0,0,19,64,11,2,39,
17,38,2,8,44,38,17,27,37,1,43,53,0,43,53,0,0,0,255,255,0,87,255,236,4,24,
5,123,18,38,0,72,0,0,17,7,0,105,0,248,0,0,0,23,64,13,3,2,38,17,38,3,2,4,42,
40,17,27,37,1,43,53,53,0,43,53,53,0,0,0,255,255,0,10,0,0,1,178,5,228,18,38,
0,241,0,0,17,6,0,67,160,0,0,21,180,1,4,17,38,1,184,255,194,180,5,8,0,2,37,
1,43,53,0,43,53,0,0,0,255,255,0,135,0,0,2,47,5,228,18,38,0,241,0,0,17,6,0,
116,63,0,0,19,64,11,1,4,17,38,1,63,4,7,0,2,37,1,43,53,0,43,53,0,255,255,255,
211,0,0,2,105,5,211,18,38,0,241,0,0,17,6,1,71,211,0,0,19,64,11,1,5,17,38,
1,2,10,4,0,2,37,1,43,53,0,43,53,0,255,255,0,8,0,0,2,53,5,123,18,38,0,241,
0,0,17,6,0,105,219,0,0,23,64,13,2,1,4,17,38,2,1,2,8,6,0,2,37,1,43,53,53,0,
43,53,53,0,0,2,0,86,255,236,4,39,5,234,0,39,0,57,0,190,64,94,100,51,1,100,
56,1,107,42,1,107,48,1,10,14,26,14,2,37,17,53,17,69,17,3,6,8,22,8,2,23,26,
29,3,50,15,28,31,28,2,28,28,50,35,71,40,64,19,16,13,3,40,17,64,14,19,72,22,
5,17,17,5,144,40,1,144,40,160,40,2,40,59,128,50,71,31,5,1,5,26,19,29,16,4,
17,27,27,22,45,80,13,80,10,1,10,184,255,192,64,28,7,10,72,82,17,1,36,17,52,
17,68,17,3,2,17,18,17,2,10,17,10,17,22,0,53,80,0,22,0,63,237,63,57,57,47,
47,93,93,93,43,93,51,237,17,51,47,18,23,57,1,47,93,237,26,16,204,93,113,17,
57,47,18,57,43,18,23,57,26,16,237,17,57,47,93,18,23,57,49,48,0,93,93,1,93,
0,93,93,93,93,5,34,46,2,53,52,62,2,51,50,22,23,46,1,39,5,53,55,46,1,39,51,
30,1,23,37,15,1,30,3,29,1,20,14,2,19,52,46,2,35,34,14,2,21,20,22,51,50,62,
2,2,54,125,181,118,56,52,116,186,133,71,117,43,43,115,76,254,211,218,56,120,
66,209,45,83,42,1,50,1,211,81,129,88,47,57,120,188,176,33,71,113,80,81,115,
73,33,144,145,81,118,75,36,20,73,132,185,111,107,182,134,75,32,27,86,176,
69,133,114,94,45,78,35,20,51,31,132,112,92,74,176,200,223,121,6,122,196,138,
74,1,245,94,137,90,44,45,92,137,91,190,178,44,90,139,0,255,255,0,140,0,0,
3,242,5,189,18,38,0,81,4,0,17,7,1,78,0,245,0,0,0,19,64,11,1,38,17,38,1,5,
47,61,19,36,37,1,43,53,0,43,53,0,0,0,255,255,0,86,255,236,4,29,5,228,18,38,
0,82,0,0,17,7,0,67,0,223,0,0,0,21,180,2,35,17,38,2,184,255,228,180,36,39,
8,0,37,1,43,53,0,43,53,0,255,255,0,86,255,236,4,29,5,228,18,38,0,82,0,0,17,
7,0,116,1,103,0,0,0,19,64,11,2,35,17,38,2,73,35,38,8,0,37,1,43,53,0,43,53,
0,0,0,255,255,0,86,255,236,4,29,5,211,18,38,0,82,0,0,17,7,1,71,0,240,0,0,
0,19,64,11,2,36,17,38,2,1,41,35,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,86,
255,236,4,29,5,189,18,38,0,82,0,0,17,7,1,78,0,247,0,0,0,19,64,11,2,35,17,
38,2,13,44,58,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,86,255,236,4,29,5,123,
18,38,0,82,0,0,17,7,0,105,0,250,0,0,0,23,64,13,3,2,35,17,38,3,2,4,39,37,8,
0,37,1,43,53,53,0,43,53,53,0,0,0,0,3,0,65,0,223,4,36,4,117,0,3,0,7,0,11,0,
75,64,48,3,11,171,0,8,8,4,128,6,160,6,2,95,6,1,32,6,1,6,63,4,95,4,111,4,3,
4,9,174,64,8,144,8,2,8,4,173,5,0,174,79,1,159,1,2,1,5,179,0,63,222,93,237,
16,253,222,93,237,1,47,93,47,93,93,93,18,57,47,51,237,50,49,48,1,53,51,21,
1,53,33,21,1,53,51,21,1,222,168,253,187,3,227,253,186,168,3,190,183,183,254,
162,146,146,254,127,183,183,0,0,3,0,44,255,218,4,180,4,92,0,22,0,34,0,45,
0,161,64,93,117,33,133,33,2,117,27,133,27,2,122,38,138,38,2,122,44,138,44,
2,150,16,1,66,16,1,77,5,1,68,21,1,75,10,1,27,38,35,0,71,64,15,23,207,23,2,
159,23,175,23,255,23,3,23,47,128,35,71,0,12,1,0,12,16,12,32,12,64,12,240,
12,5,7,12,144,47,160,47,240,47,3,224,47,1,223,47,1,0,47,32,47,2,47,184,255,
192,64,16,13,21,72,37,26,30,41,80,18,14,16,30,80,7,3,22,0,63,51,237,63,51,
237,17,57,57,1,43,93,93,93,113,47,94,93,113,237,26,16,220,93,113,26,237,18,
57,57,49,48,93,93,0,93,93,93,93,1,93,93,0,93,1,16,2,35,34,38,39,7,35,55,46,
1,53,16,33,50,22,23,55,51,7,30,1,7,52,38,39,1,30,1,51,50,62,2,37,20,23,1,
46,1,35,34,14,2,4,88,250,238,97,156,60,100,167,184,41,42,1,229,103,156,57,
91,167,173,42,39,189,12,11,254,29,38,105,62,69,112,78,42,253,179,24,1,226,
37,104,66,69,111,78,41,2,30,254,228,254,234,48,50,116,214,68,182,116,2,48,
46,45,105,201,69,185,119,68,109,44,253,206,49,39,39,98,166,126,130,85,2,49,
45,36,41,99,164,0,255,255,0,139,255,236,3,241,5,228,18,38,0,88,6,0,17,7,0,
67,0,236,0,0,0,21,180,1,38,17,38,1,184,255,236,180,39,42,36,19,37,1,43,53,
0,43,53,0,255,255,0,139,255,236,3,241,5,228,18,38,0,88,6,0,17,7,0,116,1,87,
0,0,0,19,64,11,1,38,17,38,1,53,38,41,36,19,37,1,43,53,0,43,53,0,0,0,255,255,
0,139,255,236,3,241,5,211,18,38,0,88,6,0,17,7,1,71,0,239,0,0,0,21,180,1,39,
17,38,1,184,255,252,180,44,38,36,19,37,1,43,53,0,43,53,0,255,255,0,139,255,
236,3,241,5,123,18,38,0,88,6,0,17,7,0,105,0,237,0,0,0,25,182,2,1,38,17,38,
2,1,184,255,243,180,42,40,36,19,37,1,43,53,53,0,43,53,53,0,255,255,0,5,254,
87,3,252,5,228,18,38,0,92,0,0,17,7,0,116,1,27,0,0,0,19,64,11,1,32,17,38,1,
54,32,35,17,31,37,1,43,53,0,43,53,0,0,0,0,2,0,138,254,87,4,29,5,204,0,34,
0,54,0,109,64,76,102,52,118,52,2,105,38,121,38,2,73,25,89,25,2,70,10,86,10,
2,25,21,41,21,137,21,153,21,4,22,15,38,15,134,15,150,15,4,18,71,64,160,35,
1,35,56,128,45,7,33,70,0,34,16,34,48,34,240,34,4,8,34,33,27,26,50,80,23,22,
7,40,80,13,16,0,0,0,63,63,237,50,63,237,50,63,1,47,94,93,237,50,50,26,16,
220,93,26,237,49,48,0,93,93,93,93,93,93,19,51,17,20,6,7,6,7,51,62,3,51,50,
30,2,21,20,14,2,35,34,38,39,35,30,3,21,17,35,1,52,46,2,35,34,14,2,21,20,30,
2,51,50,62,2,138,180,1,1,1,1,6,25,64,82,101,63,112,153,93,40,40,93,153,112,
116,174,46,5,1,1,1,1,180,2,214,24,59,98,74,60,106,79,46,38,73,108,70,75,99,
59,24,5,204,254,89,30,55,21,25,22,52,73,47,21,80,145,205,125,123,208,150,
85,88,100,2,32,48,59,29,254,89,3,199,100,156,108,56,34,96,169,135,115,159,
98,43,58,110,159,255,255,0,5,254,87,3,252,5,123,18,38,0,92,0,0,17,7,0,105,
0,187,0,0,0,25,182,2,1,32,17,38,2,1,184,255,254,180,36,34,17,31,37,1,43,53,
53,0,43,53,53,0,255,255,0,4,0,0,5,82,6,161,18,38,0,36,0,0,17,7,1,73,1,104,
1,78,0,19,64,11,2,21,5,38,2,2,22,21,4,7,37,1,43,53,0,43,53,0,0,0,255,255,
0,87,255,236,4,115,5,83,18,38,0,68,0,0,17,7,1,73,0,233,0,0,0,21,180,2,66,
17,38,2,184,255,202,180,67,66,3,36,37,1,43,53,0,43,53,0,255,255,0,4,0,0,5,
82,6,243,18,38,0,36,0,0,17,7,2,155,1,121,0,0,0,19,64,11,2,21,5,38,2,3,26,
34,4,7,37,1,43,53,0,43,53,0,0,0,255,255,0,87,255,236,4,115,5,230,18,38,0,
68,0,0,17,7,1,74,1,7,0,0,0,21,180,2,66,17,38,2,184,255,204,180,71,83,3,36,
37,1,43,53,0,43,53,0,255,255,0,4,254,96,5,99,5,129,18,38,0,36,0,0,17,7,1,
77,3,181,0,11,0,13,185,0,2,255,207,180,33,33,7,7,37,43,53,0,255,255,0,87,
254,85,4,115,4,78,18,38,0,68,0,0,17,7,1,77,2,197,0,0,0,13,185,0,2,255,194,
180,78,78,36,36,37,43,53,0,255,255,0,104,255,236,5,121,6,240,18,38,0,38,0,
0,17,7,2,149,2,83,0,0,0,19,64,11,1,40,5,38,1,126,40,43,26,16,37,1,43,53,0,
43,53,0,0,0,255,255,0,87,255,236,3,202,5,228,18,38,0,70,0,0,17,7,0,116,1,
103,0,0,0,19,64,11,1,40,17,38,1,114,40,43,19,9,37,1,43,53,0,43,53,0,0,0,255,
255,0,104,255,236,5,121,6,254,18,38,0,38,0,0,17,7,2,150,1,204,0,0,0,19,64,
11,1,41,5,38,1,38,46,40,26,16,37,1,43,53,0,43,53,0,0,0,255,255,0,87,255,236,
3,202,5,211,18,38,0,70,0,0,17,7,1,71,0,208,0,0,0,19,64,11,1,41,17,38,1,10,
46,40,19,9,37,1,43,53,0,43,53,0,0,0,255,255,0,104,255,236,5,121,6,241,18,
38,0,38,0,0,17,7,1,75,2,34,1,37,0,19,64,11,1,40,5,38,1,39,40,42,26,16,37,
1,43,53,0,43,53,0,0,0,255,255,0,87,255,236,3,202,5,204,18,38,0,70,0,0,17,
7,1,75,1,44,0,0,0,11,182,1,17,40,42,19,9,37,1,43,53,0,0,0,255,255,0,104,255,
236,5,121,6,254,18,38,0,38,0,0,17,7,2,151,1,204,0,0,0,19,64,11,1,40,5,38,
1,38,42,48,26,16,37,1,43,53,0,43,53,0,0,0,255,255,0,87,255,236,3,202,5,211,
18,38,0,70,0,0,17,7,1,72,0,214,0,0,0,19,64,11,1,40,17,38,1,16,42,48,19,9,
37,1,43,53,0,43,53,0,0,0,255,255,0,168,0,0,5,101,6,254,18,38,0,39,0,0,17,
7,2,151,1,102,0,0,0,21,180,2,26,5,38,2,184,255,171,180,28,34,6,0,37,1,43,
53,0,43,53,0,255,255,0,86,255,236,4,255,5,204,16,38,0,71,0,0,17,7,2,146,3,
186,0,75,0,18,64,10,2,61,0,2,83,61,61,19,19,37,1,43,53,0,63,53,255,255,0,
14,0,0,5,101,5,129,18,6,0,144,0,0,0,2,0,86,255,236,4,109,5,204,0,39,0,59,
0,146,64,86,85,42,101,42,2,90,58,106,58,2,57,1,73,1,2,54,10,70,10,2,9,4,25,
4,121,4,137,4,4,6,7,22,7,118,7,134,7,4,25,27,70,64,20,6,0,21,50,3,18,61,128,
40,71,31,6,1,6,63,61,1,143,61,1,33,21,27,19,81,24,15,20,1,239,20,255,20,2,
20,20,8,22,0,11,55,80,8,184,255,192,64,10,9,13,72,8,16,0,45,80,3,22,0,63,
237,50,63,43,237,50,63,18,57,47,93,113,51,237,50,63,1,93,114,47,93,237,26,
16,220,23,50,17,57,26,237,50,49,48,0,93,93,93,93,93,93,37,14,1,35,34,2,17,
16,33,50,22,23,51,52,46,1,52,61,1,33,53,33,53,51,21,51,21,35,17,20,30,2,23,
35,46,3,53,1,20,30,2,51,50,62,2,53,52,46,2,35,34,14,2,3,53,50,165,122,205,
193,1,142,123,164,50,2,1,1,254,212,1,44,180,132,132,1,2,2,1,172,2,3,3,2,253,
218,28,62,96,69,71,109,73,38,38,74,107,70,66,96,64,31,174,104,90,1,20,1,24,
2,54,90,98,10,43,47,42,9,141,131,147,147,131,252,41,39,72,60,43,9,10,37,48,
53,26,1,112,112,160,103,48,46,103,166,120,115,159,98,43,46,102,163,0,0,255,
255,0,168,0,0,4,254,6,161,18,38,0,40,0,0,17,7,1,73,1,122,1,78,0,21,180,1,
12,5,38,1,184,255,237,180,13,12,0,10,37,1,43,53,0,43,53,0,255,255,0,87,255,
236,4,24,5,83,18,38,0,72,0,0,17,7,1,73,0,245,0,0,0,19,64,11,2,38,17,38,2,
3,39,38,17,27,37,1,43,53,0,43,53,0,0,0,255,255,0,168,0,0,4,254,6,243,18,38,
0,40,0,0,17,7,2,155,1,137,0,0,0,21,180,1,12,5,38,1,184,255,235,180,17,25,
0,10,37,1,43,53,0,43,53,0,255,255,0,87,255,236,4,24,5,230,18,38,0,72,0,0,
17,7,1,74,1,16,0,0,0,19,64,11,2,38,17,38,2,2,43,55,17,27,37,1,43,53,0,43,
53,0,0,0,255,255,0,168,0,0,4,254,6,241,18,38,0,40,0,0,17,7,1,75,1,201,1,37,
0,21,180,1,12,5,38,1,184,255,236,180,12,14,0,10,37,1,43,53,0,43,53,0,255,
255,0,87,255,236,4,24,5,204,18,38,0,72,0,0,17,7,1,75,1,68,0,0,0,12,182,2,
2,38,40,17,27,37,1,43,53,0,0,0,255,255,0,168,254,85,4,254,5,129,18,38,0,40,
0,0,17,7,1,77,3,80,0,0,0,13,185,0,1,255,194,180,24,24,11,11,37,43,53,0,255,
255,0,87,254,85,4,24,4,78,18,38,0,72,0,0,17,7,1,77,1,125,0,0,0,13,185,0,2,
254,242,180,50,50,9,9,37,43,53,0,255,255,0,168,0,0,4,254,6,254,18,38,0,40,
0,0,17,7,2,151,1,111,0,0,0,21,180,1,12,5,38,1,184,255,231,180,14,20,0,10,
37,1,43,53,0,43,53,0,255,255,0,87,255,236,4,24,5,211,18,38,0,72,0,0,17,7,
1,72,0,234,0,0,0,21,180,2,38,17,38,2,184,255,254,180,40,46,17,27,37,1,43,
53,0,43,53,0,255,255,0,103,255,236,5,160,6,254,18,38,0,42,0,0,17,7,2,150,
1,219,0,0,0,19,64,11,1,47,5,38,1,34,52,46,0,35,37,1,43,53,0,43,53,0,0,0,255,
255,0,86,254,87,3,239,5,211,18,38,0,74,0,0,17,7,1,71,0,216,0,0,0,19,64,11,
2,71,17,38,2,0,76,70,26,41,37,1,43,53,0,43,53,0,0,0,255,255,0,103,255,236,
5,160,6,243,18,38,0,42,0,0,17,7,2,155,1,246,0,0,0,19,64,11,1,46,5,38,1,39,
51,59,0,35,37,1,43,53,0,43,53,0,0,0,255,255,0,86,254,87,3,239,5,230,18,38,
0,74,0,0,17,7,1,74,0,249,0,0,0,19,64,11,2,70,17,38,2,0,75,87,26,41,37,1,43,
53,0,43,53,0,0,0,255,255,0,103,255,236,5,160,6,241,18,38,0,42,0,0,17,7,1,
75,2,53,1,37,0,19,64,11,1,46,5,38,1,39,46,48,0,35,37,1,43,53,0,43,53,0,0,
0,255,255,0,86,254,87,3,239,5,204,18,38,0,74,0,0,17,7,1,75,1,45,0,0,0,11,
182,2,0,70,72,26,41,37,1,43,53,0,0,0,255,255,0,103,254,78,5,160,5,150,18,
38,0,42,0,0,17,7,2,140,2,78,0,0,0,11,182,1,46,50,46,0,35,37,1,43,53,0,0,0,
255,255,0,86,254,87,3,239,6,32,16,38,0,74,0,0,17,7,2,147,1,56,0,0,0,21,180,
2,79,17,38,2,184,255,252,180,70,74,26,41,37,1,43,53,0,43,53,0,255,255,0,168,
0,0,5,32,6,254,18,38,0,43,0,0,17,7,2,150,1,153,0,0,0,19,64,11,1,13,5,38,1,
0,18,12,4,10,37,1,43,53,0,43,53,0,0,0,255,255,0,142,0,0,3,238,7,62,18,38,
0,75,0,0,17,7,2,150,0,242,0,64,0,21,180,1,35,2,38,1,184,255,255,180,40,34,
25,10,37,1,43,53,0,43,53,0,0,2,0,14,0,0,5,185,5,129,0,19,0,23,0,166,64,72,
23,11,3,90,8,7,4,4,20,4,2,7,4,16,15,19,90,20,12,59,0,1,4,0,1,56,164,0,1,155,
0,1,68,0,1,244,0,1,235,0,1,68,0,148,0,2,224,0,1,2,0,0,48,0,112,0,208,0,4,
7,0,32,25,1,160,25,176,25,192,25,3,25,184,255,192,64,36,14,17,72,47,25,1,
22,18,6,95,15,11,80,7,96,7,2,7,2,95,64,23,1,160,23,208,23,2,23,23,13,9,3,
4,0,18,0,63,50,63,51,57,47,93,113,237,220,93,50,50,237,50,50,1,93,43,93,113,
47,94,93,95,93,113,113,113,114,114,114,94,93,93,51,51,237,50,50,47,94,93,
51,51,237,50,50,49,48,33,17,33,17,35,17,35,53,51,53,51,21,33,53,51,21,51,
21,35,17,3,53,33,21,4,102,253,1,191,154,154,191,2,255,186,153,153,186,253,
1,2,141,253,115,4,1,154,230,230,230,230,154,251,255,3,45,212,212,0,1,0,10,
0,0,3,238,5,204,0,41,0,150,185,0,7,255,232,64,66,9,13,72,0,7,16,7,2,7,33,
24,11,70,64,80,12,1,159,12,255,12,2,12,43,128,32,36,24,70,29,28,192,25,1,
0,25,16,25,48,25,224,25,240,25,5,8,25,176,43,192,43,208,43,3,176,43,240,43,
2,255,43,1,112,43,1,43,184,255,192,64,19,19,23,72,35,27,81,32,28,28,5,30,
0,25,11,21,0,18,80,5,184,255,192,180,9,13,72,5,15,0,63,43,237,50,63,51,63,
18,57,47,51,237,50,1,43,93,93,113,114,47,94,93,113,51,51,237,50,50,26,16,
220,93,113,26,237,18,57,49,48,0,94,93,43,1,62,3,51,50,30,2,21,17,35,17,52,
46,2,35,34,14,2,21,17,35,17,35,53,51,53,51,21,33,21,33,21,20,14,2,7,1,61,
30,70,84,100,62,104,133,77,29,181,17,48,88,70,64,103,73,40,180,132,132,180,
1,44,254,212,2,3,2,1,3,89,55,77,50,23,56,101,140,84,253,87,2,134,69,104,69,
35,46,84,120,75,253,170,4,182,131,147,147,131,148,33,66,56,39,7,255,255,255,
184,0,0,2,133,7,6,18,38,0,44,0,0,17,6,2,153,207,0,0,19,64,11,1,4,5,38,1,2,
13,27,0,2,37,1,43,53,0,43,53,0,255,255,255,184,0,0,2,133,5,189,18,38,0,241,
0,0,17,6,1,78,207,0,0,19,64,11,1,4,17,38,1,2,13,27,0,2,37,1,43,53,0,43,53,
0,255,255,0,12,0,0,2,49,6,161,18,38,0,44,0,0,17,7,1,73,255,217,1,78,0,19,
64,11,1,4,5,38,1,2,5,4,0,2,37,1,43,53,0,43,53,0,0,0,255,255,0,12,0,0,2,49,
5,83,18,38,0,241,0,0,17,6,1,73,217,0,0,19,64,11,1,4,17,38,1,2,5,4,0,2,37,
1,43,53,0,43,53,0,255,255,255,210,0,0,2,108,6,243,18,38,0,44,0,0,17,6,2,155,
234,0,0,19,64,11,1,4,5,38,1,2,9,17,0,2,37,1,43,53,0,43,53,0,255,255,255,210,
0,0,2,108,5,230,18,38,0,241,0,0,17,6,1,74,245,0,0,19,64,11,1,4,17,38,1,3,
9,21,0,2,37,1,43,53,0,43,53,0,255,255,0,92,254,85,1,186,5,129,18,38,0,44,
0,0,17,6,1,77,12,0,0,10,182,1,0,16,16,3,3,37,43,53,0,0,255,255,0,31,254,85,
1,125,5,204,18,38,0,76,0,0,17,6,1,77,207,0,0,15,64,10,23,22,1,2,0,20,20,7,
7,37,43,53,93,0,255,255,0,189,0,0,1,124,6,241,18,38,0,44,0,0,17,7,1,75,0,
39,1,37,0,19,64,11,1,4,5,38,1,0,4,6,0,2,37,1,43,53,0,43,53,0,0,0,0,1,0,194,
0,0,1,118,4,58,0,3,1,137,64,24,3,70,4,0,36,0,2,9,0,0,4,5,52,5,1,0,5,16,5,
32,5,3,229,5,184,255,192,64,55,225,228,72,240,5,1,228,5,1,176,5,192,5,208,
5,3,132,5,148,5,164,5,3,64,5,1,52,5,1,0,5,16,5,32,5,3,212,5,228,5,244,5,3,
144,5,1,116,5,132,5,2,96,5,1,5,184,255,192,64,22,193,196,72,224,5,1,196,5,
212,5,2,176,5,1,20,5,36,5,52,5,3,5,184,255,192,183,182,185,72,0,5,1,175,5,
184,255,192,179,171,174,72,5,184,255,192,182,161,167,72,128,5,1,5,184,255,
192,64,38,150,156,72,208,5,1,100,5,116,5,164,5,180,5,196,5,5,32,5,1,4,5,20,
5,2,4,5,20,5,180,5,196,5,244,5,5,117,5,184,255,192,179,121,124,72,5,184,255,
192,179,110,113,72,5,184,255,192,64,24,99,102,72,224,5,1,180,5,196,5,212,
5,3,48,5,1,4,5,20,5,36,5,3,5,184,255,192,183,67,70,72,11,5,1,62,5,184,255,
192,64,9,56,59,72,203,5,219,5,2,5,184,255,192,64,42,45,48,72,27,5,43,5,2,
196,5,212,5,228,5,3,107,5,123,5,2,64,5,1,2,16,5,32,5,48,5,3,191,5,207,5,2,
32,5,64,5,2,5,184,255,192,64,13,13,16,72,15,5,31,5,2,7,1,15,0,21,0,63,63,
1,94,93,43,93,93,113,95,113,113,113,114,43,114,43,94,93,43,113,113,113,113,
43,43,43,94,93,113,113,113,113,43,114,43,43,94,93,43,93,93,93,93,43,113,113,
113,113,114,114,114,114,114,114,114,43,94,93,93,17,18,57,47,94,93,237,49,
48,51,17,51,17,194,180,4,58,251,198,0,0,0,255,255,0,170,255,236,5,73,5,129,
16,38,0,44,237,0,16,7,0,45,1,225,0,0,255,255,0,137,254,87,3,3,5,204,16,38,
0,76,0,0,17,7,0,77,1,198,0,0,0,30,64,18,3,2,111,8,1,48,8,1,16,8,1,8,1,0,16,
0,1,0,17,93,53,53,17,93,93,93,53,53,255,255,0,32,255,236,3,205,6,254,18,38,
0,45,0,0,17,7,2,150,1,55,0,0,0,19,64,11,1,23,5,38,1,190,28,22,3,16,37,1,43,
53,0,43,53,0,0,0,0,2,255,153,254,87,2,47,5,211,0,19,0,29,1,148,64,25,150,
29,166,29,2,152,28,168,28,2,3,18,24,12,16,72,18,40,8,11,72,164,21,1,21,184,
255,192,64,49,11,15,72,21,251,26,1,59,26,1,26,64,12,15,72,36,26,1,26,15,70,
12,3,3,4,12,20,12,36,12,68,12,4,7,12,12,31,30,144,31,1,2,0,31,16,31,2,219,
31,184,255,192,64,9,223,227,72,31,64,210,213,72,31,184,255,192,64,51,205,
209,72,143,31,1,64,31,80,31,2,95,31,111,31,239,31,255,31,4,32,31,48,31,64,
31,3,144,31,160,31,224,31,240,31,4,79,31,1,0,31,1,160,175,31,191,31,207,31,
3,31,184,255,192,64,57,147,150,72,239,31,1,176,31,192,31,208,31,3,95,31,1,
32,31,1,31,31,47,31,63,31,143,31,191,31,207,31,6,0,31,1,111,239,31,1,208,
31,1,63,31,1,111,31,143,31,159,31,175,31,255,31,5,31,184,255,192,64,101,79,
82,72,223,31,1,144,31,160,31,176,31,3,47,31,63,31,79,31,3,0,31,1,61,31,64,
53,56,72,112,31,128,31,144,31,176,31,4,15,31,31,31,2,255,31,1,31,64,35,38,
72,144,31,1,79,31,1,255,31,1,112,31,128,31,192,31,208,31,224,31,5,31,31,1,
24,142,64,28,148,26,128,22,22,15,26,47,26,63,26,127,26,239,26,5,26,13,15,
7,80,0,27,0,63,237,63,47,93,51,47,26,16,253,26,237,1,93,93,93,113,113,43,
113,114,114,43,94,93,93,93,93,43,113,114,114,114,94,93,93,113,113,113,113,
43,114,94,93,93,93,113,113,114,114,43,43,43,94,93,95,93,17,18,57,47,94,93,
51,47,16,237,47,93,43,93,113,204,43,93,49,48,0,43,43,1,95,93,93,19,34,38,
39,53,30,1,51,50,62,2,53,17,51,17,20,14,2,1,21,35,39,35,7,35,53,19,51,77,
34,65,28,13,36,13,38,49,28,10,180,21,54,93,1,154,105,219,2,232,104,234,204,
254,87,4,5,139,2,4,20,43,67,46,4,165,251,64,62,106,78,45,6,110,20,169,169,
20,1,14,0,255,255,0,168,254,78,5,63,5,129,18,38,0,46,0,0,17,7,2,140,1,221,
0,0,0,14,185,0,1,255,205,180,16,12,4,11,37,1,43,53,255,255,0,138,254,78,4,
3,5,204,18,38,0,78,0,0,17,7,2,140,1,78,0,0,0,14,185,0,1,255,235,180,16,12,
4,11,37,1,43,53,0,1,0,138,0,0,4,3,4,58,0,11,0,166,64,72,123,1,1,116,7,1,86,
9,102,9,2,123,0,139,0,155,0,3,89,0,105,0,2,67,10,1,58,2,1,42,9,1,155,8,1,
122,8,138,8,2,44,8,1,1,10,8,10,9,16,112,9,128,9,144,9,3,9,9,0,11,16,80,11,
1,144,11,208,11,240,11,3,11,184,255,192,64,40,7,11,72,11,7,3,70,0,4,16,4,
48,4,240,4,4,8,4,128,13,192,13,224,13,3,63,13,1,2,1,7,10,4,8,8,5,15,4,0,21,
0,63,50,63,51,17,23,57,1,93,93,47,94,93,237,50,47,43,93,113,56,51,57,47,93,
56,57,51,17,51,49,48,93,93,93,93,0,93,1,93,93,93,93,0,93,1,93,33,1,7,17,35,
17,51,17,1,51,9,1,3,48,254,146,132,180,180,1,219,211,254,73,1,206,1,238,108,
254,126,4,58,253,243,2,13,254,47,253,151,0,0,0,255,255,0,168,0,0,4,47,6,240,
18,38,0,47,0,0,17,7,2,149,0,173,0,0,0,21,180,1,6,5,38,1,184,255,94,180,6,
9,0,4,37,1,43,53,0,43,53,0,255,255,0,91,0,0,2,3,7,62,18,38,0,79,0,0,17,6,
2,149,19,78,0,19,64,11,1,4,2,38,1,75,4,7,0,2,37,1,43,53,0,43,53,0,255,255,
0,168,254,78,4,47,5,129,18,38,0,47,0,0,17,7,2,140,1,133,0,0,0,14,185,0,1,
255,253,180,10,6,0,4,37,1,43,53,255,255,0,126,254,78,1,71,5,204,18,38,0,79,
0,0,17,6,2,140,255,0,0,14,185,0,1,255,255,180,8,4,0,2,37,1,43,53,0,0,255,
255,0,168,0,0,4,47,5,129,18,38,0,47,0,0,17,7,2,146,2,21,0,0,0,18,64,10,1,
15,3,1,138,10,6,0,4,37,1,43,53,0,63,53,255,255,0,138,0,0,2,105,5,204,16,38,
0,79,0,0,17,7,2,146,1,36,0,75,0,65,64,16,16,64,29,29,72,16,64,22,22,72,16,
64,18,18,72,16,184,255,192,179,17,17,72,16,184,255,192,64,12,16,16,72,16,
64,11,11,72,1,13,0,1,184,1,32,180,8,4,0,2,37,1,43,53,0,63,53,1,43,43,43,43,
43,43,0,255,255,0,168,0,0,4,47,5,129,18,38,0,47,0,0,17,7,1,75,1,213,253,143,
0,11,182,1,95,6,8,0,4,37,1,43,53,0,0,0,255,255,0,138,0,0,2,146,5,204,16,38,
0,79,0,0,17,7,1,75,1,66,253,143,0,14,185,0,1,1,84,180,4,6,0,2,37,1,43,53,
0,1,0,20,0,0,4,47,5,129,0,13,0,119,64,49,121,0,137,0,2,100,8,116,8,132,8,
3,86,8,1,134,8,1,86,7,1,134,7,1,12,2,90,9,5,16,3,1,0,3,32,3,64,3,96,3,128,
3,208,3,240,3,7,3,12,184,255,224,179,19,22,72,9,184,255,224,64,24,19,22,72,
6,1,9,12,4,16,7,1,7,0,13,1,13,13,5,10,3,2,95,5,18,0,63,237,63,18,57,47,93,
205,93,23,57,43,43,1,47,93,113,47,51,237,50,49,48,113,114,113,114,0,93,93,
1,5,17,33,21,33,17,7,53,55,17,51,17,37,2,104,254,255,2,200,252,121,148,148,
191,1,1,3,29,149,254,20,156,2,26,85,158,85,2,201,253,165,148,0,1,0,16,0,0,
1,186,5,204,0,11,0,102,64,42,39,3,1,39,2,1,8,7,11,70,4,2,0,0,16,0,32,0,64,
0,4,7,0,0,12,13,255,13,1,112,13,128,13,192,13,208,13,4,31,13,1,4,184,255,
224,64,23,18,22,72,10,32,18,22,72,1,10,4,7,4,2,79,8,1,8,8,5,0,0,21,0,63,63,
57,47,93,205,23,57,43,43,1,93,93,93,17,18,57,47,94,93,51,51,237,50,50,49,
48,113,113,51,17,7,53,55,17,51,17,55,21,7,17,138,122,122,180,124,124,2,30,
68,158,68,3,16,253,88,72,159,71,253,122,255,255,0,168,0,0,5,32,6,240,18,38,
0,49,0,0,17,7,2,149,2,17,0,0,0,19,64,11,1,20,5,38,1,73,20,23,8,18,37,1,43,
53,0,43,53,0,0,0,255,255,0,140,0,0,3,242,5,228,18,38,0,81,4,0,17,7,0,116,
1,132,0,0,0,19,64,11,1,38,17,38,1,97,38,41,19,36,37,1,43,53,0,43,53,0,0,0,
255,255,0,168,254,78,5,32,5,129,18,38,0,49,0,0,17,7,2,140,1,252,0,0,0,14,
185,0,1,255,252,180,24,20,8,18,37,1,43,53,255,255,0,140,254,78,3,242,4,78,
18,38,0,81,4,0,17,7,2,140,1,91,0,0,0,11,182,1,0,42,38,19,36,37,1,43,53,0,
0,0,255,255,0,168,0,0,5,32,6,254,18,38,0,49,0,0,17,7,2,151,1,147,0,0,0,21,
180,1,20,5,38,1,184,255,250,180,22,28,8,18,37,1,43,53,0,43,53,0,255,255,0,
140,0,0,3,242,5,211,18,38,0,81,4,0,17,7,1,72,0,242,0,0,0,21,180,1,38,17,38,
1,184,255,254,180,40,46,19,36,37,1,43,53,0,43,53,0,255,255,255,254,0,0,4,
80,5,129,16,38,0,81,98,0,16,7,2,3,255,127,0,0,0,1,0,165,255,236,5,52,5,149,
0,55,0,162,64,16,154,53,1,149,7,165,7,2,131,41,147,41,163,41,3,48,184,255,
232,179,12,15,72,47,184,255,216,64,91,12,15,72,42,54,58,54,154,54,170,54,
4,6,143,5,159,5,175,5,3,5,5,51,39,26,90,0,27,16,27,64,27,3,27,51,90,0,14,
64,14,80,14,112,14,160,14,176,14,6,48,14,80,14,144,14,240,14,4,224,14,1,143,
14,159,14,175,14,3,0,14,48,14,2,7,14,39,20,95,45,4,33,3,26,18,9,95,0,6,6,
0,19,0,63,50,47,16,237,63,63,63,237,50,1,47,94,93,93,93,113,114,237,47,93,
237,50,17,57,47,93,51,49,48,0,93,43,1,43,0,93,93,93,5,34,46,2,39,55,30,1,
51,50,62,2,53,17,52,46,2,35,34,14,2,21,17,35,17,52,46,2,39,51,30,3,21,51,
62,3,51,50,30,2,21,17,20,14,2,3,173,56,96,79,63,24,127,37,100,59,64,78,41,
13,39,81,127,87,94,163,121,70,191,1,1,1,1,184,1,3,2,1,4,34,103,130,153,86,
124,177,112,53,30,86,152,20,24,40,54,30,115,45,65,58,107,153,95,1,66,108,
154,98,46,62,105,139,77,252,133,4,68,37,92,90,76,22,22,63,69,69,28,61,101,
70,39,64,133,204,139,254,165,130,208,146,78,0,0,0,0,1,0,140,254,87,3,242,
4,78,0,53,0,135,64,18,121,52,137,52,2,90,52,106,52,2,43,52,59,52,75,52,3,
46,184,255,232,64,74,9,12,72,3,46,19,46,2,3,3,24,49,70,64,160,12,1,96,12,
208,12,2,31,12,1,175,12,1,12,55,128,37,24,70,160,25,176,25,2,0,25,192,25,
208,25,3,0,25,16,25,32,25,64,25,224,25,240,25,6,7,25,37,18,80,43,16,31,15,
24,21,7,80,0,27,0,63,237,63,63,63,237,50,1,47,94,93,113,114,237,50,26,16,
220,93,113,113,114,26,237,17,57,47,49,48,93,43,0,93,93,93,1,34,38,39,53,30,
1,51,50,62,2,53,17,52,46,2,35,34,14,2,21,17,35,17,52,46,2,39,51,30,3,21,51,
62,3,51,50,30,2,21,17,20,14,2,3,1,34,65,28,13,36,13,38,49,28,10,23,52,85,
63,64,103,73,40,180,1,2,2,1,170,1,2,3,2,3,26,62,82,106,70,90,130,84,39,22,
54,93,254,87,4,5,139,2,4,20,43,67,46,3,25,79,106,65,27,45,85,125,81,253,141,
3,83,34,75,67,48,7,5,44,57,59,20,47,76,53,29,44,92,145,100,252,169,62,106,
78,45,0,0,0,255,255,0,97,255,236,5,215,6,161,18,38,0,50,0,0,17,7,1,73,1,214,
1,78,0,19,64,11,2,40,5,38,2,0,41,40,10,0,37,1,43,53,0,43,53,0,0,0,255,255,
0,86,255,236,4,29,5,83,18,38,0,82,0,0,17,7,1,73,0,244,0,0,0,19,64,11,2,35,
17,38,2,0,36,35,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,97,255,236,5,215,6,
243,18,38,0,50,0,0,17,7,2,155,1,231,0,0,0,19,64,11,2,40,5,38,2,0,45,53,10,
0,37,1,43,53,0,43,53,0,0,0,255,255,0,86,255,236,4,29,5,230,18,38,0,82,0,0,
17,7,1,74,1,16,0,0,0,19,64,11,2,35,17,38,2,0,40,52,8,0,37,1,43,53,0,43,53,
0,0,0,255,255,0,97,255,236,5,215,6,241,18,38,0,50,0,0,17,7,2,154,1,226,0,
0,0,23,64,13,3,2,40,5,38,3,2,93,40,49,10,0,37,1,43,53,53,0,43,53,53,0,0,0,
255,255,0,86,255,236,4,34,5,228,18,38,0,82,0,0,17,7,1,79,1,9,0,0,0,23,64,
13,3,2,35,17,38,3,2,103,35,44,8,0,37,1,43,53,53,0,43,53,53,0,0,0,0,2,0,97,
255,246,7,166,5,140,0,30,0,49,0,170,64,119,137,13,1,102,13,1,105,12,1,86,
48,1,89,42,1,84,8,132,8,2,4,47,20,47,84,47,3,11,43,27,43,91,43,3,0,20,24,
28,90,34,0,26,32,26,48,26,3,26,22,26,22,29,15,34,47,34,79,34,3,63,34,95,34,
127,34,159,34,207,34,239,34,6,34,64,31,38,72,34,16,29,32,29,2,29,45,91,32,
10,1,15,10,31,10,2,10,127,51,1,27,95,24,24,21,29,95,30,18,22,95,21,3,40,95,
15,4,31,95,5,19,0,63,237,63,237,63,237,63,237,17,57,47,237,1,93,47,93,93,
237,47,93,47,43,93,113,18,57,57,47,47,93,16,237,50,57,57,49,48,0,93,93,93,
93,93,1,93,0,93,93,33,14,3,35,34,36,38,2,53,52,18,54,36,51,50,30,2,23,33,
21,33,17,33,21,33,17,33,21,37,50,54,55,17,46,2,34,35,34,14,2,21,20,30,2,3,
231,20,51,57,57,25,169,254,253,175,89,94,178,1,2,164,26,58,57,52,19,3,146,
252,221,2,231,253,25,3,76,251,111,32,76,26,11,32,37,37,15,125,187,125,63,
64,126,186,3,3,3,1,106,191,1,9,159,165,1,7,183,98,2,3,4,2,156,254,60,154,
254,21,156,145,2,2,4,87,1,2,1,74,142,206,131,129,209,148,80,0,3,0,86,255,
236,7,50,4,78,0,39,0,59,0,68,0,190,64,131,132,7,1,102,7,118,7,2,97,2,1,85,
2,1,90,66,106,66,2,108,61,1,90,61,1,69,58,85,58,101,58,3,69,52,85,52,101,
52,3,74,48,90,48,106,48,3,74,42,90,42,106,42,3,8,73,9,9,38,71,64,31,60,47,
60,63,60,3,144,60,1,60,70,128,17,30,68,0,71,144,40,1,32,40,1,40,50,71,25,
0,80,68,68,5,63,80,33,16,116,30,132,30,2,123,17,139,17,2,30,17,20,45,80,28,
16,55,80,20,22,5,80,14,239,8,1,128,8,1,8,8,14,22,0,63,51,47,93,93,16,237,
63,237,63,237,18,57,57,93,93,63,237,18,57,47,237,1,47,237,47,93,114,237,50,
57,57,26,16,220,93,113,26,237,50,47,237,49,48,0,93,93,93,93,93,93,93,93,93,
93,93,1,20,30,2,51,50,54,55,23,14,3,35,34,38,39,14,1,35,34,46,2,53,16,18,
51,32,23,62,1,51,50,30,2,29,1,37,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,
37,46,1,35,34,14,2,7,4,46,35,73,114,80,117,141,25,158,17,61,102,153,108,137,
198,61,63,201,137,113,181,127,68,253,242,1,25,117,67,200,119,136,183,111,
47,252,63,42,77,110,68,69,114,81,45,47,81,108,62,69,114,81,44,3,7,15,144,
135,45,99,84,58,4,1,247,85,143,103,57,94,72,45,45,91,73,47,91,92,93,90,68,
140,211,143,1,23,1,25,177,94,83,88,155,210,122,24,39,126,164,98,39,41,99,
164,123,126,165,98,40,39,98,166,225,171,157,29,74,127,98,255,255,0,168,0,
0,5,104,6,240,18,38,0,53,0,0,17,7,2,149,1,225,0,0,0,21,180,2,31,5,38,2,184,
255,245,180,31,34,4,17,37,1,43,53,0,43,53,0,255,255,0,136,0,0,2,166,5,228,
18,38,0,85,0,0,17,7,0,116,0,182,0,0,0,19,64,11,1,32,17,38,1,74,32,35,6,21,
37,1,43,53,0,43,53,0,0,0,255,255,0,168,254,78,5,104,5,129,18,38,0,53,0,0,
17,7,2,140,2,5,0,0,0,14,185,0,2,255,225,180,35,31,4,17,37,1,43,53,255,255,
0,129,254,78,2,136,4,78,18,38,0,85,0,0,17,6,2,140,2,0,0,14,185,0,1,255,94,
180,36,32,6,21,37,1,43,53,0,0,255,255,0,168,0,0,5,104,6,254,18,38,0,53,0,
0,17,7,2,151,1,102,0,0,0,21,180,2,31,5,38,2,184,255,169,180,33,39,4,17,37,
1,43,53,0,43,53,0,255,255,0,56,0,0,2,206,5,211,18,38,0,85,0,0,17,6,1,72,56,
0,0,21,180,1,32,17,38,1,184,255,251,180,34,40,6,21,37,1,43,53,0,43,53,0,0,
0,255,255,0,93,255,236,4,248,7,45,18,38,0,54,0,0,17,7,0,116,1,234,1,73,0,
19,64,11,1,64,5,38,1,91,64,67,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,57,255,
236,3,182,5,228,18,38,0,86,0,0,17,7,0,116,1,57,0,0,0,19,64,11,1,56,17,38,
1,93,56,59,10,0,37,1,43,53,0,43,53,0,0,0,255,255,0,93,255,236,4,248,7,26,
18,38,0,54,0,0,17,7,1,71,1,114,1,71,0,19,64,11,1,65,5,38,1,18,70,64,8,0,37,
1,43,53,0,43,53,0,0,0,255,255,0,57,255,236,3,182,5,211,18,38,0,86,0,0,17,
7,1,71,0,172,0,0,0,19,64,11,1,57,17,38,1,0,62,56,10,0,37,1,43,53,0,43,53,
0,0,0,255,255,0,93,254,78,4,248,5,150,18,38,0,54,0,0,17,7,0,120,1,166,0,0,
0,11,182,1,40,72,64,8,0,37,1,43,53,0,0,0,255,255,0,57,254,78,3,182,4,75,18,
38,0,86,0,0,17,7,0,120,0,218,0,0,0,11,182,1,15,64,56,10,0,37,1,43,53,0,0,
0,255,255,0,93,255,236,4,248,6,254,18,38,0,54,0,0,17,7,2,151,1,115,0,0,0,
19,64,11,1,64,5,38,1,19,66,72,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,57,255,
236,3,182,5,211,18,38,0,86,0,0,17,7,1,72,0,173,0,0,0,19,64,11,1,56,17,38,
1,0,58,64,10,0,37,1,43,53,0,43,53,0,0,0,255,255,0,46,254,78,4,180,5,129,18,
38,0,55,0,0,17,7,2,140,1,139,0,0,0,14,185,0,1,255,254,180,12,8,4,6,37,1,43,
53,255,255,0,31,254,78,2,42,5,44,16,38,0,87,0,0,17,6,2,140,115,0,2,233,64,
255,35,64,232,232,72,35,64,231,231,72,35,64,228,228,72,35,64,227,227,72,35,
64,226,226,72,35,64,221,221,72,35,64,217,217,72,35,64,216,216,72,35,64,215,
215,72,35,64,214,214,72,35,64,213,213,72,35,64,210,210,72,35,64,206,206,72,
35,64,205,205,72,35,64,203,203,72,35,64,202,202,72,35,64,199,199,72,35,64,
196,196,72,35,64,195,195,72,35,64,194,194,72,35,64,192,192,72,35,64,191,191,
72,35,64,190,190,72,35,64,185,185,72,35,64,184,184,72,35,64,181,181,72,35,
64,180,180,72,35,64,179,179,72,35,64,178,178,72,35,64,174,174,72,35,64,173,
173,72,35,64,170,170,72,35,64,169,169,72,35,64,168,168,72,35,64,167,167,72,
35,64,163,163,72,35,64,162,162,72,35,64,160,160,72,35,64,159,159,72,35,64,
158,158,72,35,64,157,157,72,35,64,156,156,72,35,64,152,152,72,35,64,149,149,
72,35,64,148,148,72,35,64,147,147,72,35,64,146,146,72,35,64,145,145,72,35,
64,144,144,72,35,64,142,142,72,35,64,141,141,72,64,221,35,64,138,138,72,35,
64,137,137,72,35,64,136,136,72,35,64,134,134,72,35,64,133,133,72,35,64,131,
131,72,35,64,130,130,72,35,64,127,127,72,35,64,126,126,72,35,64,125,125,72,
35,64,124,124,72,35,64,123,123,72,35,64,122,122,72,35,64,121,121,72,35,64,
120,120,72,35,64,116,116,72,35,64,115,115,72,35,64,113,113,72,35,64,112,112,
72,35,64,111,111,72,35,64,110,110,72,35,64,109,109,72,35,64,106,106,72,35,
64,105,105,72,35,64,104,104,72,35,64,102,102,72,35,64,101,101,72,35,64,100,
100,72,35,64,99,99,72,35,64,98,98,72,35,64,95,95,72,35,64,94,94,72,35,64,
93,93,72,35,64,91,91,72,35,64,90,90,72,35,64,89,89,72,35,128,88,88,72,35,
64,87,87,72,35,64,84,84,72,35,64,83,83,72,35,64,80,80,72,35,64,79,79,72,35,
64,78,78,72,35,64,77,77,72,35,184,255,192,179,74,74,72,35,184,255,192,179,
71,71,72,35,184,255,192,179,63,63,72,35,184,255,192,64,9,60,60,72,35,64,52,
52,72,35,184,255,192,179,50,50,72,35,184,255,192,179,49,49,72,35,184,255,
192,64,9,45,45,72,35,64,41,41,72,35,184,255,192,179,39,39,72,35,184,255,192,
64,9,38,38,72,35,64,30,30,72,35,184,255,192,179,28,28,72,35,184,255,192,64,
9,27,27,72,35,64,19,19,72,35,184,255,192,179,17,17,72,35,184,255,192,179,
13,13,72,35,184,255,192,64,15,9,9,72,35,64,8,8,72,1,50,27,23,7,0,37,1,43,
53,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,0,0,0,255,255,0,46,0,0,4,180,
6,254,18,38,0,55,0,0,17,7,2,151,1,33,0,0,0,21,180,1,8,5,38,1,184,255,251,
180,10,16,4,6,37,1,43,53,0,43,53,0,255,255,0,31,255,240,3,17,5,204,16,38,
0,87,0,0,17,7,2,146,1,204,0,75,0,17,177,1,1,184,1,136,180,27,23,7,0,37,1,
43,53,0,53,0,0,1,0,46,0,0,4,180,5,129,0,15,0,101,64,62,0,17,16,17,32,17,3,
9,3,2,5,15,14,6,12,5,14,9,6,127,12,175,12,191,12,3,47,12,143,12,2,12,64,23,
28,72,12,1,5,90,10,16,6,32,6,2,6,0,12,95,13,4,8,95,1,9,9,5,13,3,5,18,0,63,
63,18,57,47,51,237,50,16,237,50,1,47,93,51,253,50,204,43,93,113,17,57,43,
1,24,16,77,228,17,57,95,94,93,49,48,1,17,33,21,33,17,35,17,33,53,33,17,33,
53,33,21,2,208,1,25,254,231,190,254,233,1,23,254,28,4,134,4,229,254,60,154,
253,121,2,135,154,1,196,156,156,0,1,0,31,255,240,2,42,5,44,0,30,0,140,64,
91,40,30,1,40,29,1,40,26,1,40,25,1,12,32,9,15,72,156,12,172,12,2,12,40,9,
14,72,20,15,15,13,29,25,111,7,127,7,2,7,24,28,7,3,1,70,21,17,143,13,1,0,13,
16,13,32,13,3,7,13,128,32,1,47,32,1,27,19,80,20,0,15,80,28,127,16,191,16,
207,16,3,16,16,4,24,22,20,15,4,80,11,22,0,63,237,63,206,51,18,57,47,93,51,
237,50,16,237,50,1,93,93,47,94,93,113,51,51,237,23,50,47,93,51,51,17,51,17,
51,49,48,0,43,93,1,43,113,113,113,113,1,21,20,22,51,50,54,55,21,14,1,35,34,
53,17,35,53,51,17,35,53,51,55,51,21,51,21,35,17,51,21,1,80,51,63,26,49,29,
41,85,56,216,125,125,125,132,53,120,200,200,200,2,4,248,78,63,8,6,133,11,
13,245,1,31,131,1,48,131,242,242,131,254,208,131,255,255,0,158,255,236,5,
41,7,6,18,38,0,56,0,0,17,7,2,153,1,148,0,0,0,19,64,11,1,26,5,38,1,0,35,49,
5,20,37,1,43,53,0,43,53,0,0,0,255,255,0,133,255,236,3,235,5,189,18,38,0,88,
0,0,17,7,1,78,0,246,0,0,0,19,64,11,1,38,17,38,1,13,47,61,36,19,37,1,43,53,
0,43,53,0,0,0,255,255,0,158,255,236,5,41,6,156,18,38,0,56,0,0,17,7,1,73,1,
159,1,73,0,19,64,11,1,26,5,38,1,1,27,26,5,20,37,1,43,53,0,43,53,0,0,0,255,
255,0,133,255,236,3,235,5,83,18,38,0,88,0,0,17,7,1,73,0,240,0,0,0,21,180,
1,38,17,38,1,184,255,254,180,39,38,36,19,37,1,43,53,0,43,53,0,255,255,0,158,
255,236,5,41,6,243,18,38,0,56,0,0,17,7,2,155,1,174,0,0,0,19,64,11,1,26,5,
38,1,0,31,39,5,20,37,1,43,53,0,43,53,0,0,0,255,255,0,133,255,236,3,235,5,
230,18,38,0,88,0,0,17,7,1,74,1,11,0,0,0,21,180,1,38,17,38,1,184,255,253,180,
43,55,36,19,37,1,43,53,0,43,53,0,255,255,0,158,255,236,5,41,7,62,18,38,0,
56,0,0,17,7,1,76,1,191,0,203,0,23,64,13,2,1,31,5,38,2,1,0,36,26,5,20,37,1,
43,53,53,0,43,53,53,0,0,0,255,255,0,133,255,236,3,235,6,115,18,38,0,88,0,
0,17,7,1,76,1,20,0,0,0,23,64,13,2,1,43,17,38,2,1,1,48,38,36,19,37,1,43,53,
53,0,43,53,53,0,0,0,255,255,0,158,255,236,5,41,6,241,18,38,0,56,0,0,17,7,
2,154,1,157,0,0,0,23,64,13,2,1,26,5,38,2,1,81,26,35,5,20,37,1,43,53,53,0,
43,53,53,0,0,0,255,255,0,133,255,236,4,30,5,228,18,38,0,88,0,0,17,7,1,79,
1,5,0,0,0,23,64,13,2,1,38,17,38,2,1,100,38,47,36,19,37,1,43,53,53,0,43,53,
53,0,0,0,255,255,0,158,254,85,5,41,5,129,16,38,0,56,0,0,17,7,1,77,2,32,0,
0,0,40,185,0,1,254,103,181,39,39,21,21,37,51,184,255,192,179,21,21,72,51,
184,255,192,179,20,20,72,51,184,255,192,178,19,19,72,43,43,43,43,53,0,0,255,
255,0,133,254,85,4,5,4,58,18,38,0,88,0,0,17,7,1,77,2,87,0,0,0,13,185,0,1,
255,226,180,50,50,14,14,37,43,53,0,255,255,0,9,0,0,7,134,6,254,18,38,0,58,
0,0,17,7,2,150,2,121,0,0,0,21,180,1,48,5,38,1,184,255,253,180,53,47,15,46,
37,1,43,53,0,43,53,0,255,255,255,253,0,0,5,204,5,211,18,38,0,90,0,0,17,7,
1,71,1,148,0,0,0,21,180,1,44,17,38,1,184,255,251,180,49,43,15,42,37,1,43,
53,0,43,53,0,255,255,0,45,0,0,5,41,6,254,18,38,0,60,0,0,17,7,2,150,1,91,0,
0,0,21,180,1,10,5,38,1,184,255,251,180,15,9,4,8,37,1,43,53,0,43,53,0,255,
255,0,5,254,87,3,252,5,211,18,38,0,92,0,0,17,7,1,71,0,182,0,0,0,19,64,11,
1,33,17,38,1,0,38,32,17,31,37,1,43,53,0,43,53,0,0,0,255,255,0,45,0,0,5,41,
6,178,18,38,0,60,0,0,17,7,2,152,1,104,0,0,0,23,64,13,2,1,9,5,38,2,1,0,13,
11,4,8,37,1,43,53,53,0,43,53,53,0,0,0,255,255,0,65,0,0,4,163,6,240,18,38,
0,61,0,0,17,7,2,149,1,160,0,0,0,19,64,11,1,10,5,38,1,74,10,13,1,0,37,1,43,
53,0,43,53,0,0,0,255,255,0,49,0,0,3,182,5,228,18,38,0,93,0,0,17,7,0,116,1,
53,0,0,0,19,64,11,1,10,17,38,1,93,10,13,0,8,37,1,43,53,0,43,53,0,0,0,255,
255,0,65,0,0,4,163,6,241,18,38,0,61,0,0,17,7,1,75,1,124,1,37,0,19,64,11,1,
10,5,38,1,0,10,12,1,0,37,1,43,53,0,43,53,0,0,0,255,255,0,49,0,0,3,182,5,204,
18,38,0,93,0,0,17,7,1,75,0,253,0,0,0,12,182,1,0,10,12,0,8,37,1,43,53,0,0,
0,255,255,0,65,0,0,4,163,6,254,18,38,0,61,0,0,17,7,2,151,1,56,0,0,0,19,64,
11,1,10,5,38,1,17,12,18,1,0,37,1,43,53,0,43,53,0,0,0,255,255,0,49,0,0,3,182,
5,211,18,38,0,93,0,0,17,7,1,72,0,156,0,0,0,21,180,1,10,17,38,1,184,255,244,
180,12,18,0,8,37,1,43,53,0,43,53,0,0,1,0,138,0,0,2,17,5,202,0,19,0,125,185,
0,5,255,216,179,13,17,72,5,184,255,224,64,56,8,12,72,111,10,1,10,10,0,70,
0,1,16,1,48,1,240,1,4,8,1,255,21,1,224,21,1,223,21,1,176,21,192,21,2,159,
21,1,112,21,128,21,2,31,21,1,0,21,1,240,21,1,223,21,1,21,184,255,192,64,18,
34,37,72,79,21,1,112,21,1,31,21,1,14,80,7,0,0,21,0,63,63,237,1,93,93,113,
43,113,113,114,114,114,114,114,114,114,114,47,94,93,237,50,47,93,49,48,0,
43,43,33,35,17,52,62,2,51,50,22,23,21,46,1,35,34,14,2,21,1,62,180,22,59,102,
81,32,69,26,17,45,18,40,51,29,11,4,180,59,101,75,43,6,6,137,3,5,22,41,60,
39,0,0,0,0,1,0,192,254,78,3,195,5,174,0,27,0,148,64,107,133,6,1,122,18,138,
18,2,139,15,1,89,15,105,15,121,15,3,131,13,1,85,13,101,13,117,13,3,54,13,
1,38,7,1,38,8,1,34,22,50,22,114,22,130,22,4,21,17,37,17,53,17,3,27,212,8,
228,8,244,8,3,80,8,144,8,2,38,8,54,8,70,8,3,8,10,27,3,13,13,17,19,3,8,95,
14,159,14,2,14,12,16,80,9,17,17,13,3,81,15,24,127,24,175,24,3,24,13,0,47,
47,93,237,18,57,47,51,237,50,1,47,113,51,23,51,17,23,51,113,113,113,47,49,
48,93,0,93,1,93,93,93,93,93,93,93,93,93,1,46,1,35,34,14,2,15,1,51,7,35,3,
35,19,35,55,51,55,62,3,51,50,22,23,3,164,17,62,31,31,46,33,24,9,26,211,25,
213,254,180,254,152,27,151,29,12,40,71,109,81,32,82,35,5,32,5,10,19,40,64,
45,137,131,250,211,5,45,131,152,59,102,76,43,10,10,0,0,0,4,0,4,0,0,5,82,7,
62,0,26,0,39,0,61,0,67,1,36,64,18,122,64,138,64,2,102,5,118,5,134,5,3,86,
6,102,6,2,25,184,255,232,64,183,9,17,72,19,24,9,17,72,12,16,14,17,72,10,12,
1,12,38,9,10,32,8,39,32,7,32,40,130,0,68,66,132,66,2,66,62,50,130,17,175,
62,191,62,207,62,3,15,17,47,17,2,144,17,1,0,0,32,0,2,15,0,159,0,2,0,62,17,
17,62,0,3,6,11,5,32,32,10,7,139,7,1,90,7,106,7,122,7,3,7,16,6,32,6,48,6,3,
32,6,1,6,6,69,80,69,176,69,2,48,69,96,69,144,69,192,69,240,69,5,47,69,1,132,
10,1,85,10,101,10,117,10,3,10,11,62,62,45,141,112,22,128,22,2,22,22,57,127,
64,159,64,175,64,191,64,4,64,64,9,13,72,64,8,9,39,38,38,10,5,12,32,3,128,
57,1,63,57,1,0,57,1,57,7,7,10,0,47,51,47,47,93,93,93,23,51,18,57,47,51,205,
50,47,43,93,18,57,47,93,237,51,47,1,47,51,93,93,93,93,113,17,51,47,93,113,
51,93,93,17,18,57,17,51,17,18,23,57,47,47,47,93,113,93,113,93,16,237,16,205,
93,16,237,16,135,192,192,135,192,192,1,51,49,48,93,43,43,43,93,93,93,1,20,
6,7,6,7,1,35,3,33,3,35,1,38,39,46,1,53,52,62,2,51,50,30,2,3,46,3,39,14,3,
7,3,33,3,52,46,2,35,34,14,2,21,20,30,1,23,22,23,51,50,62,2,3,53,55,51,21,
5,3,158,38,33,16,18,2,29,195,161,253,126,162,198,2,36,21,18,33,38,38,66,88,
50,50,88,66,38,158,16,29,22,15,1,2,14,23,29,15,180,2,15,131,21,36,49,28,29,
49,36,21,21,36,24,21,24,9,28,49,36,21,247,217,207,254,202,5,112,45,79,30,
15,11,251,68,1,115,254,141,4,185,12,17,30,79,45,45,79,59,34,34,59,79,253,
254,36,74,60,41,4,4,41,62,73,36,254,95,3,119,25,44,33,19,19,33,44,25,26,44,
35,10,8,1,19,35,44,1,35,16,181,23,174,0,255,255,0,87,255,236,4,115,7,62,18,
38,0,68,0,0,16,39,1,76,1,20,255,85,17,7,0,116,1,99,1,90,0,35,64,14,3,2,101,
16,38,4,26,106,109,3,36,37,3,2,184,255,212,180,76,66,3,36,37,1,43,53,53,43,
53,0,43,53,53,0,0,0,255,255,0,24,0,0,7,168,6,240,18,38,0,134,0,0,17,7,2,149,
3,228,0,0,0,21,180,2,27,5,38,2,184,1,32,180,27,30,4,14,37,1,43,53,0,43,53,
0,255,255,0,66,255,236,6,194,5,228,18,38,0,166,0,0,17,7,0,116,2,175,0,0,0,
19,64,11,3,89,17,38,3,73,89,92,25,61,37,1,43,53,0,43,53,0,0,0,255,255,0,71,
255,203,5,244,6,240,18,38,0,152,0,0,17,7,2,149,2,75,0,0,0,19,64,11,3,52,5,
38,3,73,52,55,10,24,37,1,43,53,0,43,53,0,0,0,255,255,0,44,255,218,4,180,5,
228,18,38,0,184,0,0,17,7,0,116,1,178,0,0,0,19,64,11,3,46,17,38,3,94,46,49,
8,19,37,1,43,53,0,43,53,0,0,0,0,1,0,0,4,177,2,150,5,211,0,9,0,66,64,14,118,
9,134,9,2,120,8,136,8,2,128,0,1,0,184,255,192,64,27,11,15,72,0,191,6,1,6,
4,142,64,8,148,128,6,15,1,47,1,63,1,127,1,239,1,5,1,0,47,93,51,26,253,26,
237,1,47,93,204,43,93,49,48,93,93,1,21,35,39,35,7,35,53,19,51,2,150,105,219,
2,232,104,234,204,4,197,20,169,169,20,1,14,0,0,1,0,0,4,177,2,150,5,211,0,
9,0,66,64,14,118,0,134,0,2,120,1,136,1,2,128,8,1,8,184,255,192,64,27,11,15,
72,8,64,191,2,1,2,7,3,148,128,6,142,15,1,47,1,63,1,127,1,239,1,5,1,0,47,93,
237,26,237,50,1,47,93,26,204,43,93,49,48,93,93,1,35,3,53,51,23,51,55,51,21,
1,182,204,234,104,232,2,219,105,4,177,1,14,20,169,169,20,0,0,1,0,51,4,212,
2,88,5,83,0,3,0,81,64,59,4,1,1,228,1,244,1,2,1,164,0,1,91,0,107,0,2,52,0,
68,0,2,0,2,32,18,25,72,2,142,1,64,28,33,72,47,1,1,2,15,1,63,1,175,1,191,1,
4,1,64,22,26,72,1,64,14,17,72,1,0,47,43,43,93,95,113,43,237,43,1,47,93,93,
93,47,93,113,49,48,1,33,53,33,2,88,253,219,2,37,4,212,127,0,1,255,221,4,177,
2,119,5,230,0,21,0,73,64,51,133,14,1,133,8,1,31,17,79,17,127,17,175,17,223,
17,5,239,17,1,17,64,5,64,29,60,72,5,16,80,5,96,5,2,5,149,128,11,143,15,0,
47,0,63,0,127,0,239,0,5,0,0,47,93,237,26,237,113,50,1,47,43,26,204,93,113,
49,48,0,93,93,1,34,46,2,39,51,30,3,51,50,62,2,55,51,14,3,1,41,74,116,84,50,
8,117,8,39,56,72,42,42,71,56,38,8,117,9,50,83,116,4,177,51,85,112,61,43,59,
36,15,16,36,59,42,61,112,85,51,0,1,0,156,5,32,1,80,5,204,0,3,0,23,64,12,3,
134,0,64,14,17,72,0,0,83,1,0,0,63,237,1,47,43,237,49,48,19,53,51,21,156,180,
5,32,172,172,0,0,2,0,51,4,144,2,23,6,115,0,19,0,39,0,89,185,0,18,255,232,
64,14,9,14,72,12,24,9,14,72,8,24,9,14,72,2,184,255,232,64,42,9,14,72,20,130,
64,0,192,30,130,95,10,1,10,25,141,15,15,31,15,2,15,35,141,15,5,47,5,63,5,
79,5,127,5,159,5,191,5,239,5,8,5,0,47,93,237,220,93,237,1,47,93,237,26,220,
26,237,49,48,43,43,43,43,1,20,14,2,35,34,46,2,53,52,62,2,51,50,30,2,7,52,
46,2,35,34,14,2,21,20,30,2,51,50,62,2,2,23,38,66,88,50,50,88,66,38,38,66,
88,50,50,88,66,38,108,21,36,49,28,29,49,36,21,21,36,49,29,28,49,36,21,5,130,
50,88,66,38,38,66,88,50,50,88,65,38,38,65,88,50,28,49,36,21,21,36,49,28,29,
49,38,21,21,38,49,0,0,0,0,1,0,80,254,85,1,174,0,0,0,23,0,76,64,55,14,24,9,
13,72,9,24,9,13,72,5,32,9,17,72,12,17,132,15,0,31,0,2,95,0,191,0,2,0,6,11,
64,7,10,72,11,20,141,16,3,1,32,3,80,3,96,3,112,3,176,3,192,3,6,3,0,47,93,
113,237,47,43,1,47,205,93,113,237,50,49,48,43,43,43,1,14,1,35,34,38,53,52,
62,2,55,51,14,3,21,20,22,51,50,54,55,1,174,28,71,40,105,106,34,48,53,20,133,
25,52,43,27,49,45,29,58,28,254,112,12,15,102,85,47,79,61,42,11,14,45,59,70,
39,42,48,13,11,0,1,255,233,4,177,2,182,5,189,0,27,2,77,185,0,26,255,232,64,
182,9,17,72,12,24,9,17,72,41,29,1,25,29,41,29,57,29,89,29,105,29,5,29,64,
229,232,72,29,64,217,220,72,11,29,1,208,169,29,185,29,201,29,3,155,29,1,9,
29,57,29,2,185,29,201,29,217,29,3,29,64,195,198,72,155,29,171,29,2,137,29,
1,123,29,1,73,29,1,137,29,185,29,2,29,64,171,175,72,6,29,54,29,2,158,153,
29,1,125,29,141,29,2,111,29,1,45,29,61,29,77,29,3,27,29,1,13,29,1,237,29,
253,29,2,29,128,136,139,72,137,29,153,29,2,91,29,107,29,123,29,3,29,192,127,
130,72,9,29,1,249,29,1,235,29,1,201,29,217,29,2,171,29,187,29,2,153,29,1,
22,29,38,29,102,29,118,29,134,29,5,4,29,1,110,29,184,255,64,64,96,101,109,
72,148,29,1,112,29,128,29,2,82,29,98,29,2,64,29,1,18,29,34,29,50,29,3,4,29,
1,228,29,244,29,2,214,29,1,196,29,1,176,29,1,162,29,1,128,29,144,29,2,82,
29,98,29,114,29,3,36,29,52,29,68,29,3,6,29,22,29,2,246,29,1,210,29,226,29,
2,192,29,1,146,29,162,29,178,29,3,100,29,116,29,132,29,3,29,184,255,192,64,
9,60,64,72,2,29,1,59,1,29,184,255,128,64,57,53,58,72,164,29,180,29,2,144,
29,1,100,29,116,29,132,29,3,48,29,64,29,80,29,3,4,29,20,29,36,29,3,208,29,
224,29,2,164,29,180,29,196,29,3,112,29,128,29,2,148,29,164,29,228,29,3,29,
184,255,192,64,19,26,31,72,128,29,1,84,29,100,29,116,29,3,29,64,7,10,72,23,
184,255,128,64,9,36,39,72,148,23,164,23,2,23,184,255,128,64,23,30,33,72,68,
23,1,48,23,1,2,0,23,16,23,32,23,3,208,23,224,23,2,23,184,255,192,64,43,13,
19,72,15,23,1,23,9,22,22,5,143,64,15,14,31,14,2,255,14,1,14,64,16,19,72,14,
128,19,143,8,15,0,47,0,63,0,127,0,239,0,5,0,0,47,93,50,237,26,221,43,93,113,
26,237,51,47,1,47,204,93,43,93,113,95,113,113,43,113,43,43,93,93,43,93,113,
113,113,114,114,114,114,114,43,95,94,93,43,93,93,93,93,93,113,113,113,113,
113,113,113,113,113,114,114,114,114,114,114,43,94,93,93,93,93,93,93,93,113,
43,113,113,43,113,114,114,114,114,114,114,94,93,43,93,113,113,113,113,43,
113,114,114,114,94,93,43,43,93,113,49,48,43,43,1,34,46,2,35,34,6,7,35,62,
3,51,50,30,2,51,50,54,55,51,14,3,1,236,42,84,78,71,31,55,54,9,91,5,20,45,
74,59,44,84,78,69,30,54,55,8,92,5,20,43,74,4,177,37,45,37,62,57,45,95,78,
50,37,45,37,63,56,44,95,78,51,0,0,0,2,0,22,4,177,3,25,5,228,0,5,0,11,0,111,
64,82,164,10,1,102,10,1,154,8,170,8,2,98,4,162,4,2,98,3,1,154,2,170,2,2,10,
159,6,1,15,6,31,6,127,6,223,6,4,7,6,4,64,63,0,79,0,143,0,175,0,191,0,207,
0,6,0,64,30,41,72,0,64,23,26,72,0,8,2,149,128,6,15,0,47,0,63,0,127,0,239,
0,5,0,0,47,93,50,26,237,50,1,47,43,43,93,26,205,220,94,93,113,205,49,48,93,
93,93,93,93,93,19,53,19,51,21,1,51,53,19,51,21,1,22,217,207,254,182,253,217,
207,254,182,4,177,20,1,31,29,254,234,20,1,31,29,254,234,0,0,1,0,205,4,194,
1,225,6,7,0,5,0,64,64,43,2,16,12,17,72,41,2,1,10,5,26,5,42,5,3,3,43,3,1,3,
64,0,2,128,132,0,148,0,2,112,0,1,2,16,0,32,0,64,0,96,0,4,0,0,47,93,95,93,
93,26,205,1,47,26,205,93,49,48,95,93,93,43,19,53,19,51,21,3,205,69,207,201,
4,194,33,1,36,37,254,224,0,3,0,29,4,176,2,139,6,65,0,5,0,9,0,13,0,83,64,53,
2,16,11,17,72,10,5,26,5,42,5,3,47,4,1,4,47,1,1,1,1,6,192,13,208,13,2,13,10,
192,9,208,9,2,9,6,11,7,144,6,2,0,0,10,192,6,1,15,6,63,6,2,6,0,47,93,93,51,
51,47,205,16,237,50,1,47,205,93,47,205,93,18,57,47,113,205,93,49,48,93,43,
19,53,19,51,21,3,37,53,51,21,33,53,51,21,250,69,187,181,254,216,150,1,66,
150,4,176,33,1,112,37,254,148,31,172,172,172,172,0,0,255,255,0,4,0,0,5,82,
5,131,16,38,0,36,0,0,17,7,1,80,255,108,255,124,0,94,179,2,0,24,1,184,255,
10,181,24,24,5,5,37,28,184,255,192,179,36,36,72,28,184,255,192,179,30,30,
72,28,184,255,192,179,24,24,72,28,184,255,192,179,21,21,72,28,184,255,192,
179,18,18,72,28,184,255,192,179,15,15,72,28,184,255,192,64,11,12,12,72,28,
64,11,11,72,2,23,3,0,63,53,1,43,43,43,43,43,43,43,43,43,93,53,0,1,0,187,1,
190,1,126,2,154,0,3,2,10,179,3,134,0,5,184,255,128,64,12,229,233,72,6,5,22,
5,2,246,5,1,5,184,255,128,64,33,222,225,72,150,5,166,5,2,116,5,132,5,2,86,
5,102,5,2,68,5,1,38,5,54,5,2,2,5,18,5,2,211,5,184,255,128,64,22,207,210,72,
198,5,214,5,2,180,5,1,150,5,166,5,2,116,5,132,5,2,5,184,255,192,64,36,195,
199,72,4,5,20,5,2,214,5,230,5,246,5,3,194,5,1,148,5,164,5,180,5,3,118,5,134,
5,2,84,5,100,5,2,5,184,255,192,64,34,174,181,72,164,5,180,5,196,5,3,70,5,
86,5,118,5,134,5,150,5,5,52,5,1,38,5,1,4,5,20,5,2,161,5,184,255,192,179,157,
160,72,5,184,255,192,64,37,152,155,72,100,5,116,5,2,54,5,70,5,86,5,3,36,5,
1,6,5,22,5,2,244,5,1,214,5,230,5,2,178,5,194,5,2,5,184,255,128,64,28,135,
138,72,86,5,102,5,2,36,5,52,5,68,5,3,2,5,18,5,2,212,5,228,5,244,5,3,5,184,
255,192,64,23,119,124,72,82,5,98,5,2,1,32,5,48,5,64,5,3,4,5,20,5,2,112,5,
184,255,128,64,9,103,111,72,68,5,84,5,2,5,184,255,192,179,99,102,72,5,184,
255,128,179,92,95,72,5,184,255,192,179,87,91,72,5,184,255,128,64,21,81,86,
72,36,5,52,5,68,5,3,228,5,1,176,5,192,5,208,5,3,5,184,255,192,64,16,67,70,
72,48,5,1,36,5,1,0,5,16,5,2,60,5,184,255,192,64,12,56,59,72,187,5,1,128,5,
144,5,2,5,184,255,192,64,41,45,48,72,11,5,1,208,5,224,5,2,164,5,180,5,196,
5,3,32,5,48,5,2,2,0,5,16,5,2,240,5,1,159,5,175,5,2,0,5,1,5,184,255,192,181,
13,17,72,0,155,1,0,47,237,1,43,93,93,93,113,95,113,113,113,114,43,114,114,
43,94,93,93,93,43,93,93,113,43,43,43,43,114,43,94,93,93,95,93,43,93,113,113,
113,43,113,113,113,114,114,114,114,43,43,94,93,93,93,93,93,43,113,113,113,
113,113,114,43,114,114,114,114,43,94,93,93,93,93,93,93,43,93,113,43,47,237,
49,48,19,53,51,21,187,195,1,190,220,220,0,0,255,255,255,245,0,0,5,238,5,131,
16,39,0,40,0,240,0,0,17,7,1,80,255,40,255,124,0,49,64,10,1,14,3,1,16,15,1,
0,15,1,184,255,113,64,19,15,15,1,1,37,0,208,0,1,191,0,1,47,0,1,47,0,1,0,16,
93,93,93,93,53,43,93,93,53,0,63,53,0,0,0,255,255,255,242,0,0,6,13,5,131,16,
39,0,43,0,237,0,0,17,7,1,80,255,37,255,124,0,95,185,0,19,255,192,179,21,21,
72,19,184,255,192,179,20,20,72,19,184,255,192,179,19,19,72,19,184,255,192,
179,17,17,72,19,184,255,192,64,13,14,14,72,1,14,3,1,16,15,1,0,15,1,184,255,
113,64,19,15,15,5,5,37,0,207,0,1,191,0,1,111,0,1,47,0,1,0,16,93,93,93,93,
53,43,93,93,53,0,63,53,1,43,43,43,43,43,0,255,255,255,232,0,0,2,85,5,131,
16,39,0,44,0,217,0,0,17,7,1,80,255,27,255,124,0,92,185,0,11,255,192,179,17,
17,72,11,184,255,192,64,23,12,12,72,11,64,11,11,72,11,64,9,9,72,1,6,3,1,16,
7,1,0,7,1,184,255,102,64,28,7,7,1,1,37,0,128,0,1,127,0,1,111,0,1,95,0,1,79,
0,1,47,0,1,47,0,1,0,16,93,93,93,93,93,93,93,53,43,93,93,53,0,63,53,1,43,43,
43,43,255,255,255,187,255,236,5,211,5,150,16,38,0,50,252,0,17,7,1,80,254,
238,255,124,0,39,64,10,2,42,3,2,192,40,1,0,40,1,184,255,94,64,11,40,40,10,
10,37,1,0,47,0,1,0,16,93,53,53,43,93,93,53,0,63,53,0,0,0,255,255,0,65,0,0,
6,171,5,131,16,39,0,60,1,130,0,0,17,7,1,80,255,116,255,124,5,192,64,21,16,
64,233,233,72,16,64,229,229,72,16,64,227,227,72,16,64,226,226,72,16,184,255,
192,179,224,224,72,16,184,255,192,64,19,222,222,72,16,64,220,220,72,16,64,
219,219,72,16,64,216,216,72,16,184,255,192,179,215,215,72,16,184,255,192,
64,19,211,211,72,16,64,207,207,72,16,64,206,206,72,16,64,205,205,72,16,184,
255,192,179,204,204,72,16,184,255,192,64,19,202,202,72,16,64,199,199,72,16,
64,186,186,72,16,64,184,184,72,16,184,255,192,179,183,183,72,16,184,255,192,
64,14,182,182,72,16,64,179,179,72,16,64,177,177,72,16,184,255,192,64,19,172,
172,72,16,64,166,166,72,16,64,164,164,72,16,64,163,163,72,16,184,255,192,
64,24,161,161,72,16,64,156,156,72,16,128,153,153,72,16,64,152,152,72,16,64,
151,151,72,16,184,255,192,179,149,149,72,16,184,255,128,179,148,148,72,16,
184,255,128,179,147,147,72,16,184,255,192,179,146,146,72,16,184,255,128,179,
145,145,72,16,184,255,192,179,144,144,72,16,184,255,128,179,141,141,72,16,
184,255,128,179,140,140,72,16,184,255,192,179,139,139,72,16,184,255,128,179,
138,138,72,16,184,255,192,179,137,137,72,16,184,255,192,179,136,136,72,16,
184,255,192,179,135,135,72,16,184,255,128,179,134,134,72,16,184,255,192,179,
133,133,72,16,184,255,128,179,131,131,72,16,184,255,192,179,130,130,72,16,
184,255,0,179,129,129,72,16,184,255,0,179,128,128,72,16,184,254,192,179,127,
127,72,16,184,255,0,179,126,126,72,16,184,255,0,179,125,125,72,16,184,255,
64,179,124,124,72,16,184,255,64,179,123,123,72,16,184,255,64,179,122,122,
72,16,184,255,0,179,121,121,72,16,184,254,192,179,120,120,72,16,184,255,0,
179,119,119,72,16,184,255,0,179,118,118,72,16,184,255,64,179,117,117,72,16,
184,255,0,179,116,116,72,16,184,255,64,179,115,115,72,16,184,255,0,179,114,
114,72,16,184,255,64,179,113,113,72,16,184,255,64,179,112,112,72,16,184,255,
64,179,111,111,72,16,184,255,128,179,110,110,72,16,184,255,64,179,109,109,
72,16,184,255,128,179,108,108,72,16,184,255,0,179,107,107,72,16,184,255,64,
179,106,106,72,16,184,255,0,179,105,105,72,16,184,255,64,179,104,104,72,16,
184,255,64,179,103,103,72,16,184,255,64,179,102,102,72,16,184,255,128,179,
101,101,72,16,184,255,64,179,100,100,72,16,184,255,64,179,99,99,72,16,184,
255,0,179,98,98,72,16,184,255,64,179,97,97,72,16,184,255,64,179,96,96,72,
16,184,255,64,179,95,95,72,16,184,255,64,179,94,94,72,16,184,255,64,179,93,
93,72,16,184,255,128,179,92,92,72,16,184,255,64,179,91,91,72,16,184,255,128,
179,90,90,72,16,184,255,64,179,89,89,72,16,184,255,128,179,88,88,72,16,184,
255,64,179,87,87,72,16,184,255,64,179,86,86,72,16,184,255,64,179,85,85,72,
16,184,255,64,179,84,84,72,16,184,255,64,179,83,83,72,16,184,255,128,179,
82,82,72,16,184,255,192,179,81,81,72,16,184,255,128,179,80,80,72,16,184,255,
128,179,79,79,72,16,184,255,64,179,78,78,72,16,184,255,64,179,77,77,72,16,
184,255,64,179,76,76,72,16,184,255,128,179,75,75,72,16,184,255,128,179,74,
74,72,16,184,255,128,179,73,73,72,16,184,255,64,179,72,72,72,16,184,255,128,
179,71,71,72,16,184,255,192,179,70,70,72,16,184,255,128,179,69,69,72,16,184,
255,192,179,68,68,72,16,184,255,192,179,67,67,72,16,184,255,128,179,66,66,
72,16,184,255,64,179,65,65,72,16,184,255,128,179,64,64,72,16,184,255,128,
179,63,63,72,16,184,255,128,179,62,62,72,16,184,255,192,179,61,61,72,16,184,
255,192,179,60,60,72,16,184,255,192,179,59,59,72,16,184,255,128,179,58,58,
72,16,184,255,128,179,57,57,72,16,184,255,128,179,56,56,72,16,184,255,128,
179,55,55,72,16,184,255,128,179,54,54,72,16,184,255,192,179,53,53,72,16,184,
255,192,179,52,52,72,16,184,255,128,179,51,51,72,16,184,255,192,179,50,50,
72,16,184,255,128,179,49,49,72,16,184,255,128,179,48,48,72,16,184,255,128,
179,47,47,72,16,184,255,192,179,46,46,72,16,184,255,128,179,45,45,72,16,184,
255,128,179,44,44,72,16,184,255,128,179,43,43,72,16,184,255,192,179,42,42,
72,16,184,255,192,179,41,41,72,16,184,255,192,179,40,40,72,16,184,255,192,
179,39,39,72,16,184,255,128,179,38,38,72,16,184,255,128,179,37,37,72,16,184,
255,128,179,36,36,72,16,184,255,192,179,35,35,72,16,184,255,128,179,34,34,
72,16,184,255,192,179,33,33,72,16,184,255,192,179,32,32,72,16,184,255,192,
179,31,31,72,16,184,255,192,179,30,30,72,16,184,255,192,179,29,29,72,16,184,
255,192,179,28,28,72,16,184,255,192,179,27,27,72,16,184,255,192,179,26,26,
72,16,184,255,192,179,25,25,72,16,184,255,192,179,24,24,72,16,184,255,128,
179,23,23,72,16,184,255,192,179,22,22,72,16,184,255,192,179,21,21,72,16,184,
255,192,179,17,17,72,16,184,255,128,179,16,16,72,16,184,255,192,179,15,15,
72,16,184,255,192,179,14,14,72,16,184,255,192,64,30,12,12,72,16,64,11,11,
72,1,11,3,1,128,12,1,112,12,1,96,12,1,64,12,1,16,12,1,0,12,1,184,255,166,
64,13,12,12,4,4,37,0,176,0,1,0,0,1,0,16,93,93,53,43,93,93,93,93,93,93,53,
0,63,53,1,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,255,255,255,187,0,0,
5,173,5,150,16,38,1,114,10,0,17,7,1,80,254,238,255,124,0,68,64,15,65,64,19,
19,72,1,60,3,1,144,58,1,16,58,1,184,255,62,64,28,58,58,53,53,37,0,159,0,1,
95,0,1,31,0,1,223,0,1,175,0,1,159,0,1,31,0,1,0,16,93,93,93,93,113,113,113,
53,43,93,93,53,0,63,53,1,43,0,0,255,255,255,176,0,0,2,30,6,65,16,38,1,130,
0,0,17,6,1,81,147,0,2,60,64,11,29,64,227,227,72,29,64,226,226,72,29,184,255,
192,179,223,223,72,29,184,255,192,179,220,220,72,29,184,255,192,64,19,219,
219,72,29,64,213,213,72,29,64,212,212,72,29,64,211,211,72,29,184,255,192,
179,207,207,72,29,184,255,192,179,206,206,72,29,184,255,192,64,19,205,205,
72,29,64,200,200,72,29,64,199,199,72,29,64,198,198,72,29,184,255,192,64,14,
192,192,72,29,64,182,182,72,29,64,177,177,72,29,184,255,192,179,175,175,72,
29,184,255,192,64,19,174,174,72,29,64,168,168,72,29,64,167,167,72,29,64,164,
164,72,29,184,255,192,179,161,161,72,29,184,255,192,64,19,160,160,72,29,64,
155,155,72,29,64,154,154,72,29,64,153,153,72,29,184,255,192,179,152,152,72,
29,184,255,192,64,19,151,151,72,29,64,141,141,72,29,64,132,132,72,29,64,131,
131,72,29,184,255,192,64,9,129,129,72,29,64,119,119,72,29,184,255,192,64,
14,115,115,72,29,64,110,110,72,29,64,109,109,72,29,184,255,192,64,19,106,
106,72,29,64,101,101,72,29,64,100,100,72,29,64,96,96,72,29,184,255,192,179,
94,94,72,29,184,255,192,64,19,93,93,72,29,64,87,87,72,29,64,86,86,72,29,64,
85,85,72,29,184,255,192,179,84,84,72,29,184,255,192,64,9,79,79,72,29,64,74,
74,72,29,184,255,192,64,24,61,61,72,29,64,56,56,72,29,64,55,55,72,29,64,54,
54,72,29,64,51,51,72,29,184,255,192,179,50,50,72,29,184,255,192,179,49,49,
72,29,184,255,192,64,19,48,48,72,29,64,42,42,72,29,64,41,41,72,29,64,40,40,
72,29,184,255,192,179,36,36,72,29,184,255,192,179,35,35,72,29,184,255,192,
64,19,34,34,72,29,64,29,29,72,29,64,24,24,72,29,64,23,23,72,29,184,255,192,
179,21,21,72,29,184,255,192,179,17,17,72,29,184,255,192,64,14,16,16,72,29,
64,9,9,72,29,64,8,8,72,29,184,255,192,64,12,7,7,72,3,2,1,14,17,38,3,2,1,184,
255,220,180,20,26,5,13,37,1,43,53,53,53,0,43,53,53,53,1,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,255,255,0,4,0,0,5,82,5,129,
18,6,0,36,0,0,255,255,0,168,0,0,4,234,5,129,18,6,0,37,0,0,0,1,0,168,0,1,4,
47,5,130,0,5,0,56,64,40,3,90,0,4,16,4,64,4,3,4,16,0,48,0,80,0,3,0,0,16,0,
32,0,64,0,96,0,128,0,160,0,7,7,0,2,95,5,3,3,18,0,63,63,237,1,47,94,93,113,
47,93,237,49,48,1,21,33,17,35,17,4,47,253,56,191,5,130,156,251,27,5,129,0,
2,0,61,0,0,5,26,5,129,0,5,0,18,0,176,64,26,106,7,122,7,138,7,3,101,17,117,
17,133,17,3,89,8,1,86,16,1,6,24,13,17,72,18,184,255,232,64,64,13,17,72,132,
2,1,70,2,102,2,118,2,3,139,1,1,73,1,105,1,121,1,3,2,1,12,12,0,6,95,3,1,16,
3,1,15,3,1,175,3,207,3,223,3,255,3,4,79,3,127,3,2,48,3,1,31,3,1,3,18,128,
0,1,0,184,255,192,64,29,21,30,72,0,48,20,1,47,20,1,0,3,6,3,18,95,5,18,12,
32,19,22,72,153,12,1,12,1,3,0,63,51,93,43,63,237,23,50,1,93,93,47,43,93,51,
47,93,93,93,93,113,113,113,51,18,57,61,47,51,51,49,48,93,93,93,93,43,43,93,
93,93,93,49,48,55,1,51,1,21,33,37,1,46,3,39,14,3,7,1,62,2,5,217,1,254,251,
35,4,21,254,174,16,29,22,15,1,2,14,23,28,16,254,173,141,4,244,251,12,141,
156,3,94,40,82,69,48,8,8,49,70,82,40,252,164,255,255,0,168,0,0,4,254,5,129,
18,6,0,40,0,0,255,255,0,65,0,0,4,163,5,129,18,6,0,61,0,0,255,255,0,168,0,
0,5,32,5,129,18,6,0,43,0,0,0,3,0,97,255,236,5,215,5,150,0,19,0,39,0,43,0,
179,64,130,105,12,1,102,17,1,89,22,1,86,32,1,86,28,1,26,23,90,23,2,21,27,
85,27,2,9,42,1,6,43,1,10,37,26,37,90,37,3,5,33,21,33,85,33,3,9,43,42,30,0,
91,15,20,1,59,207,20,239,20,2,0,20,1,239,20,255,20,2,176,20,1,111,20,1,48,
20,1,31,20,1,0,20,16,20,32,20,64,20,80,20,160,20,6,7,20,30,91,175,10,191,
10,2,32,10,1,15,10,31,10,2,10,43,95,40,40,35,25,95,15,4,35,95,5,19,128,45,
1,32,45,1,93,93,0,63,237,63,237,18,57,47,237,1,47,93,93,93,237,47,94,93,113,
113,113,113,113,114,114,94,93,237,18,57,57,49,48,94,93,93,93,93,93,93,93,
93,93,93,93,1,20,2,6,4,35,34,36,38,2,53,52,18,54,36,51,50,4,22,18,7,52,46,
2,35,34,14,2,21,20,30,2,51,50,62,2,37,33,21,33,5,215,95,180,254,252,165,174,
254,250,174,88,92,178,1,5,169,168,1,5,177,92,195,65,127,188,123,126,190,127,
63,65,127,189,123,132,191,123,59,252,226,2,75,253,181,2,199,165,254,242,192,
104,109,195,1,12,159,165,1,10,187,101,102,188,254,246,163,127,208,148,80,
80,148,208,127,127,211,153,85,86,153,212,208,160,0,0,0,255,255,0,189,0,0,
1,124,5,129,18,6,0,44,0,0,255,255,0,168,0,0,5,63,5,129,18,6,0,46,0,0,0,1,
0,10,0,1,5,78,5,130,0,16,0,202,64,11,116,16,132,16,2,123,15,139,15,2,13,184,
255,232,182,14,17,72,54,13,1,12,184,255,240,64,127,13,17,72,2,16,13,17,72,
1,24,14,17,72,57,1,1,111,18,1,48,18,1,47,18,1,0,18,1,21,16,37,16,53,16,3,
6,16,1,230,16,246,16,2,16,26,15,42,15,58,15,3,9,15,1,233,15,249,15,2,15,7,
7,21,13,37,13,53,13,3,6,13,1,230,13,246,13,2,13,175,14,191,14,2,14,26,1,42,
1,58,1,3,9,1,1,233,1,249,1,2,1,16,0,32,0,48,0,3,111,0,1,0,0,48,0,2,0,118,
7,134,7,2,7,15,3,14,0,18,0,63,50,63,51,93,1,47,93,93,113,50,93,113,113,47,
93,51,93,113,113,57,61,47,51,93,113,113,51,93,113,113,93,93,93,93,49,48,93,
43,43,43,93,43,93,93,37,35,1,46,1,39,38,39,6,7,14,1,7,1,35,1,51,5,78,201,
254,124,17,29,12,14,12,13,14,12,30,15,254,122,201,2,63,198,1,3,224,47,89,
35,41,37,39,41,35,89,45,252,32,5,129,0,255,255,0,168,0,0,6,2,5,129,18,6,0,
48,0,0,255,255,0,168,0,0,5,32,5,129,18,6,0,49,0,0,0,3,0,90,0,0,4,217,5,129,
0,3,0,7,0,11,0,75,64,49,82,3,1,10,9,5,3,95,6,1,15,6,31,6,175,6,191,6,4,6,
2,16,5,48,5,2,32,5,64,5,112,5,160,5,4,5,10,95,11,11,0,7,95,6,18,3,95,0,3,
0,63,237,63,237,17,57,47,237,1,47,93,113,51,47,93,113,51,18,57,57,49,48,113,
19,33,21,33,1,21,33,53,1,21,33,53,125,4,57,251,199,4,92,251,129,3,228,252,
183,5,129,156,251,183,156,156,2,133,154,154,0,0,0,255,255,0,97,255,236,5,
215,5,150,18,6,0,50,0,0,0,1,0,168,0,0,5,32,5,129,0,7,0,79,64,40,3,90,0,4,
16,4,64,4,3,7,4,7,90,64,111,0,127,0,143,0,191,0,4,0,0,9,128,32,9,1,32,9,160,
9,176,9,192,9,4,9,184,255,192,64,10,14,17,72,2,95,5,3,4,0,18,0,63,50,63,237,
1,43,93,113,26,16,204,47,93,26,237,47,94,93,237,49,48,33,17,33,17,35,17,33,
17,4,97,253,6,191,4,120,4,224,251,32,5,129,250,127,255,255,0,168,0,0,4,234,
5,129,18,6,0,51,0,0,0,1,0,108,0,0,4,161,5,129,0,12,0,188,64,135,169,3,1,105,
9,1,116,9,132,9,164,9,3,148,8,164,8,2,87,8,103,8,2,145,7,1,84,7,100,7,2,146,
10,162,10,2,116,10,132,10,2,70,10,86,10,102,10,3,57,3,185,3,2,249,3,1,103,
3,1,168,8,1,103,8,1,8,100,2,1,39,2,1,175,6,1,2,6,2,6,1,208,11,1,0,11,16,11,
48,11,80,11,96,11,128,11,6,7,11,70,7,1,11,7,1,7,3,3,10,175,1,191,1,2,32,1,
1,15,1,1,1,3,7,95,9,2,8,3,0,4,3,1,10,95,0,18,0,63,237,50,63,18,23,57,237,
50,1,47,93,93,93,51,51,47,51,113,113,47,94,93,93,18,57,57,47,47,93,113,113,
51,113,113,113,113,114,49,48,93,93,93,93,93,93,93,93,113,93,51,53,9,1,53,
33,21,33,1,21,1,33,21,108,2,26,253,247,3,231,252,240,1,202,254,22,3,109,162,
2,67,1,251,161,156,254,67,124,253,240,156,0,255,255,0,46,0,0,4,180,5,129,
18,6,0,55,0,0,255,255,0,45,0,0,5,41,5,129,18,6,0,60,0,0,0,3,0,117,255,245,
5,238,5,139,0,29,0,40,0,51,0,180,185,0,28,255,240,179,12,15,72,17,184,255,
240,179,12,15,72,27,184,255,240,179,12,15,72,18,184,255,240,64,72,12,15,72,
41,90,11,15,123,15,171,15,3,15,8,30,90,4,0,116,0,164,0,3,0,35,24,7,90,47,
21,4,8,1,20,8,36,8,68,8,116,8,164,8,244,8,6,8,20,53,68,53,2,0,53,1,132,53,
164,53,196,53,244,53,4,112,53,1,2,96,53,1,53,184,255,192,64,24,10,13,72,35,
46,96,10,6,10,34,49,96,20,24,20,10,20,10,20,7,22,3,7,18,0,63,63,18,57,57,
47,47,17,51,16,237,50,17,51,16,237,50,1,43,93,95,93,93,113,113,47,93,113,
51,51,253,50,50,220,93,237,16,220,93,237,49,48,0,43,43,43,43,1,20,14,2,43,
1,21,35,53,35,34,46,2,53,52,62,2,59,1,53,51,21,51,50,30,2,7,52,38,43,1,17,
51,50,62,2,37,20,30,2,59,1,17,35,34,6,5,238,64,131,197,133,83,185,83,133,
197,131,64,67,133,201,135,72,185,71,135,202,133,67,192,185,183,48,56,92,136,
89,43,252,7,43,89,136,92,56,52,182,182,2,224,105,188,143,84,227,227,84,143,
188,105,113,185,131,72,182,182,72,131,185,117,187,180,253,22,53,98,140,88,
88,140,98,53,2,234,180,255,255,0,46,0,0,5,43,5,129,18,6,0,59,0,0,0,1,0,145,
0,0,6,30,5,129,0,35,0,203,64,127,90,31,106,31,2,85,30,101,30,2,90,4,106,4,
2,90,5,106,5,2,74,22,1,69,13,1,3,25,90,100,28,1,132,28,148,28,2,28,19,35,
90,0,10,90,107,7,1,139,7,155,7,2,7,16,219,0,1,4,0,100,0,132,0,3,219,0,1,4,
0,52,0,68,0,100,0,132,0,148,0,180,0,196,0,8,7,0,4,37,36,37,52,37,68,37,132,
37,196,37,212,37,7,228,37,244,37,2,160,37,1,132,37,148,37,2,96,37,112,37,
2,84,37,1,64,37,1,2,37,184,255,192,64,18,9,12,72,34,2,96,19,239,15,1,15,15,
26,17,8,3,0,18,0,63,63,51,51,57,47,93,51,237,50,1,43,95,93,93,93,93,93,93,
113,47,94,93,93,113,113,51,220,93,113,237,16,253,50,220,93,113,237,49,48,
95,93,93,93,0,93,1,93,0,93,33,17,35,34,46,2,53,17,51,17,20,30,2,59,1,17,51,
17,51,50,62,2,53,17,51,17,20,14,2,43,1,17,2,251,83,133,201,134,67,191,47,
93,139,92,56,185,56,95,140,91,45,191,68,134,201,132,83,1,171,84,142,189,104,
1,207,254,45,80,137,100,57,3,73,252,183,57,100,137,80,1,211,254,49,104,189,
142,84,254,85,0,0,0,1,0,87,0,0,5,163,5,150,0,57,0,225,64,91,101,36,1,101,
22,1,157,49,1,143,49,1,49,16,11,15,72,157,9,1,143,9,1,9,16,11,15,72,116,3,
132,3,2,54,3,1,54,2,118,2,2,54,56,118,56,2,116,55,132,55,2,54,55,1,42,26,
1,42,32,1,41,53,48,40,10,18,96,40,112,40,144,40,3,111,18,127,18,159,18,3,
40,18,40,18,24,34,91,80,53,1,53,184,255,192,64,69,27,30,72,191,53,207,53,
2,48,53,1,53,17,5,91,31,24,79,24,2,224,24,1,15,24,31,24,95,24,207,24,223,
24,5,160,24,1,111,24,159,24,2,0,24,32,24,48,24,3,8,24,95,59,1,10,15,19,39,
48,5,42,95,18,41,18,29,95,0,4,0,63,237,63,51,237,23,50,1,93,47,94,93,93,93,
113,113,114,253,196,47,93,93,43,114,237,17,57,57,47,47,93,93,17,51,17,51,
16,196,49,48,0,93,93,93,93,93,93,93,93,43,93,93,43,93,93,93,93,1,50,30,2,
21,20,14,2,7,54,55,62,1,59,1,21,33,53,62,3,53,52,46,2,35,34,14,2,21,20,30,
2,23,21,33,53,51,50,22,23,22,23,46,3,53,52,62,2,2,253,151,241,168,90,59,109,
157,99,42,39,33,71,23,244,253,179,96,139,89,42,61,116,169,108,109,170,116,
61,42,89,139,96,253,179,244,23,71,33,39,42,99,157,109,59,90,168,241,5,150,
86,162,234,147,106,191,167,138,54,2,3,2,4,156,224,51,126,143,159,85,116,181,
124,65,65,124,181,116,85,159,143,126,51,224,156,4,2,3,2,54,138,167,191,106,
147,234,162,86,0,0,255,255,0,7,0,0,2,52,6,178,18,38,0,44,0,0,17,6,2,152,218,
0,0,23,64,13,2,1,4,5,38,2,1,1,8,6,0,2,37,1,43,53,53,0,43,53,53,0,0,3,0,45,
0,0,5,41,6,178,0,8,0,12,0,16,2,114,64,20,30,7,1,12,7,1,7,24,12,15,72,17,5,
1,3,5,1,16,3,5,184,255,232,64,255,12,15,72,12,133,9,16,133,64,13,5,4,14,2,
1,8,14,7,105,8,169,8,2,6,8,22,8,54,8,70,8,4,14,8,6,1,90,38,2,86,2,150,2,3,
118,2,230,2,2,57,2,73,2,2,6,2,1,16,2,153,18,169,18,201,18,3,86,18,1,9,18,
57,18,2,25,18,89,18,137,18,249,18,4,6,18,1,202,249,18,1,230,18,1,9,18,25,
18,185,18,201,18,4,198,18,1,89,18,121,18,169,18,3,54,18,1,41,18,57,18,185,
18,233,18,4,11,18,1,153,249,18,1,198,18,214,18,2,178,18,1,164,18,1,150,18,
1,130,18,1,116,18,1,86,18,102,18,2,66,18,1,36,18,52,18,2,18,18,1,4,18,1,244,
18,1,230,18,1,196,18,212,18,2,166,18,182,18,2,146,18,1,132,18,1,118,18,1,
98,18,1,84,18,1,54,18,70,18,2,36,18,1,22,18,1,4,18,1,242,18,1,1,208,18,224,
18,2,196,18,1,160,18,176,18,2,148,18,1,112,18,1,100,18,1,64,18,1,20,18,36,
18,52,18,3,0,18,1,105,64,202,228,18,244,18,2,208,18,1,164,18,180,18,196,18,
3,128,18,144,18,2,116,18,1,80,18,96,18,2,68,18,1,32,18,1,4,18,20,18,2,244,
18,1,224,18,1,196,18,212,18,2,176,18,1,84,18,100,18,116,18,148,18,164,18,
5,48,18,64,18,2,36,18,1,0,18,1,196,18,244,18,2,144,18,1,4,18,20,18,36,18,
68,18,84,18,116,18,132,18,7,57,224,18,1,132,18,164,18,212,18,3,112,18,1,4,
18,36,18,52,18,84,18,100,18,5,228,18,244,18,2,192,18,1,180,18,1,144,18,1,
4,18,20,18,52,18,84,18,132,18,5,212,18,228,18,2,187,18,1,164,18,1,112,18,
1,2,48,18,96,18,2,15,18,47,18,2,10,14,145,9,95,13,1,13,64,9,12,72,13,0,3,
59,3,75,3,123,3,3,3,1,8,4,3,1,18,0,63,63,51,18,57,93,17,51,47,43,93,51,237,
50,1,93,93,95,93,93,93,93,113,113,113,113,113,114,114,114,114,94,93,93,93,
113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114,94,93,
93,93,93,93,93,93,93,93,95,93,113,113,113,113,113,113,113,113,113,113,113,
113,113,114,114,114,114,114,114,114,114,114,114,114,114,94,93,93,113,113,
113,114,114,114,94,93,93,113,113,113,47,94,93,93,93,113,253,57,206,94,93,
93,50,43,1,24,16,77,230,50,47,26,237,220,237,49,48,43,95,94,93,93,43,93,93,
1,17,35,19,1,51,9,1,51,37,53,51,21,33,53,51,21,3,9,190,2,253,224,205,1,178,
1,176,205,253,249,163,253,211,165,2,72,253,184,2,72,3,57,253,97,2,159,121,
184,184,184,184,255,255,0,86,255,236,4,101,6,7,18,38,1,122,0,0,17,7,1,80,
1,33,0,0,0,19,64,11,2,60,17,38,2,26,60,63,8,23,37,1,43,53,0,43,53,0,0,0,255,
255,0,70,255,236,3,106,6,7,18,38,1,126,0,0,17,7,1,80,0,202,0,0,0,19,64,11,
1,58,17,38,1,73,58,61,16,6,37,1,43,53,0,43,53,0,0,0,255,255,0,106,254,88,
3,238,6,7,18,38,1,128,0,0,17,7,1,80,1,57,0,0,0,19,64,11,1,36,17,38,1,100,
36,39,17,34,37,1,43,53,0,43,53,0,0,0,255,255,0,137,0,0,1,178,6,7,18,38,1,
130,0,0,17,6,1,80,209,0,0,27,64,17,1,14,17,38,1,16,14,1,0,14,1,29,14,17,5,
13,37,1,43,93,93,53,0,43,53,0,255,255,0,133,255,236,3,254,6,65,18,38,1,142,
0,0,17,7,1,81,0,222,0,0,0,30,64,9,3,2,1,32,17,38,3,2,1,184,255,241,180,38,
44,10,0,37,1,43,53,53,53,0,43,53,53,53,0,2,0,86,255,236,4,101,4,78,0,39,0,
59,1,15,64,196,122,48,138,48,2,121,52,137,52,2,101,43,1,90,58,106,58,2,54,
14,70,14,2,29,31,45,31,2,29,38,45,38,2,47,37,1,29,37,1,75,36,107,36,2,47,
36,63,36,2,29,36,1,139,35,1,47,35,1,29,35,1,47,34,1,29,34,1,47,22,1,27,22,
1,47,21,1,27,21,1,75,20,107,20,2,47,20,1,27,20,1,45,19,1,27,19,1,121,6,137,
6,2,11,6,27,6,2,34,48,18,22,72,34,33,22,48,18,22,72,22,23,26,33,42,33,2,73,
23,1,26,23,42,23,2,33,23,159,28,175,28,191,28,3,28,64,29,33,72,28,64,0,16,
22,34,4,144,50,160,50,176,50,3,127,50,1,32,50,64,50,2,50,61,128,40,71,8,16,
61,1,0,50,28,16,4,23,33,21,23,15,55,80,11,16,45,80,5,22,0,63,237,63,237,63,
63,18,23,57,1,93,47,237,26,16,220,93,93,93,23,50,26,205,43,93,50,50,93,93,
93,17,51,43,17,51,43,49,48,0,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93,
93,93,93,93,93,93,93,93,93,93,0,93,1,93,0,93,1,93,37,14,3,35,34,2,17,16,18,
51,50,30,2,23,51,62,3,55,51,14,3,7,30,3,23,35,46,3,39,1,20,30,2,51,50,62,
2,55,46,3,35,34,14,2,3,75,26,65,87,111,70,205,193,217,209,69,112,86,63,20,
2,4,14,19,23,13,188,22,46,39,30,5,3,23,31,36,18,183,11,21,16,13,3,253,196,
28,59,93,66,54,100,82,61,14,12,45,71,102,70,66,96,64,31,237,56,94,69,38,1,
20,1,24,1,28,1,26,39,69,93,54,21,56,63,65,30,47,128,139,139,58,103,175,144,
110,39,28,66,65,58,20,1,49,112,160,103,48,52,107,160,108,86,154,115,68,46,
102,163,0,2,0,142,254,87,4,73,5,204,0,32,0,62,0,185,64,68,149,20,1,154,16,
1,123,7,139,7,2,122,60,138,60,2,106,3,122,3,138,3,3,102,31,118,31,2,74,50,
90,50,106,50,3,21,2,37,2,101,2,117,2,133,2,5,147,21,1,21,21,37,21,2,28,48,
23,72,52,48,48,64,48,2,96,48,1,48,184,255,192,64,58,20,23,72,48,52,48,52,
14,0,72,64,48,43,64,43,160,43,3,160,43,176,43,192,43,3,43,64,128,33,13,70,
0,14,16,14,48,14,3,8,14,28,48,80,49,49,38,57,80,18,0,13,27,33,38,80,9,5,22,
0,63,51,237,50,63,63,237,18,57,47,237,57,1,47,94,93,237,50,26,16,220,93,113,
26,237,18,57,57,47,47,43,93,113,16,237,17,57,49,48,93,93,93,93,93,0,93,93,
93,1,93,93,1,20,14,2,35,34,38,39,35,30,1,21,17,35,17,52,54,51,50,30,2,21,
20,14,2,7,30,3,1,30,3,51,50,62,2,53,52,46,2,35,53,62,1,53,52,46,2,35,34,14,
2,21,4,73,53,111,173,120,102,160,56,6,3,3,180,228,226,99,152,102,53,35,61,
81,46,57,114,91,56,252,249,28,71,81,87,43,72,110,73,38,38,81,128,89,127,113,
27,57,87,60,70,104,68,34,1,149,89,154,116,66,55,39,57,92,53,254,215,5,172,
237,220,47,90,130,82,73,111,82,56,18,11,55,93,137,254,218,19,34,25,14,41,
76,106,66,65,110,81,45,142,27,139,122,44,77,57,32,35,77,122,88,0,0,0,0,1,
0,7,254,88,3,249,4,58,0,24,0,237,64,59,59,22,75,22,2,41,22,1,59,21,75,21,
2,26,21,42,21,2,9,21,1,42,12,58,12,74,12,3,25,12,1,77,13,1,13,16,13,16,72,
66,2,1,54,2,1,34,2,1,6,2,22,2,2,13,2,1,1,17,1,184,255,240,64,76,13,16,72,
24,15,7,7,13,14,16,15,14,47,14,2,57,31,14,63,14,95,14,127,14,159,14,191,14,
223,14,255,14,8,63,14,127,14,159,14,191,14,223,14,255,14,6,0,14,32,14,2,224,
14,1,191,14,1,160,14,1,95,14,159,14,2,0,14,16,14,64,14,3,8,14,1,0,184,255,
240,64,17,127,0,1,0,64,26,1,0,26,48,26,96,26,144,26,4,26,184,255,192,64,14,
21,26,72,7,15,24,3,25,20,27,13,13,0,15,0,63,50,47,63,17,23,51,1,43,93,113,
47,93,56,50,47,94,93,93,93,93,93,113,113,114,94,93,56,51,57,61,47,51,51,49,
48,43,94,93,94,93,93,93,93,43,93,93,93,93,93,93,93,93,19,51,19,30,3,23,62,
3,55,19,51,1,14,3,7,35,62,1,55,7,192,245,7,21,20,17,4,5,18,21,22,8,239,191,
254,122,17,31,27,23,7,191,17,48,24,4,58,253,93,22,63,67,63,22,21,62,67,63,
22,2,165,251,251,45,111,124,132,65,131,213,91,0,0,0,2,0,86,255,236,4,29,5,
204,0,19,0,50,0,156,64,81,115,28,131,28,2,106,28,1,118,46,134,46,2,106,46,
1,90,2,106,2,2,90,17,106,17,2,85,13,101,13,2,114,26,130,26,2,38,26,1,128,
25,1,114,25,1,51,25,67,25,2,50,50,31,71,0,64,25,46,5,47,47,41,31,0,1,144,
0,1,0,52,128,10,71,31,41,1,41,47,20,80,5,184,255,224,64,22,23,28,72,5,24,
18,22,72,111,5,1,90,5,1,5,46,48,0,15,80,36,22,0,63,237,63,57,57,93,93,43,
43,237,50,1,47,93,237,26,16,204,93,113,17,57,47,57,57,51,26,16,237,50,47,
49,48,93,93,93,93,93,93,93,93,93,93,93,93,1,52,46,2,39,14,3,21,20,30,2,51,
50,62,2,1,34,46,2,39,1,30,3,21,20,14,2,35,34,46,2,53,52,62,2,55,1,53,33,21,
3,96,49,69,76,26,73,134,102,60,35,73,111,77,81,112,69,31,254,255,13,42,45,
41,13,1,60,54,102,79,49,64,123,180,115,114,180,125,66,73,127,169,96,254,193,
2,221,1,215,85,145,115,86,27,26,81,114,146,91,76,131,96,55,54,95,131,3,191,
2,3,2,1,254,188,55,116,134,159,97,110,182,131,72,68,127,183,115,112,176,135,
97,33,1,83,119,132,0,1,0,70,255,236,3,106,4,78,0,57,0,179,64,49,140,37,1,
133,3,1,53,36,69,36,2,55,34,1,42,8,1,37,5,1,14,24,9,12,72,10,29,26,29,42,
29,3,42,70,21,48,27,48,27,48,16,35,35,6,64,37,48,72,6,184,255,192,179,14,
17,72,6,184,255,192,64,66,8,11,72,6,59,53,71,31,16,63,16,79,16,95,16,4,16,
64,37,43,72,16,128,59,1,31,59,95,59,2,21,48,80,15,47,31,47,79,47,95,47,175,
47,223,47,239,47,7,191,47,207,47,2,47,47,0,39,80,36,32,16,0,80,5,11,22,0,
63,51,237,63,51,237,18,57,47,93,113,237,57,1,93,113,47,43,93,237,16,198,43,
43,43,50,47,17,57,57,47,47,18,57,237,49,48,93,43,0,93,1,93,0,93,93,93,93,
37,50,62,2,55,23,14,3,35,34,46,2,53,52,62,2,55,53,46,3,53,52,62,2,51,50,22,
23,7,46,1,35,34,6,21,20,30,2,51,21,34,14,2,21,20,30,2,1,200,54,96,79,63,21,
105,32,84,106,130,78,96,141,92,45,42,72,96,54,51,85,61,34,50,95,136,87,118,
191,67,128,47,125,75,91,96,55,97,131,75,72,139,109,66,29,52,74,114,31,48,
56,26,100,39,71,53,32,46,84,116,69,58,95,69,42,5,2,6,40,64,86,51,62,106,77,
44,86,99,88,71,68,85,74,57,70,37,12,135,11,40,80,69,45,69,46,24,0,0,0,1,0,
86,254,159,3,96,5,204,0,56,0,209,64,117,169,38,1,156,29,172,29,2,149,55,165,
55,2,173,39,1,124,39,140,39,156,39,3,117,8,1,115,2,1,100,36,132,36,148,36,
164,36,4,139,24,155,24,171,24,3,57,24,1,44,31,156,31,172,31,3,44,30,60,30,
76,30,3,100,54,132,54,164,54,3,38,54,86,54,2,240,47,1,47,47,21,0,71,33,40,
50,50,10,31,21,79,21,2,191,21,1,21,64,29,33,72,0,21,16,21,32,21,64,21,4,7,
21,50,47,80,5,26,0,184,255,240,64,31,19,22,72,135,0,151,0,2,218,33,1,169,
33,185,33,201,33,3,136,33,152,33,2,26,33,0,3,15,48,0,15,0,47,63,18,23,57,
93,93,93,93,43,17,51,237,50,1,47,94,93,43,93,113,205,50,47,51,47,237,18,57,
47,113,49,48,93,93,93,93,0,93,93,1,93,0,93,93,1,93,93,93,0,93,1,93,1,20,30,
2,23,30,3,21,20,14,2,7,39,62,3,53,52,46,2,39,46,5,53,52,62,4,55,53,14,3,35,
33,53,33,21,14,5,1,21,43,74,100,57,54,111,90,58,18,26,29,10,126,9,19,16,11,
36,66,94,57,42,89,82,73,54,31,49,85,113,127,135,64,12,34,36,34,11,254,167,
2,130,62,131,123,108,81,47,1,123,64,79,49,31,15,15,34,57,88,68,34,68,62,51,
17,56,12,33,38,39,19,34,45,33,25,13,10,23,36,50,74,100,67,83,176,176,175,
166,155,68,4,1,1,1,1,131,127,70,157,166,172,171,166,0,0,0,0,1,0,106,254,88,
3,238,4,78,0,35,0,100,185,0,32,255,232,64,46,9,12,72,35,70,64,80,0,1,159,
0,255,0,2,0,37,128,23,12,70,192,13,1,0,13,16,13,48,13,224,13,240,13,5,8,13,
240,37,1,255,37,1,112,37,1,37,184,255,192,64,14,19,23,72,35,27,23,6,80,29,
16,17,15,12,21,0,63,63,63,237,50,63,1,43,93,93,113,47,94,93,113,237,50,26,
16,220,93,113,26,237,49,48,43,1,17,52,46,2,35,34,14,2,21,17,35,17,52,38,39,
51,30,3,21,51,62,3,51,50,30,2,21,17,3,57,23,52,85,63,64,103,73,40,180,22,
14,170,9,14,10,5,3,26,62,82,106,70,90,130,84,39,254,88,4,86,79,106,65,27,
45,85,125,81,253,141,3,83,68,121,42,21,48,49,47,20,47,76,53,29,44,92,145,
100,251,135,0,0,0,0,3,0,106,255,236,4,9,5,203,0,15,0,26,0,37,0,194,64,108,
153,19,169,19,2,150,24,166,24,2,138,2,1,133,5,1,138,14,1,133,10,1,124,36,
140,36,2,115,29,131,29,2,85,29,101,29,2,124,18,140,18,2,74,18,90,18,106,18,
3,115,25,131,25,2,69,25,85,25,101,25,3,6,13,22,13,2,6,10,1,9,5,1,9,2,1,7,
33,0,71,64,15,21,31,21,127,21,143,21,239,21,255,21,6,21,64,45,48,72,21,39,
128,32,22,71,32,8,1,8,184,255,192,183,29,35,72,8,48,39,1,39,184,255,192,64,
19,30,35,72,223,39,1,22,80,32,32,16,27,80,11,0,16,80,3,22,0,63,237,63,237,
18,57,47,237,1,93,43,113,47,43,93,237,50,26,16,220,43,113,26,237,51,49,48,
0,94,93,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93,93,1,16,2,35,34,46,
1,2,53,16,18,51,50,30,1,18,1,50,62,2,55,33,30,3,19,34,14,2,7,33,46,3,4,9,
240,228,108,171,118,62,233,232,121,175,112,54,254,42,62,100,73,42,3,253,221,
3,44,71,94,66,62,99,72,42,3,2,35,3,40,69,97,2,221,254,131,254,140,92,186,
1,27,192,1,117,1,121,93,188,254,231,252,216,52,128,216,164,164,215,129,52,
4,217,51,126,212,161,161,212,126,51,0,0,0,1,0,137,0,0,1,141,4,58,0,13,1,13,
64,210,13,8,70,207,5,223,5,2,0,5,32,5,208,5,3,9,5,5,14,15,95,15,111,15,2,
32,15,1,224,15,240,15,2,111,15,127,15,143,15,3,0,15,16,15,32,15,3,205,207,
15,223,15,239,15,3,96,15,1,127,15,207,15,2,64,15,80,15,2,175,15,223,15,239,
15,3,96,15,112,15,2,15,15,31,15,2,154,255,15,1,208,15,224,15,2,63,15,1,159,
15,175,15,2,112,15,1,223,15,1,144,15,1,63,15,79,15,2,0,15,1,106,159,15,223,
15,239,15,3,96,15,112,15,2,15,15,1,239,15,255,15,2,128,15,208,15,2,63,15,
1,96,15,1,15,15,31,15,2,55,207,15,255,15,2,144,15,160,15,176,15,3,31,15,47,
15,63,15,3,176,15,192,15,208,15,3,15,15,31,15,111,15,3,144,15,160,15,224,
15,3,31,15,63,15,2,0,15,1,7,6,15,0,21,0,63,63,1,94,93,93,93,113,113,114,114,
114,94,93,93,113,113,113,114,114,114,94,93,93,93,93,113,113,114,114,114,94,
93,93,93,113,113,114,114,94,93,93,93,113,113,17,18,57,47,94,93,113,237,50,
49,48,51,46,3,53,17,51,17,20,30,2,23,199,15,24,15,8,180,11,21,30,18,16,53,
64,70,33,3,78,252,169,32,64,60,52,19,0,0,0,1,0,138,0,0,4,3,4,58,0,11,0,158,
64,114,148,9,164,9,2,102,9,118,9,134,9,3,172,0,1,139,0,155,0,2,105,0,121,
0,2,86,10,150,10,166,10,3,151,10,167,10,2,84,10,1,70,7,134,7,2,1,10,247,8,
1,8,10,9,16,9,9,0,11,16,0,11,160,11,2,0,11,16,11,32,11,64,11,160,11,224,11,
6,7,11,7,3,70,0,4,16,4,48,4,240,4,4,8,4,128,13,192,13,224,13,3,63,13,1,2,
1,7,10,4,8,5,15,4,0,21,0,63,50,63,51,23,57,1,93,93,47,94,93,237,50,47,94,
93,113,56,51,57,47,56,57,51,113,17,51,49,48,0,93,93,93,1,93,93,93,93,93,93,
33,1,7,17,35,17,51,17,1,51,9,1,3,48,254,146,132,180,180,1,219,211,254,73,
1,206,1,238,109,254,127,4,58,253,243,2,13,254,47,253,151,0,0,0,0,1,0,14,0,
0,3,238,5,204,0,33,1,60,64,101,149,15,1,157,23,1,138,2,1,137,1,1,137,25,153,
25,2,140,21,156,21,2,115,0,131,0,147,0,3,140,20,156,20,2,106,20,122,20,2,
146,32,1,132,32,1,101,32,117,32,2,3,102,26,118,26,150,26,3,141,26,157,26,
2,2,126,26,1,108,26,1,3,84,18,1,148,31,1,101,31,117,31,133,31,3,86,31,1,146,
29,1,2,128,29,1,84,29,1,144,28,1,28,184,255,224,64,59,13,16,72,146,27,1,84,
27,100,27,116,27,3,93,0,109,0,2,149,17,1,73,17,1,150,18,1,138,18,1,101,18,
117,18,2,38,18,86,18,2,42,3,58,3,74,3,122,3,138,3,5,26,0,20,10,10,19,32,33,
184,255,240,64,69,33,20,19,16,31,19,63,19,2,31,19,63,19,95,19,127,19,159,
19,191,19,223,19,255,19,8,223,19,255,19,2,192,19,1,95,19,159,19,2,0,19,16,
19,64,19,3,8,19,0,35,48,35,96,35,160,35,176,35,5,26,0,13,33,19,21,6,80,13,
0,0,63,237,63,51,18,57,57,1,93,47,94,93,93,93,93,113,114,56,51,47,56,51,18,
57,47,18,57,57,49,48,93,93,93,93,93,93,93,0,93,1,93,93,43,93,93,93,95,93,
93,93,93,0,93,95,93,93,95,93,1,93,95,93,93,93,93,93,93,93,93,93,93,93,0,93,
1,39,46,3,35,34,6,7,39,62,1,51,50,30,2,23,1,35,3,46,3,39,14,3,7,1,35,1,207,
36,27,42,45,57,40,11,32,6,35,25,72,32,55,87,73,67,36,1,171,190,207,8,18,18,
16,5,7,22,25,24,8,254,255,187,3,197,99,73,105,67,31,7,3,130,9,15,36,81,131,
95,251,139,2,65,22,56,59,56,21,21,60,62,55,18,253,193,0,0,0,1,0,138,254,119,
4,6,4,58,0,41,0,108,64,55,13,40,14,17,72,90,8,106,8,2,35,70,5,15,34,95,34,
2,159,34,175,34,255,34,3,0,34,16,34,32,34,3,7,34,43,23,19,70,0,20,16,20,48,
20,240,20,4,8,20,96,43,128,43,2,43,184,255,192,64,15,20,23,72,41,21,34,21,
15,19,5,28,80,14,11,22,0,63,51,237,50,47,63,51,63,1,43,93,47,94,93,237,50,
16,220,94,93,93,113,50,237,49,48,0,93,1,43,33,46,3,53,35,14,3,35,34,38,39,
35,30,1,21,17,35,17,51,17,20,30,2,51,50,62,2,53,17,51,17,20,30,2,23,3,94,
1,3,3,3,4,26,56,69,86,57,82,120,32,4,3,1,182,182,25,59,98,74,67,100,67,33,
181,1,2,2,1,6,46,59,59,20,51,79,53,27,64,58,32,63,27,254,139,5,195,253,124,
69,116,85,47,52,91,126,75,2,105,252,175,34,76,67,49,7,0,0,1,0,0,0,0,3,178,
4,58,0,18,2,35,64,79,130,17,146,17,162,17,3,153,6,169,6,2,131,8,147,8,163,
8,3,3,87,8,103,8,119,8,3,6,5,9,32,14,17,72,9,9,7,15,16,16,0,70,64,91,12,107,
12,123,12,3,91,12,219,12,235,12,3,180,12,196,12,2,11,12,27,12,59,12,91,12,
107,12,5,7,12,20,128,8,7,184,255,240,64,255,7,11,20,27,20,2,11,20,27,20,75,
20,91,20,139,20,155,20,203,20,219,20,8,255,20,1,196,20,212,20,2,160,20,1,
132,20,148,20,2,96,20,1,68,20,84,20,2,32,20,1,4,20,20,20,2,199,224,20,1,196,
20,212,20,2,160,20,1,4,20,20,20,68,20,84,20,132,20,148,20,6,68,20,84,20,132,
20,148,20,196,20,212,20,6,27,20,1,4,20,1,219,20,1,196,20,1,155,20,1,132,20,
1,91,20,1,68,20,1,27,20,1,4,20,1,151,11,20,27,20,75,20,91,20,139,20,155,20,
203,20,219,20,8,155,20,203,20,219,20,3,132,20,1,96,20,1,68,20,84,20,2,32,
20,1,4,20,20,20,2,224,20,1,196,20,212,20,2,160,20,1,132,20,148,20,2,96,20,
1,4,20,20,20,68,20,84,20,4,103,4,20,20,20,68,20,84,20,132,20,148,20,196,20,
212,20,8,219,20,1,196,20,1,155,20,1,132,20,1,91,20,1,68,20,1,27,20,1,4,20,
1,219,20,1,196,20,1,11,20,27,20,75,20,91,20,139,20,155,20,64,93,6,55,75,20,
91,20,139,20,155,20,203,20,219,20,6,63,20,1,32,20,1,4,20,20,20,2,224,20,1,
196,20,212,20,2,160,20,1,132,20,148,20,2,96,20,1,68,20,84,20,2,32,20,1,4,
20,20,20,2,196,20,212,20,2,160,20,1,132,20,148,20,2,96,20,1,2,80,20,1,47,
20,1,0,20,16,20,2,7,15,7,15,9,6,21,0,63,51,63,51,1,94,93,93,93,95,93,93,93,
93,113,113,113,113,113,113,113,113,114,114,114,114,94,93,93,93,113,113,113,
113,113,113,113,113,114,94,93,93,93,93,93,93,113,113,113,113,113,113,114,
94,93,93,93,93,93,93,93,93,113,113,113,114,114,114,114,94,93,93,93,93,93,
93,93,93,113,114,47,56,51,26,16,220,94,93,93,113,114,26,237,50,17,51,17,57,
61,47,43,51,51,49,48,93,95,93,93,93,1,20,14,2,7,35,1,51,1,54,18,53,52,38,
39,51,30,1,3,178,63,106,140,77,170,254,122,189,1,55,142,124,29,20,177,24,
28,3,78,99,218,221,214,94,4,58,252,96,185,1,86,156,81,119,45,45,113,0,0,0,
1,0,86,254,159,3,106,5,204,0,74,1,0,64,125,122,71,138,71,2,101,33,117,33,
133,33,3,105,39,1,85,50,1,83,44,1,57,2,1,110,66,126,66,142,66,3,26,66,42,
66,2,12,29,28,29,44,29,3,13,40,9,12,72,12,73,28,73,44,73,108,73,124,73,140,
73,6,5,11,95,37,1,79,37,1,112,37,128,37,2,37,17,95,26,1,111,26,1,26,37,26,
52,63,31,70,11,32,11,1,23,11,23,11,0,31,63,63,63,79,63,111,63,127,63,143,
63,175,63,191,63,207,63,9,159,63,175,63,255,63,3,63,184,255,192,64,17,7,11,
72,63,42,71,31,0,1,0,5,37,80,31,11,24,42,184,255,240,64,32,19,22,72,151,42,
1,0,16,19,22,72,152,0,1,52,0,42,3,57,32,36,1,36,36,24,57,26,17,23,80,24,0,
0,63,237,50,50,47,18,57,47,93,18,23,57,93,43,93,43,18,57,57,237,57,1,47,93,
237,47,43,93,113,18,57,57,47,47,93,16,237,16,205,50,50,47,93,114,51,47,93,
113,114,18,57,49,48,93,43,93,0,93,93,1,93,0,93,93,93,1,93,0,93,19,52,62,2,
55,53,46,3,53,52,62,2,55,53,14,3,43,1,53,33,21,14,3,21,20,30,2,23,21,14,3,
21,20,30,2,23,30,3,21,20,14,2,7,39,62,3,53,52,46,2,39,46,5,86,51,110,175,
125,68,118,87,51,50,79,97,47,12,68,80,76,18,74,2,122,77,144,112,68,60,99,
130,69,100,175,131,76,43,74,100,57,54,114,94,61,18,26,29,10,126,9,19,16,11,
39,70,97,57,42,89,82,73,54,31,1,98,76,147,124,90,19,2,5,39,68,96,62,64,93,
64,40,10,8,1,2,3,2,131,125,9,34,59,90,67,63,81,49,24,6,131,13,54,89,127,84,
64,79,49,31,15,15,34,57,88,68,34,68,62,51,17,56,12,33,38,39,19,34,45,33,25,
13,10,23,36,50,74,100,255,255,0,86,255,236,4,29,4,78,18,6,0,82,0,0,0,1,0,
79,255,236,5,43,4,58,0,48,0,115,64,35,53,12,117,12,133,12,3,3,40,7,17,72,
3,40,7,17,72,46,80,32,96,32,2,46,32,35,70,64,111,5,1,80,5,1,5,184,255,192,
64,38,8,11,72,5,50,128,15,50,47,50,2,13,7,72,79,25,95,25,111,25,207,25,4,
25,14,20,34,7,20,80,31,15,14,21,40,80,0,22,0,63,237,63,63,237,50,50,1,47,
50,50,93,237,50,93,26,16,220,43,93,113,26,237,50,50,93,47,49,48,43,0,43,1,
93,5,34,46,2,53,17,33,21,20,14,2,7,35,62,3,61,1,34,14,2,7,53,62,3,51,33,21,
35,17,20,30,2,51,50,62,2,55,21,14,1,4,102,59,82,52,24,254,110,16,27,36,19,
188,19,39,32,20,39,79,69,53,12,12,43,51,54,23,4,37,234,13,24,35,22,7,23,25,
23,8,31,69,20,28,59,94,66,2,212,72,131,251,228,195,74,76,197,226,247,125,
80,7,10,13,7,139,6,11,8,4,131,253,83,44,56,32,13,2,2,3,1,129,8,12,0,2,0,132,
254,87,4,59,4,79,0,26,0,47,0,129,64,64,122,25,1,101,20,117,20,2,106,19,122,
19,2,106,45,122,45,2,75,8,91,8,107,8,3,125,30,1,107,30,1,74,30,90,30,2,0,
71,64,160,27,1,27,49,128,38,15,70,223,16,1,0,16,16,16,48,16,3,8,16,48,49,
1,49,184,255,192,64,21,30,35,72,223,49,1,96,49,128,49,2,32,80,22,16,15,27,
43,80,5,22,0,63,237,63,63,237,1,93,93,43,113,47,94,93,113,237,50,26,16,220,
93,26,237,49,48,93,93,93,0,93,1,93,93,0,93,1,93,1,20,14,2,35,34,46,2,39,35,
30,1,21,17,35,17,52,62,2,51,50,30,2,7,52,46,2,35,34,14,2,21,17,30,3,51,50,
62,2,4,59,63,115,161,98,62,98,80,66,28,4,2,2,180,60,116,169,110,103,181,134,
78,193,44,83,116,72,69,100,64,30,28,72,80,87,44,67,100,67,33,2,4,118,197,
142,79,20,37,53,33,30,61,32,254,87,3,238,119,193,136,74,79,150,219,131,104,
166,115,61,53,101,146,93,254,195,35,55,37,20,58,107,152,0,0,1,0,86,254,159,
3,156,4,78,0,57,0,209,64,38,137,55,1,139,54,1,143,53,1,123,53,1,106,50,1,
96,2,1,52,15,68,15,84,15,3,82,10,98,10,130,10,3,51,10,67,10,2,3,184,255,224,
64,52,12,17,72,3,24,11,14,72,26,31,106,31,122,31,138,31,4,139,30,1,10,37,
26,37,2,7,71,31,40,1,40,52,17,79,28,1,143,28,159,28,223,28,3,28,64,24,27,
72,96,28,1,28,184,255,192,183,7,12,72,28,48,59,1,59,184,255,192,64,19,30,
35,72,223,59,1,12,33,40,16,19,22,72,136,40,152,40,2,7,184,255,240,64,19,19,
22,72,135,7,151,7,2,33,7,40,3,22,53,0,80,47,16,22,0,47,63,237,51,18,23,57,
93,43,93,43,17,51,1,93,43,113,47,43,93,43,93,113,205,50,47,93,237,49,48,93,
93,0,93,43,1,43,0,93,93,93,1,93,0,93,1,93,93,0,93,93,1,34,14,4,21,20,30,2,
23,30,3,21,20,14,2,7,39,62,3,53,52,46,2,39,46,5,53,52,62,4,51,50,30,2,23,
7,46,3,2,70,54,88,67,49,32,15,32,76,124,92,53,114,95,61,18,26,29,10,126,9,
19,16,11,35,68,97,63,66,113,94,72,50,26,20,46,75,110,148,97,68,99,73,54,22,
116,18,42,49,57,3,193,49,80,104,108,106,42,68,96,72,57,30,17,37,59,89,68,
34,68,62,51,17,56,12,33,38,39,19,30,44,36,31,17,18,40,51,68,93,122,81,47,
130,140,136,108,66,21,34,44,23,119,19,36,28,17,0,2,0,86,255,236,4,209,4,58,
0,28,0,47,0,132,64,94,133,12,1,122,13,138,13,2,131,46,1,101,46,117,46,2,100,
42,116,42,132,42,3,124,33,140,33,2,90,33,106,33,2,143,38,1,108,38,124,38,
2,74,38,90,38,2,15,17,31,17,111,17,127,17,4,7,17,0,71,64,15,29,143,29,191,
29,3,0,29,32,29,64,29,3,29,49,128,40,71,31,10,143,10,2,10,23,35,80,15,15,
43,80,5,22,0,63,237,63,237,50,1,47,93,237,26,16,220,93,113,26,237,196,94,
93,49,48,0,93,93,93,1,93,93,93,0,93,93,93,1,93,1,20,14,2,35,34,46,2,53,52,
62,2,51,33,21,35,34,46,2,39,21,30,3,7,52,46,2,39,35,34,14,2,21,20,22,51,50,
62,2,4,48,61,123,183,123,123,186,124,63,86,153,213,126,2,57,165,9,35,43,44,
17,28,55,43,26,189,20,34,45,25,89,83,143,107,61,151,147,78,117,76,38,1,235,
112,188,135,76,74,139,202,129,144,210,138,66,131,1,2,2,1,4,42,99,115,131,
78,74,132,116,99,42,50,105,160,110,207,206,52,97,139,0,1,0,29,255,236,3,24,
4,58,0,35,0,99,64,50,35,13,131,13,2,31,32,12,17,72,13,31,29,31,45,31,3,26,
13,26,127,5,143,5,2,5,15,70,0,34,32,34,2,34,34,36,37,79,37,1,208,37,1,159,
37,1,16,37,1,37,184,255,192,64,12,14,17,72,20,80,29,22,14,35,80,11,15,0,63,
237,50,63,237,1,43,93,93,93,113,17,18,57,47,93,253,204,93,51,51,47,49,48,
0,93,43,1,93,1,34,14,2,7,53,62,3,51,33,21,33,17,20,30,2,51,50,62,2,55,21,
14,1,35,34,46,2,53,17,1,25,39,79,69,53,12,12,43,51,54,23,2,68,254,208,13,
24,35,22,7,23,25,23,8,31,69,43,59,82,52,24,3,183,7,10,13,7,139,6,11,8,4,131,
253,83,44,56,32,13,2,2,3,1,129,8,12,28,59,94,66,2,212,0,0,0,1,0,133,255,236,
3,254,4,58,0,31,0,113,64,62,134,3,1,133,15,149,15,2,106,18,122,18,2,86,28,
1,25,8,41,8,2,27,0,71,64,15,21,1,47,21,159,21,2,160,21,1,21,33,128,13,70,
0,10,16,10,48,10,240,10,4,8,10,240,33,1,255,33,1,112,33,1,33,184,255,192,
64,13,20,23,72,31,33,1,26,11,15,16,80,5,22,0,63,237,63,51,1,93,43,93,93,113,
47,94,93,237,26,16,220,93,113,114,26,237,50,49,48,93,93,93,93,93,1,20,14,
2,35,34,46,2,53,17,51,17,20,22,51,50,62,2,53,52,46,2,39,51,30,3,3,254,53,
113,176,123,109,160,104,51,181,117,134,73,104,65,30,20,33,40,21,188,18,40,
32,21,2,59,137,218,154,82,50,107,166,116,2,151,253,99,146,148,50,108,170,
120,68,147,139,120,41,40,113,134,149,0,2,0,85,254,87,4,218,4,82,0,35,0,45,
0,130,64,21,101,34,1,101,33,117,33,133,33,3,74,21,90,21,2,69,21,85,21,2,45,
184,255,192,179,11,14,72,25,184,255,224,64,54,11,14,72,11,29,27,29,2,64,19,
80,19,2,19,19,24,71,13,7,36,71,224,0,1,0,43,6,72,27,0,7,64,7,2,7,64,47,1,
19,80,18,18,39,80,31,16,43,27,80,5,8,22,6,27,0,63,63,51,237,50,63,237,51,
47,237,1,113,47,93,51,253,50,220,113,237,16,220,237,50,47,93,49,48,93,0,43,
43,1,93,0,93,1,93,93,1,20,14,2,7,17,35,17,46,3,53,52,62,2,55,23,14,3,21,20,
22,23,17,52,54,51,50,30,2,7,52,38,35,34,6,21,17,62,1,4,218,74,132,184,110,
170,114,181,125,67,49,103,159,109,21,69,96,60,27,147,151,154,158,84,133,92,
49,189,87,80,68,76,162,149,2,53,151,215,140,71,6,254,105,1,151,5,72,138,207,
141,102,188,150,103,18,136,15,77,114,143,80,213,201,8,2,68,193,212,76,141,
199,121,193,211,129,140,253,185,7,218,0,0,0,1,0,21,254,88,4,27,4,80,0,27,
1,26,64,51,169,25,1,153,3,1,138,6,154,6,2,174,23,1,123,23,139,23,155,23,3,
84,21,1,173,27,1,140,27,156,27,2,123,27,1,90,27,106,27,2,41,27,57,27,2,26,
16,9,17,72,2,184,255,240,64,99,9,17,72,162,1,1,131,1,147,1,2,116,1,1,69,1,
85,1,101,1,3,38,1,54,1,2,166,25,1,153,25,1,39,25,55,25,71,25,3,3,101,19,117,
19,2,86,19,1,39,19,55,19,2,25,22,0,3,4,2,26,23,24,24,27,26,16,27,26,59,26,
91,26,123,26,155,26,187,26,219,26,7,219,26,251,26,2,4,26,20,26,68,26,3,7,
26,13,13,1,2,184,255,240,183,2,36,29,1,11,29,1,22,184,255,208,64,41,14,17,
72,70,22,1,53,22,1,139,0,1,125,0,1,2,75,0,91,0,107,0,3,63,0,1,0,25,3,22,4,
1,23,15,9,80,16,16,27,1,27,0,63,51,63,237,63,18,23,57,93,93,95,93,93,93,93,
43,1,93,93,47,56,51,51,47,47,94,93,93,113,56,51,51,47,51,17,18,23,57,49,48,
93,93,93,95,93,93,93,93,93,93,93,93,43,43,93,93,93,93,93,93,93,93,93,93,0,
93,37,1,35,1,3,46,3,35,34,6,7,39,62,1,51,50,30,2,23,19,1,51,9,1,35,2,30,254,
179,188,1,184,170,27,44,40,42,25,11,32,7,34,24,62,32,48,70,60,59,36,142,1,
8,187,254,144,1,150,190,239,253,105,3,57,1,87,54,82,55,28,7,3,131,9,11,27,
62,102,75,254,217,2,27,253,71,252,215,0,0,1,0,135,254,87,5,44,5,60,0,31,0,
128,64,90,121,18,1,18,16,7,10,72,121,19,137,19,153,19,3,121,11,1,11,16,7,
10,72,121,10,137,10,153,10,3,24,70,21,15,5,70,8,0,14,72,29,0,15,16,15,160,
15,208,15,4,8,15,128,33,176,33,224,33,3,111,33,1,32,33,1,255,33,1,80,33,128,
33,144,33,192,33,4,30,30,6,22,15,0,29,80,13,16,22,14,27,0,63,63,51,237,50,
63,51,51,47,1,93,93,113,113,113,47,94,93,51,253,50,220,237,16,220,237,49,
48,0,93,43,93,93,43,93,37,62,3,53,17,51,17,20,14,2,7,17,35,17,46,3,53,17,
51,17,20,30,2,23,17,51,3,46,87,124,80,37,182,59,124,193,134,170,134,192,124,
59,181,38,79,124,87,170,119,1,31,73,121,91,2,134,253,124,122,172,110,53,1,
254,107,1,149,1,53,110,172,122,2,132,253,122,90,121,73,32,1,4,197,0,0,0,0,
1,0,83,255,236,5,235,4,79,0,63,0,176,64,83,153,33,169,33,2,153,26,169,26,
2,119,16,1,122,58,138,58,2,10,37,26,37,42,37,154,37,170,37,5,10,22,26,22,
42,22,154,22,170,22,5,29,0,73,61,61,40,8,46,13,46,13,51,19,71,64,128,8,176,
8,2,15,8,1,7,8,65,128,51,71,63,40,1,40,0,65,1,48,65,1,240,65,1,65,184,255,
192,64,32,30,35,72,175,65,223,65,2,0,65,32,65,64,65,3,30,35,62,62,14,3,56,
80,24,35,22,46,13,80,45,14,16,0,63,51,237,50,63,51,237,50,17,57,47,18,57,
1,93,93,43,93,113,114,47,93,237,26,16,220,94,93,93,26,237,18,57,57,47,47,
17,18,57,47,237,57,49,48,0,93,93,1,93,93,0,93,93,1,20,22,51,50,62,2,53,52,
46,2,39,55,30,3,21,20,14,2,35,34,46,2,39,35,14,3,35,34,46,2,53,52,62,2,55,
23,14,3,21,20,30,2,51,50,62,2,61,1,51,3,115,114,102,65,87,53,22,29,61,97,
67,23,109,159,103,49,53,101,148,95,68,104,77,52,16,4,16,52,77,105,67,95,148,
101,53,49,103,159,109,23,68,96,62,28,22,52,86,65,51,82,57,30,166,1,193,157,
173,56,102,145,90,82,150,121,84,15,139,18,112,161,194,101,128,200,137,72,
36,68,99,64,64,99,68,36,72,137,200,128,101,194,161,112,18,139,15,84,121,150,
82,90,145,102,56,45,84,123,78,252,0,0,0,255,255,255,205,0,0,1,250,5,123,18,
38,1,130,0,0,17,6,0,105,160,0,0,25,182,2,1,14,17,38,2,1,184,255,217,180,18,
16,5,13,37,1,43,53,53,0,43,53,53,0,0,0,255,255,0,133,255,236,3,254,5,123,
18,38,1,142,0,0,17,7,0,105,0,242,0,0,0,25,182,2,1,32,17,38,2,1,184,255,244,
180,36,34,10,0,37,1,43,53,53,0,43,53,53,0,255,255,0,86,255,236,4,29,6,7,18,
38,0,82,0,0,17,7,1,80,1,41,0,0,0,19,64,11,2,35,17,38,2,70,35,38,8,0,37,1,
43,53,0,43,53,0,0,0,255,255,0,133,255,236,3,254,6,7,18,38,1,142,0,0,17,7,
1,80,0,252,0,0,0,19,64,11,1,32,17,38,1,17,32,35,10,0,37,1,43,53,0,43,53,0,
0,0,255,255,0,83,255,236,5,235,6,7,18,38,1,146,0,0,17,7,1,80,1,255,0,0,0,
19,64,11,1,64,17,38,1,55,64,67,40,19,37,1,43,53,0,43,53,0,0,0,255,255,0,168,
0,0,4,254,6,178,16,38,0,40,0,0,17,7,2,152,1,121,0,0,0,153,185,0,21,255,192,
179,233,233,72,21,184,255,192,179,230,230,72,21,184,255,192,179,227,227,72,
21,184,255,192,179,224,224,72,21,184,255,192,179,221,221,72,21,184,255,192,
179,218,218,72,21,184,255,192,179,215,215,72,21,184,255,192,179,212,212,72,
21,184,255,192,179,209,209,72,21,184,255,192,179,206,206,72,21,184,255,192,
179,203,203,72,21,184,255,192,179,200,200,72,21,184,255,192,179,197,197,72,
21,184,255,192,64,10,11,11,72,2,1,12,5,38,2,1,184,255,234,180,16,14,0,10,
37,1,43,53,53,0,43,53,53,1,43,43,43,43,43,43,43,43,43,43,43,43,43,43,0,0,
1,0,46,255,236,6,79,5,129,0,45,0,133,64,13,155,31,171,31,2,101,37,117,37,
133,37,3,2,184,255,224,64,71,13,17,72,18,16,12,15,72,42,13,58,13,2,36,7,52,
7,2,20,20,10,42,1,39,90,45,175,40,1,0,40,1,40,10,90,0,29,16,29,176,29,224,
29,4,7,29,0,42,95,43,38,33,95,1,6,6,40,43,3,40,18,26,95,15,63,21,1,21,21,
15,19,0,63,51,47,93,16,237,63,63,18,57,47,51,237,50,16,237,50,1,47,94,93,
237,47,93,93,204,253,50,204,18,57,47,49,48,0,93,93,43,43,93,93,1,17,62,3,
51,50,22,29,1,20,14,2,35,34,46,2,39,55,30,3,51,50,54,61,1,52,38,35,34,14,
2,7,17,35,17,33,53,33,21,2,208,33,109,127,130,53,226,217,41,86,133,92,53,
88,75,64,29,111,18,41,48,56,33,84,80,129,144,51,123,120,105,33,190,254,28,
4,134,4,229,254,160,7,20,19,13,187,188,214,93,145,100,53,17,32,46,28,123,
16,33,26,17,101,111,219,119,122,10,15,17,8,253,12,4,229,156,156,0,255,255,
0,168,0,1,4,47,6,240,16,38,1,93,0,0,17,7,2,149,1,113,0,0,0,19,64,11,1,6,5,
38,1,33,6,9,4,0,37,1,43,53,0,43,53,0,0,0,0,1,0,104,255,236,5,121,5,150,0,
42,0,218,64,156,156,17,172,17,2,156,15,172,15,2,156,39,172,39,2,138,39,1,
156,41,172,41,2,138,41,1,137,31,1,117,11,1,117,10,165,10,2,166,26,1,73,26,
137,26,2,70,32,134,32,2,37,10,53,10,2,42,3,58,3,2,3,68,44,1,7,7,19,5,8,91,
116,29,132,29,2,203,29,219,29,2,68,29,1,43,29,1,29,37,235,19,1,100,19,116,
19,164,19,212,19,4,64,19,1,2,0,19,48,19,2,7,19,8,95,127,5,175,5,2,5,5,13,
34,79,38,1,38,38,0,95,34,4,13,95,24,16,18,32,18,2,48,18,64,18,112,18,128,
18,192,18,208,18,6,18,18,24,19,0,63,51,47,93,113,16,237,63,237,51,47,93,17,
18,57,47,113,237,1,47,94,93,95,93,93,113,51,47,93,93,93,113,237,50,17,57,
47,93,49,48,0,95,93,93,93,93,93,1,93,0,93,1,93,93,93,93,93,93,93,1,34,14,
2,7,33,21,33,30,3,51,50,62,2,55,23,14,3,35,34,36,38,2,53,52,18,54,36,51,50,
4,23,7,46,3,3,24,111,173,124,73,10,2,142,253,114,9,77,128,176,109,90,141,
108,79,27,156,40,108,148,191,123,171,254,255,173,86,91,175,1,0,164,225,1,
46,71,181,20,68,102,137,4,250,68,126,178,110,154,112,185,132,72,50,82,105,
55,77,79,136,100,57,109,195,1,12,159,165,1,10,187,101,176,173,60,50,91,70,
42,0,0,255,255,0,93,255,236,4,248,5,150,18,6,0,54,0,0,255,255,0,189,0,0,1,
124,5,129,18,6,0,44,0,0,255,255,0,7,0,0,2,52,6,178,18,38,0,44,0,0,17,6,2,
152,218,0,0,23,64,13,2,1,4,5,38,2,1,1,8,6,0,2,37,1,43,53,53,0,43,53,53,0,
255,255,0,32,255,236,3,104,5,129,18,6,0,45,0,0,0,2,0,18,255,240,8,11,5,129,
0,38,0,47,0,215,64,98,57,29,1,166,8,1,167,11,1,162,10,1,133,10,149,10,2,58,
10,1,154,15,170,15,2,141,13,157,13,173,13,3,121,13,1,116,47,132,47,148,47,
3,123,40,139,40,155,40,3,101,11,1,141,14,157,14,173,14,3,14,32,10,14,72,43,
30,123,30,139,30,155,30,4,42,31,122,31,2,0,90,48,39,1,0,39,16,39,2,7,39,20,
13,36,13,52,13,3,13,184,255,248,64,14,22,25,72,73,8,1,20,8,36,8,52,8,3,8,
184,255,248,64,39,22,25,72,9,31,73,31,2,8,13,31,3,175,20,191,20,2,20,33,44,
90,6,43,95,33,33,6,8,95,31,3,23,95,16,19,44,95,6,18,0,63,237,63,237,63,237,
18,57,47,237,1,47,237,50,47,93,23,51,113,43,113,113,43,113,47,94,93,113,237,
49,48,93,93,0,43,93,1,93,0,93,93,93,93,93,1,93,93,93,93,93,93,1,20,14,2,35,
33,17,33,3,6,2,14,3,35,34,38,39,53,30,1,51,50,62,4,55,19,33,17,33,50,30,2,
7,52,38,35,33,17,33,50,54,8,11,61,121,182,121,253,183,254,96,49,22,43,49,
60,78,102,66,25,47,14,11,35,10,30,52,45,42,39,40,21,67,3,2,1,126,125,186,
124,62,192,164,164,254,153,1,111,164,156,1,157,87,150,112,64,4,225,254,144,
172,254,245,199,137,85,37,5,5,152,4,3,23,62,107,169,238,161,1,254,253,172,
58,105,147,92,121,129,254,2,136,0,0,0,2,0,168,0,0,7,171,5,129,0,22,0,31,0,
110,64,25,116,31,132,31,148,31,3,123,24,139,24,155,24,3,38,20,54,20,2,0,90,
176,23,1,23,184,255,192,64,43,7,11,72,23,13,9,90,0,10,16,10,64,10,3,7,10,
17,28,90,14,0,6,1,8,6,27,95,17,17,8,95,13,13,10,15,11,3,10,18,28,95,6,18,
0,63,237,63,63,51,18,57,47,237,51,47,237,1,47,94,93,51,237,50,47,94,93,237,
50,47,43,93,237,49,48,0,93,93,93,1,20,14,2,35,33,17,33,17,35,17,51,17,33,
17,51,17,33,50,30,2,7,52,38,35,33,17,33,50,54,7,171,61,121,182,121,253,223,
253,194,191,191,2,62,191,1,86,125,186,124,62,192,164,164,254,193,1,71,164,
156,1,157,87,150,112,64,2,141,253,115,5,129,253,172,2,84,253,172,58,105,147,
92,121,129,254,2,136,0,0,0,0,1,0,46,0,0,6,47,5,129,0,27,0,131,64,13,155,2,
171,2,2,101,8,117,8,133,8,3,19,184,255,224,64,76,13,17,72,37,24,53,24,69,
24,3,18,13,10,90,16,175,11,1,0,11,48,11,2,11,27,90,0,0,48,0,192,0,208,0,4,
7,0,176,29,192,29,208,29,3,176,29,240,29,2,255,29,1,16,29,112,29,160,29,176,
29,4,9,4,95,18,23,23,0,17,13,95,14,3,11,0,18,0,63,50,63,237,50,18,57,47,51,
237,50,1,93,93,113,114,47,94,93,237,47,93,93,204,253,204,51,49,48,0,93,43,
93,93,33,17,52,38,35,34,14,2,7,17,35,17,33,53,33,21,33,17,62,3,51,50,22,21,
17,5,113,128,133,53,116,110,98,35,190,254,28,4,179,253,239,36,98,112,118,
56,229,214,2,63,122,109,10,15,18,7,253,12,4,229,156,156,254,160,8,20,18,13,
187,178,253,173,0,0,0,255,255,0,168,0,0,4,157,6,240,18,38,1,176,0,0,17,7,
2,149,1,172,0,0,0,19,64,11,1,23,5,38,1,37,23,26,0,13,37,1,43,53,0,43,53,0,
0,0,255,255,0,55,255,236,5,31,7,58,18,38,1,185,0,0,17,7,2,145,1,94,1,74,0,
19,64,11,1,26,5,38,1,7,31,39,21,25,37,1,43,53,0,43,53,0,0,0,0,1,0,168,254,
104,5,24,5,129,0,11,0,94,64,64,11,92,0,0,2,9,90,127,6,1,0,6,48,6,64,6,3,143,
6,159,6,207,6,3,0,6,64,6,2,6,5,90,0,2,16,2,64,2,3,7,2,16,13,1,32,13,128,13,
224,13,3,15,13,1,7,7,3,3,10,5,95,2,18,0,0,47,63,237,51,63,51,47,1,93,93,113,
47,94,93,237,47,93,93,113,113,237,18,57,47,237,49,48,1,17,33,17,51,17,33,
17,51,17,33,17,2,134,254,34,191,2,247,186,254,34,254,104,1,152,5,129,251,
31,4,225,250,127,254,104,255,255,0,4,0,0,5,82,5,129,18,6,0,36,0,0,0,2,0,168,
0,0,4,214,5,129,0,16,0,25,0,142,64,70,116,25,132,25,148,25,3,123,18,139,18,
155,18,3,153,14,1,38,14,1,9,9,0,90,223,17,1,80,17,128,17,2,31,17,1,255,17,
1,192,17,1,159,17,1,0,17,16,17,32,17,64,17,4,17,11,22,90,0,6,16,6,64,6,3,
7,6,48,27,1,27,184,255,192,64,27,30,35,72,223,27,1,21,95,64,11,1,160,11,208,
11,2,11,11,6,10,95,7,3,22,95,6,18,0,63,237,63,237,18,57,47,93,113,237,1,93,
43,113,47,94,93,237,50,47,93,93,93,93,113,113,113,237,50,47,49,48,0,93,93,
93,93,1,20,14,2,35,33,17,33,21,33,17,33,50,30,2,7,52,38,35,33,17,33,50,54,
4,214,61,121,182,121,253,183,3,158,253,33,1,126,125,186,124,62,192,164,164,
254,153,1,111,164,156,1,157,87,150,112,64,5,129,156,254,72,58,105,147,92,
121,129,254,2,136,0,0,0,255,255,0,168,0,0,4,234,5,129,18,6,0,37,0,0,255,255,
0,168,0,1,4,47,5,130,16,6,1,93,0,0,0,2,0,15,254,104,5,69,5,129,0,16,0,25,
0,194,64,95,150,10,1,150,20,1,150,15,1,144,19,1,134,19,1,115,22,131,22,2,
3,147,24,1,2,128,24,1,114,24,1,102,24,1,85,11,101,11,2,90,14,106,14,2,97,
23,145,23,2,83,23,1,53,23,69,23,2,2,92,3,3,0,90,191,17,207,17,2,160,17,1,
31,17,95,17,127,17,143,17,159,17,5,0,17,1,8,17,20,25,36,25,52,25,3,25,184,
255,248,64,11,22,25,72,20,19,36,19,52,19,3,19,184,255,248,64,28,22,25,72,
9,15,19,25,4,6,92,7,15,27,47,27,2,19,95,15,3,8,0,25,95,5,18,7,2,0,47,51,63,
237,50,50,63,237,1,93,47,237,23,51,43,113,43,113,47,94,93,93,93,93,237,50,
47,237,49,48,93,93,93,93,93,93,93,93,95,93,95,93,93,93,93,93,93,37,51,17,
35,17,33,17,35,17,51,62,3,55,19,33,3,17,33,3,14,3,7,4,150,175,180,252,50,
180,144,41,66,55,44,18,67,2,212,186,254,137,49,18,40,46,54,32,160,253,200,
1,152,254,104,2,56,51,138,181,228,141,1,254,251,31,4,65,254,144,134,221,178,
137,51,255,255,0,168,0,0,4,254,5,129,18,6,0,40,0,0,0,1,0,28,0,0,7,71,5,129,
0,41,1,72,64,41,133,8,1,117,31,133,31,2,117,14,1,99,24,1,108,25,124,25,140,
25,3,108,26,124,26,140,26,3,101,13,117,13,133,13,3,33,40,14,17,72,6,184,255,
216,64,35,14,17,72,58,24,74,24,2,41,24,1,53,15,69,15,117,15,3,3,39,15,1,27,
48,14,17,72,40,27,56,27,72,27,3,12,184,255,208,64,11,14,17,72,39,12,55,12,
71,12,3,31,184,255,224,179,14,17,72,31,184,255,240,64,73,10,13,72,8,32,14,
17,72,8,16,10,13,72,34,31,27,31,28,28,32,21,40,90,41,5,8,12,8,41,11,11,7,
18,52,41,1,116,41,196,41,228,41,3,41,33,32,16,32,64,29,32,72,228,32,1,155,
32,171,32,2,68,32,116,32,2,11,32,43,32,2,32,6,7,184,255,240,64,51,171,7,187,
7,2,7,68,43,116,43,132,43,228,43,4,47,43,1,2,15,43,1,31,8,34,5,8,5,39,0,96,
21,127,18,175,18,2,47,18,1,18,18,6,27,19,11,3,41,33,6,18,0,63,51,51,63,51,
51,18,57,47,93,113,51,237,50,57,57,17,51,17,51,1,93,95,93,93,47,93,56,51,
47,93,93,93,93,43,56,51,47,93,113,51,18,57,47,18,57,51,17,51,16,237,50,17,
57,47,57,51,17,51,49,48,43,43,43,43,93,43,93,43,93,95,93,93,93,43,43,93,93,
93,0,93,1,93,0,93,93,1,34,46,2,39,1,35,1,38,39,1,51,19,30,3,51,17,51,17,50,
62,2,55,19,51,1,6,7,1,35,1,14,3,35,17,35,3,82,17,45,48,46,17,254,85,222,1,
253,48,131,254,229,200,205,66,90,76,81,57,191,57,81,76,90,66,205,200,254,
229,131,48,1,253,222,254,85,17,46,48,45,17,191,2,133,6,11,13,8,253,85,3,7,
35,189,1,154,254,207,99,123,68,24,2,107,253,149,24,68,123,99,1,49,254,102,
189,35,252,249,2,171,8,13,11,6,253,123,0,1,0,67,255,236,4,112,5,149,0,60,
1,7,64,51,138,33,1,134,7,1,124,28,140,28,2,3,112,21,1,112,20,1,2,96,20,1,
101,8,117,8,133,8,3,132,34,1,101,34,117,34,2,124,13,1,90,13,106,13,2,59,23,
75,23,2,33,184,255,232,64,122,11,16,72,5,43,1,3,51,20,25,90,46,64,25,37,72,
46,46,56,90,16,139,36,155,36,171,36,3,127,20,1,2,95,20,111,20,2,36,20,36,
20,5,112,16,1,79,16,111,16,2,255,16,1,160,16,1,127,16,1,0,16,16,16,48,16,
3,16,175,5,191,5,2,5,64,32,45,72,5,64,13,16,72,5,51,20,95,127,21,175,21,2,
21,21,11,41,35,64,13,16,72,35,35,30,95,41,4,11,95,0,32,6,48,6,112,6,128,6,
4,208,6,1,6,184,255,192,182,13,17,72,6,6,0,19,0,63,50,47,43,93,113,16,237,
63,237,51,47,43,17,18,57,47,113,237,57,1,47,43,43,93,47,93,93,93,93,113,113,
18,57,57,47,47,93,95,93,113,16,237,50,47,43,237,18,57,49,48,0,95,93,1,43,
93,93,93,93,93,93,93,95,93,93,95,93,93,0,93,5,34,46,2,39,55,30,3,51,50,62,
2,53,52,38,43,1,53,51,50,54,53,52,46,2,35,34,14,2,7,39,62,3,51,50,30,2,21,
20,14,2,7,30,3,21,20,14,2,2,109,118,176,130,94,36,165,24,66,91,121,80,77,
122,85,45,192,202,71,71,181,173,39,72,104,65,77,114,83,56,19,178,33,96,132,
168,105,108,172,120,64,40,73,104,63,67,117,87,51,69,132,192,20,50,91,128,
79,77,55,98,75,44,37,69,100,64,133,118,148,119,123,55,86,59,30,40,68,90,49,
61,82,127,87,45,53,96,136,83,68,107,80,55,15,10,50,82,115,73,95,156,113,62,
0,1,0,168,0,0,5,24,5,129,0,19,0,123,64,17,172,18,1,138,18,154,18,2,147,8,
163,8,2,133,8,1,19,184,255,232,64,65,9,17,72,9,24,9,17,72,11,92,41,9,1,9,
64,12,80,12,144,12,3,224,12,1,143,12,159,12,175,12,3,0,12,48,12,2,12,166,
19,1,19,2,92,0,1,16,1,2,7,1,15,21,47,21,2,9,18,9,1,3,12,12,8,0,18,0,63,50,
50,47,63,51,51,47,1,93,47,94,93,237,50,113,47,93,93,93,113,51,113,237,49,
48,43,43,0,93,93,93,93,51,17,51,17,20,6,7,6,7,1,51,17,35,17,52,54,55,54,55,
1,168,172,2,2,2,2,2,238,222,170,1,2,1,2,253,26,5,129,252,100,51,98,39,46,
40,4,174,250,127,3,168,39,89,38,44,44,251,90,0,255,255,0,168,0,0,5,24,7,58,
18,38,1,174,0,0,17,7,2,145,1,146,1,74,0,19,64,11,1,20,5,38,1,6,25,33,0,10,
37,1,43,53,0,43,53,0,0,0,0,1,0,168,0,0,4,157,5,129,0,22,0,151,64,104,84,12,
116,12,132,12,3,84,15,1,139,8,1,122,8,1,89,8,105,8,2,140,14,1,14,24,13,16,
72,58,5,1,100,12,116,12,132,12,3,80,12,1,53,12,69,12,2,15,12,8,12,9,16,32,
9,96,9,128,9,3,9,9,13,2,21,90,32,22,1,22,14,13,16,15,13,127,13,207,13,239,
13,4,47,13,1,13,47,24,1,15,12,20,96,47,2,1,2,2,22,13,18,8,0,3,0,63,50,63,
51,57,47,93,237,50,57,1,93,47,93,113,56,51,47,93,237,50,17,57,47,93,56,57,
51,17,51,49,48,93,93,93,93,43,93,93,93,93,93,0,93,19,51,17,50,62,2,55,19,
51,1,6,7,1,35,1,14,3,35,17,35,168,191,57,81,76,90,66,205,200,254,229,131,
48,1,253,222,254,85,17,46,48,45,17,191,5,129,253,149,24,68,123,99,1,49,254,
102,189,35,252,249,2,171,8,13,11,6,253,123,0,0,0,0,1,0,18,255,240,4,153,5,
129,0,27,0,176,64,35,150,1,1,147,3,1,117,3,133,3,2,85,4,149,4,2,145,7,1,115,
7,131,7,2,85,7,101,7,2,129,6,145,6,2,6,184,255,216,64,46,12,15,72,37,6,53,
6,2,26,2,1,26,23,106,23,122,23,138,23,4,26,90,32,27,64,27,2,224,27,1,95,27,
1,0,27,1,8,27,20,6,36,6,52,6,3,6,184,255,248,64,14,22,25,72,73,1,1,20,1,36,
1,52,1,3,1,184,255,248,64,26,22,25,72,9,24,73,24,2,1,6,24,3,12,128,29,1,27,
18,1,95,24,3,16,95,9,19,0,63,237,63,237,63,1,93,47,23,51,113,43,113,113,43,
113,47,94,93,93,93,113,237,49,48,93,93,93,43,93,93,93,93,93,93,93,93,1,33,
3,6,2,14,3,35,34,38,39,53,30,1,51,50,62,4,55,19,33,17,35,3,223,254,94,49,
22,43,49,60,78,102,66,25,47,14,11,35,10,30,52,45,42,39,40,21,67,2,255,186,
4,225,254,144,172,254,245,199,137,85,37,5,5,152,4,3,23,62,107,169,238,161,
1,254,250,127,255,255,0,168,0,0,6,2,5,129,18,6,0,48,0,0,255,255,0,168,0,0,
5,32,5,129,18,6,0,43,0,0,255,255,0,97,255,236,5,215,5,150,18,6,0,50,0,0,255,
255,0,166,0,0,5,30,5,129,17,6,1,106,254,0,0,88,185,0,9,255,192,179,27,27,
72,9,184,255,192,179,21,21,72,9,184,255,192,179,20,20,72,9,184,255,192,179,
19,19,72,9,184,255,192,179,17,17,72,9,184,255,192,179,16,16,72,9,184,255,
192,179,15,15,72,9,184,255,192,179,14,14,72,9,184,255,192,183,11,11,72,9,
64,9,9,72,43,43,43,43,43,43,43,43,43,43,0,0,255,255,0,168,0,0,4,234,5,129,
18,6,0,51,0,0,255,255,0,104,255,236,5,121,5,150,18,6,0,38,0,0,255,255,0,46,
0,0,4,180,5,129,18,6,0,55,0,0,0,1,0,55,255,236,5,31,5,129,0,25,0,181,64,111,
217,24,1,139,24,1,90,24,106,24,122,24,3,41,24,1,85,23,101,23,133,23,3,70,
23,1,214,22,1,131,22,1,100,22,116,22,2,86,22,1,121,18,1,128,2,1,5,2,21,2,
2,132,1,1,131,0,1,84,0,100,0,2,70,0,1,198,23,214,23,2,113,23,129,23,2,86,
23,102,23,2,143,3,1,58,3,74,3,2,20,23,24,32,25,144,25,2,25,16,25,22,10,63,
21,79,21,111,21,127,21,4,21,184,255,240,64,14,21,23,20,21,5,24,24,21,3,11,
14,95,5,19,0,63,237,50,63,51,47,17,18,57,57,1,47,56,93,50,50,47,56,93,51,
57,57,49,48,0,93,93,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93,93,93,
93,93,93,1,14,3,35,34,46,2,39,55,30,1,51,50,62,2,63,1,1,51,9,1,51,2,222,47,
81,90,109,75,32,66,64,58,23,81,35,83,48,37,58,53,57,38,49,253,195,218,1,193,
1,128,205,1,62,88,128,82,40,10,18,26,16,144,22,37,21,52,90,68,89,3,186,252,
240,3,16,0,0,3,0,118,255,245,5,159,5,139,0,29,0,40,0,51,0,143,64,92,70,28,
86,28,102,28,3,73,17,89,17,105,17,3,59,51,1,59,31,1,53,43,1,38,43,1,53,39,
1,38,39,1,41,90,15,8,30,90,0,35,24,7,90,46,21,224,8,1,79,8,1,32,8,1,8,32,
53,1,112,53,208,53,224,53,3,79,53,1,16,53,1,36,47,96,10,6,10,34,49,96,20,
24,20,10,20,10,20,7,22,3,7,18,0,63,63,18,57,57,47,47,17,51,16,237,50,17,51,
16,237,50,1,93,93,93,113,47,93,93,93,51,51,253,50,50,220,237,16,220,237,49,
48,0,93,93,93,93,93,93,1,93,93,1,20,14,2,43,1,21,35,53,35,34,46,2,53,52,62,
2,59,1,53,51,21,51,50,30,2,7,52,38,43,1,17,51,50,62,2,37,20,30,2,59,1,17,
35,34,6,5,159,64,131,197,133,40,191,40,133,197,131,64,67,133,201,135,29,191,
28,135,202,133,67,192,185,183,5,13,92,136,89,43,252,87,43,89,136,92,13,9,
182,182,2,224,105,188,143,84,227,227,84,143,188,105,113,185,131,72,182,182,
72,131,185,117,187,180,253,22,53,98,140,88,88,140,98,53,2,234,180,0,255,255,
0,46,0,0,5,43,5,129,18,6,0,59,0,0,0,1,0,168,254,104,5,197,5,129,0,11,0,74,
64,47,1,92,2,2,11,90,0,8,1,175,8,1,0,8,64,8,112,8,3,8,7,90,0,4,16,4,64,4,
3,7,4,32,13,224,13,2,9,9,5,3,11,11,7,95,4,18,2,0,47,63,237,50,47,63,51,47,
1,93,47,94,93,237,47,93,93,113,237,50,47,237,49,48,37,17,35,17,33,17,51,17,
33,17,51,17,5,197,180,251,151,191,2,245,186,160,253,200,1,152,5,129,251,31,
4,225,251,31,0,0,0,1,0,160,0,0,4,174,5,129,0,25,0,134,64,70,164,14,1,20,40,
13,17,72,1,32,13,17,72,42,7,58,7,74,7,3,23,90,25,144,22,1,143,22,1,48,22,
64,22,2,207,22,1,112,22,1,111,22,1,16,22,64,22,2,22,12,90,207,11,1,0,11,16,
11,64,11,3,7,11,32,27,1,32,27,1,27,184,255,192,64,19,14,17,72,0,5,95,21,47,
16,1,16,16,11,24,18,22,22,11,3,0,63,51,47,63,18,57,47,93,51,237,50,1,43,93,
113,47,94,93,93,237,47,93,93,93,93,113,113,113,51,237,49,48,0,93,43,43,93,
1,14,3,35,34,46,2,53,17,51,17,20,22,51,50,62,2,55,17,51,17,35,3,240,36,94,
107,115,56,114,166,108,52,190,130,134,53,110,104,92,35,190,190,1,252,8,20,
18,12,47,92,137,89,2,82,253,194,123,108,10,15,17,7,2,244,250,127,0,0,1,0,
168,0,0,6,173,5,129,0,11,0,114,64,76,7,90,4,4,0,11,90,36,8,1,11,8,1,228,8,
1,219,8,1,148,8,1,123,8,1,4,8,20,8,100,8,3,8,3,90,4,0,68,0,228,0,3,7,0,235,
13,1,196,13,1,187,13,1,132,13,1,112,13,1,2,64,13,1,15,13,1,9,5,1,3,7,7,3,
95,0,18,0,63,237,50,47,63,51,51,1,93,93,95,93,93,93,93,93,47,94,93,237,47,
93,93,93,93,93,113,113,237,18,57,47,237,49,48,51,17,51,17,33,17,51,17,33,
17,51,17,168,191,1,233,186,1,233,186,5,129,251,31,4,225,251,31,4,225,250,
127,0,1,0,168,254,104,7,47,5,129,0,15,0,125,64,84,132,17,148,17,180,17,3,
123,17,1,84,17,1,1,92,2,2,15,90,12,11,90,8,8,4,11,12,59,12,75,12,91,12,123,
12,139,12,155,12,203,12,8,219,12,251,12,2,207,12,1,2,159,12,1,128,12,1,111,
12,1,0,12,1,8,12,7,90,32,4,1,4,13,9,5,3,15,15,11,11,7,95,4,18,2,0,47,63,237,
50,47,50,47,63,51,51,1,47,93,237,47,94,93,93,93,93,95,93,93,113,18,57,47,
237,16,237,50,47,237,93,93,93,49,48,37,17,35,17,33,17,51,17,33,17,51,17,33,
17,51,17,7,47,180,250,45,191,1,211,186,1,210,186,160,253,200,1,152,5,129,
251,31,4,225,251,31,4,225,251,31,0,2,0,46,0,0,5,235,5,129,0,16,0,25,0,100,
64,68,116,25,132,25,148,25,3,123,18,139,18,155,18,3,153,3,1,38,3,1,64,27,
1,6,90,47,17,127,17,2,176,17,1,159,17,1,0,17,16,17,32,17,64,17,4,7,17,14,
0,22,90,32,12,1,12,21,95,0,0,12,14,95,15,3,22,95,12,18,0,63,237,63,237,18,
57,47,237,1,47,93,253,50,204,47,94,93,93,93,113,237,93,49,48,0,93,93,93,93,
1,33,50,30,2,21,20,14,2,35,33,17,33,53,33,1,52,38,35,33,17,33,50,54,2,184,
1,66,125,186,124,62,61,121,182,121,253,243,254,53,2,138,2,115,164,164,254,
213,1,51,164,156,3,45,58,105,147,90,87,150,112,64,4,229,156,252,26,121,129,
254,2,136,0,3,0,168,0,0,6,109,5,129,0,14,0,23,0,27,0,140,64,76,116,23,132,
23,148,23,3,123,16,139,16,155,16,3,153,12,1,38,12,1,27,90,159,24,207,24,223,
24,3,16,24,64,24,80,24,112,24,4,24,0,90,0,15,1,224,15,1,159,15,1,0,15,16,
15,32,15,64,15,4,15,9,20,90,0,6,16,6,64,6,3,7,6,128,29,1,29,184,255,192,64,
19,11,14,72,19,95,9,9,6,7,25,25,7,3,24,24,20,95,6,18,0,63,237,51,47,63,51,
47,17,18,57,47,237,1,43,93,47,94,93,237,50,47,93,93,93,113,237,47,93,93,237,
49,48,0,93,93,93,93,1,20,14,2,35,33,17,51,17,33,50,30,2,7,52,38,35,33,17,
33,50,54,1,17,51,17,4,214,61,121,182,121,253,183,191,1,126,125,186,124,62,
192,164,164,254,153,1,111,164,156,1,152,191,1,157,87,150,112,64,5,129,253,
172,58,105,147,92,121,129,254,2,136,254,225,5,129,250,127,0,2,0,168,0,0,4,
214,5,129,0,14,0,23,0,107,64,76,116,23,132,23,148,23,3,123,16,139,16,155,
16,3,153,12,1,38,12,1,0,90,31,15,1,160,15,176,15,2,159,15,1,0,15,16,15,32,
15,64,15,96,15,5,15,9,20,90,0,6,16,6,2,7,6,175,25,1,64,25,128,25,144,25,3,
19,95,9,9,6,7,3,20,95,6,18,0,63,237,63,18,57,47,237,1,93,93,47,94,93,237,
50,47,93,93,93,113,237,49,48,0,93,93,93,93,1,20,14,2,35,33,17,51,17,33,50,
30,2,7,52,38,35,33,17,33,50,54,4,214,61,121,182,121,253,183,191,1,126,125,
186,124,62,192,164,164,254,153,1,111,165,155,1,157,87,150,112,64,5,129,253,
172,58,105,147,96,121,131,254,4,131,0,1,0,105,255,236,5,121,5,150,0,42,0,
206,64,81,115,26,131,26,2,115,28,131,28,2,101,28,1,115,4,131,4,2,101,4,1,
115,2,131,2,2,101,2,1,101,12,1,101,11,1,135,17,1,106,17,1,90,33,138,33,2,
10,32,26,32,90,32,3,10,40,26,40,2,36,36,24,38,14,91,32,35,112,35,2,144,35,
176,35,2,127,35,1,64,35,1,35,184,255,192,64,63,7,10,72,35,6,80,24,96,24,2,
175,24,191,24,2,32,24,1,24,35,95,127,38,175,38,2,38,38,9,30,95,19,16,25,32,
25,2,48,25,64,25,112,25,128,25,192,25,208,25,6,25,25,19,19,79,5,1,5,5,0,95,
9,4,0,63,237,51,47,93,63,51,47,93,113,16,237,17,57,47,113,237,1,47,93,93,
113,51,47,43,93,93,93,113,237,51,18,57,47,49,48,0,93,1,93,93,0,93,93,93,1,
93,93,93,93,93,93,93,93,1,34,14,2,7,39,54,36,51,50,4,22,18,21,20,2,6,4,35,
34,46,2,39,55,30,3,51,50,62,2,55,33,53,33,46,3,2,201,88,137,102,69,19,181,
71,1,46,225,164,1,0,175,91,86,172,254,255,171,118,189,149,113,41,156,27,81,
109,140,87,109,176,128,77,9,253,114,2,142,10,73,124,173,4,250,42,70,91,50,
60,173,176,101,187,254,246,165,159,254,244,195,109,54,99,136,83,78,55,105,
83,50,72,132,185,112,154,110,178,126,68,0,0,2,0,168,255,236,7,179,5,150,0,
26,0,46,0,168,64,63,165,7,1,133,24,1,138,20,1,121,29,1,118,35,1,118,39,1,
74,19,138,19,2,58,30,122,30,2,53,34,117,34,2,42,44,58,44,122,44,3,37,40,53,
40,117,40,3,160,48,1,0,91,144,27,160,27,2,160,27,176,27,2,27,184,255,192,
64,54,7,11,72,27,16,12,90,0,13,16,13,64,13,3,7,13,37,91,17,48,10,112,10,2,
10,32,95,22,4,11,95,80,16,1,176,16,224,16,2,15,16,1,8,16,16,13,14,3,13,18,
42,95,5,19,0,63,237,63,63,18,57,47,94,93,93,113,237,63,237,1,47,93,51,237,
47,94,93,237,50,47,43,93,113,237,93,49,48,93,93,93,93,93,93,93,93,93,93,93,
1,20,2,14,1,35,34,46,2,39,33,17,35,17,51,17,33,62,3,51,50,30,1,18,7,52,46,
2,35,34,14,2,21,20,30,2,51,50,62,2,7,179,90,170,245,155,156,239,165,90,7,
254,217,191,191,1,42,13,99,166,232,146,159,245,167,87,195,60,117,173,113,
116,175,117,58,60,117,173,114,121,176,114,54,2,199,165,254,242,192,104,99,
179,247,148,253,115,5,129,253,172,142,229,160,86,102,188,254,246,163,127,
208,148,80,80,148,208,127,127,211,153,85,86,153,212,0,2,0,96,0,0,5,32,5,129,
0,17,0,30,0,239,64,22,156,29,172,29,2,138,29,1,147,20,1,117,20,133,20,2,67,
17,83,17,2,17,184,255,216,64,25,33,36,72,130,17,146,17,162,17,3,100,17,116,
17,2,86,17,1,67,16,83,16,2,3,16,184,255,216,64,117,33,36,72,172,16,1,155,
16,1,125,16,141,16,2,2,94,16,110,16,2,73,16,1,44,16,60,16,2,3,175,1,1,2,1,
104,14,16,72,94,1,110,1,2,73,1,1,44,1,60,1,2,16,1,1,6,24,24,14,18,90,6,6,
0,13,90,224,14,1,143,14,159,14,175,14,207,14,4,0,14,64,14,2,7,14,17,32,0,
1,15,0,31,0,2,0,1,15,95,47,24,95,24,111,24,143,24,4,24,24,0,26,95,11,3,14,
14,0,18,0,63,50,47,63,237,18,57,47,93,237,50,1,47,93,93,51,47,94,93,93,93,
237,18,57,47,237,17,51,17,18,57,17,51,49,48,93,93,93,43,95,93,95,93,93,93,
95,93,93,93,43,95,113,93,93,93,43,113,0,93,93,93,93,51,1,46,3,53,52,62,2,
51,33,17,35,17,33,1,19,20,30,2,51,33,17,33,34,14,2,96,1,144,91,130,84,39,
66,126,185,120,2,151,191,254,73,254,146,28,37,77,119,83,1,205,254,59,76,120,
84,44,2,95,16,78,108,130,67,94,150,104,55,250,127,2,73,253,183,3,236,57,98,
72,41,2,8,31,63,94,255,255,0,87,255,236,4,115,4,78,18,6,0,68,0,0,0,2,0,120,
255,236,4,63,5,222,0,19,0,56,0,158,64,69,137,44,1,122,45,138,45,2,102,21,
118,21,134,21,3,84,18,1,84,12,1,91,2,1,90,35,122,35,138,35,3,90,47,106,47,
138,47,3,123,46,139,46,2,73,46,105,46,2,42,42,23,71,64,208,0,1,144,0,1,0,
58,128,48,58,1,128,58,1,58,184,255,192,64,12,30,35,72,52,10,71,0,31,32,31,
2,31,184,255,192,64,23,26,35,72,31,52,5,80,20,20,42,48,41,1,64,41,240,41,
2,41,15,80,26,22,0,63,237,47,93,113,51,57,47,237,50,1,47,43,93,237,57,43,
93,113,26,16,220,93,113,26,237,50,47,49,48,0,93,93,93,93,93,93,93,93,93,93,
1,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,3,50,18,17,16,2,35,34,46,2,53,
52,18,62,1,55,62,3,55,21,14,1,7,14,5,7,62,3,3,130,39,73,104,65,69,114,81,
44,44,77,105,62,69,112,78,42,243,222,210,250,238,113,178,123,65,58,128,206,
147,57,100,91,86,43,86,161,91,78,124,94,67,44,23,2,19,67,97,126,1,246,114,
151,91,37,39,92,150,112,114,150,89,36,36,88,151,2,127,254,251,254,250,254,
247,254,253,70,156,250,180,192,1,22,193,115,28,11,17,14,12,6,161,11,23,17,
14,33,50,73,108,149,101,55,97,72,41,0,0,0,0,3,0,142,0,0,3,231,4,58,0,23,0,
36,0,47,0,149,64,12,42,19,1,37,2,1,26,18,42,18,2,3,184,255,232,64,33,9,12,
72,139,10,155,10,2,10,38,44,71,5,5,24,16,71,64,47,30,159,30,2,160,30,1,30,
49,128,64,49,1,49,184,255,192,64,50,30,35,72,31,49,63,49,239,49,3,38,24,70,
192,22,1,0,22,16,22,48,22,224,22,240,22,5,8,22,10,36,81,143,38,159,38,175,
38,3,38,38,24,37,80,23,15,24,80,22,21,0,63,237,63,237,18,57,47,113,237,57,
1,47,94,93,113,237,50,93,43,113,26,16,220,93,113,26,237,17,57,47,237,18,57,
93,49,48,0,43,93,93,93,1,50,30,2,21,20,14,2,7,21,30,3,21,20,14,2,35,33,17,
19,51,50,62,2,53,52,46,2,43,1,25,1,51,50,62,2,53,52,38,35,2,52,76,144,112,
68,35,60,82,46,54,95,69,40,61,109,151,91,254,67,180,236,69,95,59,27,28,63,
100,71,224,216,68,91,55,23,102,121,4,58,24,62,104,81,53,81,58,37,9,7,7,35,
61,90,61,78,117,78,39,4,58,252,75,20,44,67,47,50,70,44,20,1,194,254,192,19,
39,61,43,82,76,0,1,0,142,0,0,2,175,4,58,0,5,0,54,64,35,0,64,18,39,72,48,0,
1,0,0,7,3,70,192,4,1,0,4,16,4,48,4,224,4,240,4,5,8,4,2,80,5,15,3,21,0,63,
63,237,1,47,94,93,113,237,17,51,47,93,43,49,48,1,21,33,17,35,17,2,175,254,
147,180,4,58,131,252,73,4,58,0,0,0,2,0,20,254,104,4,136,4,58,0,7,0,23,0,159,
64,65,134,3,1,32,3,1,102,1,1,34,5,114,5,130,5,3,34,20,1,34,17,1,137,18,1,
34,18,1,25,19,121,19,2,102,2,118,2,2,34,2,1,25,2,1,34,16,1,4,16,1,98,4,1,
4,4,36,4,68,4,84,4,4,8,73,9,184,255,192,64,42,18,25,72,9,9,22,70,64,111,7,
127,7,143,7,3,32,7,64,7,2,7,25,128,20,15,12,73,6,1,13,1,80,20,15,22,6,14,
80,11,21,13,8,0,47,51,63,237,50,50,63,237,1,47,51,51,237,51,51,26,16,220,
93,93,26,237,50,47,43,237,49,48,93,93,93,93,93,93,93,93,93,93,93,93,93,93,
93,93,1,33,6,2,14,1,7,33,1,35,17,33,17,35,17,51,62,2,18,55,33,17,51,3,66,
254,206,24,49,48,48,22,1,241,1,70,163,252,210,163,119,30,58,58,57,28,2,132,
146,3,183,177,254,249,194,136,50,253,229,1,152,254,104,2,27,50,143,220,1,
59,223,252,73,255,255,0,87,255,236,4,24,4,78,18,6,0,72,0,0,0,1,0,7,0,0,5,
83,4,58,0,39,1,97,64,88,165,23,1,165,14,1,171,34,1,164,3,1,172,24,1,154,24,
1,163,13,1,149,13,1,90,6,106,6,122,6,3,85,31,101,31,117,31,3,74,33,154,33,
170,33,3,69,4,149,4,165,4,3,42,28,58,28,2,37,9,53,9,2,34,31,170,26,1,26,31,
27,16,27,27,32,20,38,70,39,165,11,1,11,10,3,6,6,39,10,184,255,240,64,49,10,
10,17,39,39,5,33,32,16,15,32,1,255,32,1,160,32,1,159,32,1,80,32,1,63,32,1,
32,32,1,207,32,1,128,32,144,32,2,95,32,1,32,32,48,32,2,32,4,5,184,255,240,
64,64,31,5,47,5,2,127,5,159,5,2,63,5,159,5,223,5,255,5,4,5,15,41,1,255,41,
1,160,41,1,111,41,159,41,2,80,41,1,63,41,1,32,41,1,207,41,1,128,41,144,41,
2,79,41,95,41,2,48,41,1,31,6,34,3,6,184,255,240,64,37,11,17,72,6,3,37,0,80,
20,15,17,31,17,79,17,95,17,4,15,17,31,17,79,17,3,7,17,17,4,26,18,10,15,39,
33,4,21,0,63,51,51,63,51,51,18,57,47,94,93,113,51,237,50,57,57,43,17,51,17,
51,1,93,93,93,93,113,113,113,113,113,113,114,47,93,113,114,56,51,47,93,93,
93,93,113,113,113,113,113,113,114,56,51,18,57,47,51,57,47,56,18,57,17,51,
17,51,93,16,237,50,17,57,47,56,57,51,93,17,51,49,48,93,93,93,93,93,93,93,
93,93,93,93,93,0,93,93,1,34,38,39,1,35,1,46,1,39,3,51,23,30,3,51,17,51,17,
50,62,2,63,1,51,3,14,1,7,1,35,1,14,1,35,17,35,2,83,26,65,19,254,234,200,1,
97,17,66,45,216,188,148,48,65,52,48,30,180,30,48,52,65,48,148,188,216,45,
66,17,1,97,200,254,234,19,65,26,180,1,221,12,8,254,15,2,80,14,85,66,1,69,
239,77,92,50,16,1,218,254,38,16,50,92,77,239,254,187,66,85,14,253,176,1,241,
8,12,254,35,0,0,0,1,0,49,255,236,3,94,4,78,0,55,0,175,64,28,5,53,21,53,2,
5,38,21,38,37,38,3,131,45,1,45,15,21,70,40,40,51,71,10,29,73,64,30,184,255,
192,64,86,30,36,72,143,15,1,30,15,30,15,3,144,10,1,144,10,160,10,2,31,10,
1,10,57,128,16,57,1,4,73,3,64,12,20,72,3,45,15,80,143,16,159,16,175,16,3,
16,16,35,7,0,29,1,144,29,224,29,240,29,3,29,29,24,80,35,16,7,80,0,96,4,112,
4,128,4,3,239,4,1,32,4,1,4,4,0,22,0,63,50,47,93,93,113,16,237,63,237,51,47,
93,113,17,18,57,47,113,237,57,1,47,43,237,93,26,16,204,93,93,113,17,57,57,
47,47,93,43,26,237,16,237,50,47,237,18,57,113,49,48,93,93,5,34,38,39,55,30,
1,51,50,54,53,52,46,2,35,53,50,62,2,53,52,38,35,34,14,2,7,39,62,3,51,50,30,
2,21,20,14,2,7,21,30,3,21,20,14,2,1,202,167,197,45,159,25,126,103,96,113,
55,92,120,64,64,114,86,49,99,93,35,70,60,42,7,162,12,62,97,128,78,85,138,
98,53,44,71,88,45,56,100,75,43,49,101,152,20,125,129,44,78,86,94,91,59,78,
45,18,137,15,38,67,52,74,86,14,33,55,42,20,68,98,63,29,42,76,104,63,57,88,
61,36,4,2,6,41,67,93,58,69,119,87,49,0,0,0,0,1,0,142,0,0,3,234,4,58,0,19,
0,186,64,25,9,17,1,233,17,249,17,2,4,15,1,228,15,244,15,2,11,5,1,235,5,251,
5,2,16,184,255,192,64,107,29,60,72,153,16,1,6,64,29,60,72,119,6,151,6,2,6,
7,1,230,7,246,7,2,156,7,1,105,7,137,7,2,31,17,47,17,79,17,3,9,72,64,7,64,
10,1,80,10,1,159,10,255,10,2,10,21,128,0,21,192,21,208,21,224,21,4,192,21,
1,128,21,144,21,176,21,192,21,208,21,5,17,1,72,192,18,1,0,18,16,18,48,18,
224,18,240,18,5,8,18,16,7,19,15,10,6,18,21,0,63,51,51,63,51,51,1,47,94,93,
113,237,50,93,113,114,26,16,220,93,113,114,50,26,237,49,48,0,93,1,93,93,113,
114,0,93,43,93,43,113,114,113,114,1,113,114,1,17,20,14,2,7,1,51,17,35,17,
52,62,2,55,1,35,17,1,60,3,3,3,1,1,243,197,172,2,3,3,2,254,6,192,4,58,253,
176,23,77,82,74,21,3,101,251,198,2,148,19,57,60,57,20,252,151,4,58,0,255,
255,0,142,0,0,3,234,5,240,18,38,1,206,0,0,17,7,2,145,0,234,0,0,0,19,64,11,
1,20,17,38,1,2,25,33,18,8,37,1,43,53,0,43,53,0,0,0,0,1,0,138,0,0,3,138,4,
58,0,21,0,202,64,17,117,16,133,16,149,16,3,57,15,121,15,137,15,153,15,4,13,
184,255,208,64,123,12,17,72,133,11,149,11,2,120,5,1,133,13,149,13,2,47,23,
79,23,2,73,16,1,56,16,1,16,13,121,8,137,8,153,8,3,8,71,13,1,54,13,1,13,9,
16,9,9,14,2,20,70,0,21,16,21,48,21,240,21,4,21,57,15,73,15,2,15,32,14,1,32,
14,144,14,2,144,14,1,79,14,1,48,14,1,47,14,1,16,14,1,14,16,14,13,19,80,15,
2,63,2,79,2,3,15,2,63,2,255,2,3,8,2,2,14,21,21,14,21,8,8,0,15,0,63,50,47,
63,51,47,17,57,47,94,93,113,237,50,1,47,56,93,93,93,93,93,113,114,51,113,
47,93,237,50,17,57,47,56,57,113,113,51,93,17,51,113,113,93,49,48,0,93,1,93,
93,43,93,93,19,51,17,50,62,2,63,1,51,3,14,1,7,1,35,1,14,1,35,17,35,138,180,
30,48,52,65,48,148,188,216,45,66,17,1,97,200,254,234,19,65,26,180,4,58,254,
38,16,50,92,77,239,254,187,66,85,14,253,176,1,241,8,12,254,35,0,0,0,0,1,0,
11,255,236,4,29,4,58,0,25,0,186,64,42,26,21,1,130,7,1,116,7,1,85,7,101,7,
2,130,6,1,117,6,1,22,6,38,6,102,6,3,114,5,130,5,2,100,5,1,86,5,1,134,4,1,
4,184,255,240,64,61,12,15,72,26,3,1,116,2,1,7,24,12,17,72,25,70,64,127,0,
143,0,239,0,3,0,27,128,176,27,192,27,208,27,3,176,27,240,27,2,64,27,96,27,
112,27,160,27,176,27,192,27,6,131,23,1,23,54,6,1,6,2,184,255,240,64,26,24,
28,72,215,2,231,2,2,128,2,1,2,143,12,1,12,2,80,23,15,16,80,9,22,0,21,0,63,
63,237,63,237,1,47,93,51,93,93,43,51,113,51,93,93,113,114,26,16,220,93,26,
237,49,48,0,43,1,93,93,43,93,93,93,93,93,93,93,93,93,93,93,33,17,33,6,2,14,
3,35,34,38,39,53,30,1,51,50,62,3,18,55,33,17,3,104,254,137,25,42,44,51,71,
94,65,29,48,17,11,38,19,35,51,40,33,34,38,25,2,206,3,183,184,254,225,216,
149,93,42,8,5,129,4,5,42,94,149,216,1,29,183,251,198,0,0,1,0,142,0,0,4,243,
4,58,0,28,1,3,64,21,137,18,153,18,2,134,12,150,12,2,107,17,123,17,2,100,13,
116,13,2,1,184,255,224,64,122,29,60,72,138,1,154,1,2,57,1,1,0,32,29,60,72,
133,0,149,0,2,54,0,86,0,2,143,19,159,19,2,93,19,109,19,125,19,3,59,19,75,
19,2,25,19,41,19,2,128,11,144,11,2,82,11,98,11,114,11,3,52,11,68,11,2,22,
11,38,11,2,1,0,15,15,8,21,72,64,19,80,22,1,159,22,255,22,2,22,30,128,144,
30,192,30,208,30,3,79,30,1,11,8,72,192,9,1,0,9,16,9,48,9,224,9,240,9,5,8,
9,28,2,2,184,255,192,64,22,29,60,72,2,32,19,22,72,84,2,1,19,2,10,15,22,15,
64,29,60,72,15,184,255,224,64,18,19,22,72,47,15,63,15,79,15,127,15,143,15,
5,15,1,9,21,0,63,51,51,93,43,43,51,63,51,51,93,43,43,17,51,1,47,94,93,113,
237,50,93,93,26,16,220,93,113,50,26,237,18,57,61,47,51,51,49,48,93,93,93,
93,93,93,93,93,93,93,43,93,93,43,93,93,93,93,33,35,1,30,3,21,17,35,17,33,
19,30,1,23,62,1,55,19,33,17,35,17,52,62,2,55,3,19,153,254,188,1,3,1,1,174,
1,24,220,23,37,8,10,35,23,220,1,13,173,1,3,2,2,3,183,26,60,61,57,23,253,44,
4,58,253,107,63,151,72,72,151,63,2,149,251,198,2,212,22,60,64,60,23,0,1,0,
142,0,0,3,221,4,58,0,11,0,139,64,48,5,70,64,2,15,6,79,6,2,57,47,6,111,6,143,
6,255,6,4,191,6,1,143,6,159,6,255,6,3,6,13,128,0,13,192,13,208,13,224,13,
4,192,13,1,128,13,1,13,184,255,192,64,49,19,23,72,1,9,70,192,10,1,0,10,16,
10,48,10,224,10,240,10,5,10,8,80,176,1,192,1,2,159,1,175,1,191,1,3,15,1,63,
1,2,8,1,1,10,5,21,3,0,15,0,63,50,63,51,57,47,94,93,113,114,237,1,47,93,113,
237,50,43,93,113,114,26,16,220,93,113,114,94,93,50,26,237,49,48,1,17,33,17,
51,17,35,17,33,17,35,17,1,66,1,231,180,180,254,25,180,4,58,254,54,1,202,251,
198,1,237,254,19,4,58,255,255,0,86,255,236,4,29,4,78,18,6,0,82,0,0,0,1,0,
142,0,0,3,199,4,58,0,7,0,109,64,80,1,70,64,15,2,79,2,2,57,47,2,111,2,143,
2,255,2,4,191,2,1,143,2,159,2,255,2,3,2,9,128,0,9,192,9,208,9,224,9,4,192,
9,1,128,9,176,9,192,9,208,9,4,47,9,1,5,70,192,6,1,0,6,16,6,48,6,224,6,240,
6,5,8,6,4,80,7,15,6,1,21,0,63,51,63,237,1,47,94,93,113,237,93,93,113,114,
26,16,220,93,113,114,94,93,26,237,49,48,1,17,35,17,33,17,35,17,3,199,180,
254,47,180,4,58,251,198,3,183,252,73,4,58,0,255,255,0,132,254,87,4,29,4,77,
18,6,0,83,0,0,255,255,0,87,255,236,3,202,4,78,18,6,0,70,0,0,0,1,0,35,0,0,
3,135,4,58,0,7,0,72,64,43,7,14,4,2,5,14,223,2,1,2,4,70,0,5,16,5,2,8,5,5,8,
9,160,9,1,95,9,1,48,9,64,9,2,47,9,1,4,21,3,7,80,0,15,0,63,237,50,63,1,93,
93,93,93,17,18,57,47,94,93,237,204,93,43,1,24,16,77,228,49,48,19,33,21,33,
17,35,17,33,35,3,100,254,168,180,254,168,4,58,131,252,73,3,183,0,0,0,255,
255,0,5,254,87,3,252,4,58,18,6,0,92,0,0,0,3,0,86,254,87,6,62,5,204,0,53,0,
74,0,95,0,229,64,13,141,93,157,93,173,93,3,78,24,14,17,72,72,184,255,232,
179,14,17,72,57,184,255,232,182,14,17,72,109,82,1,51,184,255,224,64,75,7,
10,72,15,26,31,26,47,26,3,24,32,7,10,72,0,3,16,3,32,3,3,7,4,54,71,64,25,14,
13,0,14,14,75,71,36,0,68,0,148,0,164,0,4,0,85,39,13,72,65,38,4,14,1,4,14,
36,14,68,14,100,14,132,14,180,14,228,14,7,7,14,52,97,1,97,184,255,192,64,
52,30,35,72,219,97,1,84,97,100,97,132,97,148,97,4,64,97,1,2,32,97,48,97,2,
31,97,1,0,97,1,38,0,31,45,80,3,70,80,49,28,16,8,18,91,3,59,80,5,22,22,13,
27,0,63,63,51,237,23,50,63,51,237,23,50,63,1,93,93,93,95,93,93,93,43,113,
47,94,93,113,51,51,237,50,50,220,93,237,43,1,24,16,77,244,26,237,49,48,95,
94,93,43,93,0,43,93,1,43,43,43,93,1,20,14,2,35,34,38,39,35,30,1,21,17,35,
17,52,54,55,35,14,1,35,34,2,17,16,18,51,50,22,23,51,52,46,2,53,17,51,17,20,
14,2,21,51,62,1,51,50,30,2,5,20,30,2,51,50,62,2,55,53,52,46,2,35,34,14,2,
5,52,46,2,35,34,14,2,29,1,30,3,51,50,62,2,6,62,38,86,140,101,105,158,42,6,
2,3,170,2,3,5,46,149,111,186,179,185,180,112,149,45,5,2,2,1,170,1,1,1,5,46,
144,114,101,140,86,38,250,213,26,56,85,60,60,94,65,34,2,34,64,94,61,57,86,
57,29,4,110,23,52,88,64,53,92,70,40,1,35,65,92,60,65,88,53,23,2,34,123,208,
150,85,88,100,35,77,58,254,89,1,167,54,82,40,104,90,1,19,1,25,1,28,1,26,90,
98,10,41,46,42,12,1,163,254,92,11,43,47,43,12,104,89,80,145,205,129,112,160,
103,48,43,98,157,113,24,115,159,98,43,46,102,163,116,100,156,108,56,34,96,
169,135,23,108,150,93,41,58,110,159,0,0,0,255,255,0,23,0,0,3,234,4,58,18,
6,0,91,0,0,0,1,0,142,254,104,4,102,4,58,0,11,0,91,178,7,73,8,184,255,192,
64,54,18,21,72,8,8,5,70,64,223,2,1,207,2,223,2,2,2,64,25,28,72,0,2,48,2,2,
2,13,128,111,13,1,1,70,0,10,16,10,48,10,240,10,4,8,10,5,1,80,10,21,8,3,0,
15,0,63,50,47,63,237,50,1,47,94,93,237,93,26,16,220,93,43,93,113,26,237,50,
47,43,237,49,48,1,17,33,17,51,17,51,17,35,17,33,17,1,66,1,221,180,147,163,
252,203,4,58,252,73,3,183,252,73,253,229,1,152,4,58,0,1,0,122,0,0,3,156,4,
58,0,25,0,92,64,37,108,15,124,15,140,15,3,22,32,7,10,72,21,24,7,12,72,12,
70,64,9,175,13,1,127,13,143,13,239,13,3,13,27,128,1,70,24,184,255,192,64,
20,9,12,72,24,14,19,80,9,15,6,31,6,2,6,6,12,21,10,0,15,0,63,50,63,57,47,93,
51,237,50,1,47,43,237,26,16,220,93,113,50,26,237,49,48,43,43,0,93,1,17,20,
30,2,51,50,54,55,17,51,17,35,17,14,3,35,34,46,2,53,17,1,46,16,39,64,47,70,
132,74,180,180,38,81,87,93,51,66,101,69,36,4,58,254,110,34,59,44,25,26,21,
2,5,251,198,1,205,15,31,24,16,41,76,110,69,1,155,0,0,0,1,0,142,0,0,5,221,
4,58,0,11,0,116,64,52,7,70,4,4,0,11,70,64,4,8,52,8,2,36,8,132,8,212,8,228,
8,4,11,8,1,139,8,251,8,2,8,13,128,251,13,1,180,13,212,13,2,128,13,1,2,112,
13,1,95,13,1,13,184,255,192,64,23,9,12,72,3,70,0,0,16,0,48,0,3,8,0,9,5,1,
15,7,3,80,0,21,0,63,237,50,63,51,51,1,47,94,93,237,43,93,93,95,93,93,93,26,
16,220,93,113,113,114,26,237,18,57,47,237,49,48,51,17,51,17,33,17,51,17,33,
17,51,17,142,180,1,154,180,1,153,180,4,58,252,73,3,183,252,73,3,183,251,198,
0,0,0,1,0,142,254,104,6,102,4,58,0,15,0,141,64,96,13,73,244,14,1,14,14,11,
70,8,7,70,64,4,4,0,107,8,1,4,8,1,84,8,228,8,2,59,8,1,107,8,123,8,139,8,251,
8,4,84,8,1,8,17,128,251,17,1,212,17,1,128,17,176,17,2,2,96,17,112,17,2,95,
17,1,32,17,48,17,64,17,3,3,70,0,0,16,0,48,0,240,0,4,8,0,14,9,5,1,15,11,7,
3,80,0,21,0,63,237,50,50,63,51,51,47,1,47,94,93,237,93,93,93,95,93,93,93,
26,16,204,93,93,113,113,114,114,17,57,47,26,237,16,237,50,47,93,237,49,48,
51,17,51,17,33,17,51,17,33,17,51,17,51,17,35,17,142,180,1,149,180,1,148,180,
147,163,4,58,252,73,3,183,252,73,3,183,252,73,253,229,1,152,0,0,0,0,2,0,45,
0,0,4,172,4,58,0,14,0,25,0,113,185,0,5,255,224,179,7,10,72,2,184,255,224,
64,16,7,11,72,3,71,64,176,21,1,21,27,128,80,27,1,27,184,255,192,64,45,30,
35,72,255,27,1,14,11,15,70,32,9,1,32,9,1,9,25,81,175,14,191,14,207,14,3,15,
14,31,14,79,14,3,7,14,14,9,11,80,12,15,15,81,9,21,0,63,237,63,237,18,57,47,
94,93,113,237,1,47,93,113,253,204,51,93,43,113,26,16,220,93,26,237,49,48,
43,43,1,50,22,21,20,14,2,35,33,17,33,53,33,25,1,51,50,62,2,53,52,38,43,1,
3,13,205,210,52,104,155,103,254,103,254,184,1,252,202,69,96,59,26,116,133,
203,2,112,147,159,74,118,82,44,3,183,131,254,54,254,15,25,49,71,46,94,87,
0,3,0,142,0,0,5,50,4,58,0,12,0,23,0,27,0,105,185,0,5,255,224,179,7,10,72,
2,184,255,224,64,58,7,10,72,3,71,19,19,9,27,70,64,159,24,175,24,2,24,29,128,
12,13,70,16,9,32,9,64,9,3,9,23,81,175,12,191,12,207,12,3,15,12,31,12,79,12,
3,7,12,12,9,25,10,15,24,13,81,9,21,0,63,237,51,63,51,18,57,47,94,93,113,237,
1,47,93,237,50,26,16,220,93,26,237,18,57,47,237,49,48,43,43,1,50,22,21,20,
14,2,35,33,17,51,25,1,51,50,62,2,53,52,38,43,1,1,17,51,17,2,38,205,210,52,
104,155,103,254,103,180,202,69,96,59,26,116,133,203,3,60,180,2,112,147,159,
74,118,82,44,4,58,254,54,254,15,25,49,71,46,94,87,254,13,4,58,251,198,0,0,
0,0,2,0,142,0,0,3,215,4,58,0,12,0,23,0,132,185,0,5,255,224,179,7,10,72,2,
184,255,224,64,86,7,10,72,3,71,64,176,19,1,19,25,128,47,25,1,47,25,175,25,
2,63,25,95,25,127,25,159,25,191,25,207,25,223,25,255,25,8,25,64,35,39,72,
12,13,70,0,9,208,9,2,16,9,32,9,64,9,240,9,4,9,23,81,175,12,191,12,207,12,
3,15,12,31,12,79,12,3,7,12,12,9,10,15,13,81,9,21,0,63,237,63,18,57,47,94,
93,113,237,1,47,93,113,237,50,43,93,113,114,26,16,220,93,26,237,49,48,43,
43,1,50,22,21,20,14,2,35,33,17,51,25,1,51,50,62,2,53,52,38,43,1,2,56,205,
210,52,104,155,103,254,85,180,220,69,96,59,26,116,133,221,2,112,147,159,74,
118,82,44,4,58,254,54,254,15,25,49,71,46,94,87,0,0,0,0,1,0,55,255,236,3,190,
4,78,0,40,0,170,64,87,118,34,1,22,29,1,118,28,1,107,15,1,107,6,1,16,10,32,
10,2,10,10,0,31,71,64,12,31,9,1,144,9,1,9,42,128,20,70,21,21,1,70,31,0,1,
223,0,1,0,64,12,18,72,0,10,80,143,11,159,11,175,11,3,11,11,26,4,80,36,0,1,
16,1,32,1,96,1,112,1,128,1,192,1,208,1,8,1,184,255,192,64,29,27,34,72,1,1,
36,22,31,20,47,20,127,20,143,20,223,20,5,20,64,29,32,72,20,20,17,80,26,16,
0,63,237,51,47,43,93,63,51,47,43,93,16,237,17,57,47,113,237,1,47,43,113,114,
237,51,47,237,26,16,220,93,113,50,26,237,18,57,47,93,49,48,93,93,93,93,93,
19,55,30,1,51,50,62,2,55,33,53,33,46,3,35,34,6,7,39,62,3,51,50,30,2,21,20,
14,2,35,34,46,2,55,182,16,133,100,73,103,68,34,5,254,99,1,157,4,34,67,103,
73,109,118,15,185,13,66,105,145,93,90,170,134,81,51,114,182,130,99,151,106,
61,1,59,12,108,104,53,97,135,82,131,90,133,88,44,105,91,14,68,116,84,48,53,
128,216,163,120,205,151,86,54,92,122,0,0,0,0,2,0,142,255,236,5,170,4,78,0,
19,0,39,0,128,64,85,121,37,137,37,2,116,33,132,33,2,118,27,134,27,2,121,23,
137,23,2,150,18,166,18,2,30,71,15,15,8,31,8,2,7,8,8,11,0,71,64,160,20,1,20,
41,128,14,10,70,192,11,1,0,11,16,11,48,11,224,11,240,11,5,8,11,25,80,17,16,
9,80,47,14,1,14,14,11,12,15,11,21,35,80,3,22,0,63,237,63,63,18,57,47,93,237,
63,237,1,47,94,93,113,237,50,26,16,220,93,26,237,18,57,47,94,93,51,237,49,
48,0,93,1,93,93,93,93,1,16,2,35,34,46,2,39,35,17,35,17,51,17,51,18,33,50,
18,3,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,5,170,235,223,102,161,115,65,
5,222,180,180,223,33,1,164,237,215,189,35,67,97,61,63,99,70,37,39,70,94,56,
62,100,70,38,2,30,254,228,254,234,62,128,192,131,254,19,4,58,254,54,1,222,
254,232,254,232,126,164,98,39,41,99,164,123,126,165,98,40,39,98,166,0,0,2,
0,17,0,0,3,199,4,58,0,13,0,22,0,143,64,68,117,1,133,1,2,3,32,11,17,72,0,32,
40,43,72,223,0,239,0,2,0,32,29,37,72,52,0,1,43,0,1,41,4,1,4,48,7,10,72,7,
32,7,11,72,18,71,0,3,3,12,6,6,2,22,11,70,64,175,12,1,239,12,1,12,24,128,1,
2,184,255,240,64,22,91,2,107,2,2,2,3,0,81,47,21,1,21,21,1,15,81,9,15,12,1,
21,0,63,51,63,237,18,57,47,93,237,50,1,47,93,56,51,26,16,220,93,113,26,237,
51,18,57,47,18,57,17,51,237,49,48,43,0,43,93,1,93,113,43,113,43,43,93,9,1,
35,1,46,1,53,52,54,51,33,17,35,25,1,35,34,6,21,20,22,59,1,2,23,254,197,203,
1,88,131,118,216,207,1,176,180,234,130,120,107,124,253,1,202,254,54,1,215,
27,163,122,149,150,251,198,1,202,1,241,92,93,94,93,0,255,255,0,87,255,236,
4,24,5,123,18,38,0,72,0,0,17,7,0,105,0,248,0,0,0,23,64,13,3,2,38,17,38,3,
2,4,42,40,17,27,37,1,43,53,53,0,43,53,53,0,0,0,0,1,0,10,254,87,3,238,5,204,
0,57,0,162,64,9,170,49,1,31,32,9,15,72,24,184,255,232,64,86,9,13,72,0,24,
16,24,2,7,36,36,57,28,70,64,80,45,1,159,45,1,45,59,128,10,7,57,70,4,3,192,
0,1,0,0,16,0,48,0,224,0,240,0,5,8,0,176,59,192,59,208,59,3,176,59,240,59,
2,255,59,1,112,59,160,59,176,59,3,57,21,40,80,33,27,15,51,80,22,10,2,81,7,
3,3,5,22,184,255,192,182,7,13,72,22,15,5,0,0,63,63,43,18,57,47,51,237,50,
16,237,50,63,237,63,1,93,93,113,114,47,94,93,113,51,51,237,50,50,26,16,220,
93,113,26,237,17,57,47,49,48,0,94,93,43,43,1,93,51,17,35,53,51,53,51,21,33,
21,33,21,20,14,2,7,51,62,3,51,50,30,2,21,17,20,14,2,35,34,38,39,53,30,1,51,
50,62,2,53,17,52,46,2,35,34,14,2,21,17,142,132,132,180,1,44,254,212,2,3,2,
1,3,30,70,84,100,62,104,133,77,29,21,54,93,72,34,65,28,13,36,13,38,49,27,
10,17,48,88,70,64,103,73,40,4,182,131,147,147,131,148,33,66,56,39,7,55,77,
50,23,56,101,140,84,252,209,62,106,78,45,4,5,139,2,4,20,43,67,46,2,241,69,
104,69,35,46,84,120,75,253,170,0,0,0,255,255,0,142,0,0,2,200,5,228,18,38,
1,201,0,0,17,7,0,116,0,216,0,0,0,19,64,11,1,6,17,38,1,85,6,9,4,0,37,1,43,
53,0,43,53,0,0,0,0,1,0,87,255,236,3,222,4,78,0,40,0,171,64,113,116,30,1,116,
21,1,137,8,1,137,2,1,47,42,1,63,26,1,26,26,27,36,16,70,15,15,35,70,0,36,32,
36,2,0,36,64,36,96,36,128,36,160,36,192,36,224,36,7,8,36,24,27,71,31,5,1,
5,27,80,143,24,159,24,175,24,3,24,24,32,19,80,10,31,16,47,16,127,16,143,16,
223,16,5,16,64,29,32,72,16,16,10,16,32,80,0,0,35,16,35,32,35,96,35,112,35,
128,35,192,35,208,35,8,35,184,255,192,182,27,34,72,35,35,0,22,0,63,50,47,
43,93,16,237,63,51,47,43,93,16,237,18,57,47,113,237,1,47,93,237,50,47,94,
93,113,237,51,47,237,17,18,57,47,93,93,49,48,93,93,93,93,5,34,46,2,53,52,
62,2,51,50,30,2,23,7,46,1,35,34,14,2,7,33,21,33,30,3,51,50,54,55,23,14,3,
2,52,130,182,114,51,81,134,170,90,93,145,105,66,13,185,15,118,109,73,103,
67,34,4,1,156,254,99,4,35,68,103,74,100,133,16,182,9,61,106,151,20,86,151,
205,120,163,216,128,53,48,84,116,68,14,91,105,44,88,133,90,131,82,135,97,
53,103,109,12,67,122,92,54,0,255,255,0,57,255,236,3,182,4,75,18,6,0,86,0,
0,255,255,0,137,0,0,1,61,5,204,16,38,0,241,199,0,17,6,1,75,237,0,0,212,181,
9,64,56,56,72,9,184,255,192,64,9,55,55,72,9,64,54,54,72,9,184,255,192,179,
53,53,72,9,184,255,192,64,9,52,52,72,9,64,50,50,72,9,184,255,192,179,49,49,
72,9,184,255,192,64,9,48,48,72,9,64,42,42,72,9,184,255,192,179,41,41,72,9,
184,255,192,64,9,40,40,72,9,64,38,38,72,9,184,255,192,179,37,37,72,9,184,
255,192,179,36,36,72,9,184,255,192,179,35,35,72,9,184,255,192,64,16,34,34,
72,9,64,29,29,72,9,64,10,10,72,1,0,0,184,255,192,179,49,49,72,0,184,255,192,
64,9,40,41,72,0,64,25,27,72,0,184,255,192,182,18,18,72,128,0,1,0,184,255,
192,64,11,8,8,72,0,1,0,4,7,1,2,37,1,43,53,17,43,93,43,43,43,43,53,53,1,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,255,255,255,248,0,0,2,
37,5,123,18,38,0,241,0,0,17,6,0,105,203,0,0,25,182,2,1,4,17,38,2,1,184,255,
243,180,8,6,0,2,37,1,43,53,53,0,43,53,53,0,0,0,255,255,255,206,254,87,1,61,
5,204,18,6,0,77,0,0,0,2,0,11,255,236,6,236,4,58,0,34,0,45,1,42,64,82,163,
16,1,148,16,1,117,16,133,16,2,106,14,1,57,14,1,14,16,18,22,72,131,14,147,
14,163,14,3,117,14,1,106,13,1,57,13,1,13,16,18,22,72,163,13,1,87,13,103,13,
119,13,3,16,24,12,17,72,109,15,1,15,32,18,22,72,162,15,1,117,15,133,15,149,
15,3,54,15,70,15,2,5,184,255,224,179,7,10,72,2,184,255,224,64,18,7,11,72,
34,35,70,64,9,1,9,9,22,3,71,176,41,1,41,184,255,192,64,9,8,11,72,41,47,80,
47,1,47,184,255,192,64,93,30,35,72,255,47,1,48,47,1,109,11,1,31,11,63,11,
2,255,11,1,233,11,1,187,11,203,11,219,11,3,163,11,1,149,11,1,31,32,63,32,
2,255,32,1,106,32,1,41,32,1,163,32,1,53,32,1,11,15,32,3,22,45,81,175,34,191,
34,207,34,3,15,34,31,34,79,34,3,7,34,34,9,11,80,32,15,25,80,18,22,35,81,9,
21,0,63,237,63,237,63,237,18,57,47,94,93,113,237,1,47,23,51,93,93,113,113,
93,113,93,93,93,93,93,113,113,93,93,43,113,16,220,43,93,237,18,57,47,93,237,
50,49,48,43,43,93,93,93,43,113,0,43,1,93,93,43,113,113,93,93,43,113,113,93,
93,93,1,50,22,21,20,14,2,35,33,17,33,6,2,14,3,35,34,38,39,53,30,1,51,50,62,
3,18,55,33,25,1,51,50,62,2,53,52,38,43,1,5,77,205,210,52,104,155,103,254,
62,254,101,25,42,44,51,71,94,65,29,48,17,11,38,19,35,51,40,33,34,38,25,2,
242,242,69,96,59,26,116,133,243,2,112,147,159,74,118,82,44,3,183,184,254,
225,216,149,93,42,8,5,129,4,5,42,94,149,216,1,29,183,254,54,254,15,25,49,
71,46,94,87,0,0,2,0,142,0,0,6,44,4,58,0,20,0,31,0,133,185,0,7,255,224,179,
7,10,72,4,184,255,224,64,23,7,11,72,1,21,70,19,11,11,15,5,71,64,176,27,1,
27,33,128,80,33,1,33,184,255,192,64,50,30,35,72,255,33,1,18,14,70,16,15,32,
15,64,15,3,15,31,81,1,1,13,80,175,18,191,18,207,18,3,15,18,31,18,79,18,3,
7,18,18,0,15,21,21,81,11,21,16,0,15,0,63,50,63,237,63,18,57,47,94,93,113,
237,51,47,237,1,47,93,237,50,93,43,113,26,16,220,93,26,237,18,57,47,51,237,
50,49,48,43,43,1,17,51,50,22,21,20,14,2,35,33,17,33,17,35,17,51,17,33,17,
19,51,50,62,2,53,52,38,43,1,3,169,228,205,210,52,104,155,103,254,102,254,
78,180,180,1,178,181,202,69,96,59,26,116,133,203,4,58,254,54,147,159,74,118,
82,44,1,237,254,19,4,58,254,54,1,202,252,69,25,49,71,46,94,87,0,0,0,0,1,0,
10,0,0,3,238,5,204,0,41,0,144,185,0,7,255,232,64,85,9,13,72,0,7,16,7,2,7,
33,24,11,70,64,80,12,1,159,12,255,12,2,12,43,128,35,32,24,70,29,28,192,25,
1,0,25,16,25,48,25,224,25,240,25,5,8,25,176,43,192,43,208,43,3,176,43,240,
43,2,255,43,1,112,43,160,43,176,43,3,35,27,81,32,28,28,5,30,0,25,11,21,0,
18,80,5,184,255,192,180,9,13,72,5,15,0,63,43,237,50,63,51,63,18,57,47,51,
237,50,1,93,93,113,114,47,94,93,113,51,51,237,50,50,26,16,220,93,113,26,237,
17,57,49,48,0,94,93,43,1,62,3,51,50,30,2,21,17,35,17,52,46,2,35,34,14,2,21,
17,35,17,35,53,51,53,51,21,33,21,33,21,20,14,2,7,1,61,30,70,84,100,62,104,
133,77,29,181,17,48,88,70,64,103,73,40,180,132,132,180,1,44,254,212,2,3,2,
1,3,89,55,77,50,23,56,101,140,84,253,87,2,134,69,104,69,35,46,84,120,75,253,
170,4,182,131,147,147,131,148,33,66,56,39,7,0,0,255,255,0,138,0,0,3,138,5,
228,18,38,1,208,0,0,17,7,0,116,1,63,0,0,0,19,64,11,1,22,17,38,1,81,22,25,
0,14,37,1,43,53,0,43,53,0,0,0,255,255,0,5,254,87,3,252,5,240,18,38,0,92,0,
0,17,7,2,145,0,183,0,0,0,19,64,11,1,32,17,38,1,10,37,45,17,31,37,1,43,53,
0,43,53,0,0,0,0,1,0,142,254,104,3,221,4,58,0,11,0,125,64,89,9,73,15,10,79,
10,2,38,10,10,0,7,70,64,15,4,79,4,2,57,47,4,111,4,143,4,255,4,4,191,4,1,143,
4,159,4,255,4,3,4,13,128,3,70,192,0,1,0,0,16,0,48,0,224,0,240,0,5,8,0,176,
13,192,13,208,13,3,176,13,240,13,2,112,13,160,13,176,13,192,13,4,9,5,1,15,
8,3,80,0,0,47,237,51,63,51,47,1,93,113,114,47,94,93,113,237,26,16,220,93,
113,114,94,93,26,237,18,57,47,94,93,237,49,48,51,17,51,17,33,17,51,17,33,
17,35,17,142,180,1,231,180,254,170,163,4,58,252,73,3,183,251,198,254,104,
1,152,0,0,1,0,168,0,1,3,186,7,28,0,7,0,55,64,37,5,90,0,6,16,6,64,6,3,6,3,
70,255,0,1,0,0,16,0,64,0,128,0,176,0,208,0,6,7,0,4,95,1,7,3,5,18,0,63,63,
51,237,1,47,94,93,93,237,47,93,237,49,48,1,17,51,17,33,17,35,17,3,6,180,253,
173,191,5,129,1,155,253,201,251,28,5,128,0,0,0,0,1,0,142,0,0,3,10,5,204,0,
7,0,56,64,36,6,73,16,3,48,3,2,3,3,9,0,70,192,1,1,0,1,16,1,48,1,224,1,240,
1,5,8,1,4,0,7,80,2,15,0,21,0,63,63,237,63,1,47,94,93,113,237,17,51,47,93,
237,49,48,33,35,17,33,17,51,17,33,1,66,180,1,217,163,254,56,4,58,1,146,253,
235,255,255,0,9,0,0,7,134,6,240,18,38,0,58,0,0,17,7,2,148,2,65,0,0,0,21,180,
1,47,5,38,1,184,255,184,180,48,51,15,46,37,1,43,53,0,43,53,0,255,255,255,
253,0,0,5,204,5,228,18,38,0,90,0,0,17,7,0,67,1,72,0,0,0,21,180,1,43,17,38,
1,184,255,162,180,44,47,15,42,37,1,43,53,0,43,53,0,255,255,0,9,0,0,7,134,
6,240,18,38,0,58,0,0,17,7,2,149,2,247,0,0,0,19,64,11,1,47,5,38,1,75,47,50,
15,46,37,1,43,53,0,43,53,0,0,0,255,255,255,253,0,0,5,204,5,228,18,38,0,90,
0,0,17,7,0,116,2,38,0,0,0,19,64,11,1,43,17,38,1,93,43,46,15,42,37,1,43,53,
0,43,53,0,0,0,255,255,0,9,0,0,7,134,6,178,18,38,0,58,0,0,17,7,2,152,2,134,
0,0,0,23,64,13,2,1,47,5,38,2,1,2,51,49,15,46,37,1,43,53,53,0,43,53,53,0,0,
0,255,255,255,253,0,0,5,204,5,123,18,38,0,90,0,0,17,7,0,105,1,161,0,0,0,23,
64,13,2,1,43,17,38,2,1,0,47,45,15,42,37,1,43,53,53,0,43,53,53,0,0,0,255,255,
0,45,0,0,5,41,6,240,18,38,0,60,0,0,17,7,2,148,1,34,0,0,0,21,180,1,9,5,38,
1,184,255,181,180,10,13,4,8,37,1,43,53,0,43,53,0,255,255,0,5,254,87,3,252,
5,228,18,38,0,92,0,0,17,6,0,67,105,0,0,21,180,1,32,17,38,1,184,255,167,180,
33,36,17,31,37,1,43,53,0,43,53,0,0,0,0,1,0,0,1,195,4,114,2,76,0,3,0,43,64,
30,2,0,0,186,15,1,31,1,63,1,79,1,4,47,1,63,1,111,1,175,1,223,1,5,1,64,38,
43,72,1,0,47,43,93,113,237,1,47,47,49,48,17,53,33,21,4,114,1,195,137,137,
0,0,1,0,0,1,195,8,0,2,76,0,3,0,43,64,30,2,0,0,186,15,1,31,1,63,1,79,1,4,47,
1,63,1,111,1,175,1,223,1,5,1,64,38,43,72,1,0,47,43,93,113,237,1,47,47,49,
48,17,53,33,21,8,0,1,195,137,137,0,0,1,0,0,1,195,8,0,2,76,0,3,0,43,64,30,
2,0,0,186,15,1,31,1,63,1,79,1,4,47,1,63,1,111,1,175,1,223,1,5,1,64,38,43,
72,1,0,47,43,93,113,237,1,47,47,49,48,17,53,33,21,8,0,1,195,137,137,0,255,
255,255,225,254,78,4,138,255,169,16,38,0,66,0,229,16,7,0,66,0,0,0,190,0,1,
0,127,3,184,1,72,5,129,0,12,0,47,64,16,4,32,11,17,72,7,64,11,17,72,7,12,150,
10,151,0,184,255,192,64,10,8,11,72,0,10,156,0,169,7,3,0,63,244,237,1,47,43,
237,237,50,43,49,48,43,19,53,52,62,2,55,51,14,1,21,51,21,127,10,20,30,20,
121,45,50,89,3,184,146,52,86,75,66,32,65,132,65,195,0,0,0,1,0,127,3,184,1,
72,5,129,0,12,0,52,185,0,3,255,224,183,11,17,72,9,151,0,150,6,184,255,192,
180,11,17,72,6,11,184,255,192,64,10,8,11,72,11,10,156,5,169,11,3,0,63,228,
237,1,47,43,51,43,253,237,49,48,43,1,20,14,2,7,35,62,1,53,35,53,51,1,72,9,
20,29,20,123,45,49,88,195,4,240,53,86,75,66,32,65,132,63,197,0,1,0,127,254,
250,1,72,0,195,0,12,0,51,185,0,3,255,224,183,11,17,72,9,151,0,150,6,184,255,
192,180,11,17,72,6,11,184,255,192,64,9,8,11,72,11,5,169,11,156,10,0,47,253,
228,1,47,43,51,43,253,237,49,48,43,37,20,14,2,7,35,62,1,53,35,53,51,1,72,
9,20,29,20,123,45,49,88,195,51,53,87,75,66,32,65,132,65,195,0,0,0,1,0,126,
3,184,1,71,5,129,0,12,0,47,64,16,8,32,11,17,72,5,64,11,17,72,5,1,150,2,151,
11,184,255,192,64,10,8,11,72,11,5,169,2,156,12,3,0,63,237,228,1,47,43,237,
237,50,43,49,48,43,1,21,35,20,22,23,35,46,3,61,1,1,65,88,49,45,123,20,29,
20,9,5,129,197,63,132,65,32,66,75,86,53,145,0,0,0,2,0,75,3,184,2,95,5,129,
0,12,0,25,0,89,64,58,17,32,11,17,72,4,32,11,17,72,20,64,11,17,72,20,25,150,
13,7,64,11,17,72,7,12,150,10,151,128,0,1,15,0,31,0,2,8,0,23,151,13,159,27,
175,27,2,10,23,156,13,0,0,13,169,6,20,3,0,63,51,228,50,47,16,237,50,1,93,
47,237,220,94,93,93,237,237,50,43,16,237,50,43,49,48,43,43,1,53,52,62,2,55,
51,14,1,21,51,21,33,53,52,62,2,55,51,14,1,21,51,21,1,151,10,19,29,20,122,
45,49,88,253,242,10,20,30,20,121,45,50,89,3,184,146,52,86,75,66,32,65,132,
65,195,146,52,86,75,66,32,65,132,65,195,0,0,2,0,75,3,184,2,95,5,129,0,12,
0,25,0,107,185,0,16,255,224,179,11,17,72,3,184,255,224,64,13,11,17,72,22,
151,13,150,24,9,151,0,150,6,184,255,192,64,15,11,17,72,6,128,11,1,15,11,31,
11,2,8,11,19,184,255,192,64,24,11,17,72,19,63,24,1,24,159,27,175,27,2,10,
23,156,24,5,5,18,169,11,24,3,0,63,51,228,50,47,16,237,50,1,93,47,93,51,43,
220,94,93,93,50,43,253,237,16,253,237,49,48,43,43,1,20,14,2,7,35,62,1,53,
35,53,51,5,20,14,2,7,35,62,1,53,35,53,51,2,95,10,19,30,20,121,45,49,88,194,
254,181,9,20,29,20,123,45,49,88,195,4,240,53,86,75,66,32,65,132,65,195,145,
53,86,75,66,32,65,132,65,195,0,0,0,2,0,75,254,250,2,95,0,195,0,12,0,25,0,
104,185,0,16,255,224,179,11,17,72,3,184,255,224,64,13,11,17,72,22,151,13,
150,24,9,151,0,150,6,184,255,192,64,15,11,17,72,6,128,11,1,15,11,31,11,2,
8,11,19,184,255,192,64,21,11,17,72,19,24,159,27,175,27,2,5,5,18,169,24,11,
11,24,156,10,23,0,47,51,237,50,47,16,228,50,47,1,93,47,51,43,220,94,93,93,
50,43,253,237,16,253,237,49,48,43,43,37,20,14,2,7,35,62,1,53,35,53,51,5,20,
14,2,7,35,62,1,53,35,53,51,2,95,10,19,30,20,121,45,49,88,194,254,181,9,20,
29,20,123,45,49,88,195,51,53,87,75,66,32,65,132,65,195,144,53,87,75,66,32,
65,132,65,195,0,0,0,1,0,138,255,118,3,234,5,204,0,11,0,64,64,37,11,192,0,
8,9,8,0,188,3,7,7,6,4,192,47,3,111,3,175,3,3,32,3,1,3,11,193,10,194,7,4,193,
5,194,7,0,1,0,47,63,246,237,16,244,237,1,47,93,113,237,51,51,47,16,237,50,
50,47,16,237,49,48,1,3,35,3,5,53,5,3,51,3,37,21,2,137,22,115,22,254,160,1,
96,28,215,28,1,97,3,232,251,142,4,114,27,164,29,1,120,254,136,29,164,0,0,
1,0,136,255,115,3,233,5,204,0,21,0,86,64,50,12,8,189,9,15,5,6,11,14,15,5,
9,190,19,1,189,0,20,17,0,16,3,4,16,3,32,0,1,0,19,193,18,194,15,12,193,13,
194,15,8,193,7,194,4,1,193,2,194,4,0,0,63,246,237,16,244,237,47,246,237,16,
244,237,1,47,93,23,51,47,17,51,51,16,237,50,237,23,50,47,16,237,50,49,48,
1,5,53,5,3,51,3,37,21,37,3,19,37,21,37,19,35,19,5,53,5,19,1,241,254,152,1,
104,16,175,16,1,105,254,151,26,26,1,104,254,152,16,175,16,254,151,1,105,26,
3,232,27,164,29,1,120,254,136,29,164,27,254,182,254,185,27,164,29,254,136,
1,120,29,164,27,1,71,0,0,0,0,1,0,81,1,145,2,124,3,188,0,19,0,73,185,0,17,
255,232,179,9,12,72,13,184,255,232,64,39,9,12,72,7,24,9,12,72,3,24,9,12,72,
128,0,1,15,0,63,0,2,0,191,10,1,10,143,5,1,0,5,48,5,2,5,15,15,1,15,0,47,93,
205,93,93,1,47,93,205,93,93,49,48,0,43,43,43,43,1,20,14,2,35,34,46,2,53,52,
62,2,51,50,30,2,2,124,45,76,102,58,57,99,75,43,43,75,99,57,58,102,76,45,2,
170,58,102,77,44,44,77,102,58,57,100,74,43,43,74,100,0,0,0,3,1,22,0,0,6,234,
0,219,0,3,0,7,0,11,0,86,64,61,7,150,4,4,0,11,150,0,8,48,8,96,8,128,8,144,
8,160,8,208,8,240,8,8,0,8,48,8,64,8,96,8,144,8,192,8,208,8,240,8,8,8,8,3,
150,47,0,191,0,2,16,0,1,0,5,1,9,155,4,0,8,0,47,51,51,237,50,50,1,47,93,93,
237,47,94,93,113,237,18,57,47,237,49,48,33,53,51,21,33,53,51,21,33,53,51,
21,6,40,194,252,183,192,252,181,195,219,219,219,219,219,219,0,0,7,0,55,255,
245,7,200,5,141,0,3,0,23,0,43,0,63,0,83,0,103,0,123,3,217,64,12,118,0,134,
0,2,121,2,137,2,2,3,102,184,255,224,64,14,8,12,72,96,24,8,12,72,92,24,8,12,
72,86,184,255,224,179,8,12,72,62,184,255,232,64,14,8,12,72,56,24,8,12,72,
52,24,8,12,72,46,184,255,224,179,8,12,72,22,184,255,224,64,14,8,12,72,16,
24,8,12,72,12,24,8,12,72,6,184,255,224,64,13,8,12,72,74,180,59,181,49,0,1,
2,3,1,184,255,240,64,131,3,16,118,3,1,9,1,25,1,121,1,3,9,1,3,1,3,19,49,180,
102,64,1,38,64,182,64,198,64,214,64,4,64,64,19,114,180,99,181,89,180,105,
104,1,22,104,38,104,2,201,104,249,104,2,139,104,1,118,104,1,89,104,1,70,104,
1,41,104,1,27,104,1,233,104,1,150,104,198,104,2,121,104,1,107,104,1,86,104,
1,57,104,1,6,104,22,104,38,104,3,10,104,24,180,9,181,34,180,9,19,25,19,41,
19,73,19,89,19,121,19,137,19,153,19,8,34,19,64,45,49,72,19,184,255,192,64,
255,19,23,72,19,217,125,1,198,125,1,169,125,1,155,125,1,121,125,1,107,125,
1,93,125,1,73,125,1,59,125,1,45,125,1,9,125,25,125,2,251,125,1,237,125,1,
217,125,1,203,125,1,189,125,1,155,125,1,125,125,141,125,2,105,125,1,91,125,
1,77,125,1,54,125,1,41,125,1,11,125,27,125,2,204,233,125,249,125,2,214,125,
1,187,125,1,173,125,1,137,125,153,125,2,123,125,1,102,125,1,75,125,1,61,125,
1,9,125,1,219,125,251,125,2,205,125,1,153,125,169,125,2,107,125,139,125,2,
93,125,1,57,125,1,43,125,1,29,125,1,9,125,1,237,125,253,125,2,185,125,201,
125,217,125,3,123,125,171,125,2,89,125,1,11,125,59,125,75,125,3,155,249,125,
1,235,125,1,214,125,1,187,125,1,153,125,1,123,125,139,125,2,102,125,1,59,
125,75,125,2,9,125,25,125,2,246,125,1,217,125,1,205,125,1,169,125,185,125,
2,155,125,1,105,125,121,125,2,93,125,1,57,125,73,125,2,43,125,1,22,125,1,
249,125,1,237,125,1,201,125,64,249,1,187,125,1,153,125,1,123,125,1,102,125,
1,73,125,1,54,125,1,9,125,25,125,2,105,249,125,1,235,125,1,221,125,1,169,
125,1,150,125,1,121,125,1,107,125,1,73,125,1,59,125,1,25,125,1,11,125,1,253,
125,1,217,125,1,203,125,1,169,125,1,155,125,1,141,125,1,121,125,1,91,125,
107,125,2,57,125,1,27,125,43,125,2,249,125,1,235,125,1,169,125,201,125,2,
150,125,1,121,125,1,107,125,1,57,125,1,38,125,1,9,125,1,56,249,125,1,230,
125,1,201,125,1,182,125,1,153,125,1,139,125,1,89,125,1,70,125,1,41,125,1,
27,125,1,249,125,1,235,125,1,201,125,1,187,125,1,173,125,1,1,148,125,1,123,
125,1,100,125,1,75,125,1,63,125,1,27,125,1,15,125,1,228,125,1,203,125,1,176,
125,1,2,160,125,1,143,125,1,112,125,1,95,125,1,64,125,1,31,125,1,0,125,1,
8,109,182,84,183,119,182,94,19,69,182,44,183,79,182,54,19,39,182,14,183,29,
182,4,4,2,3,0,18,0,63,63,63,237,244,237,63,237,244,237,63,237,244,237,1,94,
93,93,93,93,93,93,93,95,93,93,93,113,113,113,113,113,113,113,95,113,113,113,
113,113,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,
93,113,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,
114,114,114,94,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,
113,113,113,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,113,113,
113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114,114,94,93,
93,93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,113,
113,47,43,43,94,93,237,244,237,47,94,93,93,93,93,93,93,93,113,113,113,113,
113,113,113,114,114,253,244,237,18,57,47,93,113,237,17,57,57,47,47,94,93,
93,56,56,17,51,17,51,16,244,237,49,48,0,43,43,43,43,43,43,43,43,43,43,43,
43,1,95,93,93,33,35,1,51,37,50,30,2,21,20,14,2,35,34,46,2,53,52,62,2,19,52,
46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,50,30,2,21,20,14,2,35,34,46,2,53,
52,62,2,19,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,50,30,2,21,20,14,2,
35,34,46,2,53,52,62,2,19,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,48,155,
3,154,157,252,152,60,107,80,46,46,81,108,62,63,108,80,46,46,81,110,210,19,
37,55,35,38,58,39,19,20,39,56,37,34,54,39,21,2,30,60,107,80,46,46,81,108,
62,63,108,80,46,46,81,110,210,19,37,55,35,38,58,39,19,20,39,56,37,34,54,39,
21,1,253,60,107,80,46,46,81,108,62,63,108,80,46,46,81,110,210,19,37,55,35,
38,58,39,19,20,39,56,37,34,54,39,21,5,129,12,33,83,139,106,102,140,86,38,
37,86,140,103,106,139,83,33,254,151,73,98,58,24,24,59,97,73,71,97,59,26,26,
59,97,254,239,33,83,139,106,102,140,86,38,37,86,140,103,106,139,83,33,254,
151,73,98,58,24,24,59,97,73,71,97,59,26,26,59,97,1,176,33,83,139,106,102,
140,86,38,37,86,140,103,106,139,83,33,254,151,73,98,58,24,24,59,97,73,71,
97,59,26,26,59,97,0,0,0,0,1,0,85,3,122,1,89,5,129,0,3,0,40,64,25,3,16,10,
13,72,1,16,10,13,72,1,150,31,2,47,2,2,2,48,0,1,0,0,1,3,0,63,205,1,47,93,221,
93,237,49,48,43,43,27,1,51,3,85,64,196,158,3,122,2,7,253,249,255,255,0,85,
3,122,2,175,5,129,16,38,2,14,0,0,17,7,2,14,1,86,0,0,0,9,180,1,96,4,1,4,17,
93,53,0,0,1,0,88,0,141,2,81,3,172,0,8,0,72,64,55,106,3,122,3,138,3,3,106,
0,122,0,138,0,3,7,236,6,235,5,236,31,1,79,1,95,1,127,1,143,1,5,48,1,64,1,
96,1,112,1,160,1,5,1,0,239,15,3,47,3,111,3,127,3,4,3,0,47,93,228,1,47,93,
113,237,237,237,49,48,93,93,37,1,53,1,51,21,9,1,21,1,168,254,176,1,80,167,
254,177,1,81,141,1,109,63,1,115,31,254,140,254,145,29,0,0,0,1,0,89,0,141,
2,82,3,172,0,8,0,66,64,48,101,6,117,6,133,6,3,101,0,117,0,133,0,3,4,236,1,
236,8,235,112,3,128,3,176,3,3,208,3,1,111,3,127,3,2,3,0,239,15,6,47,6,111,
6,127,6,4,6,0,47,93,228,1,47,93,93,113,253,237,237,49,48,93,93,37,35,53,9,
1,53,51,1,21,1,1,168,1,82,254,176,166,1,81,141,29,1,111,1,116,31,254,141,
63,0,0,0,255,255,0,185,0,0,3,71,5,129,16,38,0,4,0,0,17,7,0,4,1,200,0,0,0,
22,64,12,3,2,47,8,1,8,1,0,47,0,1,0,17,93,53,53,17,93,53,53,0,1,255,192,5,
223,2,235,6,84,0,3,0,13,179,1,0,2,1,0,47,205,1,47,47,49,48,1,33,53,33,2,235,
252,213,3,43,5,223,117,0,1,254,96,0,0,2,98,5,129,0,3,0,45,182,3,16,111,3,
1,3,1,184,255,240,64,18,239,1,1,1,64,13,18,72,1,64,8,11,72,1,2,3,0,18,0,63,
63,1,47,43,43,93,56,47,93,56,49,48,33,35,1,51,254,244,148,3,113,145,5,129,
0,0,1,0,101,2,7,2,131,4,157,0,33,0,111,185,0,30,255,216,64,30,9,17,72,23,
10,224,36,11,1,11,33,224,36,0,212,0,228,0,3,0,23,6,228,11,139,0,251,0,2,0,
184,255,192,64,38,10,13,72,4,0,1,0,29,17,17,75,29,91,29,2,29,64,21,25,72,
29,64,16,19,72,47,29,63,29,2,27,29,1,15,29,1,2,29,0,47,95,93,93,93,43,43,
93,51,47,16,204,93,43,93,50,237,50,1,47,93,237,47,93,237,50,49,48,0,43,1,
17,52,46,2,35,34,6,21,17,35,17,52,46,2,53,51,20,30,2,21,51,62,3,51,50,22,
21,17,2,2,13,29,47,35,72,85,128,1,1,2,119,2,2,2,2,15,38,49,64,42,110,97,2,
7,1,142,46,61,37,16,100,94,254,148,1,255,20,46,40,29,4,3,27,34,35,12,28,46,
32,17,108,121,254,79,0,0,0,1,0,4,0,0,4,46,5,129,0,17,0,106,64,69,7,3,7,3,
10,0,16,32,16,2,16,16,48,16,80,16,112,16,144,16,224,16,6,16,5,1,9,92,14,12,
10,8,12,81,5,31,13,1,0,13,1,13,4,95,15,1,31,1,63,1,79,1,4,63,1,1,15,1,1,8,
1,1,9,0,95,15,3,9,18,0,63,63,237,18,57,47,94,93,93,113,237,220,93,113,50,
237,50,1,47,51,51,237,50,50,47,93,113,18,57,57,47,47,49,48,1,17,33,21,33,
21,33,21,33,17,35,17,35,53,51,17,33,21,1,103,2,175,253,81,1,146,254,110,180,
175,175,3,123,4,230,254,36,157,213,129,254,233,1,23,129,3,233,155,0,1,0,58,
0,0,4,80,5,150,0,58,0,221,64,81,133,58,149,58,2,21,22,37,22,53,22,3,40,44,
0,48,17,13,6,30,111,29,29,0,52,110,6,43,39,48,110,18,14,10,10,0,79,6,95,6,
111,6,3,6,58,111,0,0,32,0,2,0,0,32,0,48,0,80,0,112,0,144,0,176,0,208,0,8,
0,0,16,0,48,0,192,0,224,0,5,8,0,184,255,192,64,70,14,18,72,0,42,16,81,17,
46,12,81,43,175,13,1,13,64,42,45,72,0,13,16,13,32,13,3,13,39,111,17,1,47,
17,95,17,111,17,143,17,159,17,223,17,239,17,7,17,17,52,35,115,41,30,1,30,
24,7,7,52,116,37,58,1,23,58,1,58,6,24,0,63,51,93,93,237,50,63,51,93,237,18,
57,47,93,113,51,222,93,43,93,50,237,50,16,237,50,1,47,43,94,93,113,114,237,
47,93,18,57,47,51,51,237,50,50,16,237,17,57,47,237,17,51,51,17,18,57,57,49,
48,0,93,93,1,14,3,35,33,53,62,1,61,1,35,53,51,53,35,53,51,53,52,62,2,51,50,
30,2,23,7,46,3,35,34,6,29,1,33,21,33,21,33,21,33,21,20,14,2,7,33,50,62,2,
55,4,80,9,57,89,115,67,253,70,89,86,186,186,186,186,48,99,152,103,70,123,
99,71,18,174,10,39,53,65,36,114,112,1,152,254,104,1,152,254,104,22,44,63,
40,1,227,38,67,53,37,8,1,55,80,117,77,37,154,46,160,121,25,129,140,129,130,
92,147,102,55,29,58,86,57,57,31,52,36,20,115,125,138,129,140,129,7,56,106,
92,71,21,19,42,67,48,0,0,0,0,4,0,158,255,236,8,103,5,129,0,14,0,23,0,47,0,
98,1,193,64,71,134,2,1,117,91,133,91,2,91,73,107,73,139,73,3,143,68,1,109,
68,1,91,68,1,105,82,1,105,80,1,125,22,1,91,22,107,22,2,125,17,141,17,2,91,
17,107,17,2,84,57,100,57,2,54,57,70,57,2,37,97,53,97,69,97,3,76,32,9,14,72,
49,184,255,224,64,94,9,14,72,29,32,12,17,72,13,29,29,29,45,29,3,82,73,81,
81,48,72,65,0,70,15,24,39,75,37,41,72,30,34,32,30,57,73,15,56,1,102,56,1,
56,56,89,72,75,95,15,1,63,75,95,75,239,75,3,75,64,27,39,72,239,30,1,31,30,
95,30,127,30,3,15,30,75,75,30,15,3,8,64,65,80,65,96,65,3,127,65,143,65,2,
65,184,255,192,64,16,7,12,72,65,20,7,70,0,8,16,8,32,8,3,8,100,184,255,192,
179,91,95,72,100,184,255,192,179,80,88,72,100,184,255,192,179,70,74,72,100,
184,255,192,179,59,62,72,100,184,255,192,179,48,53,72,100,184,255,192,64,
11,27,31,72,79,100,95,100,111,100,3,100,184,255,192,179,7,10,72,89,184,255,
248,64,71,19,22,72,65,8,19,22,72,89,65,78,60,80,57,51,22,44,80,27,22,6,95,
20,87,80,121,82,1,72,82,88,82,104,82,3,82,78,40,32,80,33,78,37,33,35,35,33,
127,33,143,33,2,175,20,1,20,64,9,17,72,20,33,20,33,8,19,95,9,3,8,18,0,63,
63,237,18,57,57,47,47,43,93,93,17,51,47,17,51,51,16,237,50,47,51,93,93,237,
16,237,63,237,63,51,237,18,57,57,43,43,1,43,93,43,43,43,43,43,43,47,93,237,
50,47,43,93,113,18,23,57,47,47,47,93,113,43,93,93,16,237,51,47,93,113,237,
17,51,51,16,237,50,17,57,57,16,237,16,237,50,47,237,49,48,93,43,43,43,93,
0,93,93,1,93,93,93,93,0,93,93,93,93,93,1,93,0,93,1,93,1,20,14,2,43,1,17,35,
17,33,50,30,2,7,52,38,43,1,17,51,50,54,1,14,1,35,34,38,53,17,35,53,51,55,
51,21,51,21,35,17,20,22,51,50,54,55,37,20,6,35,34,46,2,39,55,30,1,51,50,62,
2,53,52,46,2,39,46,3,53,52,54,51,50,22,23,7,46,3,35,34,21,20,30,2,23,30,3,
3,186,61,121,182,121,130,181,1,43,125,186,124,62,182,164,164,105,113,165,
155,2,123,35,74,48,105,93,104,111,53,110,157,157,41,55,23,40,26,2,232,183,
170,75,121,92,61,15,159,17,99,88,40,68,49,27,34,62,87,52,49,96,77,47,168,
161,141,165,22,161,6,31,45,54,30,155,32,57,80,48,48,100,82,52,3,217,92,159,
117,68,253,219,5,129,61,111,157,97,134,139,253,212,146,252,186,11,13,123,
122,1,197,131,242,242,131,254,98,78,73,8,6,98,120,129,24,54,88,64,26,61,58,
10,25,40,30,30,41,29,23,13,12,32,53,79,59,112,119,105,116,17,28,38,24,10,
85,25,36,28,22,11,11,31,54,87,0,1,0,16,255,236,4,86,5,150,0,61,0,232,185,
0,2,255,235,64,68,15,73,106,38,1,58,43,74,43,122,43,138,43,4,36,59,52,59,
68,59,116,59,132,59,5,46,55,55,4,57,45,51,110,20,24,15,14,26,15,3,20,37,110,
36,36,3,110,64,4,96,4,128,4,160,4,176,4,5,0,4,144,4,176,4,208,4,4,4,184,255,
192,64,94,24,27,72,4,48,24,81,25,57,15,81,54,15,16,31,16,127,16,143,16,159,
16,5,16,64,39,47,72,0,16,16,16,128,16,3,16,45,47,25,63,25,127,25,3,47,25,
63,25,175,25,207,25,4,47,25,175,25,2,25,25,0,40,115,216,37,1,124,37,140,37,
2,26,37,42,37,2,37,31,7,0,115,115,3,131,3,2,21,3,37,3,2,3,9,25,0,63,51,93,
93,237,63,51,93,93,93,237,18,57,47,93,113,114,51,220,93,43,113,50,237,50,
16,237,50,1,47,43,93,113,237,51,47,237,47,23,51,47,196,16,237,50,50,17,57,
47,196,49,48,0,93,93,93,43,37,50,54,55,23,14,3,35,34,46,2,39,35,55,51,46,
1,53,52,54,55,35,55,51,62,3,51,50,30,2,23,7,46,1,35,34,14,2,7,33,7,33,14,
1,21,20,22,23,33,7,33,30,3,2,179,100,120,14,185,13,63,103,147,97,120,177,
121,69,13,171,40,120,1,2,2,1,160,40,129,15,73,123,173,115,97,147,103,63,13,
185,14,121,106,68,106,79,50,11,1,190,40,254,99,2,1,2,2,1,196,40,254,108,9,
42,77,114,126,100,91,14,68,118,87,50,77,139,192,114,129,8,46,24,27,53,6,127,
122,189,130,67,50,87,118,68,14,91,100,39,87,137,99,127,16,47,23,22,37,19,
129,81,138,100,57,0,0,0,0,4,0,69,255,244,6,208,5,140,0,19,0,23,0,43,0,79,
0,192,64,14,118,20,134,20,2,121,22,137,22,2,133,47,1,66,184,255,232,64,9,
8,11,72,60,24,8,11,72,17,184,255,232,179,8,11,72,13,184,255,232,64,29,8,11,
72,7,24,8,11,72,3,24,8,11,72,22,23,20,21,74,180,73,73,52,180,53,178,63,23,
16,21,184,255,240,64,62,21,23,21,23,0,44,180,63,64,10,14,72,63,34,180,10,
178,0,180,0,24,16,24,32,24,80,24,96,24,208,24,224,24,240,24,8,24,38,52,1,
52,49,182,58,184,77,182,74,68,4,23,3,20,18,29,182,15,184,39,182,5,19,0,63,
237,244,237,63,63,63,51,237,244,237,51,93,1,47,93,253,244,237,47,43,237,18,
57,57,47,47,56,56,16,244,237,51,47,237,17,51,17,51,49,48,0,43,43,43,43,43,
43,1,93,93,93,1,20,14,2,35,34,46,2,53,52,62,2,51,50,30,2,1,35,1,51,19,52,
46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,20,30,2,51,50,54,55,23,14,3,35,34,
46,2,53,52,62,2,51,50,30,2,23,7,46,1,35,34,6,6,208,51,87,116,66,66,115,85,
49,48,86,117,68,66,115,85,50,251,59,155,3,154,157,149,22,43,63,40,42,64,44,
22,23,43,63,41,39,63,44,24,250,155,20,47,75,54,69,94,11,141,6,45,77,111,72,
94,132,82,38,59,97,124,65,68,106,76,48,9,143,10,83,75,108,87,1,178,125,171,
105,45,45,104,171,126,133,174,103,41,41,103,174,253,201,5,129,252,49,99,131,
78,32,33,78,131,98,95,128,79,34,34,79,128,2,124,75,124,90,50,82,87,9,54,99,
76,45,69,121,164,96,130,173,103,42,40,70,94,55,11,72,85,164,0,2,0,19,255,
236,2,126,5,149,0,39,0,55,0,185,64,9,138,32,1,53,40,14,17,72,26,184,255,232,
179,8,16,72,22,184,255,232,64,67,8,16,72,8,32,8,16,72,6,32,11,16,72,5,27,
21,27,2,5,21,21,21,2,3,4,4,29,16,40,32,40,2,96,40,112,40,128,40,192,40,4,
15,40,1,40,40,4,51,20,51,2,8,51,159,35,1,35,18,14,192,10,208,10,224,10,3,
10,184,255,192,179,34,38,72,10,184,255,192,64,26,7,11,72,10,79,57,1,18,51,
45,15,11,34,24,14,14,7,45,24,3,3,7,24,7,0,7,0,47,205,63,18,57,47,16,205,17,
57,47,18,57,57,205,17,57,57,1,93,47,43,43,93,198,51,205,93,50,0,94,93,1,51,
47,93,93,113,205,50,47,51,49,48,0,93,93,43,43,43,43,1,43,93,37,50,54,55,51,
14,1,35,34,38,61,1,14,1,7,53,62,1,55,17,52,62,2,51,50,30,2,21,20,14,2,7,21,
20,30,2,19,52,46,2,35,34,14,2,21,17,62,3,1,177,51,68,17,69,20,120,109,111,
127,32,66,34,35,66,31,25,59,98,72,52,79,53,27,44,79,110,66,19,32,42,115,14,
27,40,26,32,39,22,8,49,77,54,28,78,104,109,154,157,159,155,175,17,28,13,73,
14,29,16,2,75,59,108,83,49,42,78,111,69,99,180,152,118,38,244,57,83,54,26,
4,20,52,85,61,33,36,61,81,46,254,5,33,104,131,151,0,0,0,0,4,0,188,0,0,8,46,
5,129,0,19,0,35,0,55,0,59,0,244,64,124,141,0,1,0,24,13,16,72,61,0,1,25,0,
1,132,10,1,114,10,1,69,10,85,10,101,10,3,22,10,38,10,2,5,33,21,33,37,33,3,
4,29,20,29,2,11,24,27,24,2,11,22,27,22,2,47,61,1,58,20,73,36,19,73,16,0,16,
57,46,73,26,144,16,160,16,192,16,3,31,26,1,16,26,16,26,8,144,36,160,36,176,
36,3,47,36,1,0,36,1,36,10,1,7,73,48,8,64,8,80,8,3,0,8,16,8,32,8,144,8,4,8,
41,31,15,1,184,255,192,179,29,36,72,1,184,255,192,64,15,18,21,72,1,17,9,3,
51,23,192,57,208,57,2,57,184,255,192,64,21,35,44,72,57,56,11,64,29,36,72,
11,64,18,21,72,0,11,56,3,8,18,0,63,23,51,43,43,47,221,43,93,222,205,63,51,
51,43,43,63,205,1,47,93,113,237,50,50,47,93,93,93,18,57,57,47,47,93,93,16,
237,51,17,51,16,237,16,237,50,93,49,48,0,93,93,93,93,1,93,93,93,93,93,93,
43,93,33,1,22,23,30,1,21,17,35,17,51,1,38,39,46,1,53,17,51,17,1,20,6,35,34,
38,53,52,62,2,51,50,30,2,7,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,53,
33,21,4,38,253,48,1,2,1,2,160,202,2,216,2,2,2,2,162,3,54,176,175,168,177,
43,87,131,88,93,131,84,39,159,24,47,69,45,46,71,48,25,26,48,67,41,46,72,50,
25,254,16,2,123,4,166,44,44,38,89,39,252,88,5,129,251,82,40,46,39,98,51,3,
156,250,127,2,178,188,203,201,190,91,145,101,53,53,100,145,92,81,107,64,26,
27,64,107,80,82,108,63,26,26,63,108,253,160,146,146,0,0,0,0,2,0,188,2,122,
7,25,5,129,0,39,0,47,0,148,64,9,9,24,19,23,72,136,9,1,8,184,255,232,64,16,
19,23,72,89,8,105,8,121,8,3,37,24,13,17,72,24,184,255,240,64,73,12,17,72,
44,41,196,42,24,21,196,64,22,224,22,2,22,22,0,64,47,1,47,0,42,16,42,64,42,
80,42,4,42,39,196,37,111,0,175,0,207,0,223,0,239,0,5,0,40,44,202,0,9,22,29,
4,0,42,32,42,80,42,128,42,4,42,2,15,23,37,15,3,45,3,0,63,23,51,17,51,204,
93,23,50,237,50,1,47,93,51,237,47,93,204,93,18,57,47,93,237,50,16,253,204,
49,48,43,43,93,43,93,43,1,17,53,6,7,14,1,7,3,35,3,46,1,39,38,39,6,21,6,20,
21,17,35,17,51,19,30,1,31,1,54,55,62,3,53,19,51,17,1,17,35,17,35,53,33,21,
6,155,5,4,4,5,2,230,108,163,2,24,14,17,20,1,1,128,190,223,2,5,2,6,20,16,7,
13,11,7,168,184,251,40,134,255,2,138,2,122,1,169,194,11,11,9,18,5,253,203,
1,157,5,64,38,44,55,10,10,8,18,6,253,201,3,7,253,205,4,13,7,18,51,41,18,34,
28,18,2,1,157,252,249,2,152,253,104,2,152,111,111,0,0,0,0,1,0,108,0,0,5,184,
5,150,0,57,0,221,64,95,101,36,1,101,22,1,157,49,1,143,49,1,49,16,11,15,72,
157,9,1,143,9,1,9,16,11,15,72,116,3,132,3,2,54,3,1,54,2,118,2,2,54,56,118,
56,2,116,55,132,55,2,54,55,1,42,26,1,42,32,1,41,53,48,40,10,18,32,40,96,40,
112,40,144,40,4,47,18,111,18,127,18,159,18,4,40,18,40,18,24,34,91,16,53,1,
53,184,255,192,64,65,23,29,72,191,53,207,53,2,0,53,48,53,2,53,17,5,91,31,
24,63,24,79,24,143,24,191,24,207,24,223,24,7,111,24,127,24,159,24,239,24,
255,24,5,0,24,48,24,2,8,24,10,15,19,39,48,5,42,95,18,41,18,29,95,0,4,0,63,
237,63,51,237,23,50,1,47,94,93,93,113,253,196,47,93,93,43,114,237,17,57,57,
47,47,93,93,17,51,17,51,16,196,49,48,0,93,93,93,93,93,93,93,93,43,93,93,43,
93,93,93,93,1,50,30,2,21,20,14,2,7,54,55,62,1,59,1,21,33,53,62,3,53,52,46,
2,35,34,14,2,21,20,30,2,23,21,33,53,51,50,22,23,22,23,46,3,53,52,62,2,3,18,
151,241,168,90,59,109,157,99,42,39,33,71,23,244,253,179,96,139,89,42,61,116,
169,108,109,170,116,61,42,89,139,96,253,179,244,23,71,33,39,42,99,157,109,
59,90,168,241,5,150,86,162,234,147,106,191,167,138,54,2,3,2,4,156,224,51,
126,143,159,85,116,181,124,65,65,124,181,116,85,159,143,126,51,224,156,4,
2,3,2,54,138,167,191,106,147,234,162,86,0,0,0,2,0,88,255,222,4,124,4,72,0,
32,0,45,0,82,64,50,90,13,1,28,15,64,160,33,176,33,2,95,33,1,80,33,96,33,112,
33,3,33,47,128,32,47,1,45,208,17,1,17,5,16,45,45,22,39,10,16,22,21,27,1,6,
27,1,27,0,22,0,63,50,93,93,205,63,205,18,57,47,205,1,47,205,93,50,93,26,16,
220,93,113,113,26,205,50,49,48,93,5,34,46,2,53,52,62,2,51,50,30,2,21,33,17,
30,3,51,50,62,2,55,23,14,3,19,17,46,3,35,34,14,2,7,17,2,107,130,198,134,69,
95,152,189,95,112,194,142,81,252,197,22,64,78,88,46,75,116,93,76,35,72,36,
84,109,143,203,19,59,77,92,53,51,87,74,60,24,34,93,157,204,111,147,213,139,
66,79,146,210,130,254,156,24,45,35,20,31,60,87,56,42,57,100,76,44,2,138,1,
21,20,42,34,22,19,32,42,24,254,234,0,0,0,255,255,0,80,255,246,6,78,5,129,
16,38,0,121,0,0,16,39,2,20,2,249,0,0,17,7,2,144,3,204,253,206,0,63,64,40,
4,3,2,111,15,1,47,15,1,15,1,191,12,1,128,12,1,112,12,1,96,12,1,64,12,1,16,
12,1,12,98,64,11,11,72,4,3,2,60,24,0,63,53,53,53,1,43,17,93,93,93,93,93,93,
53,17,93,93,53,53,53,0,0,0,255,255,0,61,255,246,6,78,5,141,16,39,2,20,2,249,
0,0,16,39,2,144,3,204,253,206,17,6,0,115,34,0,0,63,64,40,1,3,2,111,49,1,47,
49,1,49,0,191,1,1,128,1,1,112,1,1,96,1,1,64,1,1,16,1,1,1,141,64,11,11,72,
1,3,2,49,24,0,63,53,53,53,1,43,17,93,93,93,93,93,93,53,17,93,93,53,53,53,
0,0,0,255,255,0,93,255,246,6,78,5,129,16,39,2,20,2,249,0,0,16,39,2,144,3,
204,253,206,17,6,2,142,40,0,0,63,64,40,1,3,2,111,49,1,47,49,1,49,0,191,1,
1,128,1,1,112,1,1,96,1,1,64,1,1,16,1,1,1,126,64,11,11,72,1,3,2,49,24,0,63,
53,53,53,1,43,17,93,93,93,93,93,93,53,17,93,93,53,53,53,0,0,0,255,255,0,145,
255,246,6,78,5,129,16,39,2,20,2,189,0,0,16,39,2,144,3,204,253,206,17,6,2,
143,102,0,0,47,64,28,1,3,2,111,49,1,47,49,1,49,0,191,1,1,128,1,1,1,102,64,
11,11,72,1,3,2,49,24,0,63,53,53,53,1,43,17,93,93,53,17,93,93,53,53,53,0,0,
0,0,1,1,162,0,100,6,94,2,68,0,17,0,24,64,9,0,15,12,3,128,16,7,17,16,0,47,
205,1,47,205,26,204,50,57,57,49,48,1,30,1,23,35,46,1,39,53,62,1,55,51,14,
1,7,33,21,2,129,29,59,31,72,58,130,82,82,130,58,72,31,59,29,3,221,1,41,34,
98,65,68,112,42,36,42,112,68,65,98,34,86,0,0,0,1,1,16,255,195,2,240,4,127,
0,17,0,26,64,10,15,64,0,0,15,12,3,17,128,7,0,47,26,205,204,50,57,57,1,47,
26,205,49,48,1,14,1,7,53,62,1,55,51,30,1,23,21,46,1,39,17,35,1,213,34,98,
65,68,112,42,36,42,112,68,65,98,34,86,3,160,29,59,31,72,58,130,82,82,130,
58,72,31,59,29,252,35,0,1,1,162,0,100,6,94,2,68,0,17,0,24,64,9,0,15,12,3,
128,7,17,16,17,0,47,205,1,47,221,26,204,50,57,57,49,48,1,46,1,39,51,30,1,
23,21,14,1,7,35,62,1,55,33,53,5,127,29,59,31,72,58,130,82,82,130,58,72,31,
59,29,252,35,1,127,34,98,65,68,112,42,36,42,112,68,65,98,34,86,0,0,0,1,1,
16,255,195,2,240,4,127,0,17,0,26,64,10,17,64,16,15,0,3,12,128,8,16,0,47,221,
26,204,50,57,57,1,47,26,205,49,48,37,62,1,55,21,14,1,7,35,46,1,39,53,30,1,
23,17,51,2,43,34,98,65,68,112,42,36,42,112,68,65,98,34,86,162,29,59,31,72,
58,130,82,82,130,58,72,31,59,29,3,221,0,0,1,1,162,0,100,6,94,2,68,0,31,0,
36,64,15,16,31,28,19,128,23,64,15,0,3,12,128,8,0,15,0,47,205,1,47,26,204,
50,57,57,26,221,26,204,50,57,57,49,48,1,30,1,23,35,46,1,39,53,62,1,55,51,
14,1,7,33,46,1,39,51,30,1,23,21,14,1,7,35,62,1,55,2,129,29,59,31,72,58,130,
82,82,130,58,72,31,59,29,2,254,29,59,31,72,58,130,82,82,130,58,72,31,59,29,
1,41,34,98,65,68,112,42,36,42,112,68,65,98,34,34,98,65,68,112,42,36,42,112,
68,65,98,34,0,0,0,1,1,16,255,195,2,240,4,127,0,31,0,38,64,16,15,64,0,31,16,
19,28,128,24,64,0,15,12,3,128,7,0,47,26,204,50,57,57,26,221,26,204,50,57,
57,1,47,26,205,49,48,1,14,1,7,53,62,1,55,51,30,1,23,21,46,1,39,17,62,1,55,
21,14,1,7,35,46,1,39,53,30,1,23,1,213,34,98,65,68,112,42,36,42,112,68,65,
98,34,34,98,65,68,112,42,36,42,112,68,65,98,34,3,160,29,59,31,72,58,130,82,
82,130,58,72,31,59,29,253,2,29,59,31,72,58,130,82,82,130,58,72,31,59,29,0,
2,1,16,255,72,2,240,4,127,0,3,0,35,0,40,64,17,1,19,0,4,35,20,23,32,28,3,0,
28,4,19,16,7,11,0,47,204,50,57,57,221,222,205,16,204,50,57,57,1,47,51,205,
50,49,48,5,33,21,33,19,14,1,7,53,62,1,55,51,30,1,23,21,46,1,39,17,62,1,55,
21,14,1,7,35,46,1,39,53,30,1,23,1,16,1,224,254,32,197,34,98,65,68,112,42,
36,42,112,68,65,98,34,34,98,65,68,112,42,36,42,112,68,65,98,34,104,80,4,88,
29,59,31,72,58,130,82,82,130,58,72,31,59,29,253,2,29,59,31,72,58,130,82,82,
130,58,72,31,59,29,0,0,2,0,56,255,229,3,186,5,197,0,47,0,69,0,222,64,93,156,
19,172,19,2,154,6,170,6,2,122,33,138,33,2,68,24,14,17,72,85,20,101,20,149,
20,165,20,4,140,7,1,74,7,90,7,122,7,3,74,56,90,56,2,67,56,11,15,72,58,67,
1,42,12,58,12,74,12,3,37,45,53,45,149,45,165,45,4,32,39,48,39,2,39,39,15,
169,48,249,48,2,40,48,1,48,28,0,70,64,96,31,1,31,184,255,192,64,64,18,21,
72,15,31,1,31,64,12,17,72,31,71,128,60,71,63,15,1,15,64,12,17,72,15,79,71,
1,39,34,80,43,53,81,27,0,22,64,22,128,22,192,22,4,7,22,22,47,43,111,43,223,
43,3,15,43,191,43,2,43,65,80,10,22,0,63,237,47,93,113,57,47,94,93,51,237,
16,237,50,1,93,47,43,93,237,26,16,220,43,93,43,113,26,237,51,51,113,113,18,
57,47,93,49,48,0,93,1,93,93,43,0,93,1,93,93,0,93,1,43,93,93,93,1,20,14,2,
7,14,3,35,34,46,2,53,52,62,4,51,50,30,2,23,51,62,1,53,52,38,35,34,14,2,7,
55,62,1,51,50,30,2,3,46,3,35,34,14,4,21,20,30,2,51,50,62,2,3,186,7,13,18,
11,31,96,130,162,97,93,127,78,35,22,47,73,102,132,83,42,77,64,50,16,4,1,3,
130,129,28,59,58,55,22,36,42,116,67,113,154,94,41,211,8,36,51,64,36,53,86,
67,49,32,15,21,42,65,44,66,108,83,56,3,170,46,104,106,106,48,128,206,144,
77,63,107,138,75,60,143,144,134,104,63,26,48,67,42,25,58,34,196,209,11,19,
28,17,147,23,39,88,149,195,254,147,42,74,55,32,51,84,110,116,116,48,53,91,
67,38,99,161,205,0,0,0,2,0,4,0,0,4,225,5,129,0,5,0,18,0,244,64,27,74,7,90,
7,106,7,3,69,17,85,17,101,17,3,3,56,8,1,55,16,1,6,24,14,17,72,18,184,255,
232,64,157,14,17,72,102,2,1,39,2,71,2,87,2,3,105,1,1,40,1,72,1,88,1,3,2,1,
12,12,0,6,59,3,1,20,3,1,244,3,1,107,3,155,3,187,3,235,3,4,52,3,84,3,2,0,3,
1,11,2,3,18,15,0,31,0,47,0,3,18,0,15,20,47,20,127,20,3,175,20,191,20,223,
20,255,20,4,32,20,112,20,144,20,3,15,20,63,20,143,20,3,58,175,20,207,20,223,
20,255,20,4,64,20,96,20,144,20,3,15,20,95,20,2,143,20,159,20,191,20,223,20,
4,0,20,32,20,80,20,112,20,4,0,3,6,3,18,95,5,18,12,32,19,22,72,153,12,1,12,
1,3,0,63,51,93,43,63,237,23,50,1,93,93,113,114,114,94,93,113,113,114,47,94,
93,51,47,95,94,93,93,93,93,113,113,51,18,57,61,47,51,51,49,48,93,93,93,93,
43,43,93,93,95,93,93,55,1,51,1,21,33,37,1,46,3,39,14,3,7,1,5,2,5,217,1,254,
251,35,4,21,254,174,16,29,22,15,1,2,14,23,28,16,254,173,141,4,244,251,12,
141,156,3,94,40,82,69,48,8,8,49,70,82,40,252,164,0,1,0,235,254,78,5,172,5,
129,0,7,0,54,64,36,3,90,79,4,175,4,191,4,207,4,4,4,7,90,32,0,1,15,0,1,0,0,
32,0,192,0,208,0,4,0,2,95,5,3,4,0,0,47,50,63,237,1,47,93,113,113,237,47,93,
237,49,48,1,17,33,17,35,17,33,17,4,244,252,182,191,4,193,254,78,6,145,249,
111,7,51,248,205,0,0,0,0,1,0,154,254,78,5,48,5,129,0,11,0,170,64,9,134,8,
150,8,2,163,9,1,9,184,255,192,64,26,13,16,72,163,7,1,2,144,7,1,114,7,130,
7,2,100,7,1,53,7,69,7,85,7,3,3,184,255,240,64,74,9,17,72,41,1,57,1,2,1,16,
12,17,72,8,143,6,159,6,175,6,3,2,72,17,73,15,2,127,2,2,2,6,2,6,0,207,10,1,
0,10,64,10,2,10,7,3,9,3,9,207,0,1,0,0,64,0,2,7,0,32,13,1,3,7,95,2,8,0,4,3,
1,9,95,0,0,47,237,57,63,18,57,57,237,57,1,93,47,94,93,93,51,51,47,47,51,47,
93,93,18,57,57,47,47,93,43,93,51,49,48,0,43,93,43,1,93,93,93,93,95,93,43,
93,93,19,53,9,1,53,33,21,33,9,1,33,21,154,2,123,253,149,4,66,252,178,2,72,
253,168,3,162,254,78,109,3,48,3,44,106,152,253,4,252,249,152,0,0,0,0,1,0,
101,2,96,4,72,2,242,0,3,0,32,64,20,0,2,32,2,80,2,112,2,4,2,16,0,32,0,2,0,
0,173,1,179,0,63,237,1,47,93,47,93,49,48,19,53,33,21,101,3,227,2,96,146,146,
0,0,0,0,1,0,51,255,242,4,98,6,84,0,8,0,185,185,0,0,255,232,64,135,14,17,72,
9,1,57,1,73,1,3,9,1,0,4,6,1,6,6,8,16,111,8,143,8,175,8,207,8,239,8,5,15,8,
47,8,79,8,111,8,143,8,5,8,95,2,1,2,2,15,3,47,3,79,3,111,3,4,11,3,175,10,1,
48,10,80,10,112,10,144,10,4,111,10,143,10,2,16,10,48,10,2,240,10,1,15,10,
47,10,79,10,3,57,239,10,1,176,10,208,10,2,143,10,175,10,207,10,239,10,4,112,
10,1,47,10,79,10,111,10,143,10,175,10,5,2,175,31,5,1,5,5,1,7,179,6,1,0,47,
51,63,18,57,47,93,237,1,93,113,113,114,114,94,93,93,113,113,114,114,47,94,
93,51,47,93,47,93,113,56,57,61,47,93,51,51,49,48,94,93,43,5,35,1,35,53,33,
19,1,51,2,110,106,254,229,182,1,14,242,1,174,129,14,3,24,117,253,78,5,135,
0,3,0,87,0,203,5,93,3,215,0,35,0,51,0,67,0,114,64,75,137,50,1,53,67,69,67,
2,10,15,1,10,3,1,5,33,1,5,21,1,39,26,8,52,4,18,0,0,47,32,47,64,47,112,47,
4,47,60,18,36,224,55,1,55,23,42,239,65,1,65,8,39,52,26,4,5,63,13,1,13,64,
18,21,72,0,13,80,13,2,13,31,15,23,1,23,0,47,93,51,220,93,43,113,50,23,57,
205,93,50,16,205,93,50,1,47,205,47,93,205,17,23,57,49,48,0,93,93,93,93,93,
1,93,1,20,14,2,35,34,38,39,14,3,35,34,46,2,53,52,62,2,51,50,22,23,62,3,51,
50,30,2,37,34,6,7,30,1,51,50,62,2,53,52,46,2,5,46,1,35,34,14,2,21,20,30,2,
51,50,54,5,93,44,82,115,70,97,168,70,32,75,84,90,46,69,115,83,46,44,82,116,
71,94,168,67,31,75,84,94,51,69,114,81,45,254,179,70,119,56,51,119,77,43,71,
51,27,29,51,71,254,93,51,119,78,43,70,49,27,25,48,71,47,70,120,2,78,78,141,
106,62,133,149,63,102,72,39,55,100,143,89,81,142,104,60,135,148,62,102,73,
40,55,101,143,168,126,130,128,128,40,70,94,54,54,92,69,39,250,128,128,40,
70,94,54,51,93,69,41,126,0,0,0,1,1,152,0,0,6,96,4,199,0,5,0,13,179,2,5,2,
5,0,47,205,1,47,205,49,48,1,51,17,33,21,33,1,152,94,4,106,251,56,4,199,251,
151,94,0,0,0,0,1,1,22,255,254,4,170,4,8,0,25,0,35,64,18,75,22,91,22,2,75,
16,91,16,2,25,0,12,13,13,0,19,6,0,47,205,47,51,1,47,205,47,205,49,48,0,93,
93,5,17,52,62,2,51,50,30,2,21,17,35,17,52,46,2,35,34,14,2,21,17,1,22,68,122,
167,98,99,169,123,70,103,53,95,130,78,78,130,94,52,2,2,0,116,192,138,76,76,
138,192,116,254,0,2,2,98,155,108,57,56,108,156,100,254,0,0,0,1,255,158,254,
78,2,148,5,227,0,35,2,3,64,30,10,34,26,34,42,34,3,5,16,21,16,37,16,3,9,3,
218,37,1,201,37,1,154,37,170,37,186,37,3,37,184,1,0,64,162,225,228,72,76,
37,1,0,47,37,63,37,2,9,37,1,220,37,64,211,217,72,37,64,205,209,72,134,37,
1,25,37,41,37,57,37,3,11,37,1,251,37,1,233,37,1,37,64,188,191,72,107,37,123,
37,139,37,3,93,37,1,75,37,1,41,37,57,37,2,27,37,1,9,37,1,249,37,1,37,128,
170,177,72,109,37,1,37,128,164,168,72,9,37,1,163,37,128,156,162,72,189,37,
1,121,37,153,37,169,37,3,75,37,91,37,107,37,3,37,192,140,147,72,155,37,171,
37,187,37,3,125,37,141,37,2,107,37,1,93,37,1,38,37,54,37,70,37,3,228,37,1,
214,37,1,180,37,196,37,2,6,37,1,112,37,184,255,192,64,110,119,122,72,37,64,
101,107,72,219,37,1,118,37,166,37,2,9,37,25,37,41,37,3,233,37,1,37,64,79,
82,72,37,128,74,78,72,25,37,41,37,2,11,37,1,251,37,1,217,37,233,37,2,171,
37,187,37,203,37,3,153,37,1,37,128,60,63,72,41,37,57,37,73,37,3,11,37,27,
37,2,55,233,37,249,37,2,187,37,203,37,219,37,3,141,37,157,37,173,37,3,123,
37,1,109,37,1,1,95,37,1,37,184,255,128,179,39,43,72,37,184,255,192,64,13,
34,38,72,144,37,160,37,2,2,16,37,1,37,184,255,192,64,46,28,31,72,223,37,1,
96,37,112,37,160,37,176,37,192,37,5,15,37,31,37,47,37,3,7,32,22,144,22,2,
22,22,31,70,12,47,4,159,4,2,4,4,32,12,1,12,184,255,192,64,15,16,19,72,12,
25,80,64,18,128,18,2,18,7,80,0,0,47,237,47,93,237,1,47,43,93,51,47,93,16,
237,50,47,93,94,93,93,93,43,113,95,113,43,43,114,95,114,114,114,114,114,94,
93,93,43,93,93,93,93,113,113,43,43,113,114,114,114,43,43,94,93,93,93,93,113,
113,113,113,113,43,114,114,114,43,94,93,43,93,43,93,113,113,113,113,113,113,
43,113,113,114,114,114,43,43,94,93,93,95,93,43,93,93,93,49,48,0,95,94,93,
93,19,34,38,39,53,30,1,51,50,62,2,53,3,52,62,2,51,50,22,23,21,46,1,35,34,
14,2,21,17,20,14,2,36,36,75,23,20,62,35,51,66,39,16,2,50,90,125,75,34,75,
22,18,61,36,51,66,39,16,50,89,124,254,78,11,8,147,8,16,37,64,84,48,4,188,
94,134,86,40,9,9,148,10,17,40,65,84,44,251,66,94,134,86,41,0,0,0,2,0,56,1,
80,4,44,3,244,0,33,0,67,1,31,64,26,36,16,12,16,72,2,16,12,16,72,65,24,11,
17,72,66,48,9,17,72,61,48,9,17,72,42,184,255,208,179,9,17,72,48,184,255,208,
64,19,9,17,72,31,24,9,17,72,32,48,9,17,72,26,48,9,17,72,13,184,255,232,179,
13,17,72,14,184,255,208,179,9,13,72,8,184,255,208,179,14,17,72,8,184,255,
208,64,41,9,12,72,63,16,28,48,28,80,28,3,0,28,16,28,64,28,96,28,128,28,160,
28,240,28,7,28,45,11,64,12,17,72,11,47,69,1,59,173,64,45,184,255,192,180,
35,60,72,45,34,184,255,192,179,23,28,72,34,184,255,192,64,27,16,20,72,34,
128,62,64,41,60,72,62,40,173,143,49,1,32,49,48,49,2,49,15,25,173,64,11,184,
255,192,180,39,60,72,11,0,184,255,192,179,23,28,72,0,184,255,192,64,29,16,
20,72,0,128,28,64,41,60,72,28,6,173,15,15,207,15,2,15,64,23,28,72,15,64,11,
19,72,15,0,47,43,43,93,237,196,43,26,221,43,43,196,43,26,237,16,220,93,93,
237,196,43,26,221,43,43,196,43,26,237,1,93,47,43,51,47,93,113,51,49,48,0,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,1,34,38,39,46,1,35,34,14,2,7,53,
62,1,51,50,30,2,23,30,3,51,50,54,55,21,14,3,3,34,38,39,46,1,35,34,14,2,7,
53,62,1,51,50,30,2,23,30,3,51,50,54,55,21,14,3,3,40,69,145,73,65,107,45,38,
65,60,56,29,50,132,81,40,80,77,75,37,21,50,51,51,23,69,123,52,32,59,61,68,
40,69,145,73,65,107,45,38,65,60,56,29,50,132,81,40,80,77,75,37,21,50,51,51,
23,69,123,52,32,59,61,68,2,246,43,26,22,23,12,22,33,21,144,37,47,13,21,27,
13,8,15,14,8,51,43,149,23,30,19,8,254,90,44,26,23,24,12,23,32,21,141,38,46,
13,20,26,13,8,15,14,8,50,42,147,23,32,19,8,0,1,0,65,0,55,4,36,5,16,0,19,0,
162,64,108,53,2,1,58,11,1,60,12,1,42,12,1,3,3,6,7,10,11,2,11,0,17,16,13,12,
1,12,12,11,1,2,4,9,19,100,14,116,14,2,80,14,1,2,48,14,1,0,14,16,14,32,14,
96,14,4,14,4,111,9,127,9,2,95,9,111,9,2,9,16,7,8,173,9,0,1,2,3,4,4,173,17,
6,31,5,47,5,95,5,111,5,223,5,5,5,10,11,12,13,4,80,9,208,9,2,15,9,1,9,0,47,
93,93,23,51,222,93,50,50,237,23,50,16,237,50,50,1,47,93,113,51,47,93,113,
95,113,113,51,18,23,57,16,135,192,192,192,192,16,135,192,192,192,192,49,48,
1,95,93,93,93,93,1,3,35,19,35,53,33,19,33,53,33,19,51,3,33,21,33,3,33,21,
1,192,152,145,151,237,1,55,190,254,11,2,61,154,143,152,1,21,254,162,191,2,
29,1,88,254,223,1,33,148,1,108,148,1,36,254,220,148,254,148,148,0,0,0,0,3,
0,100,0,244,4,71,4,80,0,3,0,7,0,11,0,49,64,27,11,7,2,8,4,0,8,173,9,9,1,5,
173,63,4,1,4,0,173,15,1,31,1,63,1,3,1,0,47,93,237,47,93,237,17,57,47,237,
1,47,51,51,47,51,51,49,48,19,53,33,21,1,53,33,21,1,53,33,21,100,3,227,252,
29,3,227,252,29,3,227,3,188,148,148,253,56,148,148,1,100,148,148,0,0,0,2,
0,63,0,0,4,36,4,207,0,6,0,10,0,123,185,0,5,255,216,64,17,18,22,72,3,40,18,
22,72,0,40,18,22,72,137,0,1,1,184,255,216,64,63,18,22,72,134,1,1,10,48,2,
80,2,2,0,2,16,2,32,2,64,2,96,2,128,2,160,2,7,2,7,7,0,64,12,15,72,0,8,173,
7,79,6,95,6,143,6,3,6,64,2,80,2,128,2,3,2,1,0,80,4,128,4,2,4,0,25,47,93,51,
51,205,93,205,93,24,47,237,1,47,43,51,47,47,93,113,51,49,48,0,93,43,93,43,
43,43,19,53,1,21,9,1,21,5,53,33,21,65,3,227,252,166,3,90,252,27,3,227,2,119,
205,1,139,154,254,168,254,168,153,236,145,145,0,0,2,0,65,0,0,4,36,4,207,0,
6,0,10,0,121,185,0,1,255,216,64,17,18,22,72,3,40,18,22,72,6,40,18,22,72,137,
6,1,5,184,255,216,64,62,18,22,72,134,5,1,9,48,6,80,6,2,0,6,16,6,32,6,64,6,
96,6,128,6,160,6,7,6,7,0,64,12,15,72,0,8,173,7,6,5,64,4,80,4,128,4,3,4,79,
0,95,0,143,0,3,0,80,2,128,2,2,2,0,25,47,93,205,93,205,93,51,51,24,47,237,
1,47,43,51,47,93,113,51,49,48,0,93,43,93,43,43,43,55,53,9,1,53,1,21,1,53,
33,21,65,3,90,252,166,3,227,252,29,3,227,236,153,1,88,1,88,154,254,117,205,
253,137,145,145,0,0,0,0,2,0,157,0,0,4,55,4,129,0,4,0,9,0,35,64,18,105,9,121,
9,2,105,7,121,7,2,6,4,5,0,2,8,5,0,0,47,205,47,205,1,47,205,221,205,49,48,
0,93,93,51,17,9,1,17,37,33,17,9,1,157,1,205,1,205,252,182,2,250,254,131,254,
131,2,123,2,6,253,250,253,133,82,2,6,1,170,254,86,0,0,0,0,1,0,100,0,180,4,
71,2,242,0,5,0,19,183,5,170,0,2,0,4,173,1,0,47,237,47,1,47,47,237,49,48,55,
17,33,21,33,17,100,3,227,252,174,180,2,62,146,254,84,0,0,0,1,2,34,253,154,
3,210,6,170,0,23,0,29,182,4,32,8,11,72,9,0,184,1,0,180,1,19,12,6,1,0,47,47,
205,205,1,47,237,204,49,48,43,1,35,17,52,55,54,51,50,22,21,20,6,35,34,39,
46,1,39,38,35,34,7,6,21,2,181,147,84,82,128,63,75,51,37,30,13,8,26,20,33,
16,36,9,6,253,154,7,86,196,123,123,63,48,40,52,10,4,24,22,39,39,35,105,0,
0,0,1,1,5,253,154,2,181,6,170,0,28,0,32,185,0,4,255,224,180,8,11,72,12,2,
184,1,0,180,28,24,17,7,0,0,47,47,205,205,1,47,253,204,49,48,43,1,51,17,20,
7,14,1,35,34,46,2,53,52,62,2,51,50,23,30,1,23,22,51,50,55,54,53,2,34,147,
90,40,103,62,30,50,37,20,14,23,31,18,33,26,5,21,15,31,16,37,8,7,6,170,248,
168,205,125,56,54,16,29,39,24,20,34,24,14,16,2,23,20,37,41,31,106,0,0,0,1,
255,246,2,37,5,181,2,182,0,3,0,22,180,3,5,0,4,0,184,1,2,177,1,252,0,63,237,
17,1,51,17,51,49,48,3,53,33,21,10,5,191,2,37,145,145,0,0,1,1,216,253,147,
2,105,7,72,0,3,0,24,187,0,2,1,0,0,3,1,6,180,4,3,254,0,250,0,63,63,1,16,246,
237,49,48,1,51,17,35,1,216,145,145,7,72,246,75,0,0,0,1,2,141,253,147,5,181,
2,182,0,5,0,34,178,2,7,3,186,1,0,0,0,1,6,179,6,5,254,3,184,1,2,177,0,252,
0,63,237,63,1,16,246,237,17,51,49,48,1,33,21,33,17,35,2,141,3,40,253,105,
145,2,182,145,251,110,0,0,0,1,255,246,253,147,3,30,2,182,0,5,0,34,187,0,2,
1,0,0,5,1,6,181,6,0,6,4,254,5,184,1,2,177,2,252,0,63,237,63,17,1,51,16,246,
237,49,48,3,53,33,17,35,17,10,3,40,145,2,37,145,250,221,4,146,0,0,0,0,1,2,
141,2,37,5,181,7,72,0,5,0,34,178,4,7,2,189,1,0,0,5,1,6,0,6,0,5,1,2,179,2,
252,0,250,0,63,63,237,1,16,246,237,17,51,49,48,1,51,17,33,21,33,2,141,145,
2,151,252,216,7,72,251,110,145,0,0,0,1,255,246,2,37,3,30,7,72,0,5,0,34,187,
0,5,1,0,0,2,1,6,181,6,0,6,3,250,5,184,1,2,177,2,252,0,63,237,63,17,1,51,16,
244,237,49,48,3,53,33,17,51,17,10,2,151,145,2,37,145,4,146,250,221,0,0,0,
0,1,2,141,253,147,5,181,7,72,0,7,0,39,179,4,9,5,1,186,1,0,0,0,1,6,179,8,7,
254,5,184,1,2,179,2,252,0,250,0,63,63,237,63,1,16,246,237,50,17,51,49,48,
1,51,17,33,21,33,17,35,2,141,145,2,151,253,105,145,7,72,251,110,145,251,110,
0,1,255,246,253,147,3,30,7,72,0,7,0,39,177,7,4,186,1,0,0,2,1,6,183,8,0,8,
6,254,3,250,7,184,1,2,177,2,252,0,63,237,63,63,17,1,51,16,244,237,51,49,48,
3,53,33,17,51,17,35,17,10,2,151,145,145,2,37,145,4,146,246,75,4,146,0,0,1,
255,246,253,147,5,181,2,182,0,7,0,40,178,3,9,4,186,1,0,0,7,1,6,182,8,0,8,
6,254,4,0,184,1,2,177,1,252,0,63,237,50,63,17,1,51,16,246,237,17,51,49,48,
3,53,33,21,33,17,35,17,10,5,191,253,105,145,2,37,145,145,251,110,4,146,0,
1,255,246,2,37,5,181,7,72,0,7,0,40,178,7,9,5,186,1,0,0,2,1,6,182,8,0,8,3,
250,5,0,184,1,2,177,1,252,0,63,237,51,63,17,1,51,16,244,237,17,51,49,48,3,
53,33,17,51,17,33,21,10,2,151,145,2,151,2,37,145,4,146,251,110,145,0,1,255,
246,253,147,5,181,7,72,0,11,0,51,179,7,13,5,8,187,1,0,0,2,0,11,1,6,64,9,12,
0,12,10,254,3,250,8,11,184,1,2,178,5,2,252,0,63,51,237,50,63,63,17,1,51,16,
246,50,237,50,17,51,49,48,3,53,33,17,51,17,33,21,33,17,35,17,10,2,151,145,
2,151,253,105,145,2,37,145,4,146,251,110,145,251,110,4,146,0,0,0,2,255,246,
1,113,5,181,3,106,0,3,0,7,0,37,183,3,7,7,9,0,4,8,4,184,1,2,178,5,253,0,184,
1,2,177,1,251,0,63,237,63,237,17,1,51,50,17,51,17,51,49,48,3,53,33,21,1,53,
33,21,10,5,191,250,65,5,191,2,217,145,145,254,152,145,145,0,2,1,217,253,147,
3,210,7,72,0,3,0,7,0,42,65,9,0,5,1,0,0,4,1,7,0,8,0,1,1,0,0,0,1,4,182,8,7,
3,254,4,0,250,0,63,50,63,51,1,16,246,237,16,244,237,49,48,1,51,17,35,1,51,
17,35,1,217,145,145,1,104,145,145,7,72,246,75,9,181,246,75,0,0,0,1,2,141,
253,147,5,181,3,106,0,9,0,49,181,2,6,6,11,7,3,186,1,0,0,0,1,6,179,10,9,254,
7,184,1,2,178,4,253,3,184,1,2,177,0,251,0,63,237,63,237,63,1,16,246,237,50,
17,51,17,51,49,48,1,33,21,33,21,33,21,33,17,35,2,141,3,40,253,105,2,151,253,
105,145,3,106,145,215,145,252,34,0,0,1,1,217,253,147,5,181,2,182,0,9,0,51,
178,1,11,6,191,1,0,0,9,1,4,0,10,0,2,1,0,0,5,1,7,178,10,2,6,184,1,2,180,9,
252,4,8,254,0,63,51,63,237,50,1,16,244,237,16,246,237,17,51,49,48,1,21,33,
17,35,17,35,17,35,17,5,181,254,29,145,215,145,2,182,145,251,110,4,146,251,
110,5,35,0,0,0,0,2,1,217,253,147,5,181,3,106,0,5,0,11,0,63,180,2,8,8,13,9,
65,11,1,0,0,6,1,7,0,12,0,3,1,0,0,0,1,4,0,12,0,9,1,2,181,6,253,11,5,254,3,
184,1,2,177,0,251,0,63,237,63,51,63,237,1,16,246,237,16,244,237,17,51,17,
51,49,48,1,33,21,33,17,35,1,33,21,33,17,35,1,217,3,220,252,181,145,1,104,
2,116,254,29,145,3,106,145,250,186,4,111,145,252,34,0,0,1,255,246,253,147,
3,30,3,106,0,9,0,49,177,9,6,186,1,0,0,3,1,6,183,10,4,0,0,10,8,254,3,184,1,
2,178,6,251,9,184,1,2,177,2,253,0,63,237,63,237,63,17,1,51,17,51,16,244,237,
51,49,48,3,53,33,53,33,53,33,17,35,17,10,2,151,253,105,3,40,145,1,113,145,
215,145,250,41,3,222,0,0,0,1,255,246,253,147,3,210,2,182,0,9,0,52,65,9,0,
6,1,0,0,9,1,4,0,10,0,2,1,0,0,5,1,7,183,10,0,10,4,8,254,6,0,184,1,2,177,1,
252,0,63,237,50,63,51,17,1,51,16,244,237,16,246,237,49,48,3,53,33,17,35,17,
35,17,35,17,10,3,220,145,215,145,2,37,145,250,221,4,146,251,110,4,146,0,0,
0,0,2,255,246,253,147,3,210,3,106,0,5,0,11,0,63,180,4,9,9,12,11,65,11,1,0,
0,8,1,4,0,12,0,0,1,0,0,3,1,7,0,12,0,9,1,2,181,10,253,2,7,254,4,184,1,2,177,
5,251,0,63,237,63,51,63,237,1,16,244,237,16,246,237,17,51,17,51,49,48,1,17,
35,17,33,53,1,35,17,33,53,33,3,210,145,252,181,2,116,145,254,29,2,116,3,106,
250,41,5,70,145,250,41,3,222,145,0,0,1,2,141,1,113,5,181,7,72,0,9,0,49,181,
4,8,8,11,2,6,189,1,0,0,9,1,6,0,10,0,9,1,2,178,6,253,5,184,1,2,179,2,251,0,
250,0,63,63,237,63,237,1,16,246,237,50,17,51,17,51,49,48,1,51,17,33,21,33,
21,33,21,33,2,141,145,2,151,253,105,2,151,252,216,7,72,252,34,145,215,145,
0,0,1,1,217,2,37,5,181,7,72,0,9,0,52,178,4,11,2,65,11,1,0,0,9,1,7,0,10,0,
8,1,0,0,5,1,4,0,10,0,5,1,2,181,2,8,252,0,6,250,0,63,51,63,51,237,1,16,246,
237,16,244,237,17,51,49,48,1,51,17,33,21,33,17,51,17,51,3,65,145,1,227,252,
36,145,215,7,72,251,110,145,5,35,251,110,0,0,0,2,1,217,1,113,5,181,7,72,0,
5,0,11,0,63,180,10,4,4,13,8,65,11,1,0,0,11,1,7,0,12,0,2,1,0,0,5,1,4,0,12,
0,11,1,2,178,8,251,5,184,1,2,180,2,253,6,0,250,0,63,50,63,237,63,237,1,16,
246,237,16,244,237,17,51,17,51,49,48,1,51,17,33,21,33,1,51,17,33,21,33,1,
217,145,3,75,252,36,1,104,145,1,227,253,140,7,72,250,186,145,5,215,252,34,
145,0,0,1,255,246,1,113,3,30,7,72,0,9,0,50,188,0,9,1,0,0,6,0,2,1,6,183,10,
4,0,0,10,7,250,3,184,1,2,178,6,251,9,184,1,2,177,2,253,0,63,237,63,237,63,
17,1,51,17,51,16,244,50,237,49,48,3,53,33,53,33,53,33,17,51,17,10,2,151,253,
105,2,151,145,1,113,145,215,145,3,222,250,41,0,0,1,255,246,2,37,3,210,7,72,
0,9,0,52,65,9,0,0,1,0,0,7,1,7,0,10,0,6,1,0,0,3,1,4,183,10,1,10,8,4,250,6,
1,184,1,2,177,2,252,0,63,237,51,63,51,17,1,51,16,244,237,16,244,237,49,48,
1,33,53,33,17,51,17,51,17,51,3,210,252,36,1,227,145,215,145,2,37,145,4,146,
251,110,4,146,0,0,0,2,255,246,1,113,3,210,7,72,0,5,0,11,0,63,65,9,0,8,1,0,
0,11,1,4,0,12,0,0,1,0,0,3,1,7,181,12,9,1,1,12,9,184,1,2,181,10,251,4,6,250,
1,184,1,2,177,2,253,0,63,237,63,51,63,237,17,1,51,17,51,16,244,237,16,244,
237,49,48,1,33,53,33,17,51,33,51,17,33,53,33,3,210,252,36,3,75,145,254,7,
145,253,140,1,227,1,113,145,5,70,251,145,145,0,0,0,0,1,2,141,253,147,5,181,
7,72,0,11,0,54,182,4,8,8,13,6,2,10,186,1,0,0,11,1,6,179,12,11,254,9,184,1,
2,178,6,253,5,184,1,2,179,2,251,0,250,0,63,63,237,63,237,63,1,16,246,237,
50,50,17,51,17,51,49,48,1,51,17,33,21,33,21,33,21,33,17,35,2,141,145,2,151,
253,105,2,151,253,105,145,7,72,252,34,145,215,145,252,34,0,0,0,0,2,1,217,
253,147,5,181,7,72,0,7,0,11,0,56,178,4,13,10,186,1,0,0,11,1,4,178,12,2,6,
186,1,0,0,7,1,7,183,12,7,11,254,0,8,250,5,184,1,2,177,2,252,0,63,237,63,51,
63,51,1,16,244,237,50,16,246,237,17,51,49,48,1,51,17,33,21,33,17,35,1,51,
17,35,3,65,145,1,227,254,29,145,254,152,145,145,7,72,251,110,145,251,110,
9,181,246,75,0,0,3,1,217,253,147,5,181,7,72,0,3,0,9,0,15,0,73,181,14,6,6,
17,12,8,65,12,1,0,0,15,0,9,1,7,0,16,0,0,1,0,0,1,1,4,0,16,0,15,1,2,178,12,
251,7,184,1,2,183,4,253,10,2,250,9,1,254,0,63,51,63,51,63,237,63,237,1,16,
246,237,16,244,50,237,50,17,51,17,51,49,48,1,35,17,51,19,33,21,33,17,35,17,
51,17,33,21,33,2,106,145,145,215,2,116,254,29,145,145,1,227,253,140,253,147,
9,181,250,186,145,252,34,9,181,252,34,145,0,1,255,246,253,147,3,30,7,72,0,
11,0,56,185,0,9,1,0,178,6,2,10,184,1,6,64,10,12,4,0,0,12,10,254,7,250,3,184,
1,2,178,6,251,11,184,1,2,177,2,253,0,63,237,63,237,63,63,17,1,51,17,51,16,
246,50,50,237,49,48,3,53,33,53,33,53,33,17,51,17,35,17,10,2,151,253,105,2,
151,145,145,1,113,145,215,145,3,222,246,75,3,222,0,0,0,2,255,246,253,147,
3,210,7,72,0,7,0,11,0,59,65,10,0,10,1,0,0,11,1,7,0,12,0,5,1,0,0,2,0,6,1,4,
64,10,12,0,12,11,6,254,8,3,250,7,184,1,2,177,2,252,0,63,237,63,51,63,51,17,
1,51,16,246,50,237,16,244,237,49,48,3,53,33,17,51,17,35,17,1,51,17,35,10,
1,227,145,145,1,104,145,145,2,37,145,4,146,246,75,4,146,5,35,246,75,0,0,0,
0,3,255,246,253,147,3,210,7,72,0,3,0,9,0,15,0,73,181,7,13,13,16,6,10,65,12,
1,0,0,9,0,11,1,4,0,16,0,2,1,0,0,3,1,7,0,16,0,12,1,2,181,15,253,3,11,254,6,
184,1,2,180,9,251,0,4,250,0,63,51,63,237,63,51,63,237,1,16,244,237,16,246,
50,237,50,17,51,17,51,49,48,1,51,17,35,1,51,17,33,53,33,19,35,17,33,53,33,
3,65,145,145,254,152,145,253,140,1,227,145,145,254,29,2,116,7,72,246,75,9,
181,251,145,145,250,41,3,222,145,0,0,0,2,255,246,253,147,5,181,3,106,0,7,
0,11,0,57,180,11,3,3,13,4,186,1,0,0,7,1,6,181,12,8,0,0,12,8,184,1,2,181,9,
251,6,254,4,0,184,1,2,177,1,253,0,63,237,50,63,63,237,17,1,51,17,51,16,246,
237,17,51,17,51,49,48,3,53,33,21,33,17,35,17,1,53,33,21,10,5,191,253,105,
145,253,105,5,191,1,113,145,145,252,34,3,222,1,104,145,145,0,0,1,255,246,
253,147,5,181,2,182,0,11,0,58,178,3,13,8,191,1,0,0,11,1,4,0,12,0,4,1,0,0,
7,1,7,64,9,12,0,12,6,10,254,8,4,0,184,1,2,177,1,252,0,63,237,50,50,63,51,
17,1,51,16,244,237,16,246,237,17,51,49,48,3,53,33,21,33,17,35,17,35,17,35,
17,10,5,191,254,29,145,215,145,2,37,145,145,251,110,4,146,251,110,4,146,0,
3,255,246,253,147,5,181,3,106,0,5,0,11,0,15,0,74,180,13,8,8,17,9,186,1,0,
0,6,1,7,181,16,14,3,3,16,5,189,1,0,0,2,1,4,0,16,0,14,1,2,179,15,251,9,3,184,
1,2,181,6,4,253,11,1,254,0,63,51,63,51,237,50,63,237,1,16,246,237,17,51,17,
51,16,244,237,17,51,17,51,49,48,1,35,17,33,53,33,51,33,21,33,17,35,1,21,33,
53,2,106,145,254,29,2,116,215,2,116,254,29,145,2,116,250,65,253,147,3,222,
145,145,252,34,5,215,145,145,0,0,0,0,2,255,246,1,113,5,181,7,72,0,7,0,11,
0,58,64,9,7,11,11,13,0,8,8,12,5,189,1,0,0,2,1,6,0,12,0,8,1,2,181,9,253,3,
250,5,0,184,1,2,177,1,251,0,63,237,51,63,63,237,1,16,244,237,17,51,17,51,
17,51,17,51,49,48,3,53,33,17,51,17,33,21,1,53,33,21,10,2,151,145,2,151,250,
65,5,191,2,217,145,3,222,252,34,145,254,152,145,145,0,1,255,246,2,37,5,181,
7,72,0,11,0,58,178,11,13,9,191,1,0,0,6,1,7,0,12,0,5,1,0,0,2,1,4,64,9,12,0,
12,7,3,250,9,5,0,184,1,2,177,1,252,0,63,237,51,51,63,51,17,1,51,16,244,237,
16,244,237,17,51,49,48,3,53,33,17,51,17,51,17,51,17,33,21,10,1,227,145,215,
145,1,227,2,37,145,4,146,251,110,4,146,251,110,145,0,3,255,246,1,113,5,181,
7,72,0,5,0,11,0,15,0,76,64,9,4,15,15,17,9,12,12,16,8,65,11,1,0,0,11,1,4,0,
16,0,2,1,0,0,5,1,7,0,16,0,12,1,2,179,13,253,5,9,184,1,2,181,2,10,251,0,6,
250,0,63,51,63,51,237,50,63,237,1,16,244,237,16,244,237,17,51,17,51,17,51,
17,51,49,48,1,51,17,33,21,33,1,51,17,33,53,33,1,53,33,21,3,65,145,1,227,253,
140,254,152,145,253,140,1,227,254,29,5,191,7,72,252,34,145,4,111,251,145,
145,254,7,145,145,0,0,0,1,255,246,253,147,5,181,7,72,0,19,0,76,182,11,15,
15,21,13,9,16,184,1,0,178,6,2,19,184,1,6,64,11,20,4,0,0,20,18,254,7,250,12,
4,184,1,2,180,9,5,251,16,0,184,1,2,178,13,1,253,0,63,51,237,50,63,51,237,
50,63,63,17,1,51,17,51,16,246,50,50,237,50,50,17,51,17,51,49,48,3,53,33,53,
33,53,33,17,51,17,33,21,33,21,33,21,33,17,35,17,10,2,151,253,105,2,151,145,
2,151,253,105,2,151,253,105,145,1,113,145,215,145,3,222,252,34,145,215,145,
252,34,3,222,0,0,1,255,246,253,147,5,181,7,72,0,19,0,77,179,4,21,18,9,187,
1,0,0,15,0,12,1,4,178,20,2,5,187,1,0,0,19,0,8,1,7,64,9,20,13,20,0,16,250,
9,5,13,184,1,2,182,18,2,14,252,7,11,254,0,63,51,63,51,51,237,50,50,63,51,
17,1,51,16,244,50,237,50,16,246,50,237,50,17,51,49,48,1,51,17,33,21,33,17,
35,17,35,17,35,17,33,53,33,17,51,17,51,3,65,145,1,227,254,29,145,215,145,
254,29,1,227,145,215,7,72,251,110,145,251,110,4,146,251,110,4,146,145,4,146,
251,110,0,0,0,0,4,255,246,253,147,5,181,7,72,0,5,0,11,0,17,0,23,0,93,181,
4,14,14,25,2,15,187,1,0,0,5,0,12,1,7,182,24,21,9,9,24,20,11,187,1,0,0,23,
0,8,1,4,178,24,5,21,184,1,2,183,2,22,251,0,18,250,15,9,184,1,2,181,12,10,
253,17,7,254,0,63,51,63,51,237,50,63,51,63,51,237,50,1,16,246,50,237,50,17,
51,17,51,16,244,50,237,50,17,51,17,51,49,48,1,51,17,33,21,33,3,35,17,33,53,
33,51,33,21,33,17,35,1,51,17,33,53,33,3,65,145,1,227,253,140,215,145,254,
29,2,116,215,2,116,254,29,145,254,152,145,253,140,1,227,7,72,252,34,145,250,
186,3,222,145,145,252,34,9,181,251,145,145,0,0,0,0,1,0,0,2,109,5,171,7,72,
0,3,0,18,182,0,5,1,4,2,250,1,0,47,63,17,1,51,17,51,49,48,1,33,17,33,5,171,
250,85,5,171,2,109,4,219,0,0,0,1,0,0,253,147,5,171,2,109,0,3,0,18,182,0,5,
1,4,2,1,254,0,63,47,17,1,51,17,51,49,48,1,33,17,33,5,171,250,85,5,171,253,
147,4,218,0,0,0,1,0,0,253,147,5,171,7,72,0,3,0,19,183,0,5,1,4,2,250,1,254,
0,63,63,17,1,51,17,51,49,48,1,33,17,33,5,171,250,85,5,171,253,147,9,181,0,
0,1,0,0,253,147,2,214,7,72,0,3,0,17,182,1,4,0,2,250,1,254,0,63,63,1,47,17,
51,49,48,1,33,17,33,2,214,253,42,2,214,253,147,9,181,0,0,0,0,1,2,213,253,
147,5,171,7,72,0,3,0,17,182,0,5,1,2,250,1,254,0,63,63,1,47,17,51,49,48,1,
33,17,33,5,171,253,42,2,214,253,147,9,181,0,0,0,0,42,0,103,253,245,5,171,
6,163,0,3,0,7,0,11,0,15,0,19,0,23,0,27,0,31,0,35,0,39,0,43,0,47,0,51,0,55,
0,59,0,63,0,67,0,71,0,75,0,79,0,83,0,87,0,91,0,95,0,99,0,103,0,107,0,111,
0,115,0,119,0,123,0,127,0,131,0,135,0,139,0,143,0,147,0,151,0,155,0,159,0,
163,0,167,2,49,181,161,157,153,149,145,165,184,1,1,182,164,109,85,69,45,13,
121,184,1,1,64,13,120,108,84,68,44,12,120,101,77,53,29,5,137,184,1,1,64,13,
136,100,76,52,28,4,136,113,89,65,41,17,125,184,1,1,64,13,124,112,88,64,40,
16,124,97,81,57,25,9,141,184,1,1,64,13,140,96,80,56,24,8,140,117,93,61,37,
21,129,184,1,1,64,33,128,116,92,60,36,20,128,120,136,124,140,128,128,140,
124,136,120,5,132,160,156,152,148,144,164,164,169,105,73,49,33,1,133,184,
1,1,64,15,104,72,48,32,0,10,132,1,8,3,132,167,143,139,135,184,1,3,180,132,
163,103,99,107,184,1,3,183,104,160,100,96,104,95,91,87,184,1,3,183,84,92,
88,84,159,83,79,75,184,1,3,183,72,156,80,76,72,67,63,71,184,1,3,183,68,64,
60,68,155,59,55,51,184,1,3,183,48,152,56,52,48,43,39,47,184,1,3,183,44,40,
36,44,151,31,27,35,184,1,3,183,32,148,28,24,32,23,19,15,184,1,3,183,12,20,
16,12,147,11,7,3,184,1,3,183,0,144,8,4,0,131,127,123,184,1,3,64,60,120,128,
124,120,22,84,1,27,72,1,25,68,1,27,48,1,27,44,1,20,32,1,104,84,72,68,48,44,
32,12,0,120,120,0,12,32,44,48,68,72,84,104,10,108,164,140,136,27,132,59,132,
2,15,132,1,2,132,119,115,111,184,1,3,178,116,112,108,0,47,51,51,237,50,50,
47,95,93,93,51,51,51,18,23,57,47,47,47,47,47,47,47,47,47,47,93,93,93,93,93,
93,17,51,51,16,237,50,50,17,51,51,51,16,237,50,50,50,17,51,51,16,237,50,50,
17,51,51,51,16,237,50,50,50,17,51,51,16,237,50,50,17,51,51,51,16,237,50,50,
50,17,51,51,16,237,50,50,17,51,51,51,16,237,50,50,50,17,51,51,16,237,50,50,
17,51,51,51,16,237,50,50,50,16,237,50,50,50,1,47,95,94,93,51,51,51,51,51,
237,50,50,50,50,50,17,51,47,51,51,51,51,51,18,23,57,47,47,47,47,47,17,51,
51,51,51,51,16,237,50,50,50,50,50,17,51,51,51,51,51,16,237,50,50,50,50,50,
17,51,51,51,51,51,16,237,50,50,50,50,50,17,51,51,51,51,51,16,237,50,50,50,
50,50,17,51,51,51,51,51,16,237,50,50,50,50,50,16,237,50,50,50,50,50,49,48,
19,51,21,35,37,51,21,35,37,51,21,35,5,51,21,35,37,51,21,35,37,51,21,35,7,
51,21,35,37,51,21,35,37,51,21,35,5,51,21,35,37,51,21,35,37,51,21,35,7,51,
21,35,37,51,21,35,37,51,21,35,23,51,21,35,37,51,21,35,37,51,21,35,7,51,21,
35,37,51,21,35,37,51,21,35,5,51,21,35,37,51,21,35,37,51,21,35,7,51,21,35,
37,51,21,35,37,51,21,35,23,51,21,35,37,51,21,35,37,51,21,35,1,51,21,35,37,
51,21,35,37,51,21,35,1,51,21,35,37,51,21,35,37,51,21,35,1,51,21,35,17,51,
21,35,17,51,21,35,17,51,21,35,17,51,21,35,17,51,21,35,103,104,104,1,158,104,
104,1,160,103,103,253,145,104,104,1,159,104,104,1,159,104,104,207,103,103,
254,96,104,104,254,98,104,104,4,13,104,104,254,97,104,104,254,97,104,104,
207,104,104,1,158,104,104,1,160,103,103,207,104,104,254,97,104,104,254,97,
104,104,207,104,104,1,158,104,104,1,160,103,103,253,145,104,104,1,159,104,
104,1,159,104,104,207,103,103,254,96,104,104,254,98,104,104,207,104,104,1,
159,104,104,1,159,104,104,252,194,104,104,1,159,104,104,1,159,104,104,251,
243,104,104,1,158,104,104,1,160,103,103,1,158,104,104,104,104,104,104,104,
104,104,104,104,104,5,34,98,98,98,98,98,97,96,96,96,96,96,96,96,96,96,96,
96,99,96,96,96,96,96,96,96,96,96,96,96,99,96,96,96,96,96,96,97,97,97,97,97,
98,94,94,94,94,94,98,97,97,97,97,97,96,96,96,96,96,96,7,237,98,98,98,98,98,
1,35,96,96,96,96,96,254,223,98,254,223,96,254,221,96,254,221,97,254,222,97,
7,238,96,0,0,0,0,84,0,0,253,245,5,171,6,163,0,3,0,7,0,11,0,15,0,19,0,23,0,
27,0,31,0,35,0,39,0,43,0,47,0,51,0,55,0,59,0,63,0,67,0,71,0,75,0,79,0,83,
0,87,0,91,0,95,0,99,0,103,0,107,0,111,0,115,0,119,0,123,0,127,0,131,0,135,
0,139,0,143,0,147,0,151,0,155,0,159,0,163,0,167,0,171,0,175,0,179,0,183,0,
187,0,191,0,195,0,199,0,203,0,207,0,211,0,215,0,219,0,223,0,227,0,231,0,235,
0,239,0,243,0,247,0,251,0,255,1,3,1,7,1,11,1,15,1,19,1,23,1,27,1,31,1,35,
1,39,1,43,1,47,1,51,1,55,1,59,1,63,1,67,1,71,1,75,1,79,0,0,19,51,21,35,55,
51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,55,51,
21,35,55,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,55,51,21,
35,55,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,55,51,21,35,
55,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,55,51,21,35,55,
51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,37,51,21,35,55,51,
21,35,55,51,21,35,55,51,21,35,37,51,21,35,5,51,21,35,39,51,21,35,39,51,21,
35,39,51,21,35,39,51,21,35,39,51,21,35,7,51,21,35,55,51,21,35,55,51,21,35,
55,51,21,35,55,51,21,35,55,51,21,35,23,51,21,35,39,51,21,35,39,51,21,35,39,
51,21,35,39,51,21,35,39,51,21,35,7,51,21,35,55,51,21,35,55,51,21,35,55,51,
21,35,55,51,21,35,55,51,21,35,1,51,21,35,55,51,21,35,55,51,21,35,55,51,21,
35,55,51,21,35,55,51,21,35,1,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,
55,51,21,35,55,51,21,35,19,51,21,35,7,51,21,35,23,51,21,35,7,51,21,35,23,
51,21,35,7,51,21,35,23,51,21,35,7,51,21,35,23,51,21,35,7,51,21,35,17,51,21,
35,19,51,21,35,103,104,104,207,104,104,207,104,104,208,104,104,208,104,104,
207,104,104,251,140,103,103,207,103,103,207,103,103,207,104,104,208,104,104,
208,103,103,252,90,104,104,207,104,104,207,104,104,208,104,104,208,104,104,
207,104,104,251,140,103,103,207,103,103,207,103,103,207,104,104,208,104,104,
208,103,103,252,90,104,104,207,104,104,207,104,104,208,104,104,208,104,104,
207,104,104,251,140,103,103,1,158,103,103,207,104,104,208,104,104,208,103,
103,252,194,103,103,3,165,104,104,207,104,104,208,104,104,208,104,104,207,
104,104,207,104,104,103,103,103,207,103,103,207,103,103,207,104,104,208,104,
104,208,103,103,103,104,104,207,104,104,208,104,104,208,104,104,207,104,104,
207,104,104,103,103,103,207,103,103,207,103,103,207,104,104,208,104,104,208,
103,103,251,243,103,103,207,103,103,207,103,103,207,104,104,208,104,104,208,
103,103,252,90,104,104,207,104,104,207,104,104,208,104,104,208,104,104,207,
104,104,207,104,104,103,103,103,103,104,104,103,103,103,103,104,104,103,103,
103,103,104,104,103,103,103,103,104,104,103,103,103,103,103,103,104,104,5,
34,98,98,98,98,98,98,98,98,98,98,98,97,96,96,96,96,96,96,96,96,96,96,96,96,
96,96,96,96,96,96,96,96,96,96,96,99,96,96,96,96,96,96,96,96,96,96,96,96,96,
96,96,96,96,96,96,96,96,96,96,99,96,96,96,96,96,96,96,96,96,96,96,96,97,97,
97,97,97,97,97,97,97,97,97,98,94,94,94,94,94,94,94,94,94,94,94,98,97,97,97,
97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96,96,96,96,7,237,98,98,98,
98,98,98,98,98,98,98,98,1,35,96,96,96,96,96,96,96,96,96,96,96,254,223,98,
97,96,96,96,99,96,96,96,99,96,96,97,98,94,98,97,96,96,7,237,98,1,35,96,0,
0,67,0,0,253,147,5,213,6,163,0,73,0,77,0,81,0,85,0,89,0,93,0,97,0,101,0,105,
0,109,0,113,0,117,0,121,0,125,0,129,0,133,0,137,0,141,0,145,0,149,0,153,0,
157,0,161,0,165,0,169,0,173,0,177,0,181,0,185,0,189,0,193,0,197,0,201,0,205,
0,209,0,213,0,217,0,221,0,225,0,229,0,233,0,237,0,241,0,245,0,249,0,253,1,
1,1,5,1,9,1,13,1,17,1,21,1,25,1,29,1,33,1,37,1,41,1,45,1,49,1,53,1,57,1,61,
1,65,1,69,1,73,1,77,1,81,0,0,1,33,17,51,53,35,17,51,53,35,17,51,53,35,17,
51,53,35,17,51,53,35,17,51,53,51,21,51,53,51,21,51,53,51,21,51,53,51,21,51,
53,51,21,51,53,51,21,51,53,51,21,35,21,51,17,35,21,51,17,35,21,51,17,35,21,
51,17,35,21,51,17,35,21,51,1,21,51,53,51,21,51,53,51,21,51,53,51,21,51,53,
23,35,21,51,39,35,21,51,39,35,21,51,39,35,21,51,7,21,51,53,51,21,51,53,51,
21,51,53,51,21,51,53,5,35,21,51,55,21,51,53,51,21,51,53,51,21,51,53,5,21,
51,53,33,21,51,53,7,53,35,21,37,21,51,53,19,53,35,21,35,53,35,21,35,53,35,
21,35,53,35,21,7,21,51,53,51,21,51,53,51,21,51,53,51,21,51,53,19,53,35,21,
35,53,35,21,35,53,35,21,35,53,35,21,7,21,51,53,51,21,51,53,51,21,51,53,51,
21,51,53,19,35,21,51,39,35,21,51,39,35,21,51,39,35,21,51,1,35,21,51,39,35,
21,51,39,35,21,51,39,35,21,51,1,21,51,53,51,21,51,53,23,35,21,51,39,35,21,
51,7,21,51,53,51,21,51,53,7,35,21,51,55,21,51,53,5,21,51,53,23,53,35,21,23,
53,35,21,35,53,35,21,7,21,51,53,51,21,51,53,19,53,35,21,35,53,35,21,7,21,
51,53,51,21,51,53,19,35,21,51,39,35,21,51,19,35,21,51,39,35,21,51,5,213,250,
43,106,106,106,106,106,106,106,106,106,106,106,107,106,107,106,107,107,107,
107,107,106,107,106,107,107,107,107,107,107,107,107,107,107,107,107,107,250,
149,107,106,107,106,107,107,107,107,107,107,214,107,107,214,106,106,213,106,
106,213,107,106,107,106,107,107,107,253,234,106,106,107,106,107,107,107,107,
252,170,107,1,63,107,213,107,1,171,107,107,107,107,107,107,106,107,106,107,
107,106,107,106,107,107,107,107,107,107,107,107,106,107,106,107,107,106,107,
106,107,107,107,107,107,107,214,107,107,214,106,106,213,106,106,2,22,107,
107,214,107,107,213,107,107,213,107,107,2,235,107,106,107,106,106,106,213,
106,106,213,107,106,107,107,106,106,107,106,254,86,107,213,107,213,106,107,
106,107,107,106,107,106,106,107,106,107,107,106,107,106,106,106,213,106,106,
107,107,107,213,107,107,253,147,1,34,97,1,34,97,1,35,96,1,33,98,1,33,98,1,
33,96,96,96,96,96,96,96,96,96,96,96,96,96,193,98,254,223,96,254,221,96,254,
221,96,254,221,94,254,221,96,6,106,96,96,96,96,96,96,96,96,192,98,98,98,98,
98,98,98,97,96,96,96,96,96,96,96,96,192,96,96,96,96,96,96,96,96,195,96,96,
96,96,96,96,96,96,96,96,254,223,97,97,97,97,97,97,97,97,98,94,94,94,94,94,
94,94,94,254,223,97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96,6,205,
98,98,98,98,98,98,98,1,34,98,98,98,98,98,98,98,254,223,96,96,96,96,192,98,
98,98,97,96,96,96,96,192,96,96,96,96,195,96,96,96,96,96,193,97,97,97,97,98,
94,94,94,94,254,223,97,97,97,97,96,96,96,96,96,6,205,98,98,98,1,34,98,98,
98,0,0,0,0,1,0,123,0,117,4,90,4,84,0,3,0,0,19,33,17,33,123,3,223,252,33,4,
84,252,33,0,0,2,0,6,0,0,4,207,4,201,0,3,0,7,0,21,183,7,1,4,0,4,0,5,3,0,47,
205,221,205,1,47,205,221,205,49,48,19,33,17,33,19,17,33,17,6,4,201,251,55,
76,4,49,4,201,251,55,4,125,251,207,4,49,0,0,1,0,109,1,127,2,105,3,123,0,3,
0,26,64,13,3,48,2,1,15,2,31,2,2,8,2,1,2,0,47,205,1,47,94,93,93,205,49,48,
1,33,17,33,2,105,254,4,1,252,1,127,1,252,0,0,0,2,0,109,1,127,2,105,3,123,
0,3,0,7,0,34,64,17,5,3,6,48,2,1,15,2,31,2,2,8,2,7,1,6,2,0,47,205,221,205,
1,47,94,93,93,205,221,205,49,48,1,33,17,33,3,17,33,17,2,105,254,4,1,252,76,
254,156,1,127,1,252,254,80,1,98,254,158,0,0,0,0,1,0,0,0,0,8,0,2,104,0,3,0,
0,17,33,17,33,8,0,248,0,2,104,253,152,0,0,0,1,1,158,0,0,6,76,4,174,0,2,0,
0,33,9,1,1,158,2,88,2,86,4,174,251,82,0,0,1,1,145,255,229,6,90,4,172,0,2,
0,0,9,2,1,145,4,201,251,55,4,172,253,158,253,155,0,1,1,158,255,229,6,76,4,
147,0,2,0,0,9,2,6,76,253,170,253,168,4,147,251,82,4,174,0,1,1,145,255,229,
6,90,4,172,0,2,0,0,1,17,1,6,90,251,55,4,172,251,57,2,101,0,0,2,0,8,0,0,3,
238,5,160,0,5,0,9,0,37,64,20,134,7,1,9,0,5,16,5,2,5,7,31,2,1,2,6,3,4,8,1,
0,47,51,63,51,1,47,93,51,47,93,51,49,48,93,33,35,9,1,51,9,4,2,35,82,254,55,
1,201,82,1,203,254,14,254,158,1,98,1,96,2,207,2,209,253,49,2,53,253,203,253,
194,2,62,0,2,0,167,0,162,4,46,4,41,0,19,0,39,0,46,64,28,68,37,84,37,2,75,
33,91,33,2,75,27,91,27,2,68,23,84,23,2,30,10,20,0,25,15,35,5,0,47,205,220,
205,1,47,205,220,205,49,48,93,93,93,93,19,52,62,2,51,50,30,2,21,20,14,2,35,
34,46,2,55,20,30,2,51,50,62,2,53,52,46,2,35,34,14,2,167,70,122,164,94,94,
165,123,71,71,123,165,94,94,164,122,70,86,57,98,133,76,76,134,99,58,58,99,
134,76,76,133,98,57,2,100,94,165,123,71,71,123,165,94,94,164,122,70,70,122,
164,94,76,132,99,57,57,99,132,76,76,134,99,58,58,99,134,0,0,0,0,1,0,178,0,
137,4,35,3,250,0,23,0,17,182,8,16,12,15,0,1,0,0,47,93,205,1,47,205,49,48,
1,50,23,30,1,23,30,1,21,20,7,6,35,34,39,38,53,52,54,55,62,1,55,54,2,106,110,
107,53,82,29,29,31,129,129,183,182,129,129,30,29,29,83,52,108,3,250,57,28,
82,52,54,110,57,183,129,129,129,129,183,58,109,54,52,82,28,57,0,0,0,2,0,41,
0,0,4,172,4,131,0,3,0,23,0,21,183,14,2,4,1,19,1,9,0,0,47,205,221,205,1,47,
205,221,205,49,48,51,17,33,17,1,20,30,2,51,50,62,2,53,52,46,2,35,34,14,2,
41,4,131,252,4,69,120,160,91,91,161,120,69,69,120,161,91,91,160,120,69,4,
131,251,125,2,65,91,160,120,69,69,120,160,91,91,161,120,69,69,120,161,0,0,
3,0,41,0,0,4,172,4,131,0,3,0,23,0,43,0,34,64,14,4,24,1,14,34,2,1,19,29,0,
9,39,1,0,0,47,221,221,206,16,221,206,1,47,221,221,206,16,221,206,49,48,51,
17,33,17,1,52,62,2,51,50,30,2,21,20,14,2,35,34,46,2,39,20,30,2,51,50,62,2,
53,52,46,2,35,34,14,2,41,4,131,252,81,58,99,133,75,75,133,99,58,58,99,133,
75,75,133,99,58,77,69,120,160,91,91,161,120,69,69,120,161,91,91,160,120,69,
4,131,251,125,2,65,75,133,99,58,58,99,133,75,75,133,99,58,58,99,133,75,91,
160,120,69,69,120,160,91,91,161,120,69,69,120,161,0,0,2,0,115,1,133,2,99,
3,117,0,18,0,34,0,21,183,19,0,27,11,31,6,23,15,0,47,205,220,205,1,47,205,
220,205,49,48,1,20,6,7,14,1,35,34,39,46,1,53,52,55,54,51,50,23,22,7,52,39,
38,35,34,7,6,21,20,23,22,51,50,55,54,2,99,37,37,37,86,51,101,75,35,37,72,
74,102,103,71,74,76,51,51,70,70,51,51,51,49,72,72,49,51,2,125,53,86,37,35,
37,72,37,86,53,102,72,74,74,71,103,70,51,51,51,51,70,69,54,49,49,54,0,0,0,
5,1,177,255,229,6,121,4,172,0,17,0,33,0,45,0,57,0,68,0,147,64,93,20,32,36,
32,116,32,3,20,28,36,28,116,28,3,27,24,43,24,123,24,3,27,20,43,20,123,20,
3,68,34,40,63,52,46,40,46,40,46,8,18,31,0,1,0,26,8,49,37,43,55,43,62,58,104,
58,1,89,58,1,71,58,1,25,58,1,58,60,65,15,43,95,43,111,43,3,8,65,64,9,14,72,
43,65,43,65,4,22,15,13,1,13,30,4,0,47,205,220,93,205,18,57,57,47,47,43,94,
93,16,205,51,93,93,93,93,17,51,17,51,16,205,50,1,47,205,220,93,205,18,57,
57,47,47,16,205,51,16,205,51,49,48,0,93,93,93,93,1,20,7,6,35,34,39,38,53,
52,54,55,54,51,50,23,30,1,7,52,39,38,35,34,7,6,21,20,23,22,51,50,55,54,1,
20,6,35,34,38,53,52,54,51,50,22,5,20,6,35,34,38,53,52,54,51,50,22,1,22,51,
50,55,23,6,35,34,38,39,6,121,180,179,253,253,179,180,90,90,178,254,254,178,
90,90,90,153,151,218,218,151,153,153,152,217,217,152,153,253,90,46,32,32,
45,45,32,32,46,1,211,44,32,32,47,47,32,32,44,253,234,76,147,145,76,62,98,
185,94,141,48,2,72,254,178,179,179,178,254,128,215,91,178,178,91,215,128,
217,153,154,154,153,217,216,153,154,154,153,1,87,32,46,46,32,32,45,45,32,
32,46,46,32,32,45,45,254,191,137,137,35,186,95,91,0,0,4,1,209,255,229,6,153,
4,172,0,17,0,29,0,41,0,52,0,96,64,55,42,18,24,47,36,30,24,30,24,30,0,8,39,
27,21,33,21,48,52,104,52,1,89,52,1,75,52,1,61,52,1,52,50,45,15,21,31,21,95,
21,111,21,4,8,79,45,95,45,2,21,45,21,45,13,4,0,47,204,57,57,47,47,93,94,93,
16,206,51,93,93,93,93,17,51,17,51,16,206,50,1,47,205,57,57,47,47,16,206,51,
16,206,51,49,48,1,20,7,6,35,34,39,38,53,52,54,55,54,51,50,23,30,1,5,52,38,
35,34,6,21,20,22,51,50,54,37,52,38,35,34,6,21,20,22,51,50,54,1,30,1,51,50,
55,39,6,35,34,39,6,153,180,179,253,253,179,180,90,90,178,254,254,178,90,90,
253,0,46,32,32,45,45,32,32,46,1,211,44,32,32,47,47,32,32,44,253,174,48,141,
94,185,98,62,76,145,147,76,2,72,254,178,179,179,178,254,128,215,91,178,178,
91,215,1,32,45,45,32,32,46,46,32,32,45,45,32,32,46,46,254,220,91,95,186,35,
137,137,0,2,1,70,255,115,6,14,4,59,0,51,0,70,0,139,185,0,47,255,240,64,13,
11,14,72,52,46,1,52,36,1,119,35,1,35,184,255,240,64,77,11,14,72,21,16,11,
14,72,59,20,1,59,9,1,8,16,11,14,72,59,47,1,52,35,1,52,21,1,59,8,1,66,143,
13,223,13,2,112,13,1,63,13,1,32,13,1,13,57,43,62,128,31,208,31,224,31,3,127,
31,1,48,31,1,47,31,1,31,52,15,51,63,51,79,51,3,8,51,0,47,94,93,205,220,93,
93,93,93,205,1,47,205,220,93,93,93,93,205,49,48,0,93,93,93,93,1,43,93,93,
43,43,93,93,93,43,1,51,21,30,3,23,55,23,7,30,1,23,51,21,35,14,1,7,23,7,39,
14,1,7,14,1,7,21,35,53,46,1,39,7,39,55,46,1,39,35,53,51,54,55,39,55,23,62,
1,55,23,34,6,7,6,21,20,23,30,1,51,50,55,54,53,52,39,46,1,3,137,66,32,57,54,
53,29,186,45,184,45,44,3,215,215,8,44,40,184,49,182,31,55,23,24,58,34,66,
63,110,48,188,43,182,40,46,8,215,215,12,80,180,40,189,57,112,54,31,69,117,
48,98,98,48,117,69,139,96,99,99,49,117,4,59,217,3,12,21,32,22,182,45,184,
59,113,57,62,60,110,51,188,43,182,23,32,11,9,12,5,217,217,9,46,35,180,45,
184,51,111,63,62,128,95,184,49,182,40,44,6,61,50,48,100,136,137,98,50,47,
97,97,138,137,99,48,50,0,0,0,2,1,218,0,80,4,38,4,129,0,28,0,47,0,98,64,62,
22,18,25,0,0,5,15,43,1,239,43,255,43,2,43,15,14,1,14,0,34,1,224,34,240,34,
2,34,5,22,25,19,0,28,16,28,80,28,3,28,0,39,1,240,39,1,39,18,0,0,128,0,2,8,
0,29,64,37,40,72,29,10,0,47,205,43,220,94,93,50,205,113,114,47,93,51,205,
50,1,47,205,113,114,220,93,205,113,114,17,57,47,51,205,50,49,48,1,46,1,39,
38,53,52,55,62,1,51,50,23,22,21,20,7,6,7,21,33,21,33,17,35,17,33,53,33,19,
34,7,14,1,21,20,22,23,22,51,50,55,54,53,52,38,39,38,2,220,55,90,35,71,83,
44,101,60,118,83,86,72,72,106,1,0,255,0,74,254,254,1,2,35,83,62,29,31,31,
29,62,83,87,59,61,30,29,62,2,66,8,46,42,80,108,122,83,43,43,86,83,122,109,
81,82,12,166,70,254,250,1,6,70,2,145,59,31,71,44,43,71,31,62,62,61,84,44,
71,31,59,0,2,1,81,0,250,4,175,4,129,0,65,0,81,0,70,64,40,49,65,59,15,78,1,
78,63,32,1,32,15,51,1,51,0,70,1,70,59,65,49,63,74,0,55,128,55,2,55,66,144,
20,1,20,15,63,1,8,63,0,47,94,93,204,93,205,220,93,205,18,57,57,1,47,205,114,
220,93,204,93,205,114,18,57,57,49,48,1,46,1,39,46,1,39,46,1,53,52,55,62,1,
51,50,22,23,30,1,51,50,54,55,54,51,50,21,20,7,14,1,21,20,22,23,30,1,21,20,
6,7,6,35,34,39,46,1,39,7,22,21,20,7,6,35,34,39,38,53,52,55,54,51,50,23,7,
34,7,6,21,20,23,22,51,50,55,54,53,52,39,38,3,255,17,54,37,28,40,14,5,3,6,
3,6,5,5,15,13,32,63,32,46,64,19,36,13,16,6,9,7,4,8,2,2,2,2,9,5,21,20,22,31,
11,237,84,86,87,118,118,87,84,84,85,122,71,83,154,90,62,61,61,64,88,89,60,
62,62,60,4,0,5,18,14,11,24,14,3,10,5,8,9,2,2,2,2,8,9,7,6,12,14,9,18,34,79,
45,31,64,34,11,16,5,5,7,3,6,39,42,82,42,238,81,109,125,86,88,84,84,117,117,
87,86,43,32,62,61,88,91,61,61,61,62,90,87,62,62,0,0,1,0,59,0,0,4,5,4,207,
0,47,0,40,64,25,38,32,10,48,10,96,10,112,10,4,10,14,34,64,8,11,72,34,23,79,
0,95,0,2,0,0,47,93,47,47,43,51,1,47,93,47,49,48,1,30,1,23,30,1,23,22,23,22,
21,20,7,6,35,34,39,22,23,30,1,31,1,33,55,50,55,62,3,39,14,1,35,34,39,38,53,
52,55,62,1,55,62,1,55,54,2,32,14,40,26,28,95,69,141,35,37,63,66,88,157,99,
3,36,38,163,137,8,252,232,6,125,86,43,66,44,20,1,45,132,83,90,66,63,30,23,
78,57,69,110,38,56,4,207,54,95,44,43,105,63,126,66,67,70,95,63,66,191,147,
87,86,99,9,37,37,49,25,69,91,119,75,96,95,66,63,91,74,59,42,85,47,59,113,
57,83,0,0,0,0,1,0,60,0,0,5,4,4,199,0,75,0,47,64,24,57,77,63,23,1,23,52,61,
67,13,47,30,4,18,31,18,1,27,18,27,18,1,41,1,0,47,47,18,57,57,47,47,93,18,
23,57,50,51,1,47,93,16,206,49,48,41,1,55,62,1,55,62,1,55,54,53,52,38,53,6,
7,14,1,35,34,38,39,38,53,52,55,54,51,50,22,23,46,1,39,46,1,53,52,55,62,1,
51,50,23,22,21,20,7,54,55,62,1,51,50,22,23,22,21,20,7,6,35,34,38,39,46,1,
39,30,1,23,30,1,23,22,23,4,70,252,182,8,84,108,27,41,64,26,52,2,58,90,43,
88,45,59,97,41,79,73,73,93,31,80,51,20,27,8,5,6,78,40,97,60,116,80,80,69,
84,16,14,30,17,51,86,36,73,80,80,112,62,132,50,17,43,26,3,23,23,22,67,46,
61,159,35,17,33,17,25,75,50,100,109,8,22,17,121,59,28,30,42,38,83,116,115,
79,80,25,26,34,52,19,17,38,20,115,78,38,40,80,78,109,86,98,40,3,5,3,37,41,
76,116,118,83,80,60,51,19,61,45,81,125,46,45,76,31,39,30,0,1,0,102,255,233,
4,90,4,121,0,39,0,38,64,23,18,2,1,4,2,1,8,29,41,16,12,64,12,80,12,112,12,
128,12,5,12,16,0,0,47,47,1,47,93,16,206,49,48,94,93,93,5,46,1,39,46,1,39,
46,1,39,46,1,53,52,55,54,51,50,23,30,1,23,62,1,51,50,22,23,22,21,20,7,14,
1,7,14,1,7,14,1,2,98,14,42,26,28,103,76,56,69,14,43,37,68,70,102,98,78,28,
47,17,34,142,88,50,85,35,70,41,20,78,60,75,108,32,31,44,23,56,101,48,50,147,
102,76,93,22,65,106,56,103,71,70,72,28,80,54,119,117,36,34,70,94,86,88,45,
119,75,96,152,55,54,110,0,0,0,0,1,0,66,255,231,3,210,4,199,0,26,0,18,183,
48,12,1,12,75,21,1,21,0,25,47,93,1,47,93,49,48,1,30,1,23,30,1,23,14,1,7,14,
1,7,46,1,39,46,1,39,46,1,39,62,1,55,62,1,2,7,45,113,69,69,116,47,39,120,83,
69,106,40,13,35,22,38,98,60,14,94,81,50,128,80,59,96,4,199,78,165,93,93,141,
53,40,150,111,93,159,72,25,58,32,57,135,80,20,119,99,59,160,107,77,148,0,
0,1,0,196,0,29,3,59,4,129,0,33,0,48,64,25,2,19,33,13,64,79,6,95,6,111,6,3,
6,128,27,33,18,10,10,47,0,1,0,31,24,0,47,205,204,93,57,47,57,1,47,205,26,
220,93,26,205,16,205,50,49,48,1,51,21,23,30,1,21,20,6,7,35,62,1,53,52,38,
39,38,39,17,20,6,7,6,35,34,38,53,52,55,54,51,50,23,1,233,76,153,51,58,48,
46,47,29,28,28,29,57,64,37,37,72,108,57,58,60,63,80,44,46,4,129,100,193,69,
163,85,78,134,59,65,124,59,60,99,40,81,9,254,6,63,98,38,75,54,46,73,60,60,
19,0,2,1,16,255,213,4,239,4,135,0,34,0,38,0,108,64,61,35,32,64,18,26,128,
36,15,64,111,0,1,0,128,15,9,1,9,9,0,26,1,26,17,35,86,35,1,67,35,1,35,16,36,
54,36,1,37,36,1,20,36,1,3,36,1,8,36,34,38,33,88,33,1,33,37,34,30,23,13,6,
0,47,205,47,205,47,51,51,93,17,51,17,51,94,93,93,93,93,17,51,51,93,93,17,
51,1,47,93,51,47,93,26,221,93,26,205,50,26,16,221,26,205,51,49,48,1,20,6,
7,14,1,35,34,38,53,52,55,54,51,50,23,17,5,17,20,6,7,6,35,34,38,53,52,55,54,
51,50,23,17,37,1,37,53,5,4,239,36,38,37,88,51,57,57,57,62,81,48,42,253,218,
37,35,74,106,57,58,59,60,84,45,45,2,186,253,144,2,38,253,218,1,68,63,101,
35,37,39,54,47,76,57,59,18,1,192,149,254,118,62,98,38,74,53,45,76,57,60,19,
2,240,178,254,103,149,117,152,0,0,0,3,0,29,0,0,3,118,5,204,0,27,0,31,0,35,
0,100,179,67,10,1,10,184,255,224,64,59,8,12,72,31,35,70,28,47,32,143,32,207,
32,3,31,32,79,32,111,32,143,32,4,32,79,16,95,16,2,16,16,1,70,144,2,1,111,
2,1,2,34,15,31,83,30,0,19,80,12,0,0,4,80,25,5,15,32,1,21,0,63,51,63,51,237,
50,63,237,63,237,63,1,47,93,93,237,50,47,93,47,93,113,51,237,50,49,48,0,43,
93,1,17,35,17,35,53,51,53,52,62,2,51,50,22,23,21,46,1,35,34,14,2,29,1,51,
21,19,53,51,21,3,17,51,17,1,105,180,152,152,22,59,102,81,32,69,26,17,45,18,
40,51,29,11,211,134,180,180,180,3,183,252,73,3,183,131,122,59,101,75,43,6,
6,137,3,5,22,41,60,39,97,131,1,105,172,172,250,224,4,58,251,198,0,0,0,0,2,
0,29,0,0,3,119,5,204,0,27,0,31,0,90,179,67,10,1,10,184,255,224,64,53,8,12,
72,31,70,47,28,143,28,207,28,3,31,28,79,28,111,28,143,28,4,28,79,16,95,16,
2,16,16,1,70,144,2,1,111,2,1,2,30,0,19,80,12,0,0,4,80,25,5,15,28,1,21,0,63,
51,63,51,237,50,63,237,63,1,47,93,93,237,50,47,93,47,93,113,237,49,48,0,43,
93,1,17,35,17,35,53,51,53,52,62,2,51,50,22,23,21,46,1,35,34,14,2,29,1,51,
21,19,17,51,17,1,105,180,152,152,22,59,102,81,32,69,26,17,45,18,40,51,29,
11,211,135,180,3,183,252,73,3,183,131,122,59,101,75,43,6,6,137,3,5,22,41,
60,39,97,131,252,73,5,204,250,52,0,0,1,0,119,254,78,1,227,255,170,0,28,0,
75,185,0,2,255,232,179,9,17,72,27,184,255,224,64,40,9,17,72,22,22,8,16,131,
15,0,1,95,0,1,0,8,19,140,63,23,79,23,2,23,11,140,0,5,16,5,32,5,80,5,96,5,
112,5,6,5,0,47,93,237,47,93,237,1,47,221,93,113,237,18,57,47,49,48,43,43,
5,20,14,2,35,34,38,39,53,22,51,50,62,2,53,52,38,35,42,1,7,55,51,50,30,2,1,
227,30,65,104,75,20,45,25,49,37,41,56,35,15,61,72,14,29,14,31,62,52,84,60,
32,253,41,67,48,25,1,3,98,6,12,21,30,18,37,40,2,96,18,41,63,0,0,0,255,255,
0,243,1,190,1,182,2,154,17,6,0,119,56,0,0,18,64,11,0,127,0,1,111,0,1,95,0,
1,0,17,93,93,93,53,0,1,0,127,254,78,1,72,255,158,0,10,0,75,185,0,5,255,192,
179,9,17,72,2,184,255,192,64,28,9,17,72,7,151,0,150,4,9,8,146,16,3,32,3,2,
0,3,96,3,160,3,176,3,192,3,5,3,184,255,192,64,10,30,33,72,3,0,9,16,9,2,9,
0,47,93,204,43,93,113,237,1,47,51,253,237,49,48,43,43,5,20,6,7,35,62,1,53,
35,53,51,1,72,44,40,117,45,49,88,195,193,87,107,47,48,86,46,156,0,0,0,0,2,
0,14,2,51,2,150,5,129,0,10,0,23,0,108,64,74,86,10,1,86,9,1,121,6,137,6,2,
17,175,5,191,5,2,5,64,29,60,72,5,64,24,27,72,5,8,1,224,18,6,16,2,1,48,2,1,
64,2,144,2,2,2,0,4,229,8,5,95,17,111,17,127,17,3,15,17,31,17,127,17,143,17,
4,17,17,1,11,6,220,1,223,0,63,63,51,18,57,47,93,113,51,51,237,50,1,47,93,
113,114,51,51,237,50,47,43,43,93,51,49,48,93,114,114,1,21,35,53,33,53,1,51,
17,51,21,3,14,3,7,3,33,17,60,2,54,2,39,131,254,106,1,130,151,111,240,7,22,
24,22,7,199,1,23,1,2,229,178,178,111,2,45,253,213,113,2,23,13,37,39,35,11,
254,225,1,33,14,38,38,34,0,0,0,0,1,0,53,2,40,2,124,5,129,0,38,0,134,64,37,
37,36,53,36,69,36,3,3,24,9,13,72,19,34,1,4,34,1,3,31,30,25,224,139,27,1,6,
27,10,192,26,208,26,224,26,3,26,184,255,192,64,53,16,19,72,26,29,0,225,32,
19,96,19,2,32,19,96,19,160,19,224,19,4,19,22,228,34,34,16,30,229,27,220,68,
11,84,11,100,11,3,53,11,1,6,11,22,11,38,11,3,11,16,228,5,221,0,63,237,50,
93,93,93,63,237,18,57,47,237,1,47,93,113,237,50,47,43,93,51,51,95,113,237,
50,50,0,95,93,93,49,48,43,93,1,20,14,2,35,34,46,2,39,55,30,3,51,50,54,53,
52,38,35,34,6,7,35,19,33,21,33,7,62,1,51,50,30,2,2,124,38,73,108,70,66,101,
74,44,9,133,5,24,39,54,36,71,86,81,75,51,77,23,129,33,1,250,254,114,19,29,
91,54,67,103,69,36,3,67,65,104,74,40,33,59,81,48,15,27,47,36,21,85,93,81,
85,37,23,1,212,113,245,26,33,39,71,102,0,0,0,1,0,43,2,52,2,120,5,129,0,14,
0,54,64,33,5,224,6,6,0,175,12,191,12,2,12,11,96,0,1,191,0,207,0,255,0,3,96,
0,1,0,0,12,229,13,220,5,223,0,63,63,237,50,1,47,93,93,113,51,47,93,17,57,
47,237,49,48,1,14,3,21,35,52,62,2,55,33,53,33,2,120,64,106,77,43,133,47,80,
107,60,254,52,2,77,5,28,97,176,176,187,108,102,188,179,175,88,113,0,3,0,45,
2,40,2,130,5,142,0,19,0,39,0,81,0,138,185,0,68,255,232,179,11,15,72,64,184,
255,232,64,82,11,15,72,47,24,9,13,72,43,24,9,13,72,5,15,21,15,2,76,55,71,
10,226,72,61,1,61,61,30,226,224,50,1,191,50,1,50,0,226,70,71,1,71,71,40,226,
32,20,96,20,2,32,20,96,20,160,20,224,20,4,20,76,56,25,228,15,15,35,26,5,1,
11,5,1,5,228,66,222,35,228,45,221,0,63,237,63,237,93,93,18,57,47,237,57,57,
1,47,93,113,237,50,47,113,237,47,93,93,237,51,47,113,237,18,57,57,0,93,49,
48,43,43,43,43,1,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,19,52,46,2,35,34,
14,2,21,20,30,2,51,50,62,2,55,20,14,2,35,34,46,2,53,52,62,2,55,53,46,3,53,
52,62,2,51,50,30,2,21,20,14,2,7,21,30,3,1,223,12,31,53,41,39,53,31,13,9,29,
54,45,48,54,27,7,21,13,35,61,49,45,59,36,15,15,36,61,46,46,61,34,14,142,35,
73,113,77,77,113,74,35,29,47,61,32,36,55,38,20,35,70,104,68,72,105,69,33,
20,38,56,36,36,63,46,26,4,169,28,48,34,19,19,34,48,28,23,47,39,25,25,39,48,
254,155,28,52,40,24,24,41,53,28,35,59,42,23,23,42,60,22,54,91,66,37,37,66,
90,54,46,72,52,32,5,3,8,37,52,64,35,45,79,59,34,35,60,79,44,35,63,52,37,7,
3,6,31,52,72,0,1,255,229,4,176,2,195,5,240,0,17,0,62,64,41,117,11,133,11,
2,117,7,133,7,2,12,73,15,13,191,13,239,13,3,13,6,73,64,5,12,5,128,9,142,15,
0,47,0,63,0,127,0,239,0,5,0,0,47,93,237,26,205,50,1,47,26,237,220,93,237,
49,48,0,93,93,1,34,46,2,39,51,30,1,51,50,54,55,51,14,3,1,84,111,141,81,32,
2,164,6,104,93,93,104,6,164,2,32,81,141,4,176,57,91,115,57,103,96,96,103,
57,115,91,57,0,1,0,124,4,28,1,69,5,129,0,10,0,36,64,21,7,151,0,150,4,9,8,
146,80,3,96,3,2,160,3,176,3,2,3,9,3,0,63,204,93,113,237,1,47,51,253,237,49,
48,1,20,6,7,35,62,1,53,35,53,51,1,69,44,40,117,45,49,88,195,5,23,87,117,47,
48,96,46,167,0,0,1,0,130,4,187,1,75,6,32,0,10,0,47,64,30,4,9,150,7,151,10,
7,146,95,3,111,3,2,175,3,191,3,2,3,80,10,1,15,10,63,10,127,10,3,10,0,47,93,
113,205,93,113,237,1,47,237,237,50,49,48,19,52,54,55,51,14,1,21,51,21,35,
130,44,40,117,45,49,88,195,5,37,87,117,47,48,96,46,167,0,0,0,0,1,0,106,5,
250,2,18,6,240,0,5,0,48,64,30,117,3,133,3,2,128,4,1,64,4,1,4,64,1,2,64,16,
20,72,2,128,95,0,1,0,64,9,12,72,0,0,47,43,93,26,205,43,1,47,26,205,93,93,
49,48,93,1,37,53,51,23,21,1,160,254,202,207,217,5,250,217,29,226,20,0,1,0,
72,5,250,1,240,6,240,0,5,0,52,64,34,122,2,138,2,2,64,3,128,3,2,3,64,79,0,
143,0,2,0,2,64,16,20,72,2,128,95,0,1,0,64,9,12,72,0,0,47,43,93,26,205,43,
1,47,93,26,205,93,49,48,93,19,53,55,51,21,5,72,217,207,254,202,5,250,20,226,
29,217,0,0,1,0,0,5,250,2,150,6,254,0,9,0,65,64,14,118,9,134,9,2,120,8,136,
8,2,128,0,1,0,184,255,192,64,25,11,15,72,0,6,4,142,64,8,64,16,19,72,8,128,
6,95,1,1,1,64,9,12,72,1,0,47,43,93,51,26,221,43,26,237,1,47,204,43,93,49,
48,93,93,1,21,35,39,35,7,35,53,55,51,2,150,105,219,2,232,104,234,204,6,14,
20,139,139,20,240,0,0,0,0,1,0,0,5,250,2,150,6,254,0,9,0,65,64,14,118,0,134,
0,2,120,1,136,1,2,128,8,1,8,184,255,192,64,25,11,15,72,8,64,2,7,3,64,16,19,
72,3,128,6,142,95,1,1,1,64,9,12,72,1,0,47,43,93,237,26,205,43,50,1,47,26,
204,43,93,49,48,93,93,1,35,39,53,51,23,51,55,51,21,1,182,204,234,104,232,
2,219,105,5,250,239,21,139,139,21,0,0,0,0,2,0,45,5,250,2,90,6,178,0,3,0,7,
0,35,64,19,3,133,0,7,133,4,1,5,145,0,95,4,1,4,64,9,12,72,4,0,47,43,93,51,
237,50,1,47,237,220,237,49,48,1,53,51,21,33,53,51,21,1,183,163,253,211,165,
5,250,184,184,184,184,0,0,1,255,233,5,250,2,182,7,6,0,27,0,68,181,89,2,105,
2,2,26,184,255,232,64,34,9,15,72,12,24,9,15,72,64,23,1,15,23,1,23,9,22,5,
143,64,14,128,19,143,8,95,0,1,0,64,9,12,72,0,0,47,43,93,50,237,26,221,26,
237,51,1,47,204,93,93,49,48,43,43,0,93,1,34,46,2,35,34,6,7,35,62,3,51,50,
30,2,51,50,54,55,51,14,3,1,236,42,84,78,71,31,55,54,9,91,5,20,45,74,59,44,
84,78,69,30,54,55,8,92,5,20,43,74,5,250,37,45,37,62,57,45,95,78,50,37,45,
37,63,56,44,95,78,51,0,0,0,0,2,0,32,5,250,3,15,6,241,0,5,0,11,0,88,64,60,
154,8,170,8,2,154,2,170,2,2,102,10,1,98,4,1,98,3,1,10,159,7,1,15,7,31,7,127,
7,223,7,4,7,7,4,64,0,64,9,31,72,0,8,2,64,16,20,72,2,128,6,95,0,1,0,64,9,12,
72,0,0,47,43,93,50,26,205,43,50,1,47,43,26,205,220,94,93,113,205,49,48,93,
93,93,93,93,19,53,55,51,21,5,51,53,55,51,21,5,32,197,207,254,202,253,197,
207,254,202,5,250,20,227,29,218,20,227,29,218,0,1,255,232,5,250,2,130,6,243,
0,17,0,55,64,32,4,11,1,4,7,1,17,15,19,1,100,13,64,5,12,5,64,16,20,72,5,128,
9,95,0,1,0,64,9,12,72,0,0,47,43,93,205,26,205,43,50,1,47,26,204,94,93,49,
48,0,94,93,93,1,34,46,2,39,51,30,1,51,50,54,55,51,14,3,1,52,74,116,84,50,
8,117,17,109,91,91,107,17,117,9,50,83,116,5,250,41,69,90,49,53,60,61,52,49,
90,69,41,0,0,0,0,0,0,1,0,0,21,86,0,1,3,140,12,0,0,9,9,72,0,3,0,36,255,143,
0,3,0,55,255,219,0,3,0,60,255,219,0,3,1,82,255,143,0,3,1,91,255,143,0,3,1,
94,255,143,0,3,1,101,255,143,0,3,1,109,255,219,0,3,1,110,255,219,0,3,1,116,
255,219,0,20,0,20,255,104,0,36,0,3,255,143,0,36,0,55,255,104,0,36,0,57,255,
104,0,36,0,58,255,180,0,36,0,60,255,104,0,36,0,89,255,219,0,36,0,90,255,219,
0,36,0,92,255,219,0,36,2,3,255,104,0,41,0,15,255,29,0,41,0,17,255,29,0,41,
0,36,255,143,0,47,0,3,255,180,0,47,0,55,255,104,0,47,0,57,255,104,0,47,0,
58,255,104,0,47,0,60,255,104,0,47,0,92,255,180,0,47,2,3,255,143,0,51,0,3,
255,219,0,51,0,15,254,248,0,51,0,17,254,248,0,51,0,36,255,104,0,53,0,55,255,
219,0,53,0,57,255,219,0,53,0,58,255,219,0,53,0,60,255,219,0,55,0,3,255,219,
0,55,0,15,255,29,0,55,0,16,255,143,0,55,0,17,255,29,0,55,0,29,255,29,0,55,
0,30,255,29,0,55,0,36,255,104,0,55,0,50,255,219,0,55,0,68,255,29,0,55,0,70,
255,29,0,55,0,72,255,29,0,55,0,76,255,180,0,55,0,82,255,29,0,55,0,85,255,
180,0,55,0,86,255,29,0,55,0,88,255,180,0,55,0,90,255,143,0,55,0,92,255,143,
0,57,0,15,255,68,0,57,0,16,255,143,0,57,0,17,255,68,0,57,0,29,255,180,0,57,
0,30,255,180,0,57,0,36,255,104,0,57,0,68,255,104,0,57,0,72,255,143,0,57,0,
76,255,219,0,57,0,82,255,143,0,57,0,85,255,180,0,57,0,88,255,180,0,57,0,92,
255,180,0,58,0,15,255,143,0,58,0,16,255,219,0,58,0,17,255,143,0,58,0,29,255,
219,0,58,0,30,255,219,0,58,0,36,255,180,0,58,0,68,255,180,0,58,0,72,255,219,
0,58,0,82,255,219,0,58,0,85,255,219,0,58,0,88,255,219,0,58,0,92,255,238,0,
60,0,3,255,219,0,60,0,15,254,248,0,60,0,16,255,68,0,60,0,17,254,248,0,60,
0,29,255,143,0,60,0,30,255,123,0,60,0,36,255,104,0,60,0,68,255,104,0,60,0,
72,255,68,0,60,0,76,255,180,0,60,0,82,255,68,0,60,0,83,255,104,0,60,0,84,
255,68,0,60,0,88,255,143,0,60,0,89,255,143,0,73,0,73,255,219,0,73,2,3,0,37,
0,85,0,15,255,143,0,85,0,17,255,143,0,85,2,3,0,76,0,89,0,15,255,104,0,89,
0,17,255,104,0,90,0,15,255,143,0,90,0,17,255,143,0,92,0,15,255,104,0,92,0,
17,255,104,1,82,1,98,255,213,1,82,1,105,255,213,1,82,1,109,255,104,1,82,1,
110,255,104,1,82,1,111,255,197,1,82,1,116,255,104,1,82,1,124,255,219,1,82,
1,134,255,219,1,82,1,144,255,219,1,87,1,110,255,190,1,88,1,90,0,170,1,88,
1,91,255,104,1,88,1,94,255,104,1,88,1,98,255,141,1,88,1,101,255,104,1,88,
1,105,255,141,1,88,1,111,255,141,1,88,1,114,255,158,1,88,1,119,255,104,1,
88,1,120,255,180,1,88,1,122,255,70,1,88,1,128,255,104,1,88,1,130,255,180,
1,88,1,131,255,104,1,88,1,133,255,104,1,88,1,136,255,70,1,88,1,140,255,70,
1,88,1,143,255,70,1,88,1,147,0,98,1,88,1,149,255,70,1,89,1,110,255,209,1,
89,1,116,255,209,1,91,0,3,255,143,1,91,1,98,255,213,1,91,1,105,255,213,1,
91,1,109,255,104,1,91,1,110,255,104,1,91,1,111,255,197,1,91,1,116,255,104,
1,91,1,124,255,219,1,91,1,134,255,219,1,91,1,144,255,219,1,91,2,3,255,104,
1,93,0,15,255,31,1,93,0,17,255,31,1,93,1,90,0,164,1,93,1,91,255,68,1,93,1,
94,255,68,1,93,1,101,255,68,1,93,1,130,255,168,1,93,1,147,0,88,1,94,0,3,255,
143,1,94,1,98,255,213,1,94,1,105,255,213,1,94,1,109,255,137,1,94,1,110,255,
104,1,94,1,116,255,104,1,98,1,91,255,219,1,98,1,94,255,219,1,98,1,101,255,
219,1,98,1,110,255,190,1,98,1,116,255,190,1,100,1,98,255,193,1,100,1,105,
255,193,1,100,1,111,255,143,1,100,1,117,255,231,1,100,1,122,255,231,1,100,
1,125,255,231,1,100,1,127,255,231,1,100,1,129,255,231,1,100,1,135,255,231,
1,100,1,136,255,231,1,100,1,140,255,231,1,100,1,143,255,231,1,100,1,146,255,
231,1,100,1,149,255,231,1,100,1,151,255,231,1,101,0,3,255,143,1,101,1,98,
255,213,1,101,1,105,255,213,1,101,1,109,255,104,1,101,1,110,255,104,1,101,
1,116,255,104,1,105,1,91,255,219,1,105,1,94,255,213,1,105,1,101,255,219,1,
105,1,110,255,190,1,105,1,116,255,190,1,107,0,3,255,219,1,107,0,15,254,250,
1,107,0,17,254,250,1,107,1,91,255,104,1,107,1,94,255,104,1,107,1,101,255,
104,1,108,1,137,255,158,1,108,1,141,255,158,1,109,0,3,255,219,1,109,0,15,
255,31,1,109,0,17,255,31,1,109,0,29,255,31,1,109,0,30,255,31,1,109,1,90,0,
188,1,109,1,91,255,104,1,109,1,94,255,104,1,109,1,98,255,219,1,109,1,101,
255,104,1,109,1,105,255,219,1,109,1,111,255,219,1,109,1,114,255,219,1,109,
1,117,255,31,1,109,1,118,255,31,1,109,1,121,255,78,1,109,1,122,255,31,1,109,
1,124,255,78,1,109,1,126,255,31,1,109,1,128,255,106,1,109,1,130,255,180,1,
109,1,133,255,106,1,109,1,134,255,143,1,109,1,136,255,31,1,109,1,140,255,
31,1,109,1,142,255,80,1,109,1,143,255,31,1,109,1,144,255,143,1,109,1,145,
255,106,1,109,1,147,0,188,1,109,1,148,255,78,1,109,1,149,255,31,1,109,1,150,
255,78,1,110,0,3,255,219,1,110,0,15,254,250,1,110,0,16,255,70,1,110,0,17,
254,250,1,110,0,29,255,143,1,110,0,30,255,143,1,110,1,90,0,188,1,110,1,91,
255,104,1,110,1,94,255,104,1,110,1,98,255,141,1,110,1,101,255,104,1,110,1,
105,255,141,1,110,1,111,255,141,1,110,1,114,255,158,1,110,1,119,255,104,1,
110,1,120,255,180,1,110,1,122,255,70,1,110,1,124,255,158,1,110,1,128,255,
104,1,110,1,130,255,180,1,110,1,131,255,104,1,110,1,133,255,104,1,110,1,136,
255,70,1,110,1,140,255,70,1,110,1,143,255,70,1,110,1,147,0,121,1,110,1,149,
255,70,1,111,1,91,255,197,1,111,1,110,255,190,1,111,1,116,255,190,1,113,1,
117,255,178,1,113,1,122,255,178,1,113,1,125,255,178,1,113,1,129,255,217,1,
113,1,136,255,178,1,113,1,140,255,178,1,113,1,143,255,178,1,113,1,146,255,
178,1,113,1,149,255,178,1,113,1,151,255,178,1,114,1,110,255,209,1,114,1,116,
255,209,1,116,0,3,255,219,1,116,1,90,0,170,1,116,1,91,255,104,1,116,1,94,
255,104,1,116,1,98,255,141,1,116,1,101,255,104,1,116,1,105,255,141,1,116,
1,111,255,141,1,116,1,114,255,158,1,116,1,119,255,104,1,116,1,120,255,180,
1,116,1,122,255,70,1,116,1,128,255,104,1,116,1,130,255,180,1,116,1,131,255,
104,1,116,1,133,255,104,1,116,1,136,255,70,1,116,1,140,255,70,1,116,1,143,
255,70,1,116,1,147,0,98,1,116,1,149,255,70,1,125,1,132,255,217,1,125,1,137,
255,227,1,125,1,141,255,227,1,125,1,144,255,201,1,127,1,117,255,119,1,127,
1,119,255,219,1,127,1,122,255,119,1,127,1,124,255,170,1,127,1,125,255,180,
1,127,1,128,255,219,1,127,1,129,255,158,1,127,1,130,255,219,1,127,1,131,255,
219,1,127,1,134,255,170,1,127,1,136,255,119,1,127,1,137,255,170,1,127,1,140,
255,119,1,127,1,141,255,170,1,127,1,143,255,119,1,127,1,146,255,119,1,127,
1,149,255,119,1,127,1,151,255,119,1,129,1,132,255,217,1,131,1,117,255,231,
1,131,1,122,255,231,1,131,1,125,255,231,1,131,1,127,255,231,1,131,1,129,255,
231,1,131,1,135,255,231,1,131,1,136,255,231,1,131,1,139,255,231,1,131,1,140,
255,231,1,131,1,143,255,231,1,131,1,146,255,231,1,131,1,149,255,231,1,131,
1,151,255,231,1,132,1,117,255,225,1,132,1,122,255,225,1,132,1,125,255,225,
1,132,1,135,255,225,1,132,1,136,255,225,1,132,1,139,255,209,1,132,1,140,255,
225,1,132,1,142,255,207,1,132,1,143,255,219,1,132,1,146,255,225,1,132,1,149,
255,225,1,132,1,150,255,207,1,132,1,151,255,225,1,135,1,117,255,201,1,135,
1,122,255,201,1,135,1,125,255,201,1,135,1,127,255,201,1,135,1,135,255,201,
1,135,1,136,255,201,1,135,1,139,255,201,1,135,1,140,255,201,1,135,1,143,255,
201,1,135,1,149,255,201,1,136,1,132,255,217,1,136,1,137,255,227,1,136,1,141,
255,227,1,136,1,144,255,201,1,137,1,117,255,227,1,137,1,122,255,227,1,137,
1,127,255,227,1,137,1,136,255,227,1,137,1,139,255,227,1,137,1,140,255,227,
1,137,1,143,255,227,1,137,1,146,255,227,1,137,1,151,255,227,1,138,1,132,255,
217,1,138,1,137,255,227,1,138,1,141,255,227,1,141,1,117,255,227,1,141,1,122,
255,227,1,141,1,125,255,227,1,141,1,127,255,227,1,141,1,136,255,227,1,141,
1,139,255,227,1,141,1,140,255,227,1,141,1,143,255,227,1,141,1,146,255,227,
1,141,1,151,255,227,1,143,1,132,255,217,1,143,1,137,255,227,1,143,1,141,255,
227,1,143,1,144,255,201,1,144,1,117,255,201,1,144,1,122,255,201,1,144,1,125,
255,201,1,144,1,127,255,201,1,144,1,136,255,201,1,144,1,139,255,201,1,144,
1,140,255,201,1,144,1,143,255,201,1,144,1,146,255,201,1,144,1,149,255,201,
1,144,1,151,255,201,1,146,1,132,255,217,1,146,1,137,255,227,1,146,1,141,255,
227,1,146,1,144,255,201,1,149,1,132,255,217,1,149,1,137,255,227,1,149,1,141,
255,227,1,149,1,144,255,201,1,151,1,132,255,217,1,151,1,137,255,227,1,151,
1,141,255,227,1,151,1,144,255,201,1,154,0,15,255,6,1,154,0,17,255,6,1,154,
0,108,255,119,1,154,0,123,255,119,1,154,1,255,255,211,1,160,2,3,255,96,1,
161,2,3,255,119,1,166,1,170,0,68,1,166,1,173,255,233,1,166,1,177,0,45,1,166,
1,180,255,211,1,166,1,181,255,233,1,166,1,183,255,211,1,166,1,184,255,96,
1,166,1,185,255,166,1,166,1,186,255,188,1,166,1,189,255,96,1,166,1,195,255,
211,1,166,1,198,0,23,1,166,1,216,255,211,1,166,1,217,255,233,1,166,1,218,
0,23,1,166,1,227,0,45,1,166,2,3,255,141,1,167,1,166,255,211,1,167,1,173,255,
233,1,167,1,180,255,233,1,167,1,183,255,233,1,167,1,184,255,164,1,167,1,185,
255,209,1,167,1,186,255,233,1,167,1,187,255,211,1,167,1,189,255,164,1,167,
1,192,255,188,1,167,1,195,255,233,1,167,1,197,255,233,1,167,1,209,255,233,
1,167,1,217,255,211,1,168,1,166,255,188,1,168,1,170,255,211,1,168,1,172,255,
211,1,168,1,173,255,188,1,168,1,177,255,233,1,168,1,180,255,188,1,168,1,183,
255,188,1,168,1,184,255,119,1,168,1,185,255,188,1,168,1,186,255,188,1,168,
1,187,255,166,1,168,1,189,255,164,1,168,1,192,255,141,1,168,1,197,255,188,
1,168,1,202,255,233,1,168,1,210,255,233,1,168,1,216,255,188,1,168,1,217,255,
233,1,168,1,219,255,233,1,168,1,221,255,188,1,168,1,229,255,233,1,169,0,15,
255,6,1,169,0,17,255,6,1,169,0,108,255,119,1,169,0,123,255,119,1,169,1,166,
255,119,1,169,1,170,255,119,1,169,1,173,255,211,1,169,1,177,255,141,1,169,
1,178,255,209,1,169,1,180,255,141,1,169,1,183,255,164,1,169,1,197,255,188,
1,169,1,198,255,141,1,169,1,200,255,141,1,169,1,202,255,119,1,169,1,203,255,
119,1,169,1,206,255,141,1,169,1,209,255,141,1,169,1,210,255,141,1,169,1,211,
255,141,1,169,1,212,255,119,1,169,1,214,255,141,1,169,1,217,255,119,1,169,
1,225,255,141,1,169,1,226,255,141,1,169,1,228,255,141,1,169,1,229,255,119,
1,169,1,255,255,211,1,170,1,185,0,23,1,170,1,186,255,211,1,170,1,189,255,
186,1,170,1,205,0,68,1,170,1,212,0,23,1,170,1,217,0,45,1,171,1,173,255,211,
1,171,1,215,255,233,1,172,1,173,255,233,1,172,1,180,255,211,1,172,1,183,255,
233,1,172,1,184,0,23,1,172,1,185,0,45,1,172,1,192,0,45,1,172,1,198,0,23,1,
172,1,203,255,231,1,172,1,212,255,233,1,172,1,217,255,233,1,173,1,177,255,
233,1,173,1,180,255,233,1,173,1,183,255,233,1,173,1,184,255,211,1,173,1,185,
255,233,1,173,1,186,255,233,1,173,1,189,255,211,1,173,1,197,255,233,1,176,
1,173,255,233,1,176,1,180,255,233,1,176,1,183,255,233,1,176,1,185,0,23,1,
176,1,186,255,186,1,177,1,186,255,233,1,177,1,199,0,23,1,177,1,217,0,23,1,
178,1,186,255,233,1,178,1,189,255,233,1,178,1,198,0,23,1,178,1,203,0,23,1,
178,1,212,0,23,1,178,1,215,0,23,1,178,1,217,0,23,1,178,1,221,255,233,1,178,
1,227,0,23,1,180,1,166,255,211,1,180,1,170,255,211,1,180,1,172,255,211,1,
180,1,177,255,233,1,180,1,185,255,211,1,180,1,187,255,164,1,180,1,189,255,
211,1,180,1,197,255,211,1,180,1,202,255,211,1,180,1,209,255,233,1,180,1,219,
255,233,1,182,0,15,254,125,1,182,0,17,254,125,1,182,0,29,255,211,1,182,0,
30,255,211,1,182,0,123,255,141,1,182,1,166,255,119,1,182,1,170,255,119,1,
182,1,172,255,233,1,182,1,173,255,211,1,182,1,177,255,141,1,182,1,178,255,
233,1,182,1,180,255,211,1,182,1,183,255,233,1,182,1,184,255,164,1,182,1,185,
255,211,1,182,1,186,255,233,1,182,1,187,255,164,1,182,1,197,255,211,1,182,
1,198,255,188,1,182,1,202,255,96,1,182,1,203,255,166,1,182,1,212,255,166,
1,182,1,227,255,211,1,182,1,229,255,188,1,183,1,166,255,211,1,183,1,170,255,
211,1,183,1,173,255,233,1,183,1,177,255,188,1,183,1,178,255,233,1,183,1,180,
255,211,1,183,1,184,255,188,1,183,1,185,255,188,1,183,1,187,255,141,1,183,
1,189,255,188,1,183,1,192,255,186,1,183,1,195,255,233,1,183,1,198,0,23,1,
183,1,204,0,45,1,183,1,221,255,233,1,184,0,15,255,29,1,184,0,17,255,29,1,
184,0,108,255,166,1,184,0,123,255,166,1,184,1,166,255,188,1,184,1,170,255,
188,1,184,1,172,0,23,1,184,1,173,255,233,1,184,1,177,255,211,1,184,1,180,
255,164,1,184,1,186,255,188,1,184,1,197,255,211,1,184,1,198,255,164,1,184,
1,200,255,166,1,184,1,203,255,141,1,184,1,206,255,166,1,184,1,208,255,166,
1,184,1,209,255,164,1,184,1,210,255,166,1,184,1,212,255,96,1,184,1,213,255,
166,1,184,1,214,255,141,1,184,1,215,255,141,1,184,1,217,255,141,1,184,1,219,
255,166,1,184,1,223,255,166,1,184,1,225,255,166,1,184,1,226,255,166,1,184,
1,228,255,166,1,184,1,229,255,141,1,184,1,255,255,211,1,185,0,15,254,240,
1,185,0,17,254,240,1,185,0,29,255,211,1,185,0,30,255,211,1,185,0,108,255,
166,1,185,0,123,255,164,1,185,1,166,255,119,1,185,1,170,255,164,1,185,1,173,
255,211,1,185,1,177,255,188,1,185,1,180,255,188,1,185,1,186,255,188,1,185,
1,195,255,211,1,185,1,197,255,211,1,185,1,199,255,211,1,185,1,200,255,141,
1,185,1,201,255,164,1,185,1,202,255,96,1,185,1,203,255,119,1,185,1,204,255,
188,1,185,1,205,255,141,1,185,1,206,255,164,1,185,1,207,255,188,1,185,1,208,
255,164,1,185,1,209,255,119,1,185,1,210,255,164,1,185,1,211,255,164,1,185,
1,212,255,119,1,185,1,213,255,164,1,185,1,214,255,164,1,185,1,215,255,119,
1,185,1,219,255,164,1,185,1,220,255,164,1,185,1,222,255,164,1,185,1,223,255,
164,1,185,1,228,255,164,1,185,1,229,255,119,1,185,1,255,255,233,1,186,1,166,
255,211,1,186,1,170,255,188,1,186,1,177,255,188,1,186,1,184,255,141,1,186,
1,185,255,164,1,186,1,189,255,211,1,186,1,197,255,186,1,186,1,209,255,188,
1,187,1,173,255,211,1,187,1,180,255,188,1,187,1,183,255,188,1,187,1,186,255,
188,1,187,1,195,255,186,1,187,1,212,255,233,1,187,1,217,255,211,1,188,1,180,
255,211,1,188,1,198,0,45,1,191,1,198,0,23,1,191,1,217,0,45,1,192,1,197,255,
188,1,192,2,3,255,119,1,194,1,166,255,211,1,194,1,170,255,211,1,194,1,172,
255,188,1,194,1,173,255,233,1,194,1,177,255,186,1,194,1,178,255,211,1,194,
1,180,255,211,1,194,1,183,255,211,1,194,1,184,255,51,1,194,1,187,255,164,
1,194,1,189,255,96,1,194,1,195,255,233,1,194,1,197,255,164,1,194,2,3,255,
96,1,195,1,170,255,188,1,195,1,172,255,231,1,195,1,173,255,233,1,195,1,177,
255,188,1,195,1,187,255,186,1,195,1,197,255,211,1,195,1,202,255,188,1,195,
1,204,0,23,1,195,1,209,255,188,1,195,1,210,255,233,1,195,1,229,255,233,1,
196,1,166,255,188,1,196,1,170,255,166,1,196,1,172,255,211,1,196,1,177,255,
164,1,196,1,180,255,233,1,196,1,183,255,233,1,196,1,184,255,141,1,196,1,187,
255,164,1,196,1,189,255,188,1,196,1,202,255,164,1,196,1,209,255,164,1,196,
1,210,255,233,1,198,1,205,255,233,1,198,1,216,255,211,1,198,1,217,255,233,
1,198,1,221,255,211,1,199,1,198,255,209,1,199,1,202,255,164,1,199,1,203,255,
233,1,199,1,204,255,233,1,199,1,205,255,211,1,199,1,209,255,164,1,199,1,210,
255,211,1,199,1,215,255,233,1,199,1,217,255,211,1,199,1,218,255,233,1,199,
1,219,255,188,1,199,1,221,255,188,1,199,1,224,255,188,1,199,1,227,255,233,
1,199,1,229,255,211,1,200,1,198,255,233,1,200,1,199,255,233,1,200,1,202,255,
233,1,200,1,203,255,233,1,200,1,204,255,233,1,200,1,205,255,233,1,200,1,209,
255,209,1,200,1,210,255,233,1,200,1,212,255,233,1,200,1,215,255,233,1,200,
1,216,255,211,1,200,1,217,255,211,1,200,1,218,255,233,1,200,1,221,255,164,
1,200,1,224,255,188,1,200,1,229,255,233,1,201,0,15,255,6,1,201,0,17,255,6,
1,201,1,198,255,211,1,201,1,202,255,164,1,201,1,203,255,211,1,201,1,205,255,
233,1,201,1,209,255,211,1,201,1,212,255,211,1,201,1,215,255,211,1,201,1,229,
255,233,1,202,1,224,255,211,1,202,1,227,0,23,1,203,1,199,255,233,1,203,1,
202,255,211,1,203,1,204,255,233,1,203,1,205,255,211,1,203,1,209,255,188,1,
203,1,216,255,188,1,203,1,217,255,233,1,203,1,219,255,211,1,203,1,221,255,
188,1,204,1,199,0,23,1,204,1,217,0,23,1,204,1,221,255,233,1,204,1,224,0,45,
1,205,1,199,255,233,1,205,1,202,255,211,1,205,1,203,255,233,1,205,1,205,255,
233,1,205,1,209,255,233,1,205,1,212,255,233,1,205,1,215,255,233,1,205,1,217,
255,233,1,205,1,218,255,233,1,205,1,221,255,188,1,205,1,224,255,211,1,208,
1,198,0,45,1,208,1,199,0,45,1,208,1,203,0,23,1,208,1,205,0,23,1,208,1,209,
0,23,1,208,1,212,0,23,1,208,1,215,0,23,1,208,1,216,0,23,1,208,1,217,0,23,
1,208,1,227,0,23,1,209,1,212,0,23,1,209,1,221,255,211,1,210,1,199,255,233,
1,210,1,205,255,233,1,210,1,217,0,23,1,212,1,202,255,211,1,212,1,204,255,
233,1,212,1,205,255,233,1,212,1,209,255,211,1,212,1,216,255,211,1,212,1,217,
255,233,1,212,1,219,255,233,1,212,1,221,255,211,1,214,1,202,255,209,1,214,
1,205,255,233,1,214,1,209,255,186,1,214,1,216,255,211,1,214,1,217,255,233,
1,214,1,219,255,233,1,214,1,221,255,211,1,214,1,229,255,233,1,215,1,204,0,
23,1,215,1,212,0,23,1,215,1,221,255,233,1,215,1,227,0,23,1,216,0,15,255,29,
1,216,0,17,255,29,1,216,1,198,255,233,1,216,1,202,255,188,1,216,1,203,255,
233,1,216,1,204,0,68,1,216,1,209,255,211,1,216,1,212,255,233,1,216,1,215,
255,233,1,216,1,217,0,23,1,217,0,15,255,51,1,217,0,17,255,51,1,217,0,123,
0,23,1,217,1,198,255,233,1,217,1,199,0,23,1,217,1,202,255,188,1,217,1,203,
255,233,1,217,1,204,0,23,1,217,1,209,255,211,1,217,1,210,255,233,1,217,1,
212,255,231,1,217,1,214,255,233,1,217,1,215,255,233,1,217,1,218,255,233,1,
217,1,227,255,233,1,217,1,229,255,233,1,218,1,199,255,233,1,218,1,202,255,
211,1,218,1,209,255,211,1,218,1,216,255,211,1,218,1,217,255,233,1,218,1,221,
255,211,1,218,1,229,255,233,1,219,1,198,255,233,1,219,1,199,255,233,1,219,
1,203,255,233,1,219,1,205,255,233,1,219,1,212,255,233,1,219,1,215,255,233,
1,219,1,216,255,233,1,219,1,218,255,233,1,219,1,221,255,211,1,220,1,203,255,
233,1,220,1,205,255,233,1,220,1,212,255,233,1,220,1,215,255,233,1,223,1,203,
255,233,1,223,1,212,255,233,1,223,1,217,0,23,1,226,1,216,255,96,1,226,1,221,
255,119,1,227,1,202,255,211,1,227,1,203,0,23,1,227,1,205,255,233,1,227,1,
209,255,211,1,227,1,212,0,23,1,227,1,216,255,211,1,227,1,219,255,233,1,227,
1,229,255,233,1,228,1,202,255,211,1,228,1,204,255,233,1,228,1,209,255,211,
1,228,1,210,255,233,1,228,1,216,255,211,1,228,1,219,255,233,1,228,1,221,255,
211,1,242,0,15,255,51,1,242,0,17,255,51,1,244,0,15,255,6,1,244,0,17,255,6,
1,244,0,29,255,211,1,244,0,30,255,211,1,244,0,108,255,96,1,244,0,123,255,
96,1,244,1,255,255,211,2,2,2,2,255,219,2,3,0,3,255,180,2,3,0,86,255,219,2,
3,2,3,255,219,2,8,1,153,255,96,2,8,1,162,255,96,2,8,1,184,255,96,2,8,1,189,
255,188,2,8,1,192,255,188,0,0,0,0,0,28,1,86,0,1,0,0,0,0,0,0,0,64,0,130,0,
1,0,0,0,0,0,1,0,15,0,227,0,1,0,0,0,0,0,2,0,7,1,3,0,1,0,0,0,0,0,3,0,26,1,65,
0,1,0,0,0,0,0,4,0,15,1,124,0,1,0,0,0,0,0,5,0,12,1,166,0,1,0,0,0,0,0,6,0,14,
1,209,0,1,0,0,0,0,0,7,0,122,2,214,0,1,0,0,0,0,0,8,0,20,3,123,0,1,0,0,0,0,
0,9,0,14,3,174,0,1,0,0,0,0,0,11,0,28,3,247,0,1,0,0,0,0,0,12,0,46,4,114,0,
1,0,0,0,0,0,13,0,127,5,161,0,1,0,0,0,0,0,14,0,43,6,121,0,3,0,1,4,9,0,0,0,
128,0,0,0,3,0,1,4,9,0,1,0,30,0,195,0,3,0,1,4,9,0,2,0,14,0,243,0,3,0,1,4,9,
0,3,0,52,1,11,0,3,0,1,4,9,0,4,0,30,1,92,0,3,0,1,4,9,0,5,0,24,1,140,0,3,0,
1,4,9,0,6,0,28,1,179,0,3,0,1,4,9,0,7,0,244,1,224,0,3,0,1,4,9,0,8,0,40,3,81,
0,3,0,1,4,9,0,9,0,28,3,144,0,3,0,1,4,9,0,11,0,56,3,189,0,3,0,1,4,9,0,12,0,
92,4,20,0,3,0,1,4,9,0,13,0,254,4,161,0,3,0,1,4,9,0,14,0,86,6,33,0,68,0,105,
0,103,0,105,0,116,0,105,0,122,0,101,0,100,0,32,0,100,0,97,0,116,0,97,0,32,
0,169,0,32,0,50,0,48,0,48,0,55,0,32,0,65,0,115,0,99,0,101,0,110,0,100,0,101,
0,114,0,32,0,67,0,111,0,114,0,112,0,111,0,114,0,97,0,116,0,105,0,111,0,110,
0,46,0,32,0,65,0,108,0,108,0,32,0,114,0,105,0,103,0,104,0,116,0,115,0,32,
0,114,0,101,0,115,0,101,0,114,0,118,0,101,0,100,0,46,0,0,68,105,103,105,116,
105,122,101,100,32,100,97,116,97,32,169,32,50,48,48,55,32,65,115,99,101,110,
100,101,114,32,67,111,114,112,111,114,97,116,105,111,110,46,32,65,108,108,
32,114,105,103,104,116,115,32,114,101,115,101,114,118,101,100,46,0,0,76,0,
105,0,98,0,101,0,114,0,97,0,116,0,105,0,111,0,110,0,32,0,83,0,97,0,110,0,
115,0,0,76,105,98,101,114,97,116,105,111,110,32,83,97,110,115,0,0,82,0,101,
0,103,0,117,0,108,0,97,0,114,0,0,82,101,103,117,108,97,114,0,0,65,0,115,0,
99,0,101,0,110,0,100,0,101,0,114,0,32,0,45,0,32,0,76,0,105,0,98,0,101,0,114,
0,97,0,116,0,105,0,111,0,110,0,32,0,83,0,97,0,110,0,115,0,0,65,115,99,101,
110,100,101,114,32,45,32,76,105,98,101,114,97,116,105,111,110,32,83,97,110,
115,0,0,76,0,105,0,98,0,101,0,114,0,97,0,116,0,105,0,111,0,110,0,32,0,83,
0,97,0,110,0,115,0,0,76,105,98,101,114,97,116,105,111,110,32,83,97,110,115,
0,0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,32,0,49,0,46,0,48,0,50,0,0,86,
101,114,115,105,111,110,32,49,46,48,50,0,0,76,0,105,0,98,0,101,0,114,0,97,
0,116,0,105,0,111,0,110,0,83,0,97,0,110,0,115,0,0,76,105,98,101,114,97,116,
105,111,110,83,97,110,115,0,0,76,0,105,0,98,0,101,0,114,0,97,0,116,0,105,
0,111,0,110,0,32,0,105,0,115,0,32,0,97,0,32,0,116,0,114,0,97,0,100,0,101,
0,109,0,97,0,114,0,107,0,32,0,111,0,102,0,32,0,82,0,101,0,100,0,32,0,72,0,
97,0,116,0,44,0,32,0,73,0,110,0,99,0,46,0,32,0,114,0,101,0,103,0,105,0,115,
0,116,0,101,0,114,0,101,0,100,0,32,0,105,0,110,0,32,0,85,0,46,0,83,0,46,0,
32,0,80,0,97,0,116,0,101,0,110,0,116,0,32,0,97,0,110,0,100,0,32,0,84,0,114,
0,97,0,100,0,101,0,109,0,97,0,114,0,107,0,32,0,79,0,102,0,102,0,105,0,99,
0,101,0,32,0,97,0,110,0,100,0,32,0,99,0,101,0,114,0,116,0,97,0,105,0,110,
0,32,0,111,0,116,0,104,0,101,0,114,0,32,0,106,0,117,0,114,0,105,0,115,0,100,
0,105,0,99,0,116,0,105,0,111,0,110,0,115,0,46,0,0,76,105,98,101,114,97,116,
105,111,110,32,105,115,32,97,32,116,114,97,100,101,109,97,114,107,32,111,
102,32,82,101,100,32,72,97,116,44,32,73,110,99,46,32,114,101,103,105,115,
116,101,114,101,100,32,105,110,32,85,46,83,46,32,80,97,116,101,110,116,32,
97,110,100,32,84,114,97,100,101,109,97,114,107,32,79,102,102,105,99,101,32,
97,110,100,32,99,101,114,116,97,105,110,32,111,116,104,101,114,32,106,117,
114,105,115,100,105,99,116,105,111,110,115,46,0,0,65,0,115,0,99,0,101,0,110,
0,100,0,101,0,114,0,32,0,67,0,111,0,114,0,112,0,111,0,114,0,97,0,116,0,105,
0,111,0,110,0,0,65,115,99,101,110,100,101,114,32,67,111,114,112,111,114,97,
116,105,111,110,0,0,83,0,116,0,101,0,118,0,101,0,32,0,77,0,97,0,116,0,116,
0,101,0,115,0,111,0,110,0,0,83,116,101,118,101,32,77,97,116,116,101,115,111,
110,0,0,104,0,116,0,116,0,112,0,58,0,47,0,47,0,119,0,119,0,119,0,46,0,97,
0,115,0,99,0,101,0,110,0,100,0,101,0,114,0,99,0,111,0,114,0,112,0,46,0,99,
0,111,0,109,0,47,0,0,104,116,116,112,58,47,47,119,119,119,46,97,115,99,101,
110,100,101,114,99,111,114,112,46,99,111,109,47,0,0,104,0,116,0,116,0,112,
0,58,0,47,0,47,0,119,0,119,0,119,0,46,0,97,0,115,0,99,0,101,0,110,0,100,0,
101,0,114,0,99,0,111,0,114,0,112,0,46,0,99,0,111,0,109,0,47,0,116,0,121,0,
112,0,101,0,100,0,101,0,115,0,105,0,103,0,110,0,101,0,114,0,115,0,46,0,104,
0,116,0,109,0,108,0,0,104,116,116,112,58,47,47,119,119,119,46,97,115,99,101,
110,100,101,114,99,111,114,112,46,99,111,109,47,116,121,112,101,100,101,115,
105,103,110,101,114,115,46,104,116,109,108,0,0,85,0,115,0,101,0,32,0,111,
0,102,0,32,0,116,0,104,0,105,0,115,0,32,0,76,0,105,0,98,0,101,0,114,0,97,
0,116,0,105,0,111,0,110,0,32,0,102,0,111,0,110,0,116,0,32,0,115,0,111,0,102,
0,116,0,119,0,97,0,114,0,101,0,32,0,105,0,115,0,32,0,115,0,117,0,98,0,106,
0,101,0,99,0,116,0,32,0,116,0,111,0,32,0,116,0,104,0,101,0,32,0,108,0,105,
0,99,0,101,0,110,0,115,0,101,0,32,0,97,0,103,0,114,0,101,0,101,0,109,0,101,
0,110,0,116,0,32,0,117,0,110,0,100,0,101,0,114,0,32,0,119,0,104,0,105,0,99,
0,104,0,32,0,121,0,111,0,117,0,32,0,97,0,99,0,99,0,101,0,112,0,116,0,101,
0,100,0,32,0,116,0,104,0,101,0,32,0,76,0,105,0,98,0,101,0,114,0,97,0,116,
0,105,0,111,0,110,0,32,0,102,0,111,0,110,0,116,0,32,0,115,0,111,0,102,0,116,
0,119,0,97,0,114,0,101,0,46,0,0,85,115,101,32,111,102,32,116,104,105,115,
32,76,105,98,101,114,97,116,105,111,110,32,102,111,110,116,32,115,111,102,
116,119,97,114,101,32,105,115,32,115,117,98,106,101,99,116,32,116,111,32,
116,104,101,32,108,105,99,101,110,115,101,32,97,103,114,101,101,109,101,110,
116,32,117,110,100,101,114,32,119,104,105,99,104,32,121,111,117,32,97,99,
99,101,112,116,101,100,32,116,104,101,32,76,105,98,101,114,97,116,105,111,
110,32,102,111,110,116,32,115,111,102,116,119,97,114,101,46,0,0,104,0,116,
0,116,0,112,0,58,0,47,0,47,0,119,0,119,0,119,0,46,0,97,0,115,0,99,0,101,0,
110,0,100,0,101,0,114,0,99,0,111,0,114,0,112,0,46,0,99,0,111,0,109,0,47,0,
108,0,105,0,98,0,101,0,114,0,97,0,116,0,105,0,111,0,110,0,46,0,104,0,116,
0,109,0,108,0,0,104,116,116,112,58,47,47,119,119,119,46,97,115,99,101,110,
100,101,114,99,111,114,112,46,99,111,109,47,108,105,98,101,114,97,116,105,
111,110,46,104,116,109,108,0,0,0,2,0,0,0,0,0,0,255,39,0,150,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,2,156,0,0,0,1,0,2,1,2,0,4,0,5,0,6,0,7,0,8,0,9,0,
10,0,11,0,12,0,13,0,14,0,15,1,3,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,
25,0,26,0,27,0,28,0,29,1,4,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,
40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,
0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,
0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,
0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,163,0,
132,0,133,0,189,0,150,0,232,0,134,0,142,0,139,0,157,0,169,0,164,0,138,0,218,
0,131,0,147,1,5,1,6,0,141,1,7,0,136,1,8,0,222,1,9,0,158,0,170,0,245,0,244,
0,246,0,162,0,173,0,201,0,199,0,174,0,98,0,99,0,144,0,100,0,203,0,101,0,200,
0,202,0,207,0,204,0,205,0,206,0,233,0,102,0,211,0,208,0,209,0,175,0,103,0,
240,0,145,0,214,0,212,0,213,0,104,0,235,0,237,0,137,0,106,0,105,0,107,0,109,
0,108,0,110,0,160,0,111,0,113,0,112,0,114,0,115,0,117,0,116,0,118,0,119,0,
234,0,120,0,122,0,121,0,123,0,125,0,124,0,184,0,161,0,127,0,126,0,128,0,129,
0,236,0,238,0,186,1,10,1,11,1,12,1,13,1,14,1,15,0,253,0,254,1,16,1,17,1,18,
1,19,0,255,1,0,1,20,1,21,1,22,1,1,1,23,1,24,1,25,1,26,1,27,1,28,1,29,1,30,
1,31,1,32,1,33,1,34,0,248,0,249,1,35,1,36,1,37,1,38,1,39,1,40,1,41,1,42,1,
43,1,44,1,45,1,46,1,47,1,48,1,49,1,50,0,250,0,215,1,51,1,52,1,53,1,54,1,55,
1,56,1,57,1,58,1,59,1,60,1,61,1,62,1,63,1,64,1,65,0,226,0,227,1,66,1,67,1,
68,1,69,1,70,1,71,1,72,1,73,1,74,1,75,1,76,1,77,1,78,1,79,1,80,0,176,0,177,
1,81,1,82,1,83,1,84,1,85,1,86,1,87,1,88,1,89,1,90,0,251,0,252,0,228,0,229,
1,91,1,92,1,93,1,94,1,95,1,96,1,97,1,98,1,99,1,100,1,101,1,102,1,103,1,104,
1,105,1,106,1,107,1,108,1,109,1,110,1,111,1,112,0,187,1,113,1,114,1,115,1,
116,0,230,0,231,1,117,0,166,1,118,1,119,1,120,1,121,1,122,1,123,0,216,0,225,
1,124,0,219,0,220,0,221,0,224,0,217,0,223,1,125,1,126,1,127,1,128,1,129,1,
130,1,131,1,132,1,133,1,134,1,135,1,136,1,137,1,138,0,168,1,139,1,140,1,141,
1,142,1,143,1,144,1,145,1,146,1,147,1,148,1,149,1,150,1,151,1,152,1,153,1,
154,1,155,1,156,1,157,0,159,1,158,1,159,1,160,1,161,1,162,1,163,1,164,1,165,
1,166,1,167,1,168,1,169,1,170,1,171,1,172,1,173,1,174,1,175,0,151,1,176,1,
177,1,178,0,155,1,179,1,180,1,181,1,182,1,183,1,184,1,185,1,186,1,187,1,188,
1,189,1,190,1,191,1,192,1,193,1,194,1,195,1,196,1,197,1,198,1,199,1,200,1,
201,1,202,1,203,1,204,1,205,1,206,1,207,1,208,1,209,1,210,1,211,1,212,1,213,
1,214,1,215,1,216,1,217,1,218,1,219,1,220,1,221,1,222,1,223,1,224,1,225,1,
226,1,227,1,228,1,229,1,230,1,231,1,232,1,233,1,234,1,235,1,236,1,237,1,238,
1,239,1,240,1,241,1,242,1,243,1,244,1,245,1,246,1,247,1,248,1,249,1,250,1,
251,1,252,1,253,1,254,1,255,2,0,2,1,2,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10,
2,11,2,12,2,13,2,14,2,15,2,16,2,17,2,18,2,19,2,20,2,21,2,22,2,23,2,24,2,25,
2,26,2,27,2,28,2,29,2,30,2,31,2,32,2,33,2,34,2,35,2,36,2,37,2,38,0,178,0,
179,2,39,2,40,0,182,0,183,0,196,2,41,0,180,0,181,0,197,0,130,0,194,0,135,
0,171,0,198,2,42,2,43,0,190,0,191,2,44,2,45,2,46,2,47,0,247,2,48,2,49,2,50,
2,51,2,52,2,53,0,140,2,54,2,55,2,56,2,57,2,58,2,59,2,60,2,61,2,62,2,63,2,
64,2,65,2,66,0,152,2,67,0,154,0,153,0,239,0,165,0,146,2,68,2,69,0,156,0,167,
0,143,2,70,0,148,0,149,2,71,2,72,2,73,2,74,2,75,2,76,2,77,2,78,2,79,2,80,
2,81,2,82,2,83,2,84,2,85,2,86,2,87,2,88,2,89,2,90,2,91,2,92,2,93,2,94,2,95,
2,96,2,97,2,98,2,99,2,100,2,101,2,102,2,103,2,104,2,105,2,106,2,107,2,108,
2,109,2,110,2,111,2,112,2,113,2,114,2,115,2,116,2,117,2,118,2,119,2,120,2,
121,2,122,2,123,2,124,2,125,2,126,2,127,2,128,2,129,2,130,2,131,0,185,2,132,
2,133,2,134,2,135,2,136,2,137,2,138,2,139,2,140,2,141,2,142,2,143,2,144,2,
145,2,146,2,147,2,148,2,149,2,150,2,151,2,152,2,153,2,154,2,155,2,156,2,157,
2,158,2,159,2,160,2,161,2,162,2,163,2,164,2,165,2,166,2,167,7,117,110,105,
48,48,65,48,7,117,110,105,48,48,65,68,7,117,110,105,48,51,55,69,7,117,110,
105,48,48,66,50,7,117,110,105,48,48,66,51,7,117,110,105,48,48,66,53,7,117,
110,105,50,50,49,57,7,117,110,105,48,48,66,57,7,65,109,97,99,114,111,110,
7,97,109,97,99,114,111,110,6,65,98,114,101,118,101,6,97,98,114,101,118,101,
7,65,111,103,111,110,101,107,7,97,111,103,111,110,101,107,11,67,99,105,114,
99,117,109,102,108,101,120,11,99,99,105,114,99,117,109,102,108,101,120,10,
67,100,111,116,97,99,99,101,110,116,10,99,100,111,116,97,99,99,101,110,116,
6,68,99,97,114,111,110,6,100,99,97,114,111,110,6,68,99,114,111,97,116,7,69,
109,97,99,114,111,110,7,101,109,97,99,114,111,110,6,69,98,114,101,118,101,
6,101,98,114,101,118,101,10,69,100,111,116,97,99,99,101,110,116,10,101,100,
111,116,97,99,99,101,110,116,7,69,111,103,111,110,101,107,7,101,111,103,111,
110,101,107,6,69,99,97,114,111,110,6,101,99,97,114,111,110,11,71,99,105,114,
99,117,109,102,108,101,120,11,103,99,105,114,99,117,109,102,108,101,120,10,
71,100,111,116,97,99,99,101,110,116,10,103,100,111,116,97,99,99,101,110,116,
12,71,99,111,109,109,97,97,99,99,101,110,116,12,103,99,111,109,109,97,97,
99,99,101,110,116,11,72,99,105,114,99,117,109,102,108,101,120,11,104,99,105,
114,99,117,109,102,108,101,120,4,72,98,97,114,4,104,98,97,114,6,73,116,105,
108,100,101,6,105,116,105,108,100,101,7,73,109,97,99,114,111,110,7,105,109,
97,99,114,111,110,6,73,98,114,101,118,101,6,105,98,114,101,118,101,7,73,111,
103,111,110,101,107,7,105,111,103,111,110,101,107,2,73,74,2,105,106,11,74,
99,105,114,99,117,109,102,108,101,120,11,106,99,105,114,99,117,109,102,108,
101,120,12,75,99,111,109,109,97,97,99,99,101,110,116,12,107,99,111,109,109,
97,97,99,99,101,110,116,12,107,103,114,101,101,110,108,97,110,100,105,99,
6,76,97,99,117,116,101,6,108,97,99,117,116,101,12,76,99,111,109,109,97,97,
99,99,101,110,116,12,108,99,111,109,109,97,97,99,99,101,110,116,6,76,99,97,
114,111,110,6,108,99,97,114,111,110,4,76,100,111,116,4,108,100,111,116,6,
78,97,99,117,116,101,6,110,97,99,117,116,101,12,78,99,111,109,109,97,97,99,
99,101,110,116,12,110,99,111,109,109,97,97,99,99,101,110,116,6,78,99,97,114,
111,110,6,110,99,97,114,111,110,11,110,97,112,111,115,116,114,111,112,104,
101,3,69,110,103,3,101,110,103,7,79,109,97,99,114,111,110,7,111,109,97,99,
114,111,110,6,79,98,114,101,118,101,6,111,98,114,101,118,101,13,79,104,117,
110,103,97,114,117,109,108,97,117,116,13,111,104,117,110,103,97,114,117,109,
108,97,117,116,6,82,97,99,117,116,101,6,114,97,99,117,116,101,12,82,99,111,
109,109,97,97,99,99,101,110,116,12,114,99,111,109,109,97,97,99,99,101,110,
116,6,82,99,97,114,111,110,6,114,99,97,114,111,110,6,83,97,99,117,116,101,
6,115,97,99,117,116,101,11,83,99,105,114,99,117,109,102,108,101,120,11,115,
99,105,114,99,117,109,102,108,101,120,12,84,99,111,109,109,97,97,99,99,101,
110,116,12,116,99,111,109,109,97,97,99,99,101,110,116,6,84,99,97,114,111,
110,6,116,99,97,114,111,110,4,84,98,97,114,4,116,98,97,114,6,85,116,105,108,
100,101,6,117,116,105,108,100,101,7,85,109,97,99,114,111,110,7,117,109,97,
99,114,111,110,6,85,98,114,101,118,101,6,117,98,114,101,118,101,5,85,114,
105,110,103,5,117,114,105,110,103,13,85,104,117,110,103,97,114,117,109,108,
97,117,116,13,117,104,117,110,103,97,114,117,109,108,97,117,116,7,85,111,
103,111,110,101,107,7,117,111,103,111,110,101,107,11,87,99,105,114,99,117,
109,102,108,101,120,11,119,99,105,114,99,117,109,102,108,101,120,11,89,99,
105,114,99,117,109,102,108,101,120,11,121,99,105,114,99,117,109,102,108,101,
120,6,90,97,99,117,116,101,6,122,97,99,117,116,101,10,90,100,111,116,97,99,
99,101,110,116,10,122,100,111,116,97,99,99,101,110,116,5,108,111,110,103,
115,10,65,114,105,110,103,97,99,117,116,101,10,97,114,105,110,103,97,99,117,
116,101,7,65,69,97,99,117,116,101,7,97,101,97,99,117,116,101,11,79,115,108,
97,115,104,97,99,117,116,101,11,111,115,108,97,115,104,97,99,117,116,101,
7,117,110,105,48,50,67,57,5,116,111,110,111,115,13,100,105,101,114,101,115,
105,115,116,111,110,111,115,10,65,108,112,104,97,116,111,110,111,115,9,97,
110,111,116,101,108,101,105,97,12,69,112,115,105,108,111,110,116,111,110,
111,115,8,69,116,97,116,111,110,111,115,9,73,111,116,97,116,111,110,111,115,
12,79,109,105,99,114,111,110,116,111,110,111,115,12,85,112,115,105,108,111,
110,116,111,110,111,115,10,79,109,101,103,97,116,111,110,111,115,17,105,111,
116,97,100,105,101,114,101,115,105,115,116,111,110,111,115,5,65,108,112,104,
97,4,66,101,116,97,5,71,97,109,109,97,7,69,112,115,105,108,111,110,4,90,101,
116,97,3,69,116,97,5,84,104,101,116,97,4,73,111,116,97,5,75,97,112,112,97,
6,76,97,109,98,100,97,2,77,117,2,78,117,2,88,105,7,79,109,105,99,114,111,
110,2,80,105,3,82,104,111,5,83,105,103,109,97,3,84,97,117,7,85,112,115,105,
108,111,110,3,80,104,105,3,67,104,105,3,80,115,105,12,73,111,116,97,100,105,
101,114,101,115,105,115,15,85,112,115,105,108,111,110,100,105,101,114,101,
115,105,115,10,97,108,112,104,97,116,111,110,111,115,12,101,112,115,105,108,
111,110,116,111,110,111,115,8,101,116,97,116,111,110,111,115,9,105,111,116,
97,116,111,110,111,115,20,117,112,115,105,108,111,110,100,105,101,114,101,
115,105,115,116,111,110,111,115,5,97,108,112,104,97,4,98,101,116,97,5,103,
97,109,109,97,5,100,101,108,116,97,7,101,112,115,105,108,111,110,4,122,101,
116,97,3,101,116,97,5,116,104,101,116,97,4,105,111,116,97,5,107,97,112,112,
97,6,108,97,109,98,100,97,2,110,117,2,120,105,7,111,109,105,99,114,111,110,
3,114,104,111,6,115,105,103,109,97,49,5,115,105,103,109,97,3,116,97,117,7,
117,112,115,105,108,111,110,3,112,104,105,3,99,104,105,3,112,115,105,5,111,
109,101,103,97,12,105,111,116,97,100,105,101,114,101,115,105,115,15,117,112,
115,105,108,111,110,100,105,101,114,101,115,105,115,12,111,109,105,99,114,
111,110,116,111,110,111,115,12,117,112,115,105,108,111,110,116,111,110,111,
115,10,111,109,101,103,97,116,111,110,111,115,9,97,102,105,105,49,48,48,50,
51,9,97,102,105,105,49,48,48,53,49,9,97,102,105,105,49,48,48,53,50,9,97,102,
105,105,49,48,48,53,51,9,97,102,105,105,49,48,48,53,52,9,97,102,105,105,49,
48,48,53,53,9,97,102,105,105,49,48,48,53,54,9,97,102,105,105,49,48,48,53,
55,9,97,102,105,105,49,48,48,53,56,9,97,102,105,105,49,48,48,53,57,9,97,102,
105,105,49,48,48,54,48,9,97,102,105,105,49,48,48,54,49,9,97,102,105,105,49,
48,48,54,50,9,97,102,105,105,49,48,49,52,53,9,97,102,105,105,49,48,48,49,
55,9,97,102,105,105,49,48,48,49,56,9,97,102,105,105,49,48,48,49,57,9,97,102,
105,105,49,48,48,50,48,9,97,102,105,105,49,48,48,50,49,9,97,102,105,105,49,
48,48,50,50,9,97,102,105,105,49,48,48,50,52,9,97,102,105,105,49,48,48,50,
53,9,97,102,105,105,49,48,48,50,54,9,97,102,105,105,49,48,48,50,55,9,97,102,
105,105,49,48,48,50,56,9,97,102,105,105,49,48,48,50,57,9,97,102,105,105,49,
48,48,51,48,9,97,102,105,105,49,48,48,51,49,9,97,102,105,105,49,48,48,51,
50,9,97,102,105,105,49,48,48,51,51,9,97,102,105,105,49,48,48,51,52,9,97,102,
105,105,49,48,48,51,53,9,97,102,105,105,49,48,48,51,54,9,97,102,105,105,49,
48,48,51,55,9,97,102,105,105,49,48,48,51,56,9,97,102,105,105,49,48,48,51,
57,9,97,102,105,105,49,48,48,52,48,9,97,102,105,105,49,48,48,52,49,9,97,102,
105,105,49,48,48,52,50,9,97,102,105,105,49,48,48,52,51,9,97,102,105,105,49,
48,48,52,52,9,97,102,105,105,49,48,48,52,53,9,97,102,105,105,49,48,48,52,
54,9,97,102,105,105,49,48,48,52,55,9,97,102,105,105,49,48,48,52,56,9,97,102,
105,105,49,48,48,52,57,9,97,102,105,105,49,48,48,54,53,9,97,102,105,105,49,
48,48,54,54,9,97,102,105,105,49,48,48,54,55,9,97,102,105,105,49,48,48,54,
56,9,97,102,105,105,49,48,48,54,57,9,97,102,105,105,49,48,48,55,48,9,97,102,
105,105,49,48,48,55,50,9,97,102,105,105,49,48,48,55,51,9,97,102,105,105,49,
48,48,55,52,9,97,102,105,105,49,48,48,55,53,9,97,102,105,105,49,48,48,55,
54,9,97,102,105,105,49,48,48,55,55,9,97,102,105,105,49,48,48,55,56,9,97,102,
105,105,49,48,48,55,57,9,97,102,105,105,49,48,48,56,48,9,97,102,105,105,49,
48,48,56,49,9,97,102,105,105,49,48,48,56,50,9,97,102,105,105,49,48,48,56,
51,9,97,102,105,105,49,48,48,56,52,9,97,102,105,105,49,48,48,56,53,9,97,102,
105,105,49,48,48,56,54,9,97,102,105,105,49,48,48,56,55,9,97,102,105,105,49,
48,48,56,56,9,97,102,105,105,49,48,48,56,57,9,97,102,105,105,49,48,48,57,
48,9,97,102,105,105,49,48,48,57,49,9,97,102,105,105,49,48,48,57,50,9,97,102,
105,105,49,48,48,57,51,9,97,102,105,105,49,48,48,57,52,9,97,102,105,105,49,
48,48,57,53,9,97,102,105,105,49,48,48,57,54,9,97,102,105,105,49,48,48,57,
55,9,97,102,105,105,49,48,48,55,49,9,97,102,105,105,49,48,48,57,57,9,97,102,
105,105,49,48,49,48,48,9,97,102,105,105,49,48,49,48,49,9,97,102,105,105,49,
48,49,48,50,9,97,102,105,105,49,48,49,48,51,9,97,102,105,105,49,48,49,48,
52,9,97,102,105,105,49,48,49,48,53,9,97,102,105,105,49,48,49,48,54,9,97,102,
105,105,49,48,49,48,55,9,97,102,105,105,49,48,49,48,56,9,97,102,105,105,49,
48,49,48,57,9,97,102,105,105,49,48,49,49,48,9,97,102,105,105,49,48,49,57,
51,9,97,102,105,105,49,48,48,53,48,9,97,102,105,105,49,48,48,57,56,6,87,103,
114,97,118,101,6,119,103,114,97,118,101,6,87,97,99,117,116,101,6,119,97,99,
117,116,101,9,87,100,105,101,114,101,115,105,115,9,119,100,105,101,114,101,
115,105,115,6,89,103,114,97,118,101,6,121,103,114,97,118,101,9,97,102,105,
105,48,48,50,48,56,13,117,110,100,101,114,115,99,111,114,101,100,98,108,13,
113,117,111,116,101,114,101,118,101,114,115,101,100,6,109,105,110,117,116,
101,6,115,101,99,111,110,100,9,101,120,99,108,97,109,100,98,108,7,117,110,
105,50,48,51,69,7,117,110,105,50,50,49,53,7,117,110,105,50,48,55,70,4,108,
105,114,97,6,112,101,115,101,116,97,4,69,117,114,111,9,97,102,105,105,54,
49,50,52,56,9,97,102,105,105,54,49,50,56,57,9,97,102,105,105,54,49,51,53,
50,7,117,110,105,50,49,50,54,9,101,115,116,105,109,97,116,101,100,9,111,110,
101,101,105,103,104,116,104,12,116,104,114,101,101,101,105,103,104,116,104,
115,11,102,105,118,101,101,105,103,104,116,104,115,12,115,101,118,101,110,
101,105,103,104,116,104,115,9,97,114,114,111,119,108,101,102,116,7,97,114,
114,111,119,117,112,10,97,114,114,111,119,114,105,103,104,116,9,97,114,114,
111,119,100,111,119,110,9,97,114,114,111,119,98,111,116,104,9,97,114,114,
111,119,117,112,100,110,12,97,114,114,111,119,117,112,100,110,98,115,101,
7,117,110,105,50,50,48,54,10,111,114,116,104,111,103,111,110,97,108,12,105,
110,116,101,114,115,101,99,116,105,111,110,11,101,113,117,105,118,97,108,
101,110,99,101,5,104,111,117,115,101,13,114,101,118,108,111,103,105,99,97,
108,110,111,116,10,105,110,116,101,103,114,97,108,116,112,10,105,110,116,
101,103,114,97,108,98,116,8,83,70,49,48,48,48,48,48,8,83,70,49,49,48,48,48,
48,8,83,70,48,49,48,48,48,48,8,83,70,48,51,48,48,48,48,8,83,70,48,50,48,48,
48,48,8,83,70,48,52,48,48,48,48,8,83,70,48,56,48,48,48,48,8,83,70,48,57,48,
48,48,48,8,83,70,48,54,48,48,48,48,8,83,70,48,55,48,48,48,48,8,83,70,48,53,
48,48,48,48,8,83,70,52,51,48,48,48,48,8,83,70,50,52,48,48,48,48,8,83,70,53,
49,48,48,48,48,8,83,70,53,50,48,48,48,48,8,83,70,51,57,48,48,48,48,8,83,70,
50,50,48,48,48,48,8,83,70,50,49,48,48,48,48,8,83,70,50,53,48,48,48,48,8,83,
70,53,48,48,48,48,48,8,83,70,52,57,48,48,48,48,8,83,70,51,56,48,48,48,48,
8,83,70,50,56,48,48,48,48,8,83,70,50,55,48,48,48,48,8,83,70,50,54,48,48,48,
48,8,83,70,51,54,48,48,48,48,8,83,70,51,55,48,48,48,48,8,83,70,52,50,48,48,
48,48,8,83,70,49,57,48,48,48,48,8,83,70,50,48,48,48,48,48,8,83,70,50,51,48,
48,48,48,8,83,70,52,55,48,48,48,48,8,83,70,52,56,48,48,48,48,8,83,70,52,49,
48,48,48,48,8,83,70,52,53,48,48,48,48,8,83,70,52,54,48,48,48,48,8,83,70,52,
48,48,48,48,48,8,83,70,53,52,48,48,48,48,8,83,70,53,51,48,48,48,48,8,83,70,
52,52,48,48,48,48,7,117,112,98,108,111,99,107,7,100,110,98,108,111,99,107,
5,98,108,111,99,107,7,108,102,98,108,111,99,107,7,114,116,98,108,111,99,107,
7,108,116,115,104,97,100,101,5,115,104,97,100,101,7,100,107,115,104,97,100,
101,9,102,105,108,108,101,100,98,111,120,6,72,50,50,48,55,51,6,72,49,56,53,
52,51,6,72,49,56,53,53,49,10,102,105,108,108,101,100,114,101,99,116,7,116,
114,105,97,103,117,112,7,116,114,105,97,103,114,116,7,116,114,105,97,103,
100,110,7,116,114,105,97,103,108,102,6,99,105,114,99,108,101,6,72,49,56,53,
51,51,9,105,110,118,98,117,108,108,101,116,9,105,110,118,99,105,114,99,108,
101,10,111,112,101,110,98,117,108,108,101,116,9,115,109,105,108,101,102,97,
99,101,12,105,110,118,115,109,105,108,101,102,97,99,101,3,115,117,110,6,102,
101,109,97,108,101,4,109,97,108,101,5,115,112,97,100,101,4,99,108,117,98,
5,104,101,97,114,116,7,100,105,97,109,111,110,100,11,109,117,115,105,99,97,
108,110,111,116,101,14,109,117,115,105,99,97,108,110,111,116,101,100,98,108,
7,117,110,105,70,66,48,49,7,117,110,105,70,66,48,50,7,117,110,105,70,48,48,
53,6,109,105,100,100,111,116,7,117,110,105,70,48,48,52,7,117,110,105,50,48,
55,52,7,117,110,105,50,48,55,53,7,117,110,105,50,48,55,55,7,117,110,105,50,
48,55,56,8,103,108,121,112,104,53,55,49,8,103,108,121,112,104,53,55,50,8,
103,108,121,112,104,53,55,51,8,103,108,121,112,104,53,55,52,8,103,108,121,
112,104,53,55,53,8,103,108,121,112,104,53,55,54,8,103,108,121,112,104,53,
55,55,8,103,108,121,112,104,53,55,56,8,103,108,121,112,104,53,55,57,8,103,
108,121,112,104,53,56,48,8,103,108,121,112,104,53,56,49,0,0,0,0,0,0,3,0,8,
0,2,0,17,0,1,255,255,0,3,0,1,0,0,0,14,0,0,0,24,0,0,0,0,0,2,0,1,0,1,2,155,
0,1,0,4,0,0,0,2,0,0,0,1,0,0,0,10,0,76,0,78,0,4,68,70,76,84,0,26,99,121,114,
108,0,36,103,114,101,107,0,46,108,97,116,110,0,56,0,4,0,0,0,0,255,255,0,0,
0,4,0,0,0,0,255,255,0,0,0,4,0,0,0,0,255,255,0,0,0,4,0,0,0,0,255,255,0,0,0,
0,0,0,0,1,0,0,0,10,0,84,0,98,0,4,68,70,76,84,0,26,99,121,114,108,0,38,103,
114,101,107,0,50,108,97,116,110,0,62,0,4,0,0,0,0,255,255,0,1,0,0,0,4,0,0,
0,0,255,255,0,1,0,0,0,4,0,0,0,0,255,255,0,1,0,0,0,4,0,0,0,0,255,255,0,1,0,
0,0,1,107,101,114,110,0,8,0,0,0,1,0,0,0,1,0,4,0,2,0,0,0,1,0,8,0,1,15,112,
0,4,0,0,0,105,0,220,1,6,1,12,1,50,1,64,1,94,1,112,1,130,1,204,2,2,2,52,2,
114,2,124,2,138,2,148,2,138,2,158,2,196,2,202,3,28,3,38,3,84,3,118,3,144,
3,166,3,228,3,254,4,20,4,46,4,56,4,190,5,44,5,58,3,28,5,100,5,186,5,204,6,
22,6,28,6,82,6,136,5,186,6,178,6,216,6,230,5,186,7,16,5,186,5,186,5,186,7,
62,7,84,7,90,7,96,7,166,7,224,8,54,8,168,8,194,8,204,8,246,9,24,9,46,9,60,
9,98,9,144,9,242,10,48,10,174,11,72,11,106,11,136,11,146,11,156,11,166,11,
224,12,14,12,64,12,82,12,144,12,210,12,252,13,6,13,44,13,62,13,108,13,150,
13,160,13,174,13,208,13,242,14,4,14,46,14,112,14,142,14,180,14,198,14,212,
14,222,15,0,15,30,15,40,15,70,15,76,15,90,0,10,0,36,255,143,0,55,255,219,
0,60,255,219,1,82,255,143,1,91,255,143,1,94,255,143,1,101,255,143,1,109,255,
219,1,110,255,219,1,116,255,219,0,1,0,20,255,104,0,9,0,3,255,143,0,55,255,
104,0,57,255,104,0,58,255,180,0,60,255,104,0,89,255,219,0,90,255,219,0,92,
255,219,2,3,255,104,0,3,0,15,255,29,0,17,255,29,0,36,255,143,0,7,0,3,255,
180,0,55,255,104,0,57,255,104,0,58,255,104,0,60,255,104,0,92,255,180,2,3,
255,143,0,4,0,3,255,219,0,15,254,248,0,17,254,248,0,36,255,104,0,4,0,55,255,
219,0,57,255,219,0,58,255,219,0,60,255,219,0,18,0,3,255,219,0,15,255,29,0,
16,255,143,0,17,255,29,0,29,255,29,0,30,255,29,0,36,255,104,0,50,255,219,
0,68,255,29,0,70,255,29,0,72,255,29,0,76,255,180,0,82,255,29,0,85,255,180,
0,86,255,29,0,88,255,180,0,90,255,143,0,92,255,143,0,13,0,15,255,68,0,16,
255,143,0,17,255,68,0,29,255,180,0,30,255,180,0,36,255,104,0,68,255,104,0,
72,255,143,0,76,255,219,0,82,255,143,0,85,255,180,0,88,255,180,0,92,255,180,
0,12,0,15,255,143,0,16,255,219,0,17,255,143,0,29,255,219,0,30,255,219,0,36,
255,180,0,68,255,180,0,72,255,219,0,82,255,219,0,85,255,219,0,88,255,219,
0,92,255,238,0,15,0,3,255,219,0,15,254,248,0,16,255,68,0,17,254,248,0,29,
255,143,0,30,255,123,0,36,255,104,0,68,255,104,0,72,255,68,0,76,255,180,0,
82,255,68,0,83,255,104,0,84,255,68,0,88,255,143,0,89,255,143,0,2,0,73,255,
219,2,3,0,37,0,3,0,15,255,143,0,17,255,143,2,3,0,76,0,2,0,15,255,104,0,17,
255,104,0,2,0,15,255,143,0,17,255,143,0,9,1,98,255,213,1,105,255,213,1,109,
255,104,1,110,255,104,1,111,255,197,1,116,255,104,1,124,255,219,1,134,255,
219,1,144,255,219,0,1,1,110,255,190,0,20,1,90,0,170,1,91,255,104,1,94,255,
104,1,98,255,141,1,101,255,104,1,105,255,141,1,111,255,141,1,114,255,158,
1,119,255,104,1,120,255,180,1,122,255,70,1,128,255,104,1,130,255,180,1,131,
255,104,1,133,255,104,1,136,255,70,1,140,255,70,1,143,255,70,1,147,0,98,1,
149,255,70,0,2,1,110,255,209,1,116,255,209,0,11,0,3,255,143,1,98,255,213,
1,105,255,213,1,109,255,104,1,110,255,104,1,111,255,197,1,116,255,104,1,124,
255,219,1,134,255,219,1,144,255,219,2,3,255,104,0,8,0,15,255,31,0,17,255,
31,1,90,0,164,1,91,255,68,1,94,255,68,1,101,255,68,1,130,255,168,1,147,0,
88,0,6,0,3,255,143,1,98,255,213,1,105,255,213,1,109,255,137,1,110,255,104,
1,116,255,104,0,5,1,91,255,219,1,94,255,219,1,101,255,219,1,110,255,190,1,
116,255,190,0,15,1,98,255,193,1,105,255,193,1,111,255,143,1,117,255,231,1,
122,255,231,1,125,255,231,1,127,255,231,1,129,255,231,1,135,255,231,1,136,
255,231,1,140,255,231,1,143,255,231,1,146,255,231,1,149,255,231,1,151,255,
231,0,6,0,3,255,143,1,98,255,213,1,105,255,213,1,109,255,104,1,110,255,104,
1,116,255,104,0,5,1,91,255,219,1,94,255,213,1,101,255,219,1,110,255,190,1,
116,255,190,0,6,0,3,255,219,0,15,254,250,0,17,254,250,1,91,255,104,1,94,255,
104,1,101,255,104,0,2,1,137,255,158,1,141,255,158,0,33,0,3,255,219,0,15,255,
31,0,17,255,31,0,29,255,31,0,30,255,31,1,90,0,188,1,91,255,104,1,94,255,104,
1,98,255,219,1,101,255,104,1,105,255,219,1,111,255,219,1,114,255,219,1,117,
255,31,1,118,255,31,1,121,255,78,1,122,255,31,1,124,255,78,1,126,255,31,1,
128,255,106,1,130,255,180,1,133,255,106,1,134,255,143,1,136,255,31,1,140,
255,31,1,142,255,80,1,143,255,31,1,144,255,143,1,145,255,106,1,147,0,188,
1,148,255,78,1,149,255,31,1,150,255,78,0,27,0,3,255,219,0,15,254,250,0,16,
255,70,0,17,254,250,0,29,255,143,0,30,255,143,1,90,0,188,1,91,255,104,1,94,
255,104,1,98,255,141,1,101,255,104,1,105,255,141,1,111,255,141,1,114,255,
158,1,119,255,104,1,120,255,180,1,122,255,70,1,124,255,158,1,128,255,104,
1,130,255,180,1,131,255,104,1,133,255,104,1,136,255,70,1,140,255,70,1,143,
255,70,1,147,0,121,1,149,255,70,0,3,1,91,255,197,1,110,255,190,1,116,255,
190,0,10,1,117,255,178,1,122,255,178,1,125,255,178,1,129,255,217,1,136,255,
178,1,140,255,178,1,143,255,178,1,146,255,178,1,149,255,178,1,151,255,178,
0,21,0,3,255,219,1,90,0,170,1,91,255,104,1,94,255,104,1,98,255,141,1,101,
255,104,1,105,255,141,1,111,255,141,1,114,255,158,1,119,255,104,1,120,255,
180,1,122,255,70,1,128,255,104,1,130,255,180,1,131,255,104,1,133,255,104,
1,136,255,70,1,140,255,70,1,143,255,70,1,147,0,98,1,149,255,70,0,4,1,132,
255,217,1,137,255,227,1,141,255,227,1,144,255,201,0,18,1,117,255,119,1,119,
255,219,1,122,255,119,1,124,255,170,1,125,255,180,1,128,255,219,1,129,255,
158,1,130,255,219,1,131,255,219,1,134,255,170,1,136,255,119,1,137,255,170,
1,140,255,119,1,141,255,170,1,143,255,119,1,146,255,119,1,149,255,119,1,151,
255,119,0,1,1,132,255,217,0,13,1,117,255,231,1,122,255,231,1,125,255,231,
1,127,255,231,1,129,255,231,1,135,255,231,1,136,255,231,1,139,255,231,1,140,
255,231,1,143,255,231,1,146,255,231,1,149,255,231,1,151,255,231,0,13,1,117,
255,225,1,122,255,225,1,125,255,225,1,135,255,225,1,136,255,225,1,139,255,
209,1,140,255,225,1,142,255,207,1,143,255,219,1,146,255,225,1,149,255,225,
1,150,255,207,1,151,255,225,0,10,1,117,255,201,1,122,255,201,1,125,255,201,
1,127,255,201,1,135,255,201,1,136,255,201,1,139,255,201,1,140,255,201,1,143,
255,201,1,149,255,201,0,9,1,117,255,227,1,122,255,227,1,127,255,227,1,136,
255,227,1,139,255,227,1,140,255,227,1,143,255,227,1,146,255,227,1,151,255,
227,0,3,1,132,255,217,1,137,255,227,1,141,255,227,0,10,1,117,255,227,1,122,
255,227,1,125,255,227,1,127,255,227,1,136,255,227,1,139,255,227,1,140,255,
227,1,143,255,227,1,146,255,227,1,151,255,227,0,11,1,117,255,201,1,122,255,
201,1,125,255,201,1,127,255,201,1,136,255,201,1,139,255,201,1,140,255,201,
1,143,255,201,1,146,255,201,1,149,255,201,1,151,255,201,0,5,0,15,255,6,0,
17,255,6,0,108,255,119,0,123,255,119,1,255,255,211,0,1,2,3,255,96,0,1,2,3,
255,119,0,17,1,170,0,68,1,173,255,233,1,177,0,45,1,180,255,211,1,181,255,
233,1,183,255,211,1,184,255,96,1,185,255,166,1,186,255,188,1,189,255,96,1,
195,255,211,1,198,0,23,1,216,255,211,1,217,255,233,1,218,0,23,1,227,0,45,
2,3,255,141,0,14,1,166,255,211,1,173,255,233,1,180,255,233,1,183,255,233,
1,184,255,164,1,185,255,209,1,186,255,233,1,187,255,211,1,189,255,164,1,192,
255,188,1,195,255,233,1,197,255,233,1,209,255,233,1,217,255,211,0,21,1,166,
255,188,1,170,255,211,1,172,255,211,1,173,255,188,1,177,255,233,1,180,255,
188,1,183,255,188,1,184,255,119,1,185,255,188,1,186,255,188,1,187,255,166,
1,189,255,164,1,192,255,141,1,197,255,188,1,202,255,233,1,210,255,233,1,216,
255,188,1,217,255,233,1,219,255,233,1,221,255,188,1,229,255,233,0,28,0,15,
255,6,0,17,255,6,0,108,255,119,0,123,255,119,1,166,255,119,1,170,255,119,
1,173,255,211,1,177,255,141,1,178,255,209,1,180,255,141,1,183,255,164,1,197,
255,188,1,198,255,141,1,200,255,141,1,202,255,119,1,203,255,119,1,206,255,
141,1,209,255,141,1,210,255,141,1,211,255,141,1,212,255,119,1,214,255,141,
1,217,255,119,1,225,255,141,1,226,255,141,1,228,255,141,1,229,255,119,1,255,
255,211,0,6,1,185,0,23,1,186,255,211,1,189,255,186,1,205,0,68,1,212,0,23,
1,217,0,45,0,2,1,173,255,211,1,215,255,233,0,10,1,173,255,233,1,180,255,211,
1,183,255,233,1,184,0,23,1,185,0,45,1,192,0,45,1,198,0,23,1,203,255,231,1,
212,255,233,1,217,255,233,0,8,1,177,255,233,1,180,255,233,1,183,255,233,1,
184,255,211,1,185,255,233,1,186,255,233,1,189,255,211,1,197,255,233,0,5,1,
173,255,233,1,180,255,233,1,183,255,233,1,185,0,23,1,186,255,186,0,3,1,186,
255,233,1,199,0,23,1,217,0,23,0,9,1,186,255,233,1,189,255,233,1,198,0,23,
1,203,0,23,1,212,0,23,1,215,0,23,1,217,0,23,1,221,255,233,1,227,0,23,0,11,
1,166,255,211,1,170,255,211,1,172,255,211,1,177,255,233,1,185,255,211,1,187,
255,164,1,189,255,211,1,197,255,211,1,202,255,211,1,209,255,233,1,219,255,
233,0,24,0,15,254,125,0,17,254,125,0,29,255,211,0,30,255,211,0,123,255,141,
1,166,255,119,1,170,255,119,1,172,255,233,1,173,255,211,1,177,255,141,1,178,
255,233,1,180,255,211,1,183,255,233,1,184,255,164,1,185,255,211,1,186,255,
233,1,187,255,164,1,197,255,211,1,198,255,188,1,202,255,96,1,203,255,166,
1,212,255,166,1,227,255,211,1,229,255,188,0,15,1,166,255,211,1,170,255,211,
1,173,255,233,1,177,255,188,1,178,255,233,1,180,255,211,1,184,255,188,1,185,
255,188,1,187,255,141,1,189,255,188,1,192,255,186,1,195,255,233,1,198,0,23,
1,204,0,45,1,221,255,233,0,31,0,15,255,29,0,17,255,29,0,108,255,166,0,123,
255,166,1,166,255,188,1,170,255,188,1,172,0,23,1,173,255,233,1,177,255,211,
1,180,255,164,1,186,255,188,1,197,255,211,1,198,255,164,1,200,255,166,1,203,
255,141,1,206,255,166,1,208,255,166,1,209,255,164,1,210,255,166,1,212,255,
96,1,213,255,166,1,214,255,141,1,215,255,141,1,217,255,141,1,219,255,166,
1,223,255,166,1,225,255,166,1,226,255,166,1,228,255,166,1,229,255,141,1,255,
255,211,0,38,0,15,254,240,0,17,254,240,0,29,255,211,0,30,255,211,0,108,255,
166,0,123,255,164,1,166,255,119,1,170,255,164,1,173,255,211,1,177,255,188,
1,180,255,188,1,186,255,188,1,195,255,211,1,197,255,211,1,199,255,211,1,200,
255,141,1,201,255,164,1,202,255,96,1,203,255,119,1,204,255,188,1,205,255,
141,1,206,255,164,1,207,255,188,1,208,255,164,1,209,255,119,1,210,255,164,
1,211,255,164,1,212,255,119,1,213,255,164,1,214,255,164,1,215,255,119,1,219,
255,164,1,220,255,164,1,222,255,164,1,223,255,164,1,228,255,164,1,229,255,
119,1,255,255,233,0,8,1,166,255,211,1,170,255,188,1,177,255,188,1,184,255,
141,1,185,255,164,1,189,255,211,1,197,255,186,1,209,255,188,0,7,1,173,255,
211,1,180,255,188,1,183,255,188,1,186,255,188,1,195,255,186,1,212,255,233,
1,217,255,211,0,2,1,180,255,211,1,198,0,45,0,2,1,198,0,23,1,217,0,45,0,2,
1,197,255,188,2,3,255,119,0,14,1,166,255,211,1,170,255,211,1,172,255,188,
1,173,255,233,1,177,255,186,1,178,255,211,1,180,255,211,1,183,255,211,1,184,
255,51,1,187,255,164,1,189,255,96,1,195,255,233,1,197,255,164,2,3,255,96,
0,11,1,170,255,188,1,172,255,231,1,173,255,233,1,177,255,188,1,187,255,186,
1,197,255,211,1,202,255,188,1,204,0,23,1,209,255,188,1,210,255,233,1,229,
255,233,0,12,1,166,255,188,1,170,255,166,1,172,255,211,1,177,255,164,1,180,
255,233,1,183,255,233,1,184,255,141,1,187,255,164,1,189,255,188,1,202,255,
164,1,209,255,164,1,210,255,233,0,4,1,205,255,233,1,216,255,211,1,217,255,
233,1,221,255,211,0,15,1,198,255,209,1,202,255,164,1,203,255,233,1,204,255,
233,1,205,255,211,1,209,255,164,1,210,255,211,1,215,255,233,1,217,255,211,
1,218,255,233,1,219,255,188,1,221,255,188,1,224,255,188,1,227,255,233,1,229,
255,211,0,16,1,198,255,233,1,199,255,233,1,202,255,233,1,203,255,233,1,204,
255,233,1,205,255,233,1,209,255,209,1,210,255,233,1,212,255,233,1,215,255,
233,1,216,255,211,1,217,255,211,1,218,255,233,1,221,255,164,1,224,255,188,
1,229,255,233,0,10,0,15,255,6,0,17,255,6,1,198,255,211,1,202,255,164,1,203,
255,211,1,205,255,233,1,209,255,211,1,212,255,211,1,215,255,211,1,229,255,
233,0,2,1,224,255,211,1,227,0,23,0,9,1,199,255,233,1,202,255,211,1,204,255,
233,1,205,255,211,1,209,255,188,1,216,255,188,1,217,255,233,1,219,255,211,
1,221,255,188,0,4,1,199,0,23,1,217,0,23,1,221,255,233,1,224,0,45,0,11,1,199,
255,233,1,202,255,211,1,203,255,233,1,205,255,233,1,209,255,233,1,212,255,
233,1,215,255,233,1,217,255,233,1,218,255,233,1,221,255,188,1,224,255,211,
0,10,1,198,0,45,1,199,0,45,1,203,0,23,1,205,0,23,1,209,0,23,1,212,0,23,1,
215,0,23,1,216,0,23,1,217,0,23,1,227,0,23,0,2,1,212,0,23,1,221,255,211,0,
3,1,199,255,233,1,205,255,233,1,217,0,23,0,8,1,202,255,211,1,204,255,233,
1,205,255,233,1,209,255,211,1,216,255,211,1,217,255,233,1,219,255,233,1,221,
255,211,0,8,1,202,255,209,1,205,255,233,1,209,255,186,1,216,255,211,1,217,
255,233,1,219,255,233,1,221,255,211,1,229,255,233,0,4,1,204,0,23,1,212,0,
23,1,221,255,233,1,227,0,23,0,10,0,15,255,29,0,17,255,29,1,198,255,233,1,
202,255,188,1,203,255,233,1,204,0,68,1,209,255,211,1,212,255,233,1,215,255,
233,1,217,0,23,0,16,0,15,255,51,0,17,255,51,0,123,0,23,1,198,255,233,1,199,
0,23,1,202,255,188,1,203,255,233,1,204,0,23,1,209,255,211,1,210,255,233,1,
212,255,231,1,214,255,233,1,215,255,233,1,218,255,233,1,227,255,233,1,229,
255,233,0,7,1,199,255,233,1,202,255,211,1,209,255,211,1,216,255,211,1,217,
255,233,1,221,255,211,1,229,255,233,0,9,1,198,255,233,1,199,255,233,1,203,
255,233,1,205,255,233,1,212,255,233,1,215,255,233,1,216,255,233,1,218,255,
233,1,221,255,211,0,4,1,203,255,233,1,205,255,233,1,212,255,233,1,215,255,
233,0,3,1,203,255,233,1,212,255,233,1,217,0,23,0,2,1,216,255,96,1,221,255,
119,0,8,1,202,255,211,1,203,0,23,1,205,255,233,1,209,255,211,1,212,0,23,1,
216,255,211,1,219,255,233,1,229,255,233,0,7,1,202,255,211,1,204,255,233,1,
209,255,211,1,210,255,233,1,216,255,211,1,219,255,233,1,221,255,211,0,2,0,
15,255,51,0,17,255,51,0,7,0,15,255,6,0,17,255,6,0,29,255,211,0,30,255,211,
0,108,255,96,0,123,255,96,1,255,255,211,0,1,2,2,255,219,0,3,0,3,255,180,0,
86,255,219,2,3,255,219,0,5,1,153,255,96,1,162,255,96,1,184,255,96,1,189,255,
188,1,192,255,188,0,1,0,105,0,3,0,20,0,36,0,41,0,47,0,51,0,53,0,55,0,57,0,
58,0,60,0,73,0,85,0,89,0,90,0,92,1,82,1,87,1,88,1,89,1,91,1,93,1,94,1,98,
1,100,1,101,1,105,1,107,1,108,1,109,1,110,1,111,1,113,1,114,1,116,1,125,1,
127,1,129,1,131,1,132,1,135,1,136,1,137,1,138,1,141,1,143,1,144,1,146,1,149,
1,151,1,154,1,160,1,161,1,166,1,167,1,168,1,169,1,170,1,171,1,172,1,173,1,
176,1,177,1,178,1,180,1,182,1,183,1,184,1,185,1,186,1,187,1,188,1,191,1,192,
1,194,1,195,1,196,1,198,1,199,1,200,1,201,1,202,1,203,1,204,1,205,1,208,1,
209,1,210,1,212,1,214,1,215,1,216,1,217,1,218,1,219,1,220,1,223,1,226,1,227,
1,228,1,242,1,244,2,2,2,3,2,8,0,0,0,1,0,0,0,0,199,254,176,223,0,0,0,0,191,
26,255,128,0,0,0,0,196,4,48,20,};
#endif
 
#ifdef HAVE_INCBIN
extern const unsigned char pdf_font_DroidSansMono[139280];
asm(".globl pdf_font_DroidSansMono");
asm(".balign 8");
asm("pdf_font_DroidSansMono:");
asm(".incbin \"fonts/droid/DroidSansMono.ttf\"");
#else
static const unsigned char pdf_font_DroidSansMono[139280] = {
0,1,0,0,0,19,1,0,0,4,0,48,70,70,84,77,75,29,224,116,0,2,31,244,0,0,0,28,71,
68,69,70,2,201,0,4,0,2,14,208,0,0,0,32,71,80,79,83,236,144,228,222,0,2,15,
64,0,0,16,180,71,83,85,66,147,60,130,75,0,2,14,240,0,0,0,80,79,83,47,50,247,
26,134,136,0,0,1,184,0,0,0,96,99,109,97,112,29,150,101,90,0,0,12,136,0,0,
6,242,99,118,116,32,65,244,67,234,0,0,29,92,0,0,2,20,102,112,103,109,115,
211,35,176,0,0,19,124,0,0,7,5,103,97,115,112,0,24,0,9,0,2,14,192,0,0,0,16,
103,108,121,102,155,28,79,66,0,0,36,172,0,1,184,160,104,101,97,100,248,253,
254,54,0,0,1,60,0,0,0,54,104,104,101,97,14,75,8,159,0,0,1,116,0,0,0,36,104,
109,116,120,38,164,8,117,0,0,2,24,0,0,10,112,107,101,114,110,174,170,185,
111,0,1,221,76,0,0,21,90,108,111,99,97,120,114,13,144,0,0,31,112,0,0,5,58,
109,97,120,112,7,1,7,208,0,0,1,152,0,0,0,32,110,97,109,101,35,87,171,194,
0,1,242,168,0,0,7,251,112,111,115,116,26,213,54,16,0,1,250,164,0,0,20,25,
112,114,101,112,122,200,94,246,0,0,26,132,0,0,2,213,0,1,0,0,0,1,5,30,235,
107,75,224,95,15,60,245,0,31,8,0,0,0,0,0,201,129,215,160,0,0,0,0,201,129,
215,160,254,96,253,147,8,103,7,72,0,0,0,8,0,2,0,0,0,0,0,0,0,1,0,0,7,62,254,
78,0,67,8,192,254,96,254,244,8,103,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,156,
0,1,0,0,2,156,1,82,0,84,0,140,0,5,0,2,0,16,0,47,0,90,0,0,3,158,5,192,0,3,
0,1,0,3,4,185,1,144,0,5,0,8,5,154,5,51,0,0,1,27,5,154,5,51,0,0,3,209,0,102,
2,18,8,5,2,11,6,4,2,2,2,2,2,4,160,0,2,175,80,0,120,251,0,0,0,0,0,0,0,0,49,
65,83,67,0,64,0,33,251,2,5,211,254,81,1,51,7,62,1,178,96,0,0,159,223,215,
0,0,4,58,5,129,0,0,0,32,0,2,2,236,0,68,0,0,0,0,2,170,0,0,2,57,0,0,2,57,0,
185,2,215,0,87,4,115,0,9,4,115,0,22,7,29,0,73,5,86,0,72,1,135,0,104,2,170,
0,127,2,170,0,12,3,29,0,33,4,172,0,100,2,57,0,184,2,170,0,91,2,57,0,187,2,
57,0,0,4,115,0,80,4,115,0,156,4,115,0,103,4,115,0,78,4,115,0,47,4,115,0,82,
4,115,0,104,4,115,0,105,4,115,0,89,4,115,0,96,2,57,0,187,2,57,0,184,4,172,
0,101,4,172,0,100,4,172,0,101,4,115,0,84,8,31,0,161,5,86,0,4,5,86,0,168,5,
199,0,104,5,199,0,168,5,86,0,168,4,227,0,168,6,57,0,103,5,199,0,168,2,57,
0,189,4,0,0,32,5,86,0,168,4,115,0,168,6,170,0,168,5,199,0,168,6,57,0,97,5,
86,0,168,6,57,0,97,5,199,0,168,5,86,0,93,4,227,0,46,5,199,0,158,5,86,0,9,
7,141,0,9,5,86,0,46,5,86,0,45,4,227,0,65,2,57,0,146,2,57,0,0,2,57,0,16,3,
193,0,10,4,115,255,225,2,170,0,106,4,115,0,87,4,115,0,132,4,0,0,87,4,115,
0,86,4,115,0,87,2,57,0,29,4,115,0,86,4,115,0,142,1,199,0,137,1,199,255,206,
4,0,0,138,1,199,0,138,6,170,0,136,4,115,0,136,4,115,0,86,4,115,0,132,4,115,
0,86,2,170,0,136,4,0,0,57,2,57,0,31,4,115,0,133,4,0,0,7,5,199,255,253,4,0,
0,23,4,0,0,5,4,0,0,49,2,172,0,34,2,20,0,183,2,172,0,34,4,172,0,92,2,170,0,
242,4,115,0,135,4,115,0,58,4,115,0,113,4,115,255,254,2,20,0,183,4,115,0,115,
2,170,0,45,5,229,0,31,2,246,0,26,4,115,0,83,4,172,0,100,5,229,0,31,4,107,
255,239,3,51,0,122,4,100,0,65,2,170,0,41,2,170,0,27,2,170,0,72,4,156,0,140,
4,76,0,80,2,57,0,187,2,170,0,119,2,170,0,80,2,236,0,27,4,115,0,83,6,172,0,
56,6,172,0,56,6,172,0,73,4,227,0,131,5,86,0,4,5,86,0,4,5,86,0,4,5,86,0,4,
5,86,0,4,5,86,0,4,8,0,0,24,5,199,0,104,5,86,0,168,5,86,0,168,5,86,0,168,5,
86,0,168,2,57,0,9,2,57,0,142,2,57,255,210,2,57,0,7,5,199,0,14,5,199,0,168,
6,57,0,97,6,57,0,97,6,57,0,97,6,57,0,97,6,57,0,97,4,172,0,142,6,57,0,71,5,
199,0,158,5,199,0,158,5,199,0,158,5,199,0,158,5,86,0,45,5,86,0,168,4,227,
0,142,4,115,0,87,4,115,0,87,4,115,0,87,4,115,0,87,4,115,0,87,4,115,0,87,7,
29,0,66,4,0,0,87,4,115,0,87,4,115,0,87,4,115,0,87,4,115,0,87,2,57,0,10,2,
57,0,135,2,57,255,211,2,57,0,8,4,115,0,86,4,115,0,140,4,115,0,86,4,115,0,
86,4,115,0,86,4,115,0,86,4,115,0,86,4,100,0,65,4,227,0,44,4,115,0,139,4,115,
0,139,4,115,0,139,4,115,0,139,4,0,0,5,4,115,0,138,4,0,0,5,5,86,0,4,4,115,
0,87,5,86,0,4,4,115,0,87,5,86,0,4,4,115,0,87,5,199,0,104,4,0,0,87,5,199,0,
104,4,0,0,87,5,199,0,104,4,0,0,87,5,199,0,104,4,0,0,87,5,199,0,168,4,235,
0,86,5,199,0,14,4,115,0,86,5,86,0,168,4,115,0,87,5,86,0,168,4,115,0,87,5,
86,0,168,4,115,0,87,5,86,0,168,4,115,0,87,5,86,0,168,4,115,0,87,6,57,0,103,
4,115,0,86,6,57,0,103,4,115,0,86,6,57,0,103,4,115,0,86,6,57,0,103,4,115,0,
86,5,199,0,168,4,115,0,142,5,199,0,14,4,115,0,10,2,57,255,184,2,57,255,184,
2,57,0,12,2,57,0,12,2,57,255,210,2,57,255,210,2,57,0,92,1,199,0,31,2,57,0,
189,2,57,0,194,5,225,0,170,3,141,0,137,4,0,0,32,1,199,255,153,5,86,0,168,
4,0,0,138,4,0,0,138,4,115,0,168,1,199,0,91,4,115,0,168,1,199,0,126,4,115,
0,168,2,85,0,138,4,115,0,168,2,172,0,138,4,115,0,20,1,199,0,16,5,199,0,168,
4,115,0,140,5,199,0,168,4,115,0,140,5,199,0,168,4,115,0,140,4,213,255,254,
5,201,0,165,4,115,0,140,6,57,0,97,4,115,0,86,6,57,0,97,4,115,0,86,6,57,0,
97,4,115,0,86,8,0,0,97,7,141,0,86,5,199,0,168,2,170,0,136,5,199,0,168,2,170,
0,129,5,199,0,168,2,170,0,56,5,86,0,93,4,0,0,57,5,86,0,93,4,0,0,57,5,86,0,
93,4,0,0,57,5,86,0,93,4,0,0,57,4,227,0,46,2,57,0,31,4,227,0,46,3,0,0,31,4,
227,0,46,2,57,0,31,5,199,0,158,4,115,0,133,5,199,0,158,4,115,0,133,5,199,
0,158,4,115,0,133,5,199,0,158,4,115,0,133,5,199,0,158,4,115,0,133,5,199,0,
158,4,115,0,133,7,141,0,9,5,199,255,253,5,86,0,45,4,0,0,5,5,86,0,45,4,227,
0,65,4,0,0,49,4,227,0,65,4,0,0,49,4,227,0,65,4,0,0,49,1,199,0,138,4,115,0,
192,5,86,0,4,4,115,0,87,8,0,0,24,7,29,0,66,6,57,0,71,4,227,0,44,2,170,0,0,
2,170,0,0,2,170,0,51,2,170,255,221,2,170,0,156,2,170,0,51,2,170,0,80,2,170,
255,233,2,170,0,22,2,170,0,205,2,170,0,29,5,87,0,4,2,57,0,187,6,70,255,245,
6,180,255,242,3,18,255,232,6,50,255,187,6,216,0,65,6,5,255,187,1,199,255,
176,5,86,0,4,5,86,0,168,4,104,0,168,5,88,0,61,5,86,0,168,4,227,0,65,5,199,
0,168,6,57,0,97,2,57,0,189,5,86,0,168,5,88,0,10,6,170,0,168,5,199,0,168,5,
51,0,90,6,57,0,97,5,199,0,168,5,86,0,168,4,242,0,108,4,227,0,46,5,86,0,45,
6,98,0,117,5,86,0,46,6,175,0,145,5,251,0,87,2,57,0,7,5,86,0,45,4,160,0,86,
3,145,0,70,4,115,0,106,1,199,0,137,4,96,0,133,4,160,0,86,4,154,0,142,4,0,
0,7,4,116,0,86,3,145,0,70,3,135,0,86,4,115,0,106,4,115,0,106,1,199,0,137,
4,0,0,138,4,0,0,14,4,156,0,138,4,0,0,0,3,149,0,86,4,115,0,86,5,133,0,79,4,
141,0,132,3,219,0,86,4,240,0,86,3,41,0,29,4,96,0,133,5,48,0,85,4,51,0,21,
5,180,0,135,6,63,0,83,1,199,255,205,4,96,0,133,4,115,0,86,4,96,0,133,6,63,
0,83,5,87,0,168,6,235,0,46,4,85,0,168,5,192,0,104,5,86,0,93,2,57,0,189,2,
57,0,7,4,0,0,32,8,117,0,18,8,21,0,168,6,213,0,46,4,169,0,168,5,21,0,55,5,
192,0,168,5,86,0,4,5,64,0,168,5,86,0,168,4,85,0,168,5,107,0,15,5,86,0,168,
7,99,0,28,4,213,0,67,5,192,0,168,5,192,0,168,4,169,0,168,5,64,0,18,6,170,
0,168,5,199,0,168,6,57,0,97,5,192,0,166,5,86,0,168,5,199,0,104,4,227,0,46,
5,21,0,55,6,21,0,118,5,86,0,46,5,235,0,168,5,85,0,160,7,85,0,168,7,128,0,
168,6,85,0,46,7,21,0,168,5,64,0,168,5,192,0,105,8,21,0,168,5,199,0,96,4,115,
0,87,4,149,0,120,4,64,0,142,2,235,0,142,4,171,0,20,4,115,0,87,5,90,0,7,3,
171,0,49,4,120,0,142,4,120,0,142,3,128,0,138,4,171,0,11,5,128,0,142,4,107,
0,142,4,115,0,86,4,85,0,142,4,115,0,132,4,0,0,87,3,170,0,35,4,0,0,5,6,149,
0,86,4,0,0,23,4,149,0,142,4,43,0,122,6,107,0,142,6,149,0,142,5,0,0,45,5,192,
0,142,4,43,0,142,4,21,0,55,6,0,0,142,4,85,0,17,4,115,0,87,4,115,0,10,2,235,
0,142,4,21,0,87,4,0,0,57,1,199,0,137,2,57,255,248,1,199,255,206,7,64,0,11,
6,128,0,142,4,115,0,10,3,128,0,138,4,0,0,5,4,107,0,142,3,233,0,168,3,74,0,
142,7,141,0,9,5,199,255,253,7,141,0,9,5,199,255,253,7,141,0,9,5,199,255,253,
5,86,0,45,4,0,0,5,4,115,0,0,8,0,0,0,8,0,0,0,4,107,255,225,1,199,0,127,1,199,
0,127,1,199,0,127,1,199,0,126,2,170,0,75,2,170,0,75,2,170,0,75,4,115,0,138,
4,115,0,136,2,205,0,81,8,0,1,22,8,0,0,55,1,128,0,85,2,213,0,85,2,170,0,88,
2,170,0,89,4,0,0,185,2,170,255,192,1,86,254,96,2,235,0,101,4,115,0,4,4,115,
0,58,8,192,0,158,4,115,0,16,7,21,0,69,2,150,0,19,8,149,0,188,8,0,0,188,6,
37,0,108,4,205,0,88,6,172,0,80,6,172,0,61,6,172,0,93,6,172,0,145,8,0,1,162,
4,0,1,16,8,0,1,162,4,0,1,16,8,0,1,162,4,0,1,16,4,0,1,16,3,244,0,56,4,229,
0,4,6,150,0,235,5,180,0,154,4,172,0,101,4,100,0,51,5,180,0,87,7,213,1,152,
5,192,1,22,2,49,255,158,4,100,0,56,4,100,0,65,4,171,0,100,4,100,0,63,4,100,
0,65,4,213,0,157,4,172,0,100,4,213,2,34,4,213,1,5,5,171,255,246,5,0,1,216,
5,171,2,141,5,171,255,246,5,171,2,141,5,171,255,246,5,171,2,141,5,171,255,
246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,1,217,5,
171,2,141,5,171,1,217,5,171,1,217,5,171,255,246,5,171,255,246,5,171,255,246,
5,171,2,141,5,171,1,217,5,171,1,217,5,171,255,246,5,171,255,246,5,171,255,
246,5,171,2,141,5,171,1,217,5,171,1,217,5,171,255,246,5,171,255,246,5,171,
255,246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,255,
246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,0,0,5,171,
0,0,5,171,0,0,5,171,0,0,5,171,2,213,5,171,0,103,5,171,0,0,5,213,0,0,4,213,
0,123,4,213,0,6,2,214,0,109,2,214,0,109,8,0,0,0,7,235,1,158,7,235,1,145,7,
235,1,158,7,235,1,145,3,244,0,8,4,213,0,167,4,213,0,178,4,213,0,41,4,213,
0,41,2,214,0,115,8,43,1,177,8,107,1,209,7,85,1,70,6,0,1,218,6,0,1,81,4,64,
0,59,5,64,0,60,4,192,0,102,4,21,0,66,4,0,0,196,6,0,1,16,4,0,0,29,4,0,0,29,
2,170,0,119,2,170,0,243,2,170,0,127,2,170,0,14,2,170,0,53,2,170,0,43,2,170,
0,45,2,170,255,229,1,199,0,124,1,199,0,130,2,90,0,106,2,90,0,72,2,152,0,0,
2,152,0,0,2,135,0,45,2,160,255,233,3,47,0,32,2,72,255,232,0,0,0,3,0,0,0,3,
0,0,0,28,0,1,0,0,0,0,4,232,0,3,0,1,0,0,0,28,0,4,4,204,0,0,0,190,0,128,0,6,
0,62,0,126,1,127,1,146,1,255,2,199,2,201,2,221,3,126,3,138,3,140,3,161,3,
206,4,12,4,79,4,92,4,95,4,145,30,133,30,243,32,21,32,30,32,34,32,38,32,48,
32,51,32,58,32,60,32,62,32,68,32,127,32,164,32,167,32,172,33,5,33,19,33,22,
33,34,33,38,33,46,33,94,33,149,33,168,34,2,34,6,34,15,34,18,34,21,34,26,34,
31,34,41,34,43,34,72,34,97,34,101,35,2,35,16,35,33,37,0,37,2,37,12,37,16,
37,20,37,24,37,28,37,36,37,44,37,52,37,60,37,108,37,128,37,132,37,136,37,
140,37,147,37,161,37,172,37,178,37,186,37,188,37,196,37,203,37,207,37,217,
37,230,38,60,38,64,38,66,38,96,38,99,38,102,38,107,240,2,240,5,251,2,255,
255,0,0,0,32,0,160,1,146,1,250,2,198,2,201,2,216,3,126,3,132,3,140,3,142,
3,163,4,1,4,14,4,81,4,94,4,144,30,128,30,242,32,19,32,23,32,32,32,38,32,48,
32,50,32,57,32,60,32,62,32,68,32,127,32,163,32,167,32,172,33,5,33,19,33,22,
33,34,33,38,33,46,33,91,33,144,33,168,34,2,34,6,34,15,34,17,34,21,34,25,34,
30,34,41,34,43,34,72,34,96,34,100,35,2,35,16,35,32,37,0,37,2,37,12,37,16,
37,20,37,24,37,28,37,36,37,44,37,52,37,60,37,80,37,128,37,132,37,136,37,140,
37,144,37,160,37,170,37,178,37,186,37,188,37,196,37,202,37,207,37,216,37,
230,38,58,38,64,38,66,38,96,38,99,38,101,38,106,240,1,240,5,251,1,255,255,
255,227,0,0,255,174,255,71,254,129,254,128,254,114,252,160,253,204,253,203,
253,202,253,201,253,151,253,150,253,149,253,148,253,100,227,118,227,10,225,
235,225,234,225,233,225,230,225,221,225,220,225,215,225,214,225,213,225,208,
225,150,225,115,225,113,225,109,225,21,225,8,225,6,224,251,224,248,224,241,
224,197,224,148,224,130,224,41,224,38,224,30,224,29,223,255,0,0,224,19,224,
10,224,9,223,237,223,214,223,212,223,56,223,43,223,28,221,62,221,61,221,52,
221,49,221,46,221,43,221,40,221,33,221,26,221,19,221,12,220,249,220,230,220,
227,220,224,220,221,220,218,220,206,220,198,220,193,220,186,220,185,220,178,
220,173,220,170,220,162,220,150,220,67,220,64,220,63,220,34,220,32,220,31,
220,28,18,135,18,133,7,135,0,1,0,0,0,188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,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,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
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,0,98,0,99,0,100,0,101,0,
102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,16,0,110,0,111,0,112,0,113,
0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,
126,0,127,0,128,0,129,0,130,0,131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,
0,139,0,140,0,141,0,142,0,143,0,144,0,145,0,146,0,147,0,148,0,149,0,150,0,
151,0,152,0,153,0,154,0,155,0,156,0,157,0,158,0,159,0,160,0,161,0,162,0,163,
0,164,0,165,0,166,0,167,0,168,0,169,0,170,0,171,0,172,0,173,0,174,0,175,0,
176,0,177,0,178,0,179,0,180,0,181,0,182,0,183,0,184,0,185,0,186,0,187,0,188,
0,189,0,190,0,191,0,192,0,193,0,194,0,195,0,196,0,197,0,198,0,199,0,200,0,
201,0,202,0,203,0,204,0,205,0,206,0,207,0,208,0,209,0,210,0,211,0,212,0,213,
0,214,0,215,0,216,0,217,0,218,0,219,0,220,0,221,0,222,0,223,0,224,0,225,0,
226,0,227,0,228,0,229,0,230,0,231,0,232,0,233,0,234,0,235,0,236,0,237,0,238,
0,239,0,240,0,241,0,242,0,243,0,244,0,245,0,246,0,247,0,248,0,249,0,250,0,
251,0,252,0,253,0,254,0,255,1,0,1,1,1,2,1,3,1,4,1,5,1,6,1,7,1,8,1,9,1,10,
1,11,1,12,1,13,1,14,1,15,1,16,1,17,1,18,1,19,1,20,1,21,1,22,1,23,1,24,1,25,
1,26,1,27,1,28,1,29,1,30,1,31,1,32,1,33,1,34,1,35,1,36,1,37,1,38,1,39,1,40,
1,41,1,42,1,43,1,44,1,45,1,46,1,47,1,48,1,49,1,50,1,51,1,52,1,53,1,54,1,55,
1,56,1,57,1,58,1,59,1,60,1,61,1,62,1,63,0,119,2,48,0,6,2,10,0,0,0,0,1,0,0,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,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,1,0,0,0,0,0,3,0,4,0,5,0,6,0,7,0,
8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,
23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,
0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,
0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,
0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,
0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,
0,0,0,132,0,133,0,135,0,137,0,145,0,150,0,156,0,161,0,160,0,162,0,164,0,163,
0,165,0,167,0,169,0,168,0,170,0,171,0,173,0,172,0,174,0,175,0,177,0,179,0,
178,0,180,0,182,0,181,0,186,0,185,0,187,0,188,2,9,0,112,0,99,0,100,0,104,
2,11,0,118,0,159,0,110,0,106,2,29,0,116,0,105,2,54,0,134,0,152,2,49,0,113,
2,56,2,57,0,102,0,117,2,43,2,46,2,45,1,137,2,52,0,107,0,122,1,114,0,166,0,
184,0,127,0,98,0,109,2,48,1,64,2,53,2,44,0,108,0,123,2,12,0,3,0,128,0,131,
0,149,1,18,1,19,1,254,1,255,2,6,2,7,2,2,2,3,0,183,2,119,0,191,1,56,2,20,2,
25,2,16,2,17,2,136,2,137,2,10,0,119,2,4,2,8,2,13,0,130,0,138,0,129,0,139,
0,136,0,141,0,142,0,143,0,140,0,147,0,148,0,0,0,146,0,154,0,155,0,153,0,241,
1,71,1,78,0,111,1,74,1,75,1,76,0,120,1,79,1,77,1,72,0,0,64,69,89,88,85,84,
83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,
58,57,56,55,54,53,49,48,47,46,45,44,40,39,38,37,36,35,34,33,31,24,20,17,16,
15,14,13,11,10,9,8,7,6,5,4,3,2,1,0,44,69,35,70,96,32,176,38,96,176,4,38,35,
72,72,45,44,69,35,70,35,97,32,176,38,97,176,4,38,35,72,72,45,44,69,35,70,
96,176,32,97,32,176,70,96,176,4,38,35,72,72,45,44,69,35,70,35,97,176,32,96,
32,176,38,97,176,32,97,176,4,38,35,72,72,45,44,69,35,70,96,176,64,97,32,176,
102,96,176,4,38,35,72,72,45,44,69,35,70,35,97,176,64,96,32,176,38,97,176,
64,97,176,4,38,35,72,72,45,44,1,16,32,60,0,60,45,44,32,69,35,32,176,205,68,
35,32,184,1,90,81,88,35,32,176,141,68,35,89,32,176,237,81,88,35,32,176,77,
68,35,89,32,176,4,38,81,88,35,32,176,13,68,35,89,33,33,45,44,32,32,69,24,
104,68,32,176,1,96,32,69,176,70,118,104,138,69,96,68,45,44,1,177,11,10,67,
35,67,101,10,45,44,0,177,10,11,67,35,67,11,45,44,0,176,40,35,112,177,1,40,
62,1,176,40,35,112,177,2,40,69,58,177,2,0,8,13,45,44,32,69,176,3,37,69,97,
100,176,80,81,88,69,68,27,33,33,89,45,44,73,176,14,35,68,45,44,32,69,176,
0,67,96,68,45,44,1,176,6,67,176,7,67,101,10,45,44,32,105,176,64,97,176,0,
139,32,177,44,192,138,140,184,16,0,98,96,43,12,100,35,100,97,92,88,176,3,
97,89,45,44,138,3,69,138,138,135,176,17,43,176,41,35,68,176,41,122,228,24,
45,44,69,101,176,44,35,68,69,176,43,35,68,45,44,75,82,88,69,68,27,33,33,89,
45,44,75,81,88,69,68,27,33,33,89,45,44,1,176,5,37,16,35,32,138,245,0,176,
1,96,35,237,236,45,44,1,176,5,37,16,35,32,138,245,0,176,1,97,35,237,236,45,
44,1,176,6,37,16,245,0,237,236,45,44,70,35,70,96,138,138,70,35,32,70,138,
96,138,97,184,255,128,98,35,32,16,35,138,177,12,12,138,112,69,96,32,176,0,
80,88,176,1,97,184,255,186,139,27,176,70,140,89,176,16,96,104,1,58,45,44,
32,69,176,3,37,70,82,75,176,19,81,91,88,176,2,37,70,32,104,97,176,3,37,176,
3,37,63,35,33,56,27,33,17,89,45,44,32,69,176,3,37,70,80,88,176,2,37,70,32,
104,97,176,3,37,176,3,37,63,35,33,56,27,33,17,89,45,44,0,176,7,67,176,6,67,
11,45,44,33,33,12,100,35,100,139,184,64,0,98,45,44,33,176,128,81,88,12,100,
35,100,139,184,32,0,98,27,178,0,64,47,43,89,176,2,96,45,44,33,176,192,81,
88,12,100,35,100,139,184,21,85,98,27,178,0,128,47,43,89,176,2,96,45,44,12,
100,35,100,139,184,64,0,98,96,35,33,45,44,75,83,88,138,176,4,37,73,100,35,
69,105,176,64,139,97,176,128,98,176,32,97,106,176,14,35,68,35,16,176,14,246,
27,33,35,138,18,17,32,57,47,89,45,44,75,83,88,32,176,3,37,73,100,105,32,176,
5,38,176,6,37,73,100,35,97,176,128,98,176,32,97,106,176,14,35,68,176,4,38,
16,176,14,246,138,16,176,14,35,68,176,14,246,176,14,35,68,176,14,237,27,138,
176,4,38,17,18,32,57,35,32,57,47,47,89,45,44,69,35,69,96,35,69,96,35,69,96,
35,118,104,24,176,128,98,32,45,44,176,72,43,45,44,32,69,176,0,84,88,176,64,
68,32,69,176,64,97,68,27,33,33,89,45,44,69,177,48,47,69,35,69,97,96,176,1,
96,105,68,45,44,75,81,88,176,47,35,112,176,20,35,66,27,33,33,89,45,44,75,
81,88,32,176,3,37,69,105,83,88,68,27,33,33,89,27,33,33,89,45,44,69,176,20,
67,176,0,96,99,176,1,96,105,68,45,44,176,47,69,68,45,44,69,35,32,69,138,96,
68,45,44,69,35,69,96,68,45,44,75,35,81,88,185,0,51,255,224,177,52,32,27,179,
51,0,52,0,89,68,68,45,44,176,22,67,88,176,3,38,69,138,88,100,102,176,31,96,
27,100,176,32,96,102,32,88,27,33,176,64,89,176,1,97,89,35,88,101,89,176,41,
35,68,35,16,176,41,224,27,33,33,33,33,33,89,45,44,176,2,67,84,88,75,83,35,
75,81,90,88,56,27,33,33,89,27,33,33,33,33,89,45,44,176,22,67,88,176,4,37,
69,100,176,32,96,102,32,88,27,33,176,64,89,176,1,97,35,88,27,101,89,176,41,
35,68,176,5,37,176,8,37,8,32,88,2,27,3,89,176,4,37,16,176,5,37,32,70,176,
4,37,35,66,60,176,4,37,176,7,37,8,176,7,37,16,176,6,37,32,70,176,4,37,176,
1,96,35,66,60,32,88,1,27,0,89,176,4,37,16,176,5,37,176,41,224,176,41,32,69,
101,68,176,7,37,16,176,6,37,176,41,224,176,5,37,176,8,37,8,32,88,2,27,3,89,
176,5,37,176,3,37,67,72,176,4,37,176,7,37,8,176,6,37,176,3,37,176,1,96,67,
72,27,33,89,33,33,33,33,33,33,33,45,44,2,176,4,37,32,32,70,176,4,37,35,66,
176,5,37,8,176,3,37,69,72,33,33,33,33,45,44,2,176,3,37,32,176,4,37,8,176,
2,37,67,72,33,33,33,45,44,69,35,32,69,24,32,176,0,80,32,88,35,101,35,89,35,
104,32,176,64,80,88,33,176,64,89,35,88,101,89,138,96,68,45,44,75,83,35,75,
81,90,88,32,69,138,96,68,27,33,33,89,45,44,75,84,88,32,69,138,96,68,27,33,
33,89,45,44,75,83,35,75,81,90,88,56,27,33,33,89,45,44,176,0,33,75,84,88,56,
27,33,33,89,45,44,176,2,67,84,88,176,70,43,27,33,33,33,33,89,45,44,176,2,
67,84,88,176,71,43,27,33,33,33,89,45,44,176,2,67,84,88,176,72,43,27,33,33,
33,33,89,45,44,176,2,67,84,88,176,73,43,27,33,33,33,89,45,44,32,138,8,35,
75,83,138,75,81,90,88,35,56,27,33,33,89,45,44,0,176,2,37,73,176,0,83,88,32,
176,64,56,17,27,33,89,45,44,1,70,35,70,96,35,70,97,35,32,16,32,70,138,97,
184,255,128,98,138,177,64,64,138,112,69,96,104,58,45,44,32,138,35,73,100,
138,35,83,88,60,27,33,89,45,44,75,82,88,125,27,122,89,45,44,176,18,0,75,1,
75,84,66,45,44,177,2,0,66,177,35,1,136,81,177,64,1,136,83,90,88,185,16,0,
0,32,136,84,88,178,2,1,2,67,96,66,89,177,36,1,136,81,88,185,32,0,0,64,136,
84,88,178,2,2,2,67,96,66,177,36,1,136,84,88,178,2,32,2,67,96,66,0,75,1,75,
82,88,178,2,8,2,67,96,66,89,27,185,64,0,0,128,136,84,88,178,2,4,2,67,96,66,
89,185,64,0,0,128,99,184,1,0,136,84,88,178,2,8,2,67,96,66,89,185,64,0,1,0,
99,184,2,0,136,84,88,178,2,16,2,67,96,66,89,185,64,0,2,0,99,184,4,0,136,84,
88,178,2,64,2,67,96,66,89,89,89,89,89,45,44,69,24,104,35,75,81,88,35,32,69,
32,100,176,64,80,88,124,89,104,138,96,89,68,45,44,176,0,22,176,2,37,176,2,
37,1,176,1,35,62,0,176,2,35,62,177,1,2,6,12,176,10,35,101,66,176,11,35,66,
1,176,1,35,63,0,176,2,35,63,177,1,2,6,12,176,6,35,101,66,176,7,35,66,176,
1,22,1,45,44,122,138,16,69,35,245,24,45,0,0,0,177,9,64,190,1,7,0,1,0,31,1,
7,0,1,0,159,1,4,64,142,1,192,253,1,175,253,1,0,253,1,10,79,251,1,32,251,1,
245,80,40,31,242,70,40,31,241,70,42,31,240,70,43,31,95,239,127,239,2,15,239,
79,239,95,239,143,239,175,239,5,11,229,228,30,31,227,226,70,31,15,226,1,64,
226,70,22,31,225,224,70,31,207,224,223,224,239,224,3,64,224,51,54,70,224,
70,24,31,221,61,223,85,222,61,3,85,223,1,3,85,220,3,255,31,15,213,31,213,
2,15,213,31,213,2,64,202,24,27,70,207,194,1,189,192,60,31,193,80,38,31,188,
190,40,31,255,185,1,80,184,112,184,128,184,3,184,255,192,64,255,184,18,50,
70,31,183,63,183,79,183,111,183,127,183,159,183,175,183,7,112,178,160,178,
176,178,3,15,178,1,144,181,1,176,181,1,15,181,1,8,15,179,63,179,239,179,3,
128,176,144,176,2,176,176,192,176,208,176,3,47,175,63,175,2,160,173,176,173,
2,192,173,208,173,2,47,172,63,172,2,159,171,1,192,170,208,170,2,79,169,143,
169,2,47,169,111,169,191,169,255,169,4,156,155,36,31,80,155,1,111,150,1,191,
150,1,150,70,29,31,149,148,23,31,127,148,143,148,255,148,3,48,145,64,145,
2,128,145,1,112,143,128,143,2,144,143,1,192,143,208,143,2,79,140,95,140,111,
140,3,134,70,255,31,159,133,1,132,131,49,31,116,115,63,31,115,80,38,31,111,
110,60,31,110,70,53,31,26,1,24,85,25,51,24,85,7,51,3,85,6,3,255,31,96,80,
38,31,95,80,38,31,92,70,49,31,91,90,72,31,90,70,49,31,19,50,18,85,5,1,3,85,
4,50,3,85,111,3,1,15,3,63,3,2,239,81,255,81,2,64,81,53,56,70,64,81,37,40,
70,207,64,84,80,1,73,70,32,31,72,70,53,31,71,70,53,31,175,70,1,223,70,239,
70,2,128,70,1,22,50,21,85,17,1,15,85,16,50,15,85,2,1,0,85,1,0,1,31,31,15,
63,15,95,15,127,15,4,15,15,47,15,79,15,111,15,143,15,223,15,255,15,7,63,15,
127,15,239,15,3,111,0,1,128,22,1,5,1,184,1,144,177,84,83,43,43,75,184,7,255,
82,75,176,7,80,91,176,1,136,176,37,83,176,1,136,176,64,81,90,176,6,136,176,
0,85,90,91,88,177,1,1,142,89,133,141,141,0,66,29,75,176,50,83,88,176,96,29,
89,75,176,100,83,88,176,64,29,89,75,176,128,83,88,176,16,29,177,22,0,66,89,
116,115,116,117,43,43,43,43,43,1,115,116,117,43,43,43,0,116,43,43,115,115,
117,43,43,43,1,43,43,43,0,43,43,43,43,43,43,1,43,43,0,43,43,1,43,115,43,0,
116,115,116,117,115,116,115,43,1,43,116,117,0,115,43,115,116,1,115,115,116,
0,115,116,116,115,116,115,1,94,115,115,116,115,115,0,115,43,115,115,1,43,
0,43,1,43,0,115,43,116,117,43,43,43,43,1,43,43,116,43,43,94,115,43,0,43,94,
115,116,1,43,43,43,0,43,115,115,94,115,115,115,1,115,115,115,24,94,0,0,0,
5,204,5,204,0,125,5,129,0,21,0,121,5,129,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
4,58,0,20,0,119,0,0,255,236,0,0,0,0,255,236,0,0,0,0,255,236,0,0,254,87,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,8,0,0,0,0,0,0,180,0,189,0,175,0,160,0,0,0,0,0,0,0,0,0,0,0,0,0,136,0,
126,0,0,0,172,0,0,0,0,0,0,0,0,0,0,0,0,0,191,0,195,0,171,0,0,0,0,0,155,0,141,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,185,0,170,0,0,0,0,0,
0,0,148,0,153,0,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,
0,131,0,141,0,164,0,180,0,0,0,0,0,0,0,0,0,0,0,96,0,106,0,121,0,152,0,172,
0,184,0,167,0,0,1,34,1,51,0,195,0,107,0,0,0,0,0,0,0,219,0,201,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,225,1,201,0,146,0,168,0,107,0,146,0,183,
0,107,0,155,0,0,2,123,2,242,0,146,2,82,0,110,2,215,3,129,0,130,0,137,0,160,
0,159,1,105,0,143,0,0,1,96,0,164,1,91,0,94,0,130,0,0,0,0,0,0,0,94,0,101,0,
111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,0,144,0,165,0,122,0,128,0,0,0,0,0,0,
0,0,0,0,5,129,255,243,0,13,252,167,0,131,0,137,0,143,0,150,0,105,0,113,0,
0,0,0,0,0,0,0,0,0,0,168,1,249,0,0,0,0,3,31,0,167,0,174,0,181,0,0,0,0,0,129,
0,0,0,0,0,0,0,0,7,72,3,106,2,182,2,2,253,147,0,0,0,145,0,103,0,145,0,97,1,
217,0,0,2,141,3,65,0,68,5,17,0,0,0,44,0,44,0,44,0,44,1,22,1,96,2,4,3,4,3,
230,4,240,5,14,5,84,5,158,5,246,6,50,6,114,6,144,6,178,6,218,7,80,7,150,8,
32,8,222,9,68,9,226,10,140,10,206,11,158,12,80,12,126,12,200,13,18,13,74,
13,146,14,20,15,100,16,22,16,172,17,64,17,160,17,222,18,40,18,202,19,22,19,
96,19,194,20,44,20,88,21,184,22,64,22,182,23,26,23,192,24,94,25,40,26,38,
26,146,27,42,29,162,30,254,32,64,32,148,32,190,32,242,33,28,34,172,34,202,
34,244,35,160,36,54,36,172,37,54,37,166,38,32,38,238,39,88,39,166,40,102,
41,0,41,68,42,246,43,100,43,212,44,112,45,20,45,98,46,16,46,114,46,230,48,
52,50,86,51,226,53,124,54,24,54,136,55,126,55,240,56,112,57,142,58,18,58,
196,59,100,59,234,60,238,62,28,62,144,63,134,64,72,64,168,64,210,65,178,65,
200,66,36,66,110,66,232,67,126,67,170,68,42,68,106,68,138,68,244,69,48,69,
166,70,14,70,48,70,90,70,124,71,8,71,32,71,56,71,80,71,104,71,130,71,154,
72,14,72,34,72,58,72,82,72,106,72,132,72,156,72,178,72,200,72,224,73,80,73,
104,73,128,73,152,73,176,73,200,73,226,74,68,74,252,75,20,75,44,75,68,75,
94,75,118,75,212,76,154,76,178,76,202,76,226,76,250,77,20,77,46,78,38,78,
58,78,82,78,106,78,130,78,156,78,180,78,202,78,224,78,248,79,172,79,196,79,
220,79,244,80,12,80,36,80,62,80,126,81,26,81,50,81,74,81,98,81,124,81,148,
82,24,82,50,82,74,82,98,82,122,82,146,82,166,82,186,82,210,82,234,83,2,83,
26,83,50,83,70,83,94,83,118,83,142,83,164,83,172,84,74,84,98,84,122,84,146,
84,170,84,194,84,214,84,234,84,254,85,22,85,46,85,70,85,94,85,118,85,142,
85,166,85,186,85,206,85,230,85,254,86,22,86,142,87,20,87,42,87,64,87,88,87,
110,87,132,87,154,87,172,87,192,87,216,88,170,88,182,88,210,88,234,89,228,
89,248,90,12,90,124,90,148,90,170,90,190,90,210,90,232,91,22,91,42,91,62,
91,150,91,224,91,248,92,16,92,36,92,56,92,80,92,104,92,116,93,20,93,164,93,
188,93,212,93,236,94,4,94,30,94,56,94,216,95,154,95,178,95,202,95,222,95,
242,96,10,96,34,96,58,96,82,96,106,96,130,96,150,96,170,96,194,96,218,96,
238,98,112,98,136,98,158,98,238,99,96,99,120,99,144,99,168,99,192,99,216,
99,240,100,10,100,36,100,62,100,88,100,122,100,142,100,166,100,190,100,214,
100,238,101,8,101,32,101,56,101,80,101,100,101,124,101,148,101,244,102,108,
103,104,103,140,103,164,103,188,103,212,103,236,104,34,104,88,104,142,104,
214,104,238,105,86,105,162,106,244,107,70,107,118,107,188,107,248,109,10,
109,50,109,112,109,172,109,206,112,188,112,236,114,22,114,30,114,38,114,82,
114,208,114,216,114,224,114,232,115,138,115,146,115,154,116,34,116,42,116,
50,116,116,116,124,116,182,116,190,117,56,117,64,117,72,117,234,117,242,118,
140,119,78,119,102,120,194,120,218,120,242,121,10,121,36,121,64,122,30,122,
212,123,118,124,16,124,186,125,114,125,218,126,124,127,28,127,136,128,94,
128,208,130,6,130,234,130,242,131,112,131,246,132,174,133,52,133,156,134,
4,134,138,135,74,135,188,136,108,136,134,136,160,136,184,136,208,136,232,
137,66,137,198,137,222,138,142,138,150,138,158,138,182,138,190,139,116,139,
224,140,78,140,102,140,126,140,198,140,206,141,66,141,74,141,82,141,224,141,
232,142,210,143,168,144,10,144,34,144,152,145,30,145,38,145,46,145,54,145,
108,145,116,145,124,145,132,146,12,146,156,146,164,146,226,147,78,147,158,
147,250,148,88,148,206,149,44,149,214,150,112,151,26,151,34,151,198,152,86,
152,130,152,254,153,6,153,250,154,160,155,34,155,58,155,200,156,80,157,2,
157,96,157,104,157,178,157,186,157,194,157,250,158,2,158,250,159,2,159,72,
159,160,159,242,160,86,160,184,161,28,161,134,162,24,162,150,163,6,163,32,
163,192,163,216,164,106,164,114,164,232,165,2,165,10,165,228,166,90,166,222,
166,246,167,14,167,100,167,148,167,194,167,218,167,242,168,10,168,34,168,
60,168,86,168,110,168,134,168,168,168,202,168,236,168,248,169,40,169,90,169,
140,169,188,170,18,170,114,170,208,171,12,171,102,171,172,171,238,174,134,
174,168,174,186,174,246,175,46,175,70,175,90,175,126,175,232,176,60,176,252,
178,100,179,50,180,4,180,178,181,136,182,32,182,224,183,78,183,128,183,178,
183,228,184,14,184,60,184,106,184,152,184,198,185,14,185,86,185,166,186,118,
187,22,187,70,187,184,187,214,188,72,188,226,188,250,189,52,190,108,191,92,
191,212,192,8,192,96,192,184,192,230,193,0,193,54,193,116,193,140,193,166,
193,200,193,234,194,12,194,46,194,84,194,122,194,160,194,198,194,248,195,
30,195,72,195,118,195,166,195,224,196,14,196,62,196,120,196,166,196,214,197,
16,197,62,197,110,197,168,197,220,198,18,198,86,198,138,198,194,199,8,199,
62,199,114,199,184,199,238,200,34,200,106,200,178,200,252,201,88,201,112,
201,136,201,160,201,184,201,208,203,232,205,196,207,132,207,146,207,178,207,
206,207,246,208,4,208,18,208,32,208,46,208,60,208,106,208,188,208,238,209,
32,209,114,209,180,210,100,210,228,211,148,212,14,212,166,213,6,213,140,213,
224,214,26,214,102,214,220,215,70,215,164,215,246,216,8,216,68,216,164,217,
34,217,88,218,12,218,74,218,114,218,160,218,200,218,242,219,40,219,94,219,
130,219,208,220,20,220,80,0,0,0,2,0,68,0,0,2,100,5,85,0,3,0,7,0,46,177,1,
0,47,60,178,7,4,8,237,50,177,6,5,220,60,178,3,2,8,237,50,0,177,3,0,47,60,
178,5,4,8,237,50,178,7,6,9,252,60,178,1,2,8,237,50,51,17,33,17,37,33,17,33,
68,2,32,254,36,1,152,254,104,5,85,250,171,68,4,205,0,0,0,2,0,185,0,0,1,127,
5,129,0,3,0,7,1,172,64,158,3,91,2,2,150,7,166,7,2,7,150,57,4,73,4,89,4,3,
4,64,23,27,72,6,4,1,11,4,38,9,1,201,9,217,9,2,118,9,166,9,2,25,9,41,9,2,6,
9,1,215,73,9,1,38,9,1,217,9,1,118,9,1,41,9,1,6,9,1,121,9,1,86,9,1,9,9,1,163,
169,9,1,130,9,1,84,9,100,9,116,9,3,137,9,1,98,9,114,9,2,68,9,84,9,2,34,9,
50,9,2,20,9,1,2,9,1,242,9,1,212,9,228,9,2,178,9,194,9,2,148,9,164,9,2,114,
9,130,9,2,84,9,100,9,2,66,9,1,20,9,36,9,52,9,3,2,9,1,110,9,184,255,128,64,
17,102,109,72,73,9,1,9,64,94,98,72,45,9,61,9,2,9,184,1,0,64,153,85,88,72,
9,128,81,84,72,125,9,141,9,157,9,3,95,9,111,9,2,9,128,71,75,72,9,192,67,70,
72,9,128,63,66,72,125,9,1,91,9,107,9,2,61,9,77,9,2,25,9,41,9,2,11,9,1,55,
235,9,251,9,2,205,9,221,9,2,171,9,187,9,2,9,64,45,48,72,59,9,75,9,91,9,3,
29,9,45,9,2,1,203,9,219,9,235,9,3,159,9,175,9,191,9,3,27,9,43,9,59,9,107,
9,123,9,5,15,9,1,2,127,9,143,9,159,9,191,9,207,9,5,64,9,96,9,2,15,9,31,9,
2,7,112,1,1,95,1,1,1,5,156,4,2,3,0,63,47,253,206,93,93,1,94,93,93,93,95,113,
113,113,113,95,114,114,43,114,114,114,94,93,93,93,93,93,43,43,43,113,113,
43,43,114,43,114,43,94,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,
114,114,114,94,93,93,93,113,113,113,113,114,114,94,93,93,93,93,113,47,94,
93,43,93,237,113,51,47,237,49,48,1,35,3,51,3,53,51,21,1,103,148,24,196,198,
194,1,141,3,244,250,127,201,201,0,0,2,0,87,3,198,2,128,5,129,0,3,0,7,0,104,
64,33,48,3,1,128,3,1,3,16,2,32,2,96,2,112,2,128,2,5,96,2,112,2,2,80,2,96,
2,176,2,192,2,4,2,184,255,192,179,37,40,72,2,184,255,192,64,32,25,28,72,2,
48,7,1,128,7,1,7,111,6,127,6,143,6,3,47,6,63,6,2,6,5,32,0,1,0,6,2,3,0,63,
51,205,93,50,1,47,113,114,205,93,113,220,43,43,93,113,114,205,93,113,49,48,
1,35,3,51,1,35,3,51,2,106,142,20,184,254,121,141,21,184,3,198,1,187,254,69,
1,187,0,0,0,2,0,9,0,0,4,105,5,121,0,27,0,31,0,214,64,134,90,25,1,90,21,1,
68,14,1,68,19,1,54,19,1,68,30,1,38,30,54,30,2,68,23,1,38,23,54,23,2,3,16,
1,8,29,28,21,20,9,20,20,11,14,15,18,19,10,9,19,12,16,4,10,4,1,0,25,24,5,24,
24,27,3,3,7,30,31,22,23,6,23,5,6,4,7,8,11,4,12,13,1,14,29,30,4,13,0,15,28,
31,4,16,17,18,21,22,25,4,17,16,13,1,208,13,1,79,17,143,17,159,17,3,63,17,
79,17,2,13,17,13,17,5,20,23,24,3,19,3,6,9,10,3,5,0,47,23,51,63,23,51,18,57,
57,47,47,93,113,93,113,17,23,51,16,205,23,50,17,23,51,16,205,23,50,1,47,51,
51,135,192,192,192,192,1,23,51,16,135,192,192,192,192,1,47,23,51,135,192,
192,192,192,1,51,16,135,192,192,192,192,49,48,1,93,93,93,93,93,93,93,93,93,
93,1,3,33,21,33,3,35,19,33,3,35,19,35,53,51,19,35,53,33,19,51,3,33,19,51,
3,51,21,33,3,33,19,3,128,78,1,4,254,229,88,110,86,254,149,84,110,84,201,225,
78,252,1,18,89,110,88,1,107,88,110,88,211,253,64,80,1,106,78,3,117,254,143,
108,254,104,1,152,254,104,1,152,108,1,113,108,1,152,254,104,1,152,254,104,
108,254,143,1,113,0,3,0,22,255,114,4,82,5,236,0,48,0,59,0,70,1,46,64,92,154,
14,1,154,13,1,150,68,1,133,39,1,138,57,154,57,2,137,53,153,53,2,132,37,1,
118,6,134,6,150,6,3,70,63,86,63,134,63,3,52,38,100,38,116,38,3,37,2,1,25,
27,1,24,34,55,3,47,9,21,65,3,32,48,1,48,48,16,49,30,111,29,41,111,0,49,32,
49,2,0,49,32,49,48,49,80,49,112,49,5,8,3,49,184,255,192,179,29,35,72,49,184,
255,192,64,117,17,22,72,49,4,111,3,64,16,24,72,3,60,111,16,33,66,115,207,
54,1,157,54,1,5,136,54,1,120,10,216,10,2,199,34,215,34,2,182,34,1,135,34,
167,34,2,215,65,1,166,65,1,119,65,1,60,16,65,34,10,54,41,49,8,0,125,30,141,
30,2,26,30,1,30,24,22,64,19,23,72,22,15,21,47,21,63,21,95,21,4,21,55,9,115,
47,148,4,164,4,2,112,4,128,4,2,5,4,21,4,85,4,101,4,4,46,4,0,0,47,50,50,93,
93,93,205,237,50,47,93,205,43,51,51,93,93,18,23,57,93,93,93,93,93,93,93,93,
95,93,93,237,50,1,47,237,214,43,237,47,43,43,95,94,93,113,253,212,237,17,
18,57,47,114,23,51,205,23,50,49,48,93,0,93,93,93,93,93,93,1,93,93,93,0,93,
1,93,37,46,1,39,55,30,3,23,17,39,46,3,53,52,62,2,55,53,51,21,30,3,23,7,46,
1,39,17,30,5,21,20,14,2,7,21,35,1,52,46,2,39,17,62,3,1,20,30,2,23,17,14,3,
2,6,217,245,34,170,11,46,78,113,78,20,77,148,116,71,64,115,158,95,124,100,
145,102,66,20,174,20,122,117,59,114,103,88,64,36,56,114,175,119,124,1,160,
47,81,106,58,65,108,77,42,253,92,40,70,95,55,72,100,61,27,20,9,185,165,37,
53,87,64,39,5,1,240,5,18,50,83,128,98,84,124,83,44,4,131,131,5,45,80,115,
75,33,94,105,11,254,67,14,30,41,56,79,109,72,77,131,100,62,6,162,2,24,63,
80,51,32,15,254,44,4,31,56,81,2,197,54,74,50,33,14,1,165,4,33,52,68,0,0,0,
0,5,0,73,255,244,6,212,5,141,0,19,0,23,0,43,0,63,0,83,0,212,64,11,118,20,
134,20,2,121,22,137,22,2,42,184,255,232,64,14,8,12,72,37,24,8,12,72,32,24,
8,12,72,26,184,255,232,179,8,12,72,17,184,255,232,179,8,12,72,13,184,255,
232,64,18,8,12,72,7,24,8,12,72,3,24,8,12,72,22,23,20,21,21,184,255,240,64,
84,23,16,23,21,23,21,0,39,54,180,10,178,0,180,0,44,16,44,32,44,3,0,44,64,
44,2,0,44,16,44,32,44,80,44,96,44,112,44,224,44,240,44,8,44,64,180,29,178,
74,180,15,39,1,239,39,255,39,2,39,64,10,13,72,39,79,182,34,184,69,182,24,
4,22,3,21,18,49,182,15,184,59,182,5,19,0,63,237,244,237,63,63,63,237,244,
237,1,47,43,113,114,237,244,237,47,93,113,114,253,244,237,17,18,57,57,47,
47,56,56,17,51,17,51,49,48,0,43,43,43,43,43,43,43,43,1,93,93,1,20,14,2,35,
34,46,2,53,52,62,2,51,50,30,2,1,35,1,51,37,50,30,2,21,20,14,2,35,34,46,2,
53,52,62,2,1,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,52,46,2,35,34,14,
2,21,20,30,2,51,50,62,2,6,212,51,87,116,66,66,115,85,49,48,86,117,68,66,115,
85,50,251,59,155,3,154,157,251,223,64,114,86,49,50,85,116,66,67,116,85,49,
49,86,118,4,250,22,43,63,40,42,64,44,22,23,43,63,41,39,63,44,24,251,240,22,
42,62,40,43,65,44,22,23,43,64,42,38,62,44,24,1,178,125,171,105,45,45,104,
171,126,133,174,103,41,41,103,174,253,201,5,129,12,41,102,172,131,126,172,
107,46,46,106,172,127,131,172,102,41,252,37,99,131,78,32,33,78,131,98,95,
128,79,34,34,79,128,2,124,98,130,78,32,33,78,130,97,95,130,79,34,34,79,130,
0,0,3,0,72,255,236,5,54,5,137,0,57,0,73,0,89,1,20,64,73,137,1,1,140,36,1,
123,42,139,42,2,98,82,114,82,130,82,3,102,71,1,127,78,1,91,78,1,73,43,89,
43,105,43,3,54,48,134,48,2,37,40,1,44,35,124,35,140,35,3,28,5,44,5,60,5,92,
5,4,10,10,26,10,42,10,3,10,2,26,2,42,2,3,31,184,255,232,64,56,9,13,72,10,
25,26,25,42,25,3,48,41,38,69,4,54,66,73,23,33,73,58,45,44,140,74,1,74,77,
18,3,23,3,58,44,80,23,1,3,44,1,23,58,44,44,58,23,3,13,15,54,1,175,54,1,54,
184,255,192,64,61,9,12,72,54,80,72,63,13,79,13,2,13,143,3,1,141,77,1,98,69,
114,69,2,54,69,70,69,2,3,74,48,41,77,44,38,18,69,9,8,63,81,144,28,1,192,28,
1,15,28,63,28,2,28,85,81,8,22,51,80,0,22,0,63,237,63,237,47,93,93,113,237,
18,23,57,93,93,93,93,1,47,93,237,47,43,93,113,18,23,57,47,47,47,0,93,1,93,
17,18,57,17,23,57,93,16,205,16,237,16,237,17,23,57,49,48,93,43,0,93,93,93,
93,1,93,93,93,0,93,93,93,93,1,93,0,93,93,5,34,38,39,14,3,35,34,46,2,53,52,
62,2,55,46,3,53,52,62,2,51,50,30,2,21,20,14,2,7,30,1,23,62,1,55,23,14,1,7,
30,1,51,50,54,55,21,14,1,1,52,46,2,35,34,6,21,20,22,23,62,3,3,46,1,39,14,
1,21,20,30,2,51,50,62,2,4,169,96,144,58,30,76,93,109,64,117,171,110,53,51,
91,126,75,18,29,22,12,40,85,133,93,73,123,90,50,66,112,148,83,62,146,85,61,
81,29,145,35,107,70,53,106,49,32,59,26,28,75,254,150,27,48,69,42,96,100,37,
28,65,116,86,50,74,89,164,66,113,123,35,72,109,73,44,79,68,55,12,66,61,26,
48,38,23,60,105,143,83,79,129,105,83,33,34,77,78,78,35,66,115,85,49,38,72,
106,68,75,117,92,75,33,114,201,97,90,199,121,43,139,227,103,54,44,7,9,135,
11,11,4,121,37,60,43,23,103,91,59,129,56,26,55,65,79,252,158,105,230,122,
48,148,105,55,95,71,41,19,30,38,0,0,1,0,104,3,198,1,32,5,129,0,3,0,33,64,
19,48,3,1,128,3,1,3,16,2,32,2,2,2,32,0,1,0,2,3,0,63,205,93,1,47,93,205,93,
113,49,48,1,35,3,51,1,10,141,21,184,3,198,1,187,0,1,0,127,254,88,2,158,5,
204,0,22,0,66,64,45,135,13,1,135,9,1,88,20,1,88,2,1,17,24,14,17,72,5,24,14,
17,72,16,6,16,16,6,128,6,2,6,11,242,0,0,16,0,32,0,3,0,16,27,5,0,0,63,63,1,
47,93,237,204,93,56,50,49,48,43,43,93,93,93,93,19,52,62,2,55,51,14,3,21,20,
30,2,23,35,46,3,53,127,42,90,140,97,174,94,137,88,43,43,88,137,94,174,97,
140,90,42,2,20,139,254,234,220,105,105,221,235,254,139,139,254,236,220,105,
105,220,234,253,140,0,0,0,1,0,12,254,88,2,43,5,204,0,22,0,72,64,13,136,13,
1,136,9,1,87,20,1,87,2,1,17,184,255,232,179,14,17,72,5,184,255,232,180,14,
17,72,16,6,184,255,240,64,16,31,6,143,6,2,6,0,242,143,11,1,11,16,0,5,27,0,
63,63,1,47,93,253,204,93,56,50,49,48,43,43,93,93,93,93,1,20,14,2,7,35,62,
3,53,52,46,2,39,51,30,3,21,2,43,42,90,140,97,174,94,137,88,43,43,88,137,94,
174,97,140,90,42,2,16,140,253,234,220,105,105,220,236,254,139,139,254,235,
221,105,105,220,234,254,139,0,0,0,0,1,0,33,2,178,2,253,5,129,0,14,0,107,64,
75,77,5,93,5,109,5,3,75,4,91,4,107,4,3,66,8,82,8,2,67,7,83,7,2,0,6,12,3,13,
95,4,1,15,4,1,4,3,32,2,48,2,2,2,14,47,10,63,10,2,10,9,8,191,13,207,13,2,16,
13,32,13,2,13,240,5,1,223,5,1,0,5,1,5,14,3,0,63,204,93,93,93,1,47,93,93,204,
51,204,93,221,204,93,51,204,113,114,18,23,57,49,48,93,93,93,93,1,37,23,5,
23,7,11,1,39,55,37,55,5,3,51,1,200,1,8,45,254,230,185,119,150,156,119,189,
254,232,45,1,11,12,136,4,90,103,132,73,250,72,1,2,255,0,72,248,73,134,107,
1,41,0,0,0,1,0,100,0,180,4,71,4,158,0,11,0,71,64,46,211,11,1,133,11,1,220,
4,1,138,4,1,9,1,170,6,16,2,32,2,2,2,217,2,1,56,2,136,2,2,2,0,4,173,9,214,
7,1,55,7,135,7,2,7,5,179,0,63,51,93,93,51,237,50,50,93,93,1,47,93,51,237,
50,49,48,93,93,93,93,1,17,35,17,33,53,33,17,51,17,33,21,2,159,147,254,88,
1,168,147,1,168,2,96,254,84,1,172,146,1,172,254,84,146,0,0,1,0,184,254,250,
1,129,0,219,0,12,0,78,185,0,4,255,224,183,11,17,72,10,151,0,150,7,184,255,
192,64,22,9,17,72,7,128,12,144,12,2,64,12,80,12,176,12,3,144,12,160,12,2,
12,184,255,192,64,14,38,41,72,12,64,13,16,72,12,7,168,0,155,11,0,47,253,228,
1,47,43,43,93,113,114,51,43,253,237,49,48,43,37,21,20,14,2,7,35,62,1,53,35,
53,1,129,9,20,29,20,123,45,49,88,219,168,53,87,75,66,32,65,132,65,219,0,0,
0,0,1,0,91,1,208,2,79,2,112,0,3,0,33,64,20,0,2,64,2,112,2,3,2,0,0,187,159,
1,207,1,2,47,1,1,1,0,47,93,113,237,1,47,47,93,49,48,19,53,33,21,91,1,244,
1,208,160,160,0,0,0,1,0,187,0,0,1,126,0,219,0,3,0,46,64,32,3,150,0,0,144,
0,2,64,0,80,0,176,0,224,0,240,0,5,144,0,160,0,2,0,64,13,16,72,0,1,155,0,0,
47,237,1,47,43,93,113,114,237,49,48,51,53,51,21,187,195,219,219,0,1,0,0,255,
236,2,57,5,204,0,3,0,51,64,26,121,0,137,0,2,1,24,13,17,72,41,2,1,2,16,0,2,
16,2,32,2,128,2,4,2,0,184,255,240,180,0,1,0,0,19,0,63,63,1,47,56,205,93,56,
49,48,93,43,93,21,1,51,1,1,155,158,254,105,20,5,224,250,32,0,0,2,0,80,255,
236,4,35,5,150,0,19,0,39,0,112,64,80,89,37,105,37,2,70,33,86,33,102,33,3,
86,27,102,27,2,89,23,105,23,2,4,18,1,118,17,134,17,2,121,13,137,13,2,11,12,
1,11,8,1,121,7,137,7,2,118,3,134,3,2,4,2,1,7,0,110,64,144,20,160,20,2,20,
41,128,30,110,63,10,1,10,25,115,15,7,35,115,5,25,0,63,237,63,237,1,47,93,
237,26,16,220,93,26,237,49,48,94,93,93,93,93,93,93,93,93,93,93,93,93,1,20,
2,14,1,35,34,46,1,2,53,52,18,62,1,51,50,30,1,18,7,52,46,2,35,34,14,2,21,20,
30,2,51,50,62,2,4,35,77,133,180,102,103,178,131,75,75,132,180,106,101,177,
132,76,183,40,78,113,72,76,116,79,40,41,79,114,73,71,114,79,43,2,193,203,
254,235,171,74,74,170,1,21,204,213,1,23,166,67,67,166,254,233,213,168,223,
133,55,56,133,223,167,162,222,135,59,59,135,222,0,1,0,156,0,0,4,15,5,129,
0,10,0,94,64,32,32,9,128,9,2,9,9,8,110,2,144,4,1,4,47,1,143,1,2,1,1,4,6,3,
0,2,16,2,2,7,2,5,184,255,240,64,26,16,22,72,68,5,84,5,100,5,3,5,4,3,16,16,
22,72,4,3,6,6,8,1,116,0,24,0,63,237,50,63,51,51,43,47,51,93,43,1,47,94,93,
23,51,47,93,47,93,16,237,50,47,93,49,48,51,53,33,17,5,53,37,51,17,33,21,156,
1,103,254,194,1,77,166,1,87,153,4,60,227,170,229,251,24,153,0,0,0,1,0,103,
0,0,4,12,5,150,0,40,0,161,64,77,117,4,1,117,26,133,26,2,122,16,138,16,2,101,
37,1,86,37,1,41,33,89,33,105,33,3,105,35,1,28,35,1,25,21,1,117,27,133,27,
2,6,27,1,39,29,110,64,8,64,38,42,72,64,8,1,143,8,1,8,42,128,18,110,19,116,
38,132,38,2,19,38,16,0,32,0,2,0,184,255,192,64,31,30,38,72,0,8,38,142,18,
1,92,18,108,18,124,18,3,10,18,26,18,2,18,13,115,24,7,1,38,116,0,24,0,63,237,
57,63,237,51,93,93,93,18,57,1,47,43,93,51,51,93,47,237,26,16,220,93,113,43,
26,237,50,49,48,93,93,0,93,93,93,93,1,93,93,0,93,93,93,51,53,62,5,53,52,46,
2,35,34,14,2,7,39,62,3,51,50,30,2,21,20,14,6,7,33,21,103,51,147,162,159,128,
79,36,68,95,58,54,95,74,47,7,184,9,66,116,163,107,105,164,113,60,51,85,112,
122,124,109,86,24,2,223,127,117,179,145,124,124,136,86,60,91,62,31,30,60,
89,59,17,76,134,101,58,50,98,144,94,71,128,116,108,103,101,102,105,57,153,
0,0,0,0,1,0,78,255,236,4,25,5,150,0,59,0,216,64,149,122,3,138,3,2,117,2,133,
2,2,117,58,133,58,2,117,51,133,51,2,117,47,133,47,2,117,13,133,13,2,122,37,
138,37,2,91,17,107,17,2,26,41,1,21,8,1,118,46,134,46,2,7,46,1,73,39,1,38,
110,54,25,49,95,25,111,25,2,39,25,39,25,10,19,32,110,49,49,0,110,64,31,19,
47,19,159,19,3,144,19,1,19,61,128,11,110,239,10,1,63,10,1,10,54,25,116,26,
26,16,141,38,1,92,38,108,38,124,38,3,10,38,26,38,2,38,35,115,44,7,16,115,
129,11,1,83,11,99,11,115,11,3,20,11,1,5,11,1,11,5,25,0,63,51,93,93,93,93,
237,63,237,51,93,93,93,18,57,47,237,57,1,47,93,113,237,26,16,220,93,113,26,
237,50,47,237,17,18,57,57,47,47,93,17,18,57,237,113,49,48,0,93,93,93,93,1,
93,0,93,93,1,93,93,93,93,0,93,1,20,14,2,35,34,46,2,39,55,30,3,51,50,54,53,
52,46,2,43,1,53,51,50,62,2,53,52,38,35,34,6,7,39,62,3,51,50,30,2,21,20,14,
2,7,21,30,3,4,25,63,121,179,115,131,179,116,58,9,186,8,43,74,108,74,136,155,
69,103,121,51,102,98,51,110,91,59,133,131,119,147,12,181,11,80,123,158,89,
118,170,108,51,34,72,111,78,85,126,82,41,1,133,97,152,105,55,65,107,137,73,
17,56,92,66,36,134,132,78,95,53,18,156,21,55,94,73,113,131,122,111,14,93,
138,91,45,59,101,136,77,62,108,86,62,16,4,9,59,88,112,0,0,2,0,47,0,0,4,55,
5,129,0,10,0,23,0,117,64,80,154,15,1,153,6,1,136,6,1,133,16,149,16,2,118,
16,1,24,22,1,118,22,134,22,150,22,3,22,5,64,12,21,72,5,91,10,107,10,123,10,
3,10,8,1,111,23,6,31,2,1,112,2,224,2,2,0,2,16,2,48,2,80,2,224,2,5,8,2,0,4,
115,8,22,22,1,11,6,6,1,24,0,63,63,51,18,57,47,51,237,50,1,47,94,93,113,114,
51,51,237,50,50,93,47,43,51,93,113,49,48,93,93,93,93,0,93,1,17,35,17,33,53,
1,51,17,51,21,1,14,3,7,1,14,3,7,33,3,113,170,253,104,2,133,189,198,254,144,
2,16,20,21,8,254,151,5,19,20,20,6,1,242,1,63,254,193,1,63,140,3,182,252,76,
142,3,119,5,29,36,37,12,253,236,8,26,27,26,7,0,1,0,82,255,236,4,29,5,129,
0,44,0,181,64,28,86,13,102,13,134,13,3,85,2,101,2,2,90,3,106,3,2,85,43,101,
43,2,85,42,101,42,2,38,184,255,216,64,89,14,17,72,21,8,1,6,10,1,25,36,153,
36,2,137,36,217,36,2,3,68,33,1,6,35,32,14,17,72,35,11,0,110,64,31,21,1,47,
21,159,21,2,144,21,1,21,46,128,36,31,37,110,33,32,32,11,110,208,10,1,63,10,
1,10,26,115,40,40,16,36,116,33,6,16,115,115,11,131,11,2,103,11,1,22,11,1,
11,5,25,0,63,51,93,93,93,237,63,237,18,57,47,237,1,47,93,113,237,51,47,51,
237,50,50,26,16,220,93,113,114,26,237,17,57,43,49,48,95,113,95,113,114,0,
93,1,93,0,43,93,1,93,0,93,1,93,0,93,1,20,14,2,35,34,46,2,39,55,30,3,51,50,
62,2,53,52,46,2,35,34,14,2,7,35,19,33,21,33,3,62,1,51,50,30,2,4,29,64,126,
187,123,111,165,114,67,14,182,11,40,69,101,72,70,114,81,44,42,78,113,72,45,
76,65,53,23,176,47,3,33,253,131,27,48,144,99,105,168,118,64,1,203,106,176,
127,70,52,91,122,70,21,40,75,59,35,43,84,122,79,65,109,79,44,16,28,37,20,
2,246,153,254,65,37,53,64,117,162,0,0,0,0,2,0,104,255,236,4,25,5,150,0,36,
0,56,0,175,64,48,140,21,1,122,22,138,22,2,89,7,105,7,2,90,3,106,3,122,3,3,
84,2,100,2,2,84,35,100,35,116,35,3,84,34,100,34,116,34,3,53,30,69,30,2,133,
50,1,50,184,255,240,64,45,10,13,72,132,26,1,37,26,53,26,69,26,117,26,4,22,
26,1,21,111,20,20,0,110,64,47,37,159,37,2,144,37,1,37,58,128,47,29,110,16,
10,32,10,2,10,184,255,192,64,24,30,38,72,10,29,42,117,32,32,52,24,115,25,
21,153,21,2,21,15,7,52,115,5,25,0,63,237,63,51,93,237,18,57,47,237,50,1,47,
43,93,237,50,26,16,220,93,113,26,237,50,47,237,49,48,93,93,93,43,93,0,93,
93,1,93,93,0,93,93,93,93,1,20,14,2,35,34,46,1,2,53,52,18,62,1,51,50,30,2,
23,7,46,1,35,34,14,2,21,62,1,51,50,30,2,7,52,46,2,35,34,14,2,21,20,30,2,51,
50,62,2,4,25,59,115,170,111,123,184,122,61,69,130,187,118,72,126,103,78,23,
172,28,123,81,74,120,84,45,49,178,115,96,156,111,61,183,36,72,106,70,49,100,
81,51,40,75,106,66,65,103,72,38,1,205,106,177,127,71,94,177,1,1,164,188,1,
28,190,96,30,67,110,80,31,91,81,70,139,210,140,91,95,62,117,167,112,73,118,
83,45,29,65,106,76,78,135,100,58,45,85,122,0,0,1,0,105,0,0,4,12,5,129,0,14,
0,68,64,45,122,11,138,11,2,105,11,1,5,110,6,6,0,80,12,1,16,12,32,12,2,12,
11,95,0,1,0,0,32,0,64,0,96,0,128,0,5,0,0,12,116,13,6,5,24,0,63,63,237,50,
1,47,93,113,51,47,93,113,18,57,47,237,49,48,93,93,1,6,10,2,21,35,52,26,2,
55,33,53,33,4,12,106,178,128,71,188,80,136,180,101,253,11,3,163,4,239,162,
254,213,254,209,254,193,180,169,1,69,1,57,1,46,147,153,0,0,0,0,3,0,89,255,
236,4,26,5,150,0,41,0,61,0,81,0,191,64,132,117,40,133,40,2,117,33,133,33,
2,117,29,133,29,2,117,28,133,28,2,117,24,133,24,2,122,23,138,23,2,122,19,
138,19,2,122,12,1,122,8,138,8,2,122,7,138,7,2,122,3,138,3,2,117,2,133,2,2,
85,69,101,69,2,85,75,101,75,2,90,65,106,65,2,52,110,21,42,110,31,15,36,31,
79,21,1,21,31,21,31,10,0,110,64,15,62,31,62,2,31,62,47,62,159,62,3,144,62,
1,62,83,128,72,110,208,10,1,10,36,15,67,117,57,57,77,47,117,26,7,77,117,5,
25,0,63,237,63,237,18,57,47,237,57,57,1,47,113,237,26,16,220,93,113,114,26,
237,17,57,57,47,47,113,18,57,57,16,237,16,237,49,48,93,93,93,93,0,93,93,1,
93,93,93,93,0,93,93,1,93,93,93,1,20,14,2,35,34,46,2,53,52,62,2,55,53,46,3,
53,52,62,2,51,50,30,2,21,20,14,2,7,21,30,3,3,52,46,2,35,34,14,2,21,20,30,
2,51,50,62,2,19,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,4,26,57,117,182,
124,124,181,119,57,47,79,101,54,59,93,63,33,57,112,166,109,115,169,111,54,
33,63,93,61,61,104,76,44,222,27,62,100,73,71,98,63,28,22,58,102,80,85,103,
55,17,35,28,68,115,86,79,111,69,32,32,70,114,81,82,112,68,29,1,137,90,151,
110,62,62,109,151,89,77,120,87,53,9,4,14,62,87,106,59,74,131,99,57,58,99,
132,74,58,106,87,61,12,4,10,53,87,120,2,76,53,88,63,35,35,63,88,53,42,88,
72,46,46,72,88,253,163,51,95,73,45,45,74,97,52,65,107,77,42,42,77,109,0,0,
0,2,0,96,255,236,4,18,5,150,0,36,0,56,0,190,64,105,169,39,1,163,11,1,149,
12,165,12,2,170,17,1,153,17,1,116,35,132,35,2,116,32,132,32,148,32,3,122,
31,138,31,154,31,3,122,27,138,27,154,27,3,123,26,139,26,155,26,3,90,40,106,
40,2,89,2,105,2,2,16,24,10,13,72,54,8,1,37,0,110,47,19,63,19,2,79,19,191,
19,2,0,19,32,19,48,19,64,19,176,19,5,7,19,58,11,111,10,10,47,110,32,29,1,
29,184,255,192,64,27,32,38,72,29,19,52,115,95,24,111,24,2,24,24,5,42,115,
34,7,14,115,23,11,1,11,5,25,0,63,51,93,237,63,237,17,57,47,93,237,50,1,47,
43,93,237,51,47,237,16,220,94,93,113,114,237,51,49,48,93,43,93,93,0,93,1,
93,93,0,93,93,1,93,93,0,93,93,1,93,1,20,2,14,1,35,34,46,2,39,55,30,1,51,50,
62,2,55,14,3,35,34,46,2,53,52,62,2,51,50,18,7,52,46,2,35,34,14,2,21,20,30,
2,51,50,62,2,4,18,71,132,189,118,81,130,102,72,22,172,28,119,91,73,121,85,
48,2,21,73,93,108,55,96,155,108,59,63,120,175,111,235,242,196,37,73,107,70,
65,104,72,39,35,70,104,69,50,103,83,53,2,221,188,254,229,188,94,33,70,112,
79,27,91,85,69,138,208,140,47,74,51,27,69,124,175,107,109,176,123,66,254,
164,175,78,138,102,59,46,85,122,75,71,122,89,51,34,70,107,0,0,0,0,2,0,187,
0,0,1,126,4,58,0,3,0,7,0,54,64,36,3,7,150,0,0,4,144,4,2,64,4,80,4,224,4,240,
4,4,144,4,160,4,2,4,64,13,16,72,4,5,156,4,0,156,1,15,0,63,237,47,237,1,47,
43,93,113,114,51,237,50,49,48,19,53,51,21,3,53,51,21,187,195,195,195,3,107,
207,207,252,149,207,207,0,0,0,2,0,184,254,250,1,129,4,58,0,12,0,16,0,89,185,
0,4,255,224,64,10,11,17,72,16,10,151,0,150,13,7,184,255,192,64,22,9,17,72,
7,128,12,144,12,2,64,12,80,12,176,12,3,144,12,160,12,2,12,184,255,192,64,
18,38,41,72,12,64,13,16,72,12,13,156,14,15,7,168,0,156,11,0,47,253,228,63,
237,1,47,43,43,93,113,114,51,43,51,253,237,51,49,48,43,37,21,20,14,2,7,35,
62,1,53,35,53,17,53,51,21,1,129,9,20,29,20,123,45,49,88,195,207,156,53,87,
75,66,32,65,132,65,207,2,156,207,207,0,0,1,0,101,0,154,4,72,4,170,0,6,0,106,
185,0,5,255,216,64,17,18,22,72,3,40,18,22,72,0,40,18,22,72,137,0,1,1,184,
255,216,64,51,18,22,72,134,1,1,6,0,2,32,2,80,2,112,2,4,2,32,0,1,0,63,6,127,
6,143,6,3,6,48,2,112,2,128,2,3,2,1,0,15,4,63,4,111,4,159,4,207,4,5,4,0,25,
47,93,51,51,205,93,205,93,1,24,47,93,47,93,51,49,48,0,93,43,93,43,43,43,19,
53,1,21,9,1,21,101,3,227,252,166,3,90,2,59,205,1,162,154,254,146,254,145,
153,0,0,0,0,2,0,100,1,88,4,71,3,236,0,3,0,7,0,70,64,49,7,64,2,96,2,2,0,2,
32,2,112,2,208,2,4,2,4,223,0,1,32,0,1,0,4,173,31,5,47,5,95,5,111,5,223,5,
5,5,0,173,80,1,208,1,2,15,1,1,1,0,47,93,93,237,222,93,237,1,47,93,93,51,47,
93,113,51,49,48,19,53,33,21,1,53,33,21,100,3,227,252,29,3,227,3,88,148,148,
254,0,148,148,0,0,0,0,1,0,101,0,154,4,72,4,170,0,6,0,106,185,0,1,255,216,
64,17,18,22,72,3,40,18,22,72,6,40,18,22,72,137,6,1,5,184,255,216,64,51,18,
22,72,134,5,1,0,6,32,6,80,6,112,6,4,6,3,32,0,1,0,6,5,48,4,112,4,128,4,3,4,
63,0,127,0,143,0,3,0,15,2,63,2,111,2,159,2,207,2,5,2,0,25,47,93,205,93,205,
93,51,51,1,24,47,93,51,47,93,49,48,0,93,43,93,43,43,43,55,53,9,1,53,1,21,
101,3,90,252,166,3,227,154,153,1,111,1,110,154,254,94,205,0,2,0,84,0,0,4,
39,5,150,0,37,0,41,0,137,64,68,117,36,133,36,2,117,35,133,35,2,90,26,106,
26,2,90,21,1,90,14,122,14,138,14,3,90,13,122,13,138,13,3,58,6,74,6,2,9,72,
10,10,176,41,192,41,2,41,150,38,38,19,27,70,28,0,70,0,19,32,19,64,19,144,
19,176,19,5,19,184,255,192,64,23,38,44,72,19,19,33,95,10,143,10,2,10,39,156,
38,76,27,1,27,24,95,33,4,0,63,237,51,93,47,253,198,93,17,57,1,47,43,93,237,
47,237,18,57,47,237,113,51,47,237,49,48,0,93,1,93,93,0,93,93,93,1,93,1,20,
14,6,7,35,62,7,53,52,46,2,35,34,6,7,39,62,3,51,50,30,2,1,53,51,21,4,39,37,
62,79,82,79,63,39,1,175,2,39,62,78,80,77,60,37,42,77,109,67,140,164,14,184,
11,67,121,179,122,114,178,123,64,253,143,195,4,8,71,108,85,67,60,58,68,83,
55,69,104,80,63,57,57,70,88,59,59,92,63,32,140,122,12,84,149,112,65,56,103,
148,251,157,201,201,0,0,0,0,2,0,161,254,229,7,110,5,204,0,93,0,114,1,101,
64,255,122,17,138,17,2,117,15,133,15,2,117,27,133,27,2,121,47,137,47,2,116,
38,132,38,2,102,38,1,99,70,1,86,69,102,69,2,123,26,139,26,2,73,26,1,74,56,
90,56,106,56,3,59,102,1,82,63,1,54,63,70,63,2,82,64,1,38,64,54,64,70,64,3,
131,3,1,37,3,53,3,69,3,3,37,2,53,2,69,2,133,2,4,25,8,57,8,2,11,8,1,11,8,27,
8,2,8,32,12,17,72,22,92,102,92,134,92,3,80,58,96,58,2,5,58,21,58,53,58,69,
58,4,137,57,1,93,57,1,10,57,26,57,2,9,7,1,125,52,141,52,2,11,52,75,52,2,10,
22,26,22,42,22,3,104,212,24,37,41,211,10,112,34,132,72,1,72,10,49,80,24,1,
80,24,1,24,10,24,10,82,0,210,64,95,49,111,49,2,143,49,159,49,2,49,116,128,
61,210,0,82,16,82,32,82,3,82,44,213,5,5,107,214,19,99,214,29,36,29,47,19,
63,19,79,19,3,32,29,48,29,64,29,3,19,29,19,29,77,54,214,89,0,149,71,1,71,
66,214,77,0,47,237,51,93,63,237,18,57,57,47,47,93,93,17,51,16,237,16,237,
51,47,237,1,47,93,237,26,16,220,93,113,26,237,18,57,57,47,47,93,114,17,18,
57,93,50,50,16,237,50,16,237,49,48,93,93,93,93,0,93,93,93,1,93,93,93,43,93,
0,93,93,1,93,93,93,0,93,93,1,93,93,0,93,93,1,93,93,0,93,93,1,93,93,93,0,93,
1,93,0,93,1,20,14,2,35,34,46,2,53,52,54,55,35,14,3,35,34,46,2,53,52,62,2,
51,50,30,2,23,51,55,51,3,14,1,21,20,22,51,50,62,2,53,52,46,2,35,34,14,4,21,
20,30,2,51,50,62,2,55,23,14,3,35,34,36,38,2,53,52,18,62,2,36,51,50,4,22,18,
5,52,46,2,35,34,14,2,21,20,22,51,50,62,2,55,62,1,7,110,67,118,165,97,56,79,
50,22,2,1,6,24,69,93,117,71,84,125,81,40,71,132,185,114,60,96,73,54,18,6,
39,156,116,19,18,43,38,62,107,79,45,83,161,238,156,134,227,184,139,94,48,
86,165,243,158,105,182,152,120,44,55,50,135,166,196,111,190,254,217,203,105,
63,118,170,215,0,255,144,201,1,36,191,92,253,162,34,63,89,56,86,130,87,45,
95,99,69,120,96,70,18,9,14,2,243,144,239,172,96,27,47,64,38,15,43,12,45,89,
69,43,58,103,141,83,120,221,169,102,27,48,67,40,160,254,6,84,120,49,48,46,
81,142,192,112,129,222,162,92,64,116,161,192,219,115,141,238,171,96,33,48,
57,24,112,30,63,52,33,115,206,1,28,169,139,1,0,220,180,128,70,118,200,254,
248,155,50,84,60,33,85,138,173,87,120,136,62,102,132,71,36,80,0,0,0,0,2,0,
4,0,0,5,82,5,129,0,7,0,20,1,18,64,206,102,2,118,2,134,2,3,102,19,118,19,134,
19,3,105,1,121,1,137,1,3,105,20,121,20,137,20,3,115,6,131,6,2,101,6,1,124,
5,140,5,2,106,5,1,122,0,138,0,2,57,0,89,0,105,0,3,117,3,133,3,2,54,3,86,3,
102,3,3,90,4,1,72,4,1,85,7,1,71,7,1,19,2,3,1,20,0,21,6,37,6,53,6,3,6,6,1,
230,6,246,6,2,26,5,42,5,58,5,3,9,5,1,233,5,249,5,2,6,5,13,13,4,26,0,42,0,
58,0,3,9,0,1,233,0,249,0,2,0,16,7,32,7,48,7,3,32,7,1,7,7,22,21,3,37,3,53,
3,3,6,3,1,230,3,246,3,2,3,175,4,191,4,2,4,80,22,176,22,2,48,22,96,22,144,
22,192,22,240,22,5,47,22,1,1,2,95,20,19,19,118,13,1,13,5,3,4,0,18,0,63,50,
63,51,93,57,47,51,237,50,1,93,93,113,47,93,51,93,113,113,17,51,47,93,113,
51,93,113,113,18,57,61,47,51,51,93,113,113,93,113,113,18,57,57,18,57,57,49,
48,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,33,3,33,3,35,1,51,9,1,
46,3,39,14,3,7,3,33,4,143,161,253,126,162,198,2,63,217,2,54,253,174,16,29,
22,15,1,2,14,23,29,15,180,2,15,1,156,254,100,5,129,250,127,4,2,40,82,67,45,
5,5,46,68,82,40,254,49,0,3,0,168,0,0,4,234,5,129,0,22,0,33,0,46,0,155,64,
108,155,24,171,24,2,147,32,1,133,32,1,147,45,1,117,45,133,45,2,122,36,138,
36,154,36,3,5,11,21,11,37,11,3,6,2,22,2,38,2,3,171,18,1,159,18,1,107,18,123,
18,139,18,3,18,28,13,90,23,64,13,17,72,23,23,41,0,90,64,31,34,47,34,2,175,
34,1,34,48,128,28,41,90,0,6,16,6,64,6,3,7,6,18,40,95,127,28,1,28,28,41,27,
95,7,3,41,95,6,18,0,63,237,63,237,18,57,47,113,237,57,1,47,94,93,237,50,26,
16,220,93,113,26,237,18,57,47,43,237,17,57,93,93,93,49,48,93,93,0,93,93,93,
93,93,93,1,20,14,2,35,33,17,33,50,30,2,21,20,14,2,7,30,3,1,52,38,35,33,17,
33,50,62,2,19,52,46,2,35,33,17,33,50,62,2,4,234,84,142,188,104,253,196,2,
0,117,184,128,67,33,67,101,67,85,131,88,46,254,238,156,148,254,191,1,65,84,
116,72,32,81,49,92,129,80,254,156,1,115,73,123,89,50,1,141,107,151,95,44,
5,129,39,84,129,90,59,104,85,61,15,10,58,90,119,2,66,114,98,254,66,33,61,
86,253,190,67,94,60,28,254,4,24,60,100,0,1,0,104,255,236,5,121,5,150,0,39,
0,173,64,79,121,14,137,14,2,117,13,133,13,2,123,37,139,37,2,106,38,1,124,
36,140,36,2,106,36,1,106,28,1,85,7,1,90,3,1,42,29,106,29,2,134,23,1,42,23,
106,23,2,5,8,21,8,2,5,2,21,2,2,5,91,80,26,96,26,2,175,26,191,26,2,32,26,1,
15,26,1,26,34,16,184,255,192,64,42,7,13,72,16,16,41,32,41,1,79,35,1,35,35,
0,95,31,4,0,15,16,15,2,48,15,64,15,112,15,128,15,192,15,208,15,6,15,15,10,
95,21,19,0,63,237,51,47,93,113,63,237,51,47,93,1,93,17,51,47,43,51,47,93,
93,93,113,237,49,48,93,93,93,93,93,0,93,93,1,93,93,93,93,0,93,93,1,93,1,34,
14,2,21,20,30,2,51,50,62,2,55,23,14,3,35,34,36,38,2,53,52,18,54,36,51,50,
4,23,7,46,3,3,24,120,185,125,64,69,129,187,117,82,135,109,86,33,156,38,112,
151,191,118,171,254,255,173,86,91,175,1,0,164,225,1,46,71,181,20,68,102,137,
4,250,80,148,208,127,127,211,152,84,43,78,107,65,78,79,136,100,57,109,195,
1,12,159,165,1,10,187,101,176,173,60,50,91,70,42,0,2,0,168,0,0,5,101,5,129,
0,12,0,25,0,100,64,70,169,24,1,123,24,1,172,23,1,27,23,43,23,59,23,123,23,
4,169,16,1,27,16,43,16,59,16,123,16,4,123,15,1,153,3,1,121,2,1,0,90,64,47,
13,1,13,27,128,64,27,1,20,90,0,6,16,6,64,6,3,7,6,19,95,7,3,20,95,6,18,0,63,
237,63,237,1,47,94,93,237,93,26,16,220,113,26,237,49,48,93,93,93,93,93,93,
93,93,93,1,20,2,14,1,35,33,17,33,50,4,22,18,7,52,46,2,35,33,17,33,50,62,2,
5,101,106,184,251,145,253,241,1,210,163,1,19,198,111,192,82,148,206,123,254,
241,1,58,111,189,138,78,2,207,176,254,243,181,93,5,129,81,169,254,252,180,
143,203,130,61,251,177,72,142,212,0,0,1,0,168,0,0,4,254,5,129,0,11,0,77,181,
7,3,7,3,0,10,184,255,192,64,37,7,11,72,10,10,13,5,9,90,0,0,16,0,64,0,3,7,
0,32,13,1,8,95,127,5,1,5,5,9,4,95,1,3,9,95,0,18,0,63,237,63,237,18,57,47,
113,237,1,93,47,94,93,237,50,17,51,47,43,18,57,57,47,47,49,48,51,17,33,21,
33,17,33,21,33,17,33,21,168,4,45,252,146,3,50,252,206,3,151,5,129,156,254,
60,154,254,21,156,0,0,1,0,168,0,0,4,145,5,129,0,9,0,105,185,0,2,255,192,182,
13,24,72,2,2,6,8,184,255,192,64,58,7,12,72,8,8,11,1,5,90,0,6,16,6,64,6,3,
7,6,48,11,1,4,95,239,1,1,15,1,63,1,111,1,127,1,159,1,175,1,207,1,223,1,8,
8,1,64,23,30,72,1,1,5,0,95,7,3,5,18,0,63,63,237,18,57,47,43,94,93,113,237,
1,93,47,94,93,237,50,17,51,47,43,18,57,47,43,49,48,1,17,33,21,33,17,35,17,
33,21,1,103,3,18,252,238,191,3,233,4,229,253,244,158,253,197,5,129,156,0,
1,0,103,255,236,5,160,5,150,0,45,0,185,64,130,134,43,1,106,43,1,66,37,82,
37,2,5,24,21,24,85,24,3,86,23,1,86,19,1,5,18,21,18,85,18,3,122,12,138,12,
2,89,12,105,12,2,106,3,1,106,2,1,73,37,89,37,2,53,29,1,123,13,139,13,2,64,
10,1,10,10,36,92,31,64,33,33,0,127,31,143,31,2,31,47,128,32,47,96,47,128,
47,3,21,91,175,0,191,0,2,32,0,1,15,0,1,0,33,95,240,34,1,34,34,5,26,95,41,
19,16,95,5,48,11,64,11,2,144,11,224,11,2,11,11,5,4,0,63,51,47,93,113,16,237,
63,237,17,57,47,93,237,1,47,93,93,93,237,93,26,16,204,93,17,57,47,26,16,237,
50,47,93,49,48,0,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,19,52,18,54,
36,51,50,30,2,23,7,46,3,35,34,14,2,21,20,30,2,51,50,62,2,55,53,33,53,33,17,
14,3,35,34,36,38,2,103,89,177,1,6,173,130,196,144,100,35,182,26,73,104,137,
88,128,189,124,61,66,130,193,127,83,140,113,86,29,254,91,2,85,47,127,158,
188,107,178,254,246,177,89,2,199,165,1,10,187,101,46,86,123,77,54,52,85,60,
33,80,148,208,127,127,211,153,85,28,45,55,28,254,160,254,26,48,87,66,38,109,
195,1,12,0,0,0,0,1,0,168,0,0,5,32,5,129,0,11,0,103,64,29,11,90,64,8,143,0,
159,0,175,0,223,0,4,0,13,128,64,13,1,64,13,192,13,208,13,224,13,4,13,184,
255,192,64,37,14,17,72,7,3,90,0,4,16,4,64,4,3,7,4,2,95,80,7,1,176,7,224,7,
2,15,7,1,8,7,7,9,5,3,4,0,18,0,63,50,63,51,57,47,94,93,93,113,237,1,47,94,
93,237,50,43,93,113,26,16,220,93,50,26,237,49,48,33,17,33,17,35,17,51,17,
33,17,51,17,4,97,253,6,191,191,2,250,191,2,141,253,115,5,129,253,172,2,84,
250,127,0,0,0,1,0,189,0,0,1,124,5,129,0,3,0,122,64,70,3,90,15,0,1,12,0,0,
1,61,16,0,32,0,208,0,3,96,0,112,0,2,0,0,16,0,64,0,80,0,176,0,5,7,0,175,5,
1,0,5,160,5,176,5,3,0,5,16,5,64,5,80,5,160,5,176,5,192,5,240,5,8,32,5,144,
5,240,5,3,5,184,255,192,179,56,61,72,5,184,255,192,179,45,48,72,5,184,255,
192,182,13,16,72,1,3,0,18,0,63,63,1,43,43,43,93,113,114,93,47,94,93,113,114,
94,93,94,93,237,49,48,51,17,51,17,189,191,5,129,250,127,0,0,0,1,0,32,255,
236,3,104,5,129,0,21,0,124,64,15,137,2,1,130,5,1,123,10,1,100,6,116,6,2,6,
184,255,224,64,66,14,17,72,0,14,32,14,2,128,14,144,14,224,14,240,14,4,14,
14,3,17,90,64,64,12,80,12,96,12,3,111,12,1,12,23,128,15,3,1,3,32,23,1,32,
23,64,23,80,23,96,23,4,14,95,15,3,9,95,0,64,4,1,4,4,0,19,0,63,50,47,93,16,
237,63,237,1,93,113,47,113,26,16,220,93,113,26,237,18,57,47,93,113,49,48,
0,43,1,93,93,93,0,93,5,34,38,39,55,30,3,51,50,54,53,17,33,53,33,17,20,14,
2,1,201,171,219,35,187,10,46,64,78,41,104,120,254,241,1,205,56,107,154,20,
178,192,31,65,93,60,28,143,138,3,69,156,252,35,101,162,115,62,0,1,0,168,0,
0,5,63,5,129,0,11,0,154,64,103,171,1,1,157,1,1,138,8,154,8,2,138,1,154,1,
170,1,3,102,2,1,131,7,147,7,2,100,7,1,157,0,173,0,2,107,0,123,0,139,0,3,89,
0,1,86,10,1,155,10,1,36,10,1,1,10,106,8,250,8,2,8,10,144,9,160,9,2,9,9,0,
11,16,0,11,1,11,11,13,7,2,3,90,0,4,16,4,64,4,3,7,4,7,10,1,2,4,4,8,5,3,0,4,
18,0,63,51,63,51,18,23,57,1,47,94,93,237,50,50,17,51,47,93,56,51,57,47,93,
57,51,113,17,51,49,48,0,93,93,1,93,93,93,93,0,93,93,93,1,93,93,0,93,93,33,
1,7,17,35,17,51,17,1,51,9,1,4,82,253,205,184,191,191,2,167,225,253,168,2,
168,2,168,140,253,228,5,129,253,62,2,194,253,156,252,227,0,0,0,0,1,0,168,
0,0,4,47,5,129,0,5,0,56,64,40,16,4,48,4,2,0,4,16,4,32,4,64,4,96,4,128,4,160,
4,240,4,8,4,3,90,0,0,16,0,64,0,3,7,0,1,3,3,95,0,18,0,63,237,63,1,47,94,93,
237,47,93,113,49,48,51,17,51,17,33,21,168,191,2,200,5,129,251,27,156,0,0,
0,0,1,0,168,0,0,6,2,5,129,0,44,2,44,64,12,152,41,1,151,31,1,12,16,18,24,72,
12,184,255,240,179,13,17,72,13,184,255,240,64,27,18,24,72,40,13,1,13,16,13,
17,72,42,32,33,37,72,42,32,18,28,72,42,32,9,17,72,30,184,255,224,179,33,37,
72,30,184,255,224,179,18,28,72,30,184,255,224,64,255,9,17,72,13,12,36,36,
27,44,92,42,36,0,52,0,2,212,0,1,139,0,155,0,2,4,0,1,8,0,46,139,46,1,116,46,
1,59,46,1,203,46,1,180,46,1,11,46,1,207,171,46,1,52,46,1,32,46,1,20,46,1,
0,46,1,244,46,1,208,46,1,196,46,1,176,46,1,116,46,132,46,164,46,3,96,46,1,
84,46,1,64,46,1,52,46,1,16,46,1,4,46,1,151,240,46,1,180,46,196,46,228,46,
3,160,46,1,116,46,148,46,2,80,46,1,68,46,1,48,46,1,4,46,36,46,2,244,46,1,
224,46,1,180,46,212,46,2,144,46,1,132,46,1,112,46,1,52,46,68,46,100,46,3,
32,46,1,20,46,1,244,46,1,208,46,1,116,46,132,46,164,46,196,46,4,96,46,1,52,
46,84,46,2,16,46,1,4,46,1,103,116,46,148,46,180,46,196,46,228,46,5,80,46,
1,4,46,36,46,68,46,3,20,46,52,46,68,46,100,46,132,46,180,46,212,46,244,46,
8,164,46,196,46,244,46,3,139,46,1,4,46,52,46,84,46,116,46,4,55,64,83,228,
46,1,203,46,1,36,46,68,46,116,46,148,46,180,46,5,11,46,1,212,46,244,46,2,
187,46,1,100,46,132,46,2,75,46,1,20,46,52,46,2,251,46,1,164,46,196,46,228,
46,3,128,46,1,2,64,46,80,46,112,46,3,63,46,1,0,46,32,46,2,30,27,92,0,28,64,
28,2,7,28,6,21,21,184,255,192,64,16,18,37,72,42,21,29,3,75,36,1,0,13,36,3,
28,18,0,63,23,51,93,63,51,51,43,17,51,1,47,94,93,237,50,93,93,93,95,93,93,
93,113,113,113,113,113,114,114,114,114,94,93,93,93,113,114,114,114,94,93,
93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,114,114,114,114,114,
114,114,114,94,93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,94,93,
93,93,113,113,113,16,220,94,93,93,93,113,50,237,18,57,61,47,51,51,49,48,43,
43,43,43,43,43,43,93,43,43,43,93,93,33,17,52,54,55,54,55,6,7,14,1,7,1,35,
1,46,3,39,38,39,22,23,30,1,21,17,35,17,51,1,30,3,23,62,3,55,1,51,17,5,86,
2,2,2,3,14,15,13,31,15,254,148,134,254,143,6,13,15,15,7,17,16,1,2,2,2,170,
251,1,119,7,20,18,15,3,3,16,21,20,8,1,112,245,3,172,51,106,44,51,48,51,50,
43,97,39,252,64,3,192,15,40,45,47,23,53,57,56,55,47,103,39,252,84,5,129,252,
47,20,63,66,59,16,16,60,66,62,20,3,209,250,127,0,0,0,0,1,0,168,0,0,5,32,5,
129,0,19,0,196,185,0,10,255,224,64,39,12,43,72,54,10,70,10,2,0,32,12,43,72,
41,0,57,0,73,0,3,11,16,29,33,72,11,32,18,28,72,150,11,166,11,2,41,11,1,1,
184,255,240,179,29,33,72,1,184,255,224,64,53,18,28,72,154,1,170,1,2,3,38,
1,1,19,92,0,68,16,84,16,148,16,3,224,16,1,2,0,16,48,16,64,16,112,16,192,16,
208,16,6,16,64,21,1,64,21,192,21,208,21,224,21,4,21,184,255,192,64,16,14,
17,72,10,7,92,0,8,16,8,64,8,3,7,8,1,184,255,192,64,16,29,43,72,17,1,9,3,11,
64,29,43,72,11,0,8,18,0,63,51,51,43,63,51,51,43,1,47,94,93,237,50,43,93,113,
47,93,95,93,113,51,237,49,48,0,93,95,93,43,43,93,93,43,43,1,93,43,93,43,33,
1,22,23,30,1,21,17,35,17,51,1,38,39,46,1,53,17,51,17,4,58,253,14,2,3,2,3,
170,222,2,250,3,3,2,4,172,4,176,49,48,41,91,35,252,88,5,129,251,72,49,49,
42,99,45,3,156,250,127,0,0,0,0,2,0,97,255,236,5,215,5,150,0,19,0,39,0,108,
64,74,91,37,1,26,37,1,9,37,1,82,33,1,21,33,1,7,33,1,84,27,1,21,27,1,91,23,
1,25,23,1,102,17,1,104,12,1,0,91,64,15,20,1,20,41,128,32,41,128,41,2,30,91,
175,10,191,10,2,32,10,1,15,10,31,10,2,10,25,95,15,4,35,95,5,19,0,63,237,63,
237,1,47,93,93,93,237,93,26,16,220,113,26,237,49,48,93,93,93,93,93,93,93,
93,93,93,93,93,1,20,2,6,4,35,34,36,38,2,53,52,18,54,36,51,50,4,22,18,7,52,
46,2,35,34,14,2,21,20,30,2,51,50,62,2,5,215,95,180,254,252,165,174,254,250,
174,88,92,178,1,5,169,168,1,5,177,92,195,65,127,188,123,126,190,127,63,65,
127,189,123,132,191,123,59,2,199,165,254,242,192,104,109,195,1,12,159,165,
1,10,187,101,102,188,254,246,163,127,208,148,80,80,148,208,127,127,211,153,
85,86,153,212,0,2,0,168,0,0,4,234,5,129,0,14,0,23,0,117,64,83,169,2,1,147,
23,1,155,16,171,16,2,10,3,26,3,42,3,3,5,12,21,12,37,12,3,0,90,64,15,25,128,
64,25,1,64,25,1,20,7,90,0,8,16,8,64,8,3,8,6,95,31,20,47,20,79,20,95,20,127,
20,5,15,20,207,20,255,20,3,7,20,64,9,17,72,20,20,7,19,95,9,3,7,18,0,63,63,
237,18,57,47,43,94,93,113,237,1,47,93,237,50,93,113,26,16,220,26,237,49,48,
0,93,93,93,93,93,1,20,14,2,35,33,17,35,17,33,50,30,2,7,52,38,35,33,17,33,
50,54,4,234,61,121,182,121,254,98,191,2,81,125,186,124,62,192,164,164,254,
133,1,131,165,155,3,217,92,159,117,68,253,219,5,129,61,111,157,97,134,139,
253,212,146,0,0,0,2,0,97,254,125,5,215,5,150,0,36,0,56,0,162,64,113,108,20,
124,20,140,20,3,104,24,1,104,29,1,101,34,1,87,6,1,85,49,1,90,39,1,90,45,1,
108,19,124,19,140,19,3,26,19,90,19,2,26,40,90,40,2,21,44,85,44,2,26,54,90,
54,2,8,54,1,21,50,85,50,2,7,50,1,13,13,22,5,27,0,91,64,15,37,1,37,58,128,
47,91,175,27,191,27,2,32,27,1,15,27,31,27,2,27,32,58,128,58,2,42,95,32,4,
52,95,5,22,19,10,95,17,0,47,237,63,51,237,63,237,1,93,47,93,93,93,237,26,
16,220,113,26,237,17,57,57,50,47,49,48,93,93,93,93,93,93,0,93,93,93,93,93,
1,93,93,93,0,93,93,1,20,14,2,7,30,3,51,50,54,55,21,14,1,35,34,46,2,39,46,
2,2,53,52,18,54,36,51,50,4,22,18,7,52,46,2,35,34,14,2,21,20,30,2,51,50,62,
2,5,215,77,145,211,134,21,53,68,83,51,28,64,23,38,91,49,86,128,97,70,27,158,
239,159,80,92,178,1,5,169,168,1,5,177,92,195,65,127,188,123,126,190,127,63,
65,127,189,123,132,191,123,59,2,199,149,247,186,117,18,64,90,57,27,8,5,134,
9,13,51,95,138,87,8,115,193,1,3,152,165,1,10,187,101,102,188,254,246,163,
127,208,148,80,80,148,208,127,127,211,153,85,86,153,212,0,0,0,2,0,168,0,0,
5,104,5,129,0,17,0,30,0,210,64,62,169,13,1,138,20,154,20,170,20,3,148,29,
1,117,29,133,29,2,174,0,1,157,0,1,124,0,140,0,2,74,0,90,0,106,0,3,3,160,1,
1,114,1,130,1,146,1,3,2,99,1,1,64,1,1,51,1,1,37,1,1,3,16,184,255,112,64,87,
17,73,112,16,128,16,144,16,3,84,16,100,16,2,66,16,1,2,35,16,51,16,2,1,16,
16,25,18,90,11,11,0,0,17,48,17,64,17,96,17,144,17,160,17,6,17,64,32,144,32,
160,32,3,25,3,90,0,4,16,4,64,4,3,7,4,16,2,95,47,25,95,25,111,25,143,25,4,
25,25,0,24,95,5,3,4,0,18,0,63,50,63,237,18,57,47,93,237,50,1,47,94,93,237,
50,93,47,93,51,57,47,237,18,57,17,51,49,48,93,95,93,93,93,43,95,93,93,93,
93,95,93,93,95,93,93,93,93,0,93,93,93,93,33,1,33,17,35,17,33,50,30,2,21,20,
14,2,7,1,3,52,46,2,35,33,17,33,50,62,2,4,140,254,146,254,73,191,2,151,120,
185,126,66,39,84,130,91,1,144,248,44,84,120,76,254,59,1,205,82,120,77,37,
2,73,253,183,5,129,55,104,150,94,67,130,108,78,16,253,161,3,236,64,94,63,
31,253,248,41,72,98,0,0,0,0,1,0,93,255,236,4,248,5,150,0,63,0,226,64,110,
150,62,1,68,62,1,166,59,1,134,54,1,132,49,1,151,40,1,169,33,1,11,33,27,33,
43,33,155,33,4,89,29,169,29,2,139,17,1,139,7,1,150,2,1,4,2,20,2,2,132,58,
1,96,54,1,105,21,1,118,17,1,42,90,41,41,0,90,64,176,19,1,19,65,128,9,90,8,
64,16,19,72,8,8,52,90,0,31,16,31,64,31,3,7,31,19,16,19,22,72,120,19,136,19,
152,19,3,59,19,1,52,184,255,240,64,47,19,22,72,119,52,135,52,151,52,3,58,
52,1,19,52,5,47,95,111,42,1,89,42,1,75,42,1,6,42,1,42,36,4,14,95,96,9,1,82,
9,1,68,9,1,9,5,19,0,63,51,93,93,93,237,63,51,93,93,93,93,237,18,57,57,93,
93,43,93,93,43,1,47,94,93,237,51,47,43,237,26,16,220,93,26,237,50,47,237,
49,48,0,93,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93,93,1,20,14,2,35,
32,36,39,55,30,3,51,50,62,2,53,52,46,2,39,46,5,53,52,62,2,51,50,30,2,23,7,
46,3,35,34,14,2,21,20,30,2,23,30,5,4,248,69,144,219,150,254,249,254,218,40,
185,14,58,99,146,102,85,142,102,57,63,114,158,96,59,119,109,96,70,40,81,144,
196,114,131,186,128,77,23,188,14,53,86,123,83,98,133,81,35,63,108,142,80,
65,129,118,103,76,43,1,133,89,150,109,61,184,174,37,55,90,65,36,29,60,95,
66,69,86,56,38,22,13,31,43,58,81,107,70,100,143,92,42,41,82,121,80,33,51,
80,54,28,35,60,81,47,63,81,54,36,18,15,31,43,58,84,114,0,0,0,1,0,46,0,0,4,
180,5,129,0,7,1,212,64,255,9,9,1,201,9,217,9,249,9,3,187,9,1,73,9,89,9,121,
9,137,9,4,59,9,1,9,9,25,9,2,246,9,1,153,9,201,9,2,139,9,1,9,9,25,9,73,9,105,
9,4,199,217,9,233,9,2,203,9,1,182,9,1,41,9,89,9,105,9,137,9,153,9,5,27,9,
1,6,9,1,25,9,41,9,89,9,121,9,153,9,169,9,217,9,7,233,9,249,9,2,219,9,1,169,
9,1,150,9,1,57,9,105,9,2,45,9,1,1,11,9,1,151,107,9,123,9,139,9,171,9,187,
9,235,9,251,9,7,84,9,1,11,9,43,9,59,9,3,187,9,251,9,2,164,9,1,59,9,75,9,123,
9,3,36,9,1,139,9,155,9,187,9,203,9,251,9,5,127,9,1,2,79,9,95,9,2,48,9,1,15,
9,1,103,207,9,223,9,2,176,9,1,15,9,79,9,95,9,143,9,4,240,9,1,159,9,175,9,
207,9,223,9,4,112,9,1,95,9,1,64,9,1,31,9,1,31,9,63,9,95,9,111,9,159,9,223,
9,239,9,7,0,9,1,55,239,9,1,128,64,93,9,144,9,208,9,3,111,9,1,80,9,1,47,9,
1,0,9,1,208,9,1,175,9,1,144,9,1,111,9,127,9,2,16,9,32,9,64,9,80,9,4,255,9,
1,224,9,1,191,9,1,64,9,96,9,144,9,160,9,4,63,9,1,32,9,1,15,9,1,7,3,5,4,14,
1,90,2,64,2,7,14,112,7,160,7,176,7,3,32,7,128,7,2,7,184,255,192,64,15,23,
28,72,7,32,2,1,2,0,4,95,5,3,1,18,0,63,63,237,50,1,47,93,204,43,93,113,43,
1,26,24,16,77,253,228,50,95,94,93,93,93,93,93,93,93,113,113,113,113,113,114,
114,114,114,114,114,94,93,93,113,113,113,113,113,113,114,114,114,94,93,93,
93,95,93,93,113,113,113,113,114,114,114,94,93,95,93,93,93,93,93,93,113,114,
114,114,114,114,114,94,93,93,93,93,113,113,113,113,113,114,49,48,1,17,35,
17,33,53,33,21,2,208,190,254,28,4,134,4,229,251,27,4,229,156,156,0,0,0,0,
1,0,158,255,236,5,41,5,129,0,25,0,136,64,61,89,23,105,23,2,89,3,105,3,2,89,
2,105,2,2,69,16,1,69,10,1,21,90,64,64,18,80,18,160,18,3,48,18,144,18,240,
18,3,143,18,159,18,175,18,3,18,27,128,64,27,1,64,27,192,27,208,27,224,27,
4,27,184,255,192,64,36,14,17,72,8,90,79,5,95,5,111,5,3,143,5,159,5,2,207,
5,1,0,5,16,5,64,5,3,7,5,19,6,3,13,95,0,19,0,63,237,63,51,1,47,94,93,93,113,
114,237,43,93,113,26,16,220,93,113,114,26,237,49,48,0,93,93,93,93,93,5,34,
46,2,53,17,51,17,20,30,2,51,50,62,2,53,17,51,17,20,14,2,2,219,116,208,157,
92,191,57,102,139,83,82,146,110,63,190,93,160,215,20,62,131,201,138,3,129,
252,143,107,149,94,43,44,96,155,111,3,100,252,145,141,207,136,66,0,1,0,9,
0,0,5,77,5,129,0,16,0,235,64,181,74,14,90,14,106,14,3,69,4,85,4,101,4,3,140,
15,1,58,15,90,15,106,15,122,15,4,131,3,1,53,3,85,3,101,3,117,3,4,116,0,132,
0,2,9,0,1,140,1,1,123,1,1,6,1,1,26,1,42,1,58,1,3,9,1,1,233,1,249,1,2,21,0,
37,0,53,0,3,6,0,1,230,0,246,0,2,1,0,9,9,2,26,15,42,15,58,15,3,3,8,15,1,232,
15,248,15,2,15,52,16,84,16,2,32,16,1,2,16,16,1,48,16,96,16,144,16,192,16,
240,16,5,16,21,3,37,3,53,3,3,6,3,1,230,3,246,3,2,3,175,2,191,2,2,2,32,18,
80,18,2,48,18,96,18,144,18,192,18,240,18,5,47,18,1,15,2,3,121,9,1,9,1,18,
0,63,51,93,63,51,1,93,93,113,47,93,51,93,113,113,47,93,113,95,113,113,51,
93,113,95,113,18,57,61,47,51,51,93,113,113,93,113,113,49,48,93,93,93,93,93,
93,93,93,93,93,93,33,35,1,51,1,30,1,23,22,23,54,55,62,1,55,1,51,3,14,198,
253,193,201,1,134,15,30,12,14,13,12,14,12,29,17,1,132,201,5,129,252,32,45,
89,35,41,39,37,41,35,88,48,3,224,0,0,1,0,9,0,0,7,134,5,129,0,46,4,87,64,73,
121,44,1,117,17,1,123,2,139,2,2,73,2,1,116,12,132,12,2,70,12,1,122,30,138,
30,2,73,30,89,30,105,30,3,117,31,133,31,2,71,31,87,31,103,31,3,142,45,1,91,
45,107,45,123,45,3,129,16,1,100,16,116,16,2,85,16,1,1,32,13,17,72,13,184,
255,224,64,255,13,17,72,131,0,1,117,0,1,68,0,84,0,100,0,3,54,0,1,140,14,1,
122,14,1,75,14,91,14,107,14,3,14,16,9,12,72,26,14,42,14,58,14,3,9,14,1,233,
14,249,14,2,21,13,37,13,53,13,3,6,13,1,230,13,246,13,2,14,13,22,26,30,42,
30,58,30,3,9,30,1,233,30,249,30,2,21,31,37,31,53,31,3,6,31,1,230,31,246,31,
2,31,30,7,26,1,42,1,58,1,3,9,1,1,233,1,249,1,2,21,0,37,0,53,0,3,6,0,1,230,
0,246,0,2,1,0,39,123,39,1,116,22,132,22,2,22,7,39,39,7,22,3,15,26,45,42,45,
58,45,3,3,8,45,1,232,45,248,45,2,45,219,46,1,207,46,1,187,46,1,175,46,1,155,
46,1,143,46,1,123,46,1,111,46,1,91,46,1,79,46,1,2,79,46,143,46,175,46,3,46,
64,25,28,72,32,46,48,46,2,15,46,1,9,46,5,16,1,229,16,245,16,2,182,16,198,
16,214,16,3,3,16,8,15,56,15,120,15,136,15,152,15,184,15,6,12,15,64,64,255,
25,38,72,15,119,48,151,48,215,48,3,54,48,70,48,86,48,3,23,48,39,48,2,6,48,
1,55,48,103,48,119,48,167,48,183,48,199,48,231,48,247,48,8,38,48,1,7,48,23,
48,2,201,199,48,215,48,231,48,3,120,48,152,48,168,48,184,48,4,105,48,1,40,
48,56,48,88,48,3,25,48,1,7,48,1,232,48,1,217,48,1,168,48,200,48,2,153,48,
1,138,48,1,88,48,104,48,2,73,48,1,55,48,1,8,48,24,48,2,231,48,1,200,48,1,
167,48,1,8,48,24,48,40,48,72,48,136,48,5,153,199,48,1,88,48,104,48,136,48,
152,48,168,48,5,73,48,1,40,48,1,9,48,25,48,2,216,48,232,48,2,203,48,1,154,
48,170,48,186,48,3,139,48,1,48,192,124,127,72,57,48,1,42,48,1,25,48,1,10,
48,1,249,48,1,234,48,1,217,48,1,202,48,1,184,48,1,137,48,153,48,169,48,3,
120,48,1,105,48,1,58,48,74,48,90,48,3,41,48,1,26,48,1,12,48,1,104,253,48,
1,236,48,1,221,48,1,204,48,1,64,255,189,48,1,171,48,1,156,48,1,139,48,1,124,
48,1,107,48,1,92,48,1,75,48,1,60,48,1,43,48,1,28,48,1,11,48,1,252,48,1,235,
48,1,220,48,1,203,48,1,188,48,1,171,48,1,156,48,1,0,141,48,1,127,48,1,109,
48,1,95,48,1,77,48,1,47,48,63,48,2,29,48,1,15,48,1,253,48,1,239,48,1,221,
48,1,207,48,1,189,48,1,175,48,1,157,48,1,143,48,1,109,48,125,48,2,91,48,1,
77,48,1,59,48,1,45,48,1,27,48,1,13,48,1,56,251,48,1,237,48,1,219,48,1,205,
48,1,187,48,1,173,48,1,155,48,1,141,48,1,123,48,1,109,48,1,75,48,91,48,2,
57,48,1,43,48,1,25,48,1,11,48,1,249,48,1,235,48,1,221,48,1,203,48,1,189,48,
1,171,48,1,157,48,1,139,48,1,125,48,1,107,48,1,93,48,1,75,48,1,61,48,1,1,
43,48,1,31,48,1,2,95,48,127,48,159,48,191,48,223,48,255,48,6,0,48,1,8,68,
7,84,7,2,7,30,45,3,15,3,39,64,15,22,123,22,139,22,2,22,32,9,14,72,22,1,14,
18,0,63,51,51,43,93,17,51,63,23,51,93,1,94,93,93,95,113,113,95,113,113,113,
113,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114,
114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,113,
113,113,113,113,113,113,113,95,113,113,113,113,113,113,113,114,114,114,114,
114,114,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,
93,93,93,93,113,113,113,113,43,113,113,113,113,114,114,114,114,114,94,93,
93,93,93,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,94,93,
93,93,113,113,113,113,47,43,94,93,51,95,93,93,113,47,94,93,93,43,93,95,113,
113,113,113,113,113,113,113,113,113,51,93,113,95,113,18,23,57,61,47,47,47,
93,93,17,51,51,93,113,113,93,113,113,17,51,51,93,113,113,93,113,113,17,51,
51,93,113,113,93,113,113,49,48,43,93,93,93,93,93,93,93,43,43,93,93,93,93,
93,93,93,93,93,93,93,93,93,93,93,33,35,3,46,1,39,38,39,6,7,14,1,7,3,35,1,
51,19,30,1,23,22,23,54,55,62,3,55,19,51,19,30,3,23,22,23,50,62,2,55,19,51,
5,231,228,244,11,25,10,12,12,13,12,11,24,11,246,228,254,97,199,253,17,31,
11,13,11,15,16,7,14,15,15,6,245,183,245,6,15,15,14,7,16,15,1,16,24,29,15,
249,199,3,127,38,104,47,55,57,58,55,48,102,38,252,129,5,129,252,129,63,124,
49,58,52,69,67,28,62,60,55,23,3,109,252,147,23,55,59,62,28,67,70,69,104,121,
52,3,127,0,0,1,0,46,0,0,5,43,5,129,0,11,2,119,64,255,92,4,1,73,4,1,59,4,1,
38,11,1,75,0,91,0,2,41,0,57,0,2,68,2,84,2,2,38,2,54,2,2,9,3,25,3,41,3,3,81,
10,1,69,10,1,51,10,1,6,10,22,10,2,93,8,1,76,8,1,43,8,59,8,2,9,8,25,8,2,82,
6,1,67,6,1,3,38,6,54,6,2,7,6,23,6,2,12,219,13,1,196,13,1,171,13,1,144,13,
1,132,13,1,96,13,1,84,13,1,48,13,1,36,13,1,0,13,1,244,13,1,208,13,1,196,13,
1,160,13,1,148,13,1,112,13,1,100,13,1,64,13,1,52,13,1,16,13,1,4,13,1,204,
224,13,1,212,13,1,176,13,1,164,13,1,128,13,1,116,13,1,80,13,1,68,13,1,32,
13,1,20,13,1,36,13,84,13,132,13,180,13,228,13,5,4,13,52,13,100,13,148,13,
196,13,244,13,6,156,52,13,100,13,148,13,196,13,244,13,5,11,13,1,27,13,75,
13,123,13,171,13,219,13,5,139,13,187,13,235,13,3,4,13,20,13,52,13,68,13,4,
106,84,13,100,13,132,13,148,64,156,13,180,13,196,13,228,13,244,13,8,59,13,
1,36,13,1,11,13,1,244,13,1,219,13,1,196,13,1,171,13,1,148,13,1,123,13,1,100,
13,1,48,13,1,36,13,1,0,13,1,244,13,1,208,13,1,196,13,1,160,13,1,148,13,1,
112,13,1,100,13,1,64,13,1,52,13,1,16,13,1,4,13,1,57,224,13,1,212,13,1,176,
13,1,164,13,1,128,13,1,20,13,68,13,116,13,3,36,13,84,13,132,13,180,13,228,
13,5,84,13,100,13,148,13,244,13,4,64,13,1,2,0,13,48,13,2,6,8,10,7,1,4,4,9,
5,9,5,9,3,0,11,16,192,11,240,11,2,11,184,255,192,64,16,26,30,72,175,11,1,
144,11,1,127,11,1,0,11,1,11,184,255,192,181,11,15,72,11,2,3,184,255,240,64,
41,16,3,32,3,2,224,3,240,3,2,31,3,175,3,191,3,207,3,4,3,114,7,1,52,7,68,7,
84,7,3,4,7,10,1,4,8,5,3,3,0,18,0,63,50,63,51,23,57,93,93,1,47,93,93,113,56,
51,47,43,93,93,93,93,43,93,56,51,18,57,57,47,47,18,23,57,50,51,93,95,93,93,
113,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,93,93,93,113,113,113,
113,113,113,113,113,113,113,114,114,114,114,94,93,93,113,114,114,94,93,113,
114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,93,93,
93,113,113,113,113,113,113,113,113,113,113,49,48,94,93,93,95,93,93,93,93,
93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,33,9,1,35,9,1,51,9,1,51,9,1,
4,88,254,89,254,80,211,2,24,254,17,211,1,136,1,125,211,254,30,2,11,2,104,
253,152,2,220,2,165,253,215,2,41,253,98,253,29,0,0,0,1,0,45,0,0,5,41,5,129,
0,8,2,83,64,20,30,7,1,12,7,1,7,24,12,15,72,17,5,1,3,5,1,16,3,5,184,255,232,
64,255,12,15,72,5,4,14,2,1,8,14,7,105,8,169,8,2,6,8,22,8,54,8,70,8,4,14,8,
6,1,90,38,2,86,2,150,2,3,118,2,230,2,2,57,2,73,2,2,6,2,1,16,2,153,10,169,
10,201,10,3,86,10,1,9,10,57,10,2,25,10,89,10,137,10,249,10,4,6,10,1,202,249,
10,1,230,10,1,9,10,25,10,185,10,201,10,4,198,10,1,89,10,121,10,169,10,3,54,
10,1,41,10,57,10,185,10,233,10,4,11,10,1,153,249,10,1,198,10,214,10,2,178,
10,1,164,10,1,150,10,1,130,10,1,116,10,1,86,10,102,10,2,66,10,1,36,10,52,
10,2,18,10,1,4,10,1,244,10,1,230,10,1,196,10,212,10,2,166,10,182,10,2,146,
10,1,132,10,1,118,10,1,98,10,1,84,10,1,54,10,70,10,2,36,10,1,22,10,1,4,10,
1,242,10,1,1,208,10,224,10,2,196,10,1,160,10,176,10,2,148,10,1,112,10,1,100,
10,1,64,10,1,20,10,36,10,52,10,3,0,10,1,105,228,10,244,10,2,208,10,64,182,
1,164,10,180,10,196,10,3,128,10,144,10,2,116,10,1,80,10,96,10,2,68,10,1,32,
10,1,4,10,20,10,2,244,10,1,224,10,1,196,10,212,10,2,176,10,1,84,10,100,10,
116,10,148,10,164,10,5,48,10,64,10,2,36,10,1,0,10,1,196,10,244,10,2,144,10,
1,4,10,20,10,36,10,68,10,84,10,116,10,132,10,7,57,224,10,1,132,10,164,10,
212,10,3,112,10,1,4,10,36,10,52,10,84,10,100,10,5,228,10,244,10,2,192,10,
1,180,10,1,144,10,1,4,10,20,10,52,10,84,10,132,10,5,212,10,228,10,2,187,10,
1,164,10,1,112,10,1,2,48,10,96,10,2,15,10,47,10,2,0,3,59,3,75,3,123,3,3,3,
1,8,4,3,1,18,0,63,63,51,18,57,93,17,51,1,93,93,95,93,93,93,93,113,113,113,
113,113,114,114,114,114,94,93,93,93,113,113,113,113,113,113,113,113,114,114,
114,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,93,95,93,113,113,113,
113,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114,
114,114,114,94,93,93,113,113,113,114,114,114,94,93,93,113,113,113,47,94,93,
93,93,113,253,57,206,94,93,93,50,43,1,24,16,77,230,50,49,48,43,95,94,93,93,
43,93,93,1,17,35,17,1,51,9,1,51,3,9,190,253,226,210,1,173,1,171,210,2,72,
253,184,2,72,3,57,253,97,2,159,0,0,0,0,1,0,65,0,0,4,163,5,129,0,9,0,122,64,
35,100,4,116,4,132,4,3,109,3,125,3,141,3,3,91,3,1,41,3,57,3,73,3,3,114,8,
130,8,2,84,8,100,8,2,8,184,255,240,64,9,10,13,72,9,3,16,7,1,7,184,255,192,
64,18,12,17,72,7,8,4,15,2,31,2,2,2,64,12,15,72,2,11,184,255,192,64,14,13,
17,72,7,3,4,95,5,3,2,8,95,1,18,0,63,237,50,63,237,50,50,1,43,47,43,93,51,
51,47,43,93,51,51,49,48,43,93,93,93,93,93,93,41,1,53,1,33,53,33,21,1,33,4,
163,251,158,3,90,252,239,3,234,252,166,3,137,143,4,86,156,139,251,166,0,0,
1,0,146,254,87,2,41,5,204,0,7,0,49,64,30,7,48,2,1,224,2,1,2,4,241,63,1,1,
143,1,191,1,2,32,1,1,1,4,245,1,0,5,245,0,27,0,63,237,63,237,1,47,93,93,113,
237,205,93,113,50,49,48,19,17,33,21,35,17,51,21,146,1,151,233,233,254,87,
7,117,129,249,141,129,0,1,0,0,255,236,2,57,5,204,0,3,0,71,64,40,120,1,136,
1,2,0,24,13,17,72,9,3,25,3,73,3,3,70,2,1,10,2,26,2,42,2,3,3,16,0,3,16,3,32,
3,128,3,4,3,1,184,255,240,183,143,1,1,1,1,0,0,19,0,63,63,1,47,93,56,205,93,
56,49,48,93,93,93,43,93,5,1,51,1,1,151,254,105,158,1,155,20,5,224,250,32,
0,0,0,0,1,0,16,254,87,1,167,5,204,0,7,0,49,64,31,4,63,0,1,239,0,1,0,7,241,
64,2,80,2,2,192,2,208,2,224,2,3,2,4,245,5,0,1,245,0,27,0,63,237,63,237,1,
47,93,113,253,205,93,113,50,49,48,19,53,51,17,35,53,33,17,16,233,233,1,151,
254,87,129,6,115,129,248,139,0,1,0,10,2,161,3,183,5,129,0,6,2,243,181,0,24,
18,22,72,2,184,255,232,179,18,22,72,5,184,255,232,64,47,18,22,72,118,5,134,
5,2,4,24,18,22,72,121,4,137,4,2,3,54,6,70,6,2,102,6,118,6,134,6,230,6,4,6,
6,22,6,38,6,70,6,86,6,102,6,6,6,184,255,192,179,48,65,72,6,184,255,192,64,
57,18,22,72,6,5,4,57,3,73,3,2,105,3,121,3,137,3,3,9,3,25,3,41,3,89,3,105,
3,5,9,3,64,18,22,72,3,6,1,22,1,134,1,3,57,38,1,54,1,70,1,246,1,4,230,1,1,
1,184,255,192,182,60,63,72,153,1,1,1,184,255,224,64,255,30,33,72,56,1,72,
1,2,39,1,1,22,1,1,183,1,199,1,2,6,1,70,1,86,1,102,1,150,1,166,1,6,9,1,6,8,
1,246,8,1,164,8,1,121,8,1,6,8,1,246,8,1,201,8,217,8,2,187,8,1,9,8,25,8,41,
8,169,8,4,201,201,8,217,8,2,54,8,118,8,134,8,150,8,4,153,8,233,8,2,102,8,
118,8,2,9,8,25,8,57,8,3,198,8,1,139,8,1,57,8,73,8,121,8,3,43,8,1,4,8,1,152,
228,8,244,8,2,208,8,1,162,8,178,8,194,8,3,132,8,148,8,2,82,8,98,8,114,8,3,
64,8,1,50,8,1,36,8,1,2,8,18,8,2,228,8,244,8,2,214,8,1,196,8,1,146,8,162,8,
178,8,3,116,8,132,8,2,102,8,1,50,8,66,8,82,8,3,20,8,36,8,2,6,8,1,242,8,1,
212,8,228,8,2,166,8,182,8,2,130,8,146,8,2,100,8,116,8,2,86,8,1,52,8,68,8,
2,32,8,1,4,8,20,8,2,104,230,8,246,8,2,192,8,1,146,8,162,8,64,24,178,8,3,116,
8,132,8,2,82,8,98,8,2,52,8,68,8,2,22,8,38,8,2,8,184,255,128,64,24,85,88,72,
182,8,198,8,2,132,8,148,8,164,8,3,102,8,118,8,2,68,8,1,8,184,255,192,182,
72,75,72,228,8,1,8,184,255,192,64,12,66,69,72,148,8,1,114,8,130,8,2,8,184,
255,128,64,120,59,62,72,18,8,34,8,2,1,0,8,1,56,240,8,1,212,8,228,8,2,176,
8,1,100,8,132,8,148,8,164,8,4,64,8,80,8,2,36,8,52,8,2,228,8,244,8,2,171,8,
187,8,2,116,8,132,8,148,8,3,75,8,1,52,8,1,11,8,1,235,8,251,8,2,208,8,1,196,
8,1,176,8,1,132,8,148,8,164,8,3,96,8,112,8,2,2,0,8,16,8,64,8,80,8,4,8,34,
1,1,3,1,19,1,2,1,4,3,3,3,0,0,47,50,47,63,51,93,93,1,94,93,95,93,93,93,93,
93,93,113,113,113,113,113,113,114,114,114,114,114,114,94,93,95,93,43,93,93,
43,93,43,113,113,113,113,43,114,114,114,114,114,114,114,94,93,93,93,93,93,
93,93,93,93,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,
114,114,94,93,93,93,93,93,113,113,113,114,114,94,93,93,93,93,113,113,113,
113,114,25,47,94,93,93,113,113,113,43,113,43,113,114,94,93,205,43,94,93,113,
114,51,51,205,43,43,93,113,114,49,48,95,93,43,93,43,43,43,9,2,35,1,51,1,3,
19,254,203,254,206,162,1,112,203,1,114,2,161,2,121,253,135,2,224,253,32,0,
0,0,0,1,255,225,254,105,4,138,254,235,0,3,0,35,64,23,16,2,96,2,128,2,160,
2,208,2,5,96,2,128,2,240,2,3,2,0,0,186,1,0,47,237,1,47,47,93,113,49,48,3,
53,33,21,31,4,169,254,105,130,130,0,1,0,106,4,177,2,18,5,228,0,5,0,47,64,
31,117,3,133,3,2,64,4,128,4,2,4,64,16,1,1,1,2,149,128,15,0,47,0,63,0,127,
0,239,0,5,0,0,47,93,26,237,1,47,93,26,205,93,49,48,93,9,1,53,51,19,21,1,180,
254,182,207,217,4,177,1,22,29,254,225,20,0,0,0,0,2,0,87,255,236,4,115,4,78,
0,50,0,65,0,161,64,50,121,61,137,61,2,121,12,137,12,2,2,40,9,13,72,10,5,26,
5,2,43,24,9,17,72,5,28,21,28,2,37,37,30,70,64,46,9,111,56,127,56,143,56,3,
56,67,128,20,71,21,184,255,192,64,20,21,28,72,21,21,63,71,31,3,1,3,48,67,
192,67,2,160,67,1,67,184,255,192,64,32,30,35,72,33,81,40,22,57,81,9,9,26,
51,95,20,1,47,20,143,20,2,20,20,15,80,26,16,46,51,80,0,22,0,63,237,50,63,
237,51,47,93,113,17,18,57,47,237,63,237,1,43,93,113,47,93,237,51,47,43,237,
26,16,220,93,50,50,26,237,50,47,49,48,93,43,93,43,0,93,93,5,34,38,53,52,62,
2,63,1,53,52,46,2,35,34,14,2,7,39,62,3,51,50,22,21,17,20,22,51,50,54,55,21,
14,1,35,34,46,2,39,35,14,3,39,50,62,2,61,1,7,14,3,21,20,22,1,158,163,164,
81,131,168,87,243,28,58,87,59,52,84,62,38,6,188,10,56,103,155,110,204,206,
42,59,15,30,14,34,67,38,51,73,46,24,3,6,29,69,92,117,35,86,129,85,42,197,
66,119,90,53,95,20,172,150,107,137,78,30,2,4,59,67,94,58,27,15,39,67,51,17,
64,107,78,43,187,177,254,46,80,81,4,3,112,8,8,27,55,81,54,52,84,59,32,135,
63,98,116,53,89,4,1,17,50,90,73,88,96,0,0,2,0,132,255,236,4,29,5,204,0,31,
0,51,0,146,64,9,105,49,121,49,2,121,35,1,31,184,255,224,64,24,7,10,72,134,
30,150,30,2,73,27,89,27,2,73,4,89,4,2,134,1,150,1,2,1,184,255,224,64,63,7,
10,72,0,71,64,160,32,1,32,53,128,42,5,19,70,0,18,16,18,48,18,240,18,4,8,18,
176,53,1,63,53,1,112,53,144,53,2,31,53,1,255,53,1,192,53,224,53,2,25,37,80,
29,16,18,0,12,21,5,47,80,2,22,0,63,237,50,63,63,63,237,50,1,93,93,113,113,
114,114,47,94,93,237,50,50,26,16,220,93,26,237,49,48,43,93,93,93,93,43,93,
93,1,16,33,34,38,39,35,20,14,2,7,35,62,3,53,17,51,17,20,6,7,6,7,51,62,1,51,
50,18,3,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,4,29,254,114,123,163,51,
2,3,3,3,1,174,1,2,2,1,180,1,1,1,1,4,50,165,122,205,193,189,28,62,96,69,71,
109,73,38,38,73,108,70,66,96,64,31,2,34,253,202,89,99,26,56,48,34,4,9,43,
60,72,39,4,237,254,89,30,55,21,25,22,104,90,254,236,254,226,112,160,103,48,
46,102,166,120,116,158,99,43,46,102,163,0,0,0,1,0,87,255,236,3,202,4,78,0,
39,0,117,64,81,121,16,1,121,23,1,99,37,1,99,3,1,32,70,31,31,8,70,160,9,1,
9,9,41,0,71,31,19,1,19,35,80,26,31,32,127,32,143,32,223,32,4,32,32,26,16,
32,8,112,8,128,8,208,8,224,8,5,0,8,16,8,96,8,112,8,128,8,192,8,208,8,7,8,
8,5,80,14,22,31,41,1,93,0,63,237,51,47,93,113,63,51,47,93,16,237,1,47,93,
237,17,51,125,47,113,24,237,51,47,237,49,48,93,93,93,93,1,20,30,2,51,50,54,
55,23,14,3,35,34,46,2,53,52,62,4,51,50,30,2,23,7,46,1,35,34,14,2,1,19,27,
64,105,77,96,129,15,182,9,60,103,148,97,127,178,111,50,36,65,88,103,114,58,
91,142,103,64,13,185,14,114,105,77,103,64,27,2,34,93,156,113,62,104,108,12,
67,124,94,57,86,151,205,120,109,167,125,85,51,23,50,87,118,68,14,90,106,51,
103,156,0,0,0,0,2,0,86,255,236,3,239,5,204,0,31,0,51,0,123,64,87,85,34,101,
34,2,90,50,106,50,2,57,1,73,1,2,54,10,70,10,2,9,4,25,4,121,4,137,4,4,6,7,
22,7,118,7,134,7,4,19,70,64,42,0,143,18,239,18,2,18,53,128,32,71,31,6,1,6,
112,53,144,53,2,31,53,1,255,53,1,192,53,224,53,2,25,21,18,0,11,47,80,8,16,
0,37,80,3,22,0,63,237,50,63,237,50,63,63,1,93,93,113,113,47,93,237,26,16,
220,93,50,50,26,237,49,48,0,93,93,93,93,93,93,37,14,1,35,34,2,17,16,33,50,
22,23,51,52,46,1,52,53,17,51,17,20,30,2,23,35,46,3,53,1,20,30,2,51,50,62,
2,53,52,46,2,35,34,14,2,3,53,50,165,122,205,193,1,142,123,164,50,2,1,1,180,
1,2,2,1,172,2,3,3,2,253,218,28,62,96,69,71,109,73,38,38,74,107,70,66,96,64,
31,174,104,90,1,20,1,24,2,54,90,98,10,43,47,42,9,1,163,251,19,39,72,60,43,
9,10,37,48,53,26,1,112,112,160,103,48,46,103,166,120,115,159,98,43,46,102,
163,0,0,0,2,0,87,255,236,4,24,4,78,0,28,0,37,0,107,64,46,90,35,106,35,2,90,
30,106,30,2,85,3,101,3,2,8,73,9,9,27,71,64,31,29,1,144,29,1,29,39,128,37,
0,71,31,17,1,17,48,39,192,39,208,39,3,39,184,255,192,64,19,30,35,72,8,8,5,
0,80,37,37,5,32,80,22,16,5,80,14,22,0,63,237,63,237,18,57,47,237,17,57,47,
1,43,113,47,93,237,50,26,16,220,93,113,26,237,50,47,237,49,48,93,0,93,93,
1,20,30,2,51,50,54,55,23,14,3,35,34,2,17,52,62,2,51,50,30,2,29,1,39,46,1,
35,34,14,2,7,1,20,35,73,114,80,117,141,25,158,17,61,102,153,108,240,251,76,
132,176,100,136,183,111,47,186,15,144,135,45,99,84,58,4,1,247,85,143,103,
57,94,72,45,45,91,73,47,1,30,1,26,152,211,132,59,88,155,210,122,24,138,171,
157,29,74,127,98,0,0,0,1,0,29,0,0,2,60,5,202,0,27,0,161,64,11,3,10,19,10,
51,10,67,10,4,13,10,184,255,224,64,106,8,12,72,26,15,16,1,14,16,25,16,1,70,
5,0,2,1,18,2,31,29,47,29,79,29,95,29,127,29,143,29,159,29,7,15,29,63,29,127,
29,175,29,191,29,223,29,239,29,7,59,95,29,191,29,2,127,29,143,29,159,29,3,
29,64,86,100,72,29,64,39,44,72,32,29,48,29,96,29,3,175,29,223,29,239,29,3,
64,29,1,15,29,47,29,2,19,80,12,0,0,3,80,25,6,15,1,21,0,63,63,51,237,50,63,
237,1,93,93,93,113,43,43,113,114,94,93,113,47,94,93,51,237,50,50,47,94,93,
51,49,48,0,43,94,93,1,17,35,17,35,53,51,53,52,62,2,51,50,22,23,21,46,1,35,
34,14,2,29,1,51,21,1,105,180,152,152,22,59,102,81,32,69,26,17,45,18,40,51,
29,11,211,3,183,252,73,3,183,131,122,59,101,75,43,6,6,137,3,5,22,41,60,39,
97,131,0,2,0,86,254,87,3,239,4,75,0,49,0,69,0,217,64,72,122,49,138,49,2,118,
7,134,7,2,101,62,1,85,12,101,12,2,90,58,106,58,2,38,3,54,3,2,38,18,1,41,33,
1,9,23,25,23,121,23,137,23,4,6,29,22,29,118,29,134,29,4,9,47,70,64,50,34,
48,14,1,127,14,223,14,2,14,71,128,6,70,5,184,255,192,64,81,23,28,72,5,5,60,
71,15,26,1,10,26,32,71,64,71,2,207,71,1,0,71,32,71,144,71,176,71,4,80,223,
71,1,192,71,1,79,71,1,128,71,160,71,2,15,71,47,71,2,208,71,240,71,2,15,71,
1,8,41,15,34,55,80,31,16,15,65,80,21,22,9,80,53,6,1,38,6,1,6,0,27,0,63,50,
93,93,237,63,237,50,63,237,50,63,1,94,93,93,113,113,114,114,114,94,93,93,
113,47,94,93,237,51,47,43,237,26,16,220,93,113,50,50,26,237,49,48,0,94,93,
93,93,93,93,93,93,93,93,93,1,34,46,2,39,55,30,1,51,50,62,2,61,1,35,14,3,35,
34,46,2,53,52,62,2,51,50,22,23,51,52,62,2,55,51,14,3,21,17,20,6,19,52,46,
2,35,34,14,2,21,20,30,2,51,50,62,2,2,36,93,144,102,64,14,181,18,123,100,61,
100,70,38,2,20,59,85,112,72,103,147,93,43,43,97,155,111,115,169,46,2,3,3,
4,2,171,1,2,2,1,223,44,49,80,103,54,69,99,65,31,31,64,98,68,54,103,82,50,
254,87,38,71,98,60,26,75,81,34,75,120,86,174,41,75,58,35,69,138,205,135,130,
208,145,77,105,97,25,62,55,40,3,9,43,60,73,39,252,197,227,229,3,198,113,161,
102,48,48,103,161,112,117,159,98,42,46,100,158,0,0,0,0,1,0,142,0,0,3,238,
5,204,0,33,0,109,185,0,8,255,192,64,36,7,11,72,11,70,64,80,12,1,159,12,255,
12,2,12,35,128,0,35,192,35,208,35,224,35,4,192,35,1,15,35,1,128,35,1,35,184,
255,192,64,32,19,23,72,28,24,70,192,25,1,0,25,16,25,48,25,224,25,240,25,5,
8,25,26,0,25,11,21,0,18,80,5,16,0,63,237,50,63,51,63,1,47,94,93,113,237,50,
43,93,113,113,114,26,16,220,93,113,26,237,49,48,43,1,62,3,51,50,30,2,21,17,
35,17,52,46,2,35,34,14,2,21,17,35,17,51,17,20,14,2,7,1,61,30,70,84,100,62,
104,133,77,29,181,17,48,88,70,64,103,73,40,180,180,2,3,2,1,3,129,55,77,50,
23,56,101,140,84,253,47,2,174,69,104,69,35,46,84,120,75,253,130,5,204,254,
126,33,66,56,39,7,0,0,0,2,0,137,0,0,1,61,5,204,0,3,0,7,0,115,64,13,3,7,70,
0,0,4,16,4,48,4,3,8,4,184,255,192,64,42,21,24,72,4,4,8,9,255,9,1,224,9,1,
223,9,1,176,9,192,9,2,159,9,1,112,9,128,9,2,31,9,1,0,9,1,240,9,1,223,9,1,
9,184,255,192,64,17,34,37,72,79,9,1,31,9,1,5,15,4,21,0,83,1,0,0,63,237,63,
63,1,93,113,43,113,113,114,114,114,114,114,114,114,114,17,18,57,47,43,94,
93,51,237,50,49,48,19,53,51,21,3,17,51,17,137,180,180,180,5,32,172,172,250,
224,4,58,251,198,0,0,0,0,2,255,206,254,87,1,61,5,204,0,3,0,23,1,51,64,151,
7,24,12,16,72,7,40,8,11,72,3,4,70,21,12,12,0,0,21,16,21,32,21,64,21,4,7,21,
21,24,25,144,25,1,63,25,1,0,25,16,25,2,219,25,64,210,213,72,208,25,224,25,
2,143,25,1,64,25,80,25,2,15,25,31,25,95,25,111,25,255,25,5,144,25,160,25,
224,25,240,25,4,79,25,1,0,25,1,160,63,25,175,25,191,25,207,25,4,239,25,1,
176,25,192,25,208,25,3,63,25,79,25,95,25,3,32,25,1,143,25,191,25,207,25,3,
0,25,1,111,239,25,1,208,25,1,63,25,143,25,2,111,25,143,25,159,25,175,25,255,
25,5,25,184,255,192,64,84,79,82,72,223,25,1,144,25,160,25,176,25,3,47,25,
63,25,79,25,3,0,25,1,61,25,64,53,56,72,112,25,128,25,144,25,176,25,4,15,25,
31,25,2,255,25,1,25,64,35,38,72,144,25,1,79,25,1,255,25,1,112,25,128,25,192,
25,208,25,224,25,5,31,25,1,22,15,16,80,9,27,0,83,1,0,0,63,237,63,237,63,1,
93,93,93,113,113,43,113,114,114,43,94,93,93,93,93,43,113,114,114,114,94,93,
93,113,113,113,113,114,94,93,93,93,113,114,114,114,43,94,93,93,93,17,18,57,
47,94,93,51,51,47,16,237,50,49,48,0,43,43,19,53,51,21,17,20,14,2,35,34,38,
39,53,30,1,51,50,62,2,53,17,51,137,180,21,54,93,72,34,65,28,13,36,13,38,49,
28,10,180,5,32,172,172,250,90,62,106,78,45,4,5,139,2,4,20,43,67,46,4,165,
0,0,1,0,138,0,0,4,3,5,204,0,11,0,251,64,84,124,2,1,122,8,1,118,7,1,86,9,102,
9,134,9,150,9,4,139,0,155,0,2,89,0,105,0,121,0,3,116,10,132,10,148,10,3,68,
10,1,1,10,10,11,42,8,1,3,8,9,16,116,9,1,9,9,0,11,16,84,11,116,11,148,11,3,
116,11,148,11,180,11,212,11,228,11,244,11,6,48,11,1,2,11,184,255,192,64,105,
7,10,72,11,7,3,70,0,4,16,4,48,4,240,4,4,8,4,31,13,63,13,2,31,13,63,13,95,
13,255,13,4,15,13,31,13,63,13,95,13,127,13,5,57,13,64,83,86,72,96,13,128,
13,160,13,192,13,208,13,5,223,13,1,0,13,96,13,128,13,160,13,4,0,13,16,13,
48,13,64,13,128,13,160,13,192,13,224,13,240,13,9,7,2,1,7,10,4,8,15,5,0,4,
21,0,21,0,63,63,63,63,23,57,1,94,93,113,113,114,43,94,93,113,114,47,94,93,
237,50,47,43,95,93,93,113,56,51,51,47,93,56,51,95,114,17,57,17,51,49,48,93,
93,93,93,93,0,93,1,93,0,93,33,1,7,17,35,17,51,17,1,51,9,1,3,48,254,146,132,
180,180,1,219,211,254,73,1,206,1,238,109,254,127,5,204,252,97,2,13,254,47,
253,151,0,0,0,1,0,138,0,0,1,62,5,204,0,3,0,111,64,52,3,70,192,0,1,208,0,1,
0,0,16,0,48,0,240,0,4,8,0,224,5,240,5,2,223,5,1,176,5,192,5,2,159,5,1,112,
5,128,5,2,15,5,31,5,2,240,5,1,223,5,1,5,184,255,192,64,27,34,37,72,79,5,1,
255,5,1,112,5,128,5,192,5,208,5,224,5,5,31,5,1,1,0,0,21,0,63,63,1,93,93,93,
113,43,113,113,114,114,114,114,114,114,47,94,93,113,114,237,49,48,51,17,51,
17,138,180,5,204,250,52,0,0,1,0,136,0,0,6,35,4,78,0,59,2,194,185,0,42,255,
224,179,8,11,72,32,184,255,224,64,255,8,11,72,34,59,70,0,0,13,46,70,217,47,
249,47,2,182,47,1,41,47,89,47,137,47,3,6,47,1,166,47,182,47,214,47,230,47,
4,137,47,1,118,47,1,89,47,1,6,47,22,47,70,47,3,7,47,25,12,70,198,13,1,6,13,
22,13,54,13,230,13,246,13,5,8,13,251,61,1,201,61,217,61,233,61,3,187,61,1,
153,61,1,139,61,1,105,61,121,61,2,91,61,1,73,61,1,43,61,59,61,2,249,61,1,
235,61,1,217,61,1,203,61,1,189,61,1,153,61,1,139,61,1,105,61,1,91,61,1,41,
61,57,61,2,27,61,1,9,61,1,202,235,61,251,61,2,105,61,137,61,153,61,185,61,
201,61,5,91,61,1,77,61,1,41,61,57,61,2,27,61,1,249,61,1,235,61,1,201,61,217,
61,2,187,61,1,153,61,1,139,61,1,125,61,1,1,43,61,75,61,91,61,107,61,4,31,
61,1,4,61,1,203,61,235,61,2,175,61,191,61,2,139,61,1,127,61,1,43,61,75,61,
91,61,107,61,4,31,61,1,11,61,1,154,255,61,1,235,61,64,255,1,223,61,1,187,
61,1,175,61,1,139,61,155,61,2,127,61,1,91,61,107,61,2,79,61,1,59,61,1,36,
61,1,11,61,1,235,61,1,223,61,1,187,61,1,175,61,1,155,61,1,127,61,143,61,2,
100,61,1,75,61,1,63,61,1,43,61,1,15,61,31,61,2,235,61,1,223,61,1,123,61,139,
61,171,61,187,61,4,111,61,1,59,61,1,31,61,1,11,61,1,106,187,61,203,61,235,
61,3,175,61,1,139,61,1,127,61,1,91,61,1,79,61,1,27,61,1,251,61,1,223,61,239,
61,2,187,61,203,61,2,175,61,1,100,61,148,61,2,27,61,43,61,75,61,3,4,61,1,
244,61,1,139,61,171,61,219,61,3,127,61,1,107,61,1,52,61,1,27,61,1,15,61,1,
57,187,61,219,61,251,61,3,160,61,1,116,61,148,61,2,43,61,75,61,91,61,3,31,
61,1,11,61,1,203,61,235,61,251,61,3,164,61,1,27,61,75,61,91,61,123,61,4,244,
61,1,208,61,1,2,96,61,144,61,160,61,192,61,4,79,61,1,48,61,1,47,61,1,0,64,
19,61,1,8,34,53,80,40,16,25,6,80,31,16,19,15,47,13,0,21,0,63,50,50,63,63,
237,50,63,237,50,1,94,93,93,93,93,93,95,93,93,113,113,113,114,114,114,114,
114,114,94,93,93,93,93,93,93,93,113,113,113,113,113,113,113,114,114,114,114,
114,114,114,94,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,113,
113,114,114,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93,
93,113,113,113,95,113,113,113,113,113,113,113,114,114,114,114,114,114,94,
93,93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,47,
94,93,113,237,50,47,94,93,93,93,93,93,113,113,113,113,237,18,57,47,237,57,
49,48,0,43,43,33,17,52,46,2,35,34,14,2,21,17,35,17,52,46,2,39,51,30,3,21,
51,62,3,51,50,22,23,51,62,3,51,50,30,2,21,17,35,17,52,46,2,35,34,14,2,21,
17,3,0,20,47,76,55,57,92,65,35,179,1,2,2,1,170,1,2,3,2,3,24,56,75,97,64,123,
143,28,3,24,60,80,100,64,82,119,76,36,178,20,47,76,55,57,92,65,35,2,174,79,
106,65,27,45,85,125,81,253,141,3,83,34,75,67,48,7,5,44,57,59,20,47,76,53,
29,98,107,47,76,53,29,44,92,145,100,253,47,2,174,79,106,65,27,43,84,126,83,
253,141,0,1,0,136,0,0,3,238,4,78,0,37,0,109,185,0,34,255,224,64,36,7,11,72,
37,70,64,80,0,1,159,0,255,0,2,0,39,128,0,39,192,39,208,39,224,39,4,192,39,
1,15,39,1,128,39,1,39,184,255,192,64,32,19,23,72,25,12,70,192,13,1,0,13,16,
13,48,13,224,13,240,13,5,8,13,25,6,80,31,16,19,15,13,0,21,0,63,50,63,63,237,
50,1,47,94,93,113,237,50,43,93,113,113,114,26,16,220,93,113,26,237,49,48,
43,33,17,52,46,2,35,34,14,2,21,17,35,17,52,46,2,39,51,30,3,21,51,62,3,51,
50,30,2,21,17,3,57,23,52,85,63,64,103,73,40,180,1,2,2,1,170,1,2,3,2,3,26,
62,82,106,70,90,130,84,39,2,174,79,106,65,27,45,85,125,81,253,141,3,83,34,
75,67,48,7,5,44,57,59,20,47,76,53,29,44,92,145,100,253,47,0,0,0,0,2,0,86,
255,236,4,29,4,78,0,14,0,34,0,116,64,59,121,32,137,32,2,116,28,132,28,2,118,
22,134,22,2,121,18,137,18,2,150,12,166,12,2,4,12,20,12,2,11,9,27,9,2,11,5,
27,5,2,4,2,20,2,2,7,0,71,64,144,15,1,15,36,128,48,36,1,36,184,255,192,64,
20,30,35,72,223,36,1,25,71,31,8,1,8,20,80,10,16,30,80,3,22,0,63,237,63,237,
1,47,93,237,93,43,113,26,16,220,93,26,237,49,48,94,93,93,93,93,93,93,93,93,
93,1,16,2,35,34,46,2,53,16,33,50,30,2,7,52,46,2,35,34,14,2,21,20,30,2,51,
50,62,2,4,29,250,238,113,178,123,65,1,229,126,183,117,56,189,39,75,108,68,
69,111,78,41,44,77,105,62,69,112,78,42,2,30,254,228,254,234,68,140,211,143,
2,48,70,140,210,140,126,164,98,39,41,99,164,123,126,165,98,40,39,98,166,0,
0,2,0,132,254,87,4,29,4,77,0,38,0,58,0,148,64,16,105,56,121,56,2,105,42,121,
42,2,134,36,150,36,2,36,184,255,224,64,19,7,10,72,73,31,89,31,2,73,7,89,7,
2,134,3,150,3,2,3,184,255,224,64,63,7,10,72,0,71,64,160,39,1,39,60,128,49,
28,15,70,0,16,16,16,48,16,240,16,4,8,16,176,60,1,63,60,1,112,60,144,60,2,
31,60,1,255,60,1,192,60,224,60,2,28,44,80,34,16,22,15,15,27,8,54,80,5,22,
0,63,237,50,63,63,63,237,50,1,93,93,113,113,114,114,47,94,93,237,50,50,26,
16,220,93,26,237,49,48,43,93,93,93,43,93,93,93,1,20,14,2,35,34,38,39,35,30,
3,21,17,35,17,52,46,2,39,51,30,3,21,51,62,3,51,50,30,2,7,52,46,2,35,34,14,
2,21,20,30,2,51,50,62,2,4,29,40,93,153,112,116,174,46,5,1,1,1,1,180,1,2,2,
1,174,1,3,3,3,4,25,64,82,101,63,112,153,93,40,189,24,59,98,74,60,106,79,46,
38,73,108,70,75,99,59,24,2,34,123,208,150,85,88,100,2,32,48,59,29,254,89,
5,6,39,72,59,42,9,3,36,51,58,26,52,73,47,21,80,145,205,129,100,156,108,56,
34,96,169,135,115,159,98,43,58,110,159,0,0,2,0,86,254,87,3,240,4,78,0,34,
0,54,0,165,64,119,85,47,101,47,2,90,43,106,43,2,57,32,73,32,2,54,9,70,9,2,
9,1,25,1,121,1,137,1,4,6,5,22,5,118,5,134,5,4,9,22,70,64,35,11,127,23,223,
23,2,23,56,128,45,71,15,3,1,10,3,32,56,64,56,2,207,56,1,0,56,32,56,144,56,
176,56,4,80,223,56,1,192,56,1,79,56,1,128,56,160,56,2,15,56,47,56,2,208,56,
240,56,2,15,56,1,8,22,27,17,16,11,40,80,6,16,29,50,80,0,22,0,63,237,50,63,
237,50,63,63,1,94,93,93,113,113,114,114,114,94,93,93,113,47,94,93,237,26,
16,220,93,50,50,26,237,49,48,0,94,93,93,93,93,93,93,5,34,2,17,16,18,51,50,
30,2,23,51,52,62,2,55,51,14,1,21,17,35,17,52,54,55,54,55,35,14,3,1,52,46,
2,35,34,14,2,21,20,30,2,51,50,62,2,1,228,206,192,197,201,67,103,81,61,25,
2,3,3,4,2,173,2,5,180,1,1,1,1,2,26,63,82,103,1,16,41,75,107,66,69,98,61,29,
27,61,97,70,60,106,79,46,20,1,22,1,22,1,26,1,28,24,47,70,47,25,61,54,39,3,
17,144,134,251,54,1,183,26,56,25,28,29,51,75,49,23,2,62,118,160,96,41,51,
105,161,110,108,160,104,51,37,97,169,0,0,0,1,0,136,0,0,2,136,4,78,0,31,0,
62,64,40,16,21,48,21,2,21,21,33,12,31,70,192,0,1,0,0,16,0,48,0,224,0,240,
0,5,8,0,25,40,19,22,72,25,12,18,16,7,15,0,21,0,63,63,63,51,205,43,1,47,94,
93,113,237,50,17,51,47,93,49,48,51,17,52,46,2,39,51,30,3,21,51,62,3,51,50,
22,23,21,46,1,35,34,14,2,21,17,142,1,2,2,1,170,1,3,3,1,4,19,43,58,80,57,22,
40,11,18,48,30,62,87,55,26,3,62,34,71,66,58,23,23,59,62,57,20,62,91,59,29,
7,3,165,5,5,56,99,137,81,253,204,0,0,1,0,57,255,236,3,182,4,75,0,55,0,189,
64,85,116,46,132,46,2,111,21,127,21,143,21,3,107,22,1,37,54,1,42,27,1,21,
52,1,5,2,21,2,2,11,30,27,30,2,36,73,35,35,0,72,64,32,19,48,19,2,144,19,160,
19,176,19,3,19,57,128,11,73,10,64,25,30,72,10,10,44,72,79,29,95,29,2,32,29,
1,29,96,57,192,57,2,128,57,1,57,184,255,192,64,42,39,42,72,63,57,1,16,57,
1,19,44,5,41,80,32,0,36,1,144,36,240,36,2,36,36,32,16,14,80,5,96,11,112,11,
2,128,11,1,11,11,5,22,0,63,51,47,93,113,16,237,63,51,47,93,113,16,237,18,
57,57,1,93,93,43,93,113,47,93,113,237,51,47,43,237,26,16,220,93,113,26,237,
50,47,237,49,48,93,93,0,93,1,93,93,0,93,93,93,1,20,14,2,35,34,46,2,39,55,
30,1,51,50,62,2,53,52,46,2,39,46,3,53,52,54,51,50,22,23,7,46,3,35,34,6,21,
20,30,2,23,30,5,3,182,59,112,163,105,94,151,114,77,18,159,23,144,128,58,97,
70,39,46,82,117,70,65,128,103,64,211,202,179,211,28,162,9,48,68,85,46,122,
116,43,77,108,65,43,90,85,75,56,33,1,43,76,119,81,43,29,64,105,76,31,87,81,
16,39,65,48,49,63,42,31,19,17,42,69,102,77,148,155,126,139,20,42,57,35,15,
74,75,44,57,39,29,16,11,25,35,47,66,88,0,0,0,0,1,0,31,255,240,2,42,5,44,0,
22,0,123,64,87,40,14,1,105,14,121,14,137,14,3,40,13,1,105,13,121,13,137,13,
3,139,4,1,4,32,9,13,72,108,4,124,4,156,4,172,4,4,4,32,9,12,72,111,22,127,
22,2,22,12,13,22,3,16,70,9,8,143,5,1,0,5,16,5,32,5,64,5,4,7,5,128,24,1,15,
6,80,12,63,10,1,10,9,15,19,80,3,22,0,63,237,63,205,93,51,237,50,1,93,47,94,
93,113,51,51,237,23,50,47,93,49,48,0,43,93,1,43,93,93,113,93,113,37,14,1,
35,34,53,17,35,53,51,55,51,21,51,21,35,17,20,22,51,50,54,55,2,42,41,85,56,
216,125,132,53,120,200,200,51,63,26,49,29,8,11,13,245,2,210,131,242,242,131,
253,85,78,63,8,6,0,0,0,0,1,0,133,255,236,3,235,4,58,0,37,0,121,64,69,150,
3,1,26,33,42,33,58,33,3,25,14,70,64,47,11,143,11,2,191,11,1,143,11,159,11,
255,11,3,11,39,128,1,70,223,36,239,36,2,0,36,16,36,48,36,240,36,4,8,36,176,
39,192,39,208,39,3,176,39,240,39,2,255,39,1,112,39,1,39,184,255,192,64,13,
19,23,72,25,6,80,31,22,19,21,12,0,15,0,63,50,63,63,237,50,1,43,93,93,113,
114,47,94,93,113,237,26,16,220,93,113,114,26,237,51,49,48,0,93,93,1,17,20,
30,2,51,50,62,2,53,17,51,17,20,30,2,23,35,46,3,53,35,14,3,35,34,46,2,53,17,
1,58,23,52,85,63,64,103,73,40,180,1,2,2,1,170,1,2,3,2,3,26,62,82,106,70,90,
130,84,39,4,58,253,82,79,106,65,27,45,85,125,81,2,115,252,173,34,75,67,48,
7,5,44,57,59,20,47,76,53,29,44,92,144,101,2,209,0,0,1,0,7,0,0,3,249,4,58,
0,16,2,91,64,55,57,1,73,1,2,153,1,1,54,0,70,0,2,134,0,150,0,2,58,15,74,15,
2,154,15,1,105,15,121,15,137,15,3,53,3,69,3,2,149,3,1,3,103,3,119,3,135,3,
3,14,16,13,17,72,4,184,255,240,64,62,13,17,72,1,0,9,9,2,15,16,16,43,16,123,
16,2,4,16,20,16,2,4,16,20,16,68,16,84,16,132,16,148,16,196,16,212,16,8,219,
16,1,68,16,84,16,132,16,148,16,196,16,5,27,16,1,4,16,1,8,16,3,2,184,255,240,
64,255,11,2,91,2,2,42,2,11,18,27,18,2,11,18,27,18,75,18,91,18,139,18,155,
18,203,18,219,18,8,255,18,1,196,18,212,18,2,160,18,1,132,18,148,18,2,96,18,
1,68,18,84,18,2,32,18,1,4,18,20,18,2,199,224,18,1,196,18,212,18,2,160,18,
1,4,18,20,18,68,18,84,18,132,18,148,18,6,68,18,84,18,132,18,148,18,196,18,
212,18,6,27,18,1,4,18,1,219,18,1,196,18,1,155,18,1,132,18,1,91,18,1,68,18,
1,27,18,1,4,18,1,151,11,18,27,18,75,18,91,18,139,18,155,18,203,18,219,18,
8,155,18,203,18,219,18,3,132,18,1,96,18,1,68,18,84,18,2,32,18,1,4,18,20,18,
2,224,18,1,196,18,212,18,2,160,18,1,132,18,148,18,2,96,18,1,4,18,20,18,68,
18,84,18,4,103,4,18,20,18,68,18,84,18,132,18,148,18,196,18,212,18,8,219,18,
1,196,18,1,155,18,1,132,18,1,91,18,1,68,18,1,27,18,1,4,18,1,219,18,1,196,
18,1,11,18,27,18,75,18,64,99,91,18,139,18,155,18,6,55,75,18,91,18,139,18,
155,18,203,18,219,18,6,63,18,1,32,18,1,4,18,20,18,2,224,18,1,196,18,212,18,
2,160,18,1,132,18,148,18,2,96,18,1,68,18,84,18,2,32,18,1,4,18,20,18,2,196,
18,212,18,2,160,18,1,132,18,148,18,2,96,18,1,2,80,18,1,47,18,1,0,18,16,18,
2,7,15,2,15,9,1,21,0,63,51,63,51,1,94,93,93,93,95,93,93,93,93,113,113,113,
113,113,113,113,113,114,114,114,114,94,93,93,93,113,113,113,113,113,113,113,
113,114,94,93,93,93,93,93,93,113,113,113,113,113,113,114,94,93,93,93,93,93,
93,93,93,113,113,113,114,114,114,114,94,93,93,93,93,93,93,93,93,113,114,47,
94,93,56,51,47,94,93,93,93,93,113,114,114,56,51,18,57,61,47,51,51,49,48,43,
43,93,95,93,113,93,93,113,93,113,93,113,33,35,1,51,19,30,3,23,62,3,55,19,
51,2,101,213,254,119,192,238,7,19,20,17,6,6,19,20,21,8,246,191,4,58,253,64,
22,63,68,63,21,21,63,66,63,22,2,194,0,0,0,0,1,255,253,0,0,5,204,4,58,0,42,
3,177,64,36,229,23,1,58,41,74,41,2,122,41,138,41,154,41,3,53,16,69,16,2,117,
16,133,16,149,16,3,54,29,70,29,2,54,29,1,29,184,255,240,64,22,13,17,72,57,
28,73,28,2,57,28,1,28,16,13,17,72,54,0,70,0,2,0,184,255,240,64,9,11,17,72,
54,13,70,13,2,13,184,255,240,64,51,11,17,72,57,1,73,1,2,1,16,11,17,72,57,
14,73,14,2,3,14,16,9,17,72,14,13,22,29,28,7,1,0,35,40,35,1,88,35,1,22,7,35,
35,7,22,3,15,41,42,16,42,184,255,192,64,73,47,50,72,73,42,1,52,42,1,38,42,
1,249,42,1,198,42,230,42,2,164,42,1,150,42,1,121,42,1,54,42,70,42,102,42,
3,25,42,1,244,42,1,182,42,230,42,2,132,42,148,42,2,102,42,118,42,2,57,42,
1,38,42,1,20,42,1,6,42,1,8,42,16,15,184,255,240,64,255,9,15,89,15,105,15,
121,15,4,10,15,198,44,230,44,246,44,3,164,44,1,150,44,1,121,44,1,102,44,1,
84,44,1,54,44,70,44,2,25,44,1,244,44,1,230,44,1,196,44,1,182,44,1,153,44,
1,134,44,1,116,44,1,102,44,1,57,44,1,20,44,36,44,2,6,44,1,202,249,44,1,150,
44,182,44,198,44,230,44,4,105,44,1,54,44,70,44,2,9,44,25,44,2,230,44,1,185,
44,1,86,44,102,44,134,44,3,57,44,1,43,44,1,20,44,1,6,44,1,228,44,1,214,44,
1,196,44,1,182,44,1,162,44,1,148,44,1,134,44,1,114,44,1,100,44,1,86,44,1,
52,44,68,44,2,34,44,1,20,44,1,6,44,1,153,246,44,1,194,44,210,44,2,180,44,
1,166,44,1,132,44,1,118,44,1,84,44,100,44,2,66,44,1,52,44,1,22,44,38,44,2,
4,44,1,226,44,242,44,2,212,44,1,198,44,1,164,44,1,146,44,1,132,44,1,102,44,
118,44,2,84,44,1,54,44,70,44,2,36,44,1,22,44,1,4,44,1,244,44,64,213,1,230,
44,1,196,44,1,178,44,1,164,44,1,102,44,134,44,150,44,3,68,44,84,44,2,54,44,
1,20,44,1,6,44,1,105,246,44,1,226,44,1,212,44,1,150,44,182,44,198,44,3,116,
44,132,44,2,54,44,70,44,102,44,3,36,44,1,6,44,22,44,2,244,44,1,182,44,230,
44,2,148,44,164,44,2,134,44,1,105,44,1,86,44,1,68,44,1,6,44,54,44,2,228,44,
1,214,44,1,196,44,1,166,44,182,44,2,137,44,1,114,44,1,1,96,44,1,4,44,36,44,
84,44,3,56,164,44,196,44,212,44,244,44,4,128,44,1,116,44,1,75,44,1,48,44,
1,20,44,36,44,2,251,44,1,196,44,1,160,44,1,148,44,1,123,44,1,52,44,68,44,
100,44,3,27,44,1,240,44,1,228,44,1,203,44,1,100,44,132,44,148,44,180,44,4,
63,44,1,2,0,44,16,44,2,8,7,184,255,224,64,40,14,17,72,66,7,1,52,7,1,34,7,
1,7,28,41,3,15,15,35,40,12,17,72,45,35,1,22,40,12,17,72,45,22,1,1,22,35,3,
14,21,0,63,23,51,93,43,93,43,63,23,51,93,93,93,43,1,94,93,95,93,93,93,93,
93,113,113,113,113,113,113,113,114,114,114,114,114,114,94,93,93,95,93,93,
93,93,93,93,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,
94,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,113,
113,113,114,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93,
93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,114,114,114,114,114,94,
93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,47,94,93,
56,51,47,94,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,114,114,114,
43,56,51,18,23,57,61,47,47,47,113,114,17,51,51,17,51,51,17,51,51,49,48,43,
95,113,43,113,43,113,43,113,43,93,113,43,93,113,93,113,93,113,113,33,35,3,
46,1,39,38,39,6,7,14,1,7,3,35,1,51,19,30,1,23,22,23,54,55,62,1,55,19,51,19,
30,1,23,22,23,54,55,62,1,55,19,51,4,150,209,173,8,17,8,10,9,9,10,8,19,8,178,
208,254,209,178,183,7,14,7,7,8,8,9,8,16,6,196,193,189,7,16,7,8,8,8,8,7,15,
7,191,176,2,186,27,80,38,44,47,45,44,38,82,31,253,74,4,58,253,33,23,67,32,
37,39,38,36,31,64,21,2,231,253,25,26,66,29,34,35,38,36,31,67,26,2,223,0,0,
1,0,23,0,0,3,234,4,58,0,11,2,214,64,72,148,2,1,134,2,1,141,8,157,8,2,121,
8,1,130,6,146,6,2,118,6,1,141,0,157,0,2,121,0,1,55,10,119,10,2,28,10,1,122,
4,1,19,4,1,3,24,1,120,1,136,1,152,1,4,23,7,135,7,151,7,3,6,8,10,1,7,4,4,9,
9,16,5,184,255,240,64,59,5,9,5,9,3,0,11,16,41,11,57,11,2,4,11,20,11,2,214,
11,230,11,246,11,3,196,11,1,150,11,166,11,182,11,3,132,11,1,6,11,38,11,70,
11,102,11,134,11,150,11,166,11,198,11,230,11,9,8,11,184,255,192,181,24,31,
72,11,2,3,184,255,240,64,11,9,3,1,9,3,57,3,2,10,3,13,184,255,128,64,116,223,
233,72,118,13,1,100,13,1,86,13,1,68,13,1,54,13,1,36,13,1,22,13,1,4,13,1,230,
13,246,13,2,210,13,1,192,13,1,178,13,1,132,13,148,13,164,13,3,118,13,1,100,
13,1,86,13,1,68,13,1,54,13,1,36,13,1,22,13,1,4,13,1,199,246,13,1,228,13,1,
214,13,1,196,13,1,182,13,1,164,13,1,6,13,70,13,86,13,134,13,150,13,166,13,
198,13,214,13,230,13,9,150,13,198,13,2,13,184,255,192,64,187,183,192,72,132,
13,1,86,13,102,13,118,13,3,68,13,1,38,13,54,13,2,4,13,1,151,38,13,54,13,102,
13,118,13,166,13,182,13,198,13,230,13,246,13,9,230,13,1,132,13,1,118,13,1,
68,13,84,13,100,13,3,54,13,1,36,13,1,22,13,1,4,13,1,246,13,1,228,13,1,214,
13,1,196,13,1,182,13,1,164,13,1,118,13,134,13,150,13,3,100,13,1,6,13,22,13,
38,13,70,13,86,13,5,103,6,13,70,13,86,13,134,13,150,13,198,13,214,13,230,
13,8,153,13,217,13,2,100,13,1,86,13,1,68,13,1,54,13,1,36,13,1,22,13,1,4,13,
1,214,13,230,13,246,13,3,196,13,1,6,13,38,13,54,13,70,13,4,55,102,13,166,
13,182,13,230,13,246,13,5,13,184,255,192,64,54,61,66,72,57,13,1,34,13,1,1,
0,13,16,13,2,244,13,1,192,13,208,13,224,13,3,180,13,1,128,13,144,13,160,13,
3,116,13,1,96,13,1,84,13,1,64,13,1,52,13,1,32,13,1,13,184,255,192,64,34,18,
24,72,160,13,1,2,0,13,16,13,80,13,112,13,128,13,144,13,6,7,10,4,4,7,1,3,2,
8,6,15,0,2,21,0,63,51,63,51,18,23,57,17,1,51,94,93,95,93,43,113,113,113,113,
113,113,113,113,113,113,114,95,114,114,43,114,94,93,93,93,113,113,113,113,
113,113,113,113,114,94,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,
113,113,114,94,93,93,93,93,93,43,93,113,114,114,114,114,114,114,94,93,93,
93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,43,47,94,
93,114,56,51,47,43,94,93,113,113,113,113,114,114,56,51,18,57,57,47,47,56,
56,18,23,57,50,51,49,48,0,93,93,1,95,93,93,93,93,93,93,93,93,93,93,93,93,
33,9,1,35,9,1,51,9,1,51,9,1,3,33,254,221,254,219,194,1,129,254,145,199,1,
14,1,12,201,254,145,1,134,1,188,254,68,2,44,2,14,254,91,1,165,253,244,253,
210,0,0,0,0,1,0,5,254,87,3,252,4,58,0,31,2,207,64,59,147,3,1,147,2,1,153,
16,1,150,0,1,141,16,157,16,2,141,0,157,0,2,122,29,138,29,154,29,3,105,29,
1,157,30,1,30,16,13,16,72,146,19,1,134,19,1,114,19,1,86,19,102,19,2,146,18,
1,3,18,184,255,240,64,36,13,16,72,16,0,24,8,24,8,24,17,30,31,16,153,31,1,
134,31,1,89,31,1,70,31,1,25,31,1,6,31,1,8,31,18,17,184,255,240,64,36,17,6,
33,1,6,33,38,33,54,33,70,33,102,33,118,33,134,33,166,33,182,33,198,33,230,
33,246,33,12,199,230,33,246,33,2,33,184,255,192,64,255,217,233,72,196,33,
1,166,33,182,33,2,132,33,1,6,33,38,33,54,33,70,33,102,33,118,33,6,6,33,38,
33,54,33,70,33,102,33,118,33,134,33,166,33,182,33,198,33,230,33,246,33,12,
6,33,22,33,38,33,70,33,86,33,102,33,134,33,166,33,198,33,230,33,246,33,11,
151,244,33,1,224,33,1,194,33,210,33,2,180,33,1,160,33,1,130,33,146,33,2,116,
33,1,96,33,1,66,33,82,33,2,52,33,1,32,33,1,2,33,18,33,2,228,33,244,33,2,194,
33,210,33,2,164,33,180,33,2,130,33,146,33,2,100,33,116,33,2,66,33,82,33,2,
36,33,52,33,2,2,33,18,33,2,228,33,244,33,2,194,33,210,33,2,164,33,180,33,
2,130,33,146,33,2,100,33,116,33,2,86,33,1,66,33,1,36,33,52,33,2,22,33,1,2,
33,1,103,228,33,244,33,2,214,33,1,194,33,1,164,33,180,33,2,150,33,1,130,33,
1,100,33,116,33,2,86,33,1,66,33,1,36,33,52,33,2,22,33,1,2,33,1,228,33,244,
33,2,214,33,1,64,166,194,33,1,1,160,33,176,33,2,132,33,148,33,2,96,33,112,
33,2,68,33,84,33,2,32,33,48,33,2,4,33,20,33,2,224,33,240,33,2,196,33,212,
33,2,160,33,176,33,2,132,33,148,33,2,96,33,112,33,2,68,33,84,33,2,32,33,48,
33,2,4,33,20,33,2,55,224,33,1,196,33,212,33,2,160,33,1,132,33,148,33,2,96,
33,1,68,33,84,33,2,32,33,1,4,33,20,33,2,224,33,1,196,33,212,33,2,160,33,1,
132,33,148,33,2,96,33,1,2,0,33,32,33,48,33,80,33,4,80,33,128,33,144,33,192,
33,4,47,33,1,0,33,16,33,2,7,16,0,24,0,32,30,17,15,12,80,5,27,0,63,237,63,
51,17,51,51,17,51,1,94,93,93,93,113,95,113,113,113,113,113,114,114,114,114,
114,114,114,114,94,93,93,93,93,93,93,93,93,113,113,113,113,113,113,95,113,
113,113,114,114,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,
93,93,93,93,93,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,
114,114,114,114,114,94,93,113,114,114,114,114,43,114,94,93,113,47,56,51,47,
94,93,93,93,93,93,93,56,51,18,57,57,61,47,24,47,17,51,51,49,48,43,95,93,93,
93,93,93,43,93,93,93,0,93,93,1,93,93,93,93,33,14,3,35,34,38,39,53,30,1,51,
50,54,63,1,1,51,19,30,3,23,62,3,55,19,51,2,92,38,79,98,120,78,34,58,32,19,
48,17,79,136,51,17,254,83,192,228,10,31,31,24,2,3,23,29,30,10,212,190,98,
157,111,59,4,7,135,3,3,118,129,43,4,53,253,170,27,90,90,72,9,11,65,80,82,
30,2,106,0,1,0,49,0,0,3,182,4,58,0,9,1,11,64,78,157,2,173,2,2,139,2,1,89,
2,105,2,2,146,7,162,7,2,116,7,132,7,2,70,7,86,7,102,7,3,40,8,1,3,8,2,123,
6,1,4,6,20,6,36,6,164,6,180,6,212,6,228,6,7,7,6,7,3,11,1,59,1,91,1,3,10,1,
64,39,55,72,1,64,17,20,72,1,11,184,255,192,64,40,92,100,72,192,11,1,180,11,
1,160,11,1,148,11,1,128,11,1,116,11,1,96,11,1,84,11,1,64,11,1,52,11,68,11,
100,11,132,11,4,11,184,255,192,64,32,73,82,72,32,11,1,20,11,1,0,11,1,63,68,
11,100,11,132,11,164,11,4,4,11,36,11,68,11,100,11,4,11,184,255,192,179,51,
62,72,11,184,255,192,64,18,31,39,72,224,11,1,2,0,11,32,11,80,11,112,11,4,
7,11,184,255,192,64,13,16,20,72,6,3,80,4,15,1,7,80,0,21,0,63,237,50,63,237,
50,1,43,94,93,95,93,43,43,113,114,94,93,93,93,43,93,113,113,113,113,113,113,
113,113,113,43,47,43,43,94,93,51,51,47,94,93,113,51,51,95,113,49,48,93,93,
93,93,93,93,51,53,1,33,53,33,21,1,33,21,49,2,149,253,147,3,56,253,106,2,187,
137,3,38,139,137,252,218,139,0,0,0,1,0,34,254,87,2,136,5,204,0,45,0,96,64,
65,3,32,9,12,72,19,32,9,13,72,23,45,33,28,40,240,17,11,31,5,63,5,2,143,5,
1,64,5,1,5,33,11,245,47,12,111,12,2,15,12,79,12,223,12,239,12,4,47,12,79,
12,111,12,3,12,12,0,24,245,21,0,43,245,0,27,0,63,237,63,237,18,57,47,93,113,
114,237,57,1,47,93,93,113,51,51,237,50,50,205,50,49,48,43,43,1,34,46,2,53,
17,52,46,2,39,53,62,3,53,17,52,54,59,1,21,35,34,6,21,17,20,14,2,7,21,30,3,
21,17,20,22,59,1,21,2,1,65,99,66,34,29,55,80,51,51,80,55,29,133,131,135,63,
91,77,30,52,71,41,43,71,51,29,77,91,63,254,87,41,76,108,68,1,105,63,88,56,
28,2,127,2,28,56,88,62,1,106,141,152,129,107,108,254,156,50,84,64,44,10,2,
10,44,65,84,51,254,155,106,109,129,0,1,0,183,254,78,1,93,5,204,0,3,1,207,
64,21,3,171,6,0,1,11,0,0,4,5,214,5,230,5,246,5,3,194,5,1,5,184,255,128,179,
226,229,72,5,184,255,192,64,10,222,225,72,2,5,18,5,2,218,5,184,255,128,179,
214,217,72,5,184,255,192,64,20,210,213,72,180,5,196,5,2,162,5,1,1,112,5,128,
5,144,5,3,5,184,255,192,64,20,199,202,72,0,5,1,240,5,1,212,5,228,5,2,176,
5,192,5,2,5,184,255,192,64,43,187,190,72,48,5,64,5,80,5,3,4,5,20,5,36,5,3,
240,5,1,196,5,212,5,228,5,3,128,5,144,5,160,5,3,4,5,20,5,36,5,3,164,5,184,
255,192,179,168,171,72,5,184,255,128,179,160,163,72,5,184,255,192,64,14,156,
159,72,112,5,128,5,144,5,3,228,5,1,5,184,255,192,64,11,145,148,72,176,5,192,
5,208,5,3,5,184,255,192,64,15,133,136,72,48,5,1,20,5,36,5,2,0,5,1,5,184,255,
192,64,15,122,125,72,128,5,1,4,5,20,5,36,5,3,110,5,184,255,192,64,10,114,
117,72,192,5,1,84,5,1,5,184,255,192,182,102,105,72,16,5,1,5,184,255,192,64,
9,91,94,72,80,5,96,5,2,5,184,255,192,64,15,79,82,72,203,5,219,5,2,160,5,176,
5,2,2,5,184,255,192,64,10,68,71,72,15,5,31,5,2,62,5,184,255,192,64,29,56,
61,72,207,5,1,96,5,112,5,160,5,176,5,4,31,5,1,0,5,1,160,5,224,5,240,5,3,5,
184,255,192,64,28,25,28,72,5,64,17,21,72,64,5,112,5,128,5,144,5,4,15,5,31,
5,47,5,3,7,1,0,0,0,47,63,1,94,93,93,43,43,113,114,114,114,114,43,94,93,43,
95,93,93,43,113,43,114,43,114,114,43,94,93,93,43,113,113,113,43,113,43,113,
114,43,43,43,94,93,93,93,93,113,113,43,113,113,113,114,43,114,95,114,114,
43,43,94,93,43,43,93,93,17,18,57,47,94,93,237,49,48,19,17,51,17,183,166,254,
78,7,126,248,130,0,0,0,0,1,0,34,254,87,2,135,5,204,0,45,0,98,185,0,40,255,
224,179,9,12,72,24,184,255,224,64,55,9,13,72,20,44,32,26,38,240,15,9,48,3,
1,192,3,208,3,2,3,9,32,245,47,31,111,31,2,15,31,79,31,223,31,239,31,4,47,
31,79,31,111,31,3,31,31,21,45,245,44,27,20,245,21,0,0,63,237,63,237,18,57,
47,93,113,114,237,57,1,47,93,113,51,51,253,50,50,205,50,49,48,43,43,19,50,
54,53,17,52,62,2,55,53,46,3,53,17,52,38,43,1,53,51,50,22,21,17,20,30,2,23,
21,14,3,21,17,20,14,2,43,1,53,94,91,79,28,51,71,43,42,70,52,29,79,91,60,132,
131,133,29,55,81,52,52,81,55,29,34,66,99,65,132,254,216,109,106,1,101,51,
84,65,44,10,2,10,44,64,84,50,1,100,108,107,129,152,141,254,150,62,88,56,28,
2,127,2,28,56,88,63,254,151,68,108,76,41,129,0,0,0,0,1,0,92,2,41,4,80,3,39,
0,32,0,154,64,26,90,3,138,3,2,25,2,41,2,57,2,3,30,48,10,16,72,13,31,1,25,
48,9,12,72,13,184,255,208,179,9,13,72,7,184,255,208,64,19,9,13,72,0,27,32,
27,112,27,3,27,32,10,1,10,24,173,64,10,184,255,192,180,38,60,72,10,0,184,
255,192,179,23,28,72,0,184,255,192,64,41,14,20,72,0,128,27,64,41,60,72,27,
5,173,31,14,79,14,159,14,3,111,14,127,14,159,14,175,14,207,14,239,14,255,
14,7,14,64,9,13,72,14,0,47,43,93,113,237,196,43,26,221,43,43,196,43,26,237,
1,47,93,47,93,49,48,0,43,43,43,93,43,93,93,1,34,38,39,38,35,34,14,2,7,53,
62,1,51,50,30,2,23,30,3,51,50,54,55,21,14,3,3,76,69,145,73,129,88,38,65,60,
56,29,50,132,81,40,80,77,75,37,21,50,51,51,23,69,123,52,32,59,61,68,2,41,
44,26,45,12,23,32,21,143,38,46,13,20,26,13,8,15,14,8,50,42,149,23,30,19,8,
0,0,0,2,0,242,254,185,1,184,4,58,0,3,0,7,2,19,64,133,2,91,3,3,166,5,182,5,
2,5,150,105,6,185,6,2,70,6,86,6,2,57,6,1,6,64,23,27,72,182,6,198,6,2,73,6,
89,6,105,6,3,22,6,54,6,2,9,6,1,10,6,121,9,137,9,153,9,201,9,4,70,9,1,9,9,
57,9,2,249,9,1,182,9,1,105,9,121,9,169,9,3,38,9,1,9,9,1,204,217,9,233,9,2,
150,9,1,73,9,89,9,121,9,3,6,9,1,185,9,201,9,2,134,9,1,116,9,1,86,9,102,9,
2,68,9,1,22,9,38,9,54,9,3,9,184,255,192,64,14,168,171,72,180,9,1,134,9,150,
9,166,9,3,9,184,255,192,64,22,159,162,72,36,9,1,6,9,22,9,2,156,182,9,198,
9,214,9,246,9,4,9,184,255,64,64,14,147,150,72,102,9,1,150,9,166,9,182,9,3,
9,184,255,192,64,24,137,144,72,98,9,114,9,130,9,3,64,9,80,9,2,34,9,50,9,2,
16,9,1,9,184,255,64,182,117,124,72,128,9,1,9,184,255,64,64,10,110,115,72,
4,9,20,9,2,108,9,184,255,64,64,62,101,107,72,180,9,196,9,212,9,3,150,9,166,
9,2,132,9,1,118,9,1,82,9,98,9,2,36,9,52,9,68,9,3,6,9,22,9,2,246,9,1,194,9,
210,9,2,1,144,9,160,9,176,9,3,100,9,116,9,132,9,3,9,184,255,128,64,16,71,
75,72,212,9,228,9,244,9,3,160,9,176,9,2,9,184,255,192,64,61,59,64,72,16,9,
32,9,2,4,9,1,55,180,9,228,9,244,9,3,128,9,144,9,2,84,9,100,9,116,9,3,27,9,
1,0,9,1,240,9,1,196,9,212,9,228,9,3,84,9,100,9,164,9,212,9,228,9,244,9,6,
9,184,255,192,64,20,26,31,72,64,9,1,2,15,9,1,7,0,6,156,7,15,0,3,1,3,0,47,
93,63,253,206,1,94,93,95,93,43,93,113,113,114,114,114,114,114,94,93,93,43,
93,93,43,113,113,95,113,113,114,114,114,114,114,114,114,43,94,93,43,93,43,
113,113,113,113,43,113,114,43,114,94,93,93,43,93,93,43,113,113,113,113,113,
113,114,114,114,114,94,93,93,93,93,93,113,113,113,47,94,93,93,93,93,43,113,
113,113,237,113,51,47,237,49,48,1,51,19,35,19,21,35,53,1,10,148,24,196,198,
194,2,173,252,12,5,129,201,201,0,0,0,1,0,135,255,225,3,250,5,129,0,43,0,137,
64,31,88,14,104,14,2,87,20,103,20,2,26,28,1,21,6,1,6,3,1,25,10,22,0,11,1,
11,11,3,39,71,17,184,255,192,64,56,8,11,72,17,31,70,30,30,3,70,4,34,80,217,
31,1,124,31,140,31,2,25,31,1,31,22,96,25,112,25,2,160,25,1,25,23,3,12,213,
3,1,112,3,128,3,2,21,3,101,3,2,3,0,80,9,10,0,47,221,237,51,93,93,93,51,63,
221,93,113,50,50,93,93,93,237,1,47,237,51,47,237,47,43,237,18,57,47,113,51,
205,50,49,48,0,93,93,93,93,93,1,50,54,55,23,14,3,7,21,35,53,46,3,53,52,62,
2,55,53,51,21,30,3,23,7,46,1,35,34,14,2,21,20,30,2,2,84,96,129,15,182,8,51,
88,126,83,124,111,154,95,43,66,111,146,80,124,78,120,86,54,12,185,14,114,
105,77,103,64,27,27,64,105,1,21,104,108,12,62,116,92,62,8,168,168,10,93,149,
195,113,150,206,131,63,7,155,155,8,55,85,109,63,14,90,106,51,103,156,105,
93,156,113,62,0,0,1,0,58,0,0,4,80,5,150,0,50,0,210,64,83,70,23,1,54,2,70,
2,2,21,18,37,18,53,18,3,36,0,39,13,6,26,111,25,25,39,0,44,110,6,35,39,110,
14,95,10,1,10,10,0,79,6,95,6,111,6,3,6,50,111,0,0,32,0,2,0,0,32,0,48,0,80,
0,112,0,144,0,176,0,208,0,8,0,0,16,0,48,0,192,0,224,0,5,0,184,255,192,64,
64,14,18,72,0,38,11,81,35,15,14,31,14,175,14,3,15,14,63,14,111,14,127,14,
159,14,175,14,207,14,223,14,8,8,14,64,37,42,72,14,64,27,32,72,14,14,44,31,
115,26,20,7,7,44,116,22,50,118,50,134,50,3,50,6,24,0,63,51,93,237,50,63,51,
237,18,57,47,43,43,94,93,113,51,237,50,1,47,43,93,113,114,237,47,93,18,57,
47,113,51,237,50,16,237,17,18,57,47,237,17,51,17,18,57,49,48,0,93,1,93,0,
93,1,14,3,35,33,53,62,1,61,1,35,53,51,17,52,62,2,51,50,30,2,23,7,46,3,35,
34,6,21,17,33,21,33,21,20,14,2,7,33,50,62,2,55,4,80,9,57,89,115,67,253,70,
89,86,186,186,48,99,152,103,70,123,99,71,18,174,10,39,53,65,36,114,112,1,
152,254,104,22,44,63,40,1,227,38,67,53,37,8,1,55,80,117,77,37,154,46,160,
121,144,129,1,24,92,147,102,55,29,58,86,57,57,31,52,36,20,115,125,254,224,
129,126,56,106,92,71,21,19,42,67,48,0,0,0,2,0,113,0,225,4,2,4,115,0,35,0,
55,0,153,64,119,74,29,90,29,106,29,3,44,29,60,29,2,74,25,90,25,106,25,3,44,
25,60,25,2,69,11,85,11,101,11,3,35,11,51,11,2,69,7,85,7,101,7,3,35,7,51,7,
2,74,34,90,34,106,34,3,45,34,61,34,2,69,20,85,20,101,20,3,35,20,51,20,2,69,
16,85,16,101,16,3,35,16,51,16,2,74,2,90,2,106,2,3,45,2,61,2,2,46,176,18,36,
176,207,0,223,0,2,0,0,1,0,47,57,1,41,176,27,51,176,9,0,47,237,220,237,1,93,
47,93,93,237,220,237,49,48,93,93,93,93,93,93,93,93,0,93,93,93,93,93,93,93,
93,19,52,54,55,39,55,23,62,1,51,50,22,23,55,23,7,30,1,21,20,6,7,23,7,39,14,
1,35,34,38,39,7,39,55,46,1,55,20,30,2,51,50,62,2,53,52,46,2,35,34,14,2,137,
41,37,100,104,99,54,127,73,71,126,54,97,104,96,37,43,44,38,100,102,101,54,
126,71,72,128,52,105,102,102,37,41,154,44,77,102,58,57,102,77,44,44,77,102,
57,58,102,77,44,2,172,71,127,54,100,103,101,39,43,42,38,97,105,96,54,127,
71,71,128,53,100,105,101,37,41,42,38,105,105,102,54,127,73,58,102,76,44,44,
76,102,58,58,102,76,45,45,76,102,0,1,255,254,0,0,4,118,5,129,0,22,0,185,64,
134,151,0,167,0,2,152,17,168,17,2,73,22,1,70,18,1,155,21,171,21,2,74,21,106,
21,122,21,138,21,4,148,19,164,19,2,69,19,101,19,117,19,133,19,4,19,15,18,
31,18,79,18,143,18,4,18,9,21,0,22,16,22,64,22,128,22,4,22,20,4,0,8,92,17,
13,0,9,16,9,64,9,128,9,4,7,9,3,15,81,16,7,11,81,4,47,12,159,12,175,12,3,12,
64,41,45,72,0,12,16,12,32,12,160,12,4,12,20,0,0,16,1,15,16,175,16,2,8,16,
16,8,21,18,3,8,18,0,63,63,51,18,57,47,94,93,113,51,51,222,93,43,113,50,237,
50,16,237,50,1,47,94,93,51,51,253,50,50,57,204,93,50,16,204,93,50,49,48,93,
93,93,93,93,93,93,93,1,33,21,33,21,33,21,33,17,35,17,33,53,33,55,33,53,33,
1,51,9,1,51,2,208,1,65,254,129,1,127,254,129,178,254,131,1,125,2,254,129,
1,64,254,91,199,1,115,1,119,199,2,197,125,154,127,254,209,1,47,127,154,125,
2,188,253,121,2,135,0,2,0,183,254,78,1,93,5,204,0,3,0,7,1,221,64,23,3,7,171,
0,6,4,1,11,4,4,8,9,214,9,230,9,246,9,3,194,9,1,9,184,255,128,179,226,229,
72,9,184,255,192,64,10,222,225,72,2,9,18,9,2,218,9,184,255,128,179,214,217,
72,9,184,255,192,64,20,210,213,72,180,9,196,9,2,162,9,1,1,112,9,128,9,144,
9,3,9,184,255,192,64,20,199,202,72,0,9,1,240,9,1,212,9,228,9,2,176,9,192,
9,2,9,184,255,192,64,43,187,190,72,48,9,64,9,80,9,3,4,9,20,9,36,9,3,240,9,
1,196,9,212,9,228,9,3,128,9,144,9,160,9,3,4,9,20,9,36,9,3,164,9,184,255,192,
179,168,171,72,9,184,255,128,179,160,163,72,9,184,255,192,64,14,156,159,72,
112,9,128,9,144,9,3,228,9,1,9,184,255,192,64,11,145,148,72,176,9,192,9,208,
9,3,9,184,255,192,64,15,133,136,72,48,9,1,20,9,36,9,2,0,9,1,9,184,255,192,
64,15,122,125,72,128,9,1,4,9,20,9,36,9,3,110,9,184,255,192,64,10,114,117,
72,192,9,1,84,9,1,9,184,255,192,182,102,105,72,16,9,1,9,184,255,192,64,9,
91,94,72,80,9,96,9,2,9,184,255,192,64,15,79,82,72,203,9,219,9,2,160,9,176,
9,2,2,9,184,255,192,64,10,68,71,72,15,9,31,9,2,62,9,184,255,192,64,29,56,
61,72,207,9,1,96,9,112,9,160,9,176,9,4,31,9,1,0,9,1,160,9,224,9,240,9,3,9,
184,255,192,64,33,25,28,72,9,64,17,21,72,64,9,112,9,128,9,144,9,4,15,9,31,
9,47,9,3,7,5,0,5,0,1,4,1,0,0,63,47,18,57,57,47,47,1,94,93,93,43,43,113,114,
114,114,114,43,94,93,43,95,93,93,43,113,43,114,43,114,114,43,94,93,93,43,
113,113,113,43,113,43,113,114,43,43,43,94,93,93,93,93,113,113,43,113,113,
113,114,43,114,95,114,114,43,43,94,93,43,43,93,93,17,18,57,47,94,93,51,237,
50,49,48,19,17,51,17,3,17,51,17,183,166,166,166,2,194,3,10,252,246,251,140,
3,11,252,245,0,0,0,0,2,0,115,255,84,4,0,5,204,0,77,0,97,1,79,64,144,117,47,
133,47,2,122,8,138,8,2,100,85,1,43,85,107,85,2,45,81,109,81,2,45,57,109,57,
125,57,141,57,4,85,96,117,96,133,96,3,83,62,115,62,131,62,3,83,90,115,90,
131,90,3,121,80,137,80,2,111,80,1,90,80,1,45,80,1,116,16,132,16,2,54,16,70,
16,2,42,73,1,37,42,1,37,45,1,43,3,1,25,3,1,5,31,21,31,2,5,36,21,36,2,11,76,
27,76,2,14,73,75,34,73,55,144,75,1,75,55,75,55,78,70,29,65,24,6,73,5,5,24,
73,160,78,1,0,78,32,78,64,78,144,78,4,78,184,255,192,179,29,33,72,78,184,
255,192,64,18,21,26,72,78,45,73,44,44,88,73,0,65,32,65,176,65,3,65,184,255,
192,64,68,34,38,72,65,217,55,1,203,55,1,188,55,1,152,55,1,245,3,1,230,3,1,
149,3,1,121,83,1,106,83,1,218,83,1,155,83,1,228,14,244,14,2,166,14,1,119,
14,135,14,2,104,14,1,14,83,93,55,4,0,50,81,45,39,11,81,6,0,0,0,63,50,237,
47,51,237,18,23,57,93,93,93,93,93,93,113,113,93,93,93,93,93,93,93,1,47,43,
93,237,51,47,237,47,43,43,93,113,237,50,16,237,17,18,57,57,17,57,57,47,47,
114,16,237,16,237,49,48,93,93,93,93,93,0,93,93,1,93,0,93,93,93,93,93,93,93,
93,93,93,93,93,1,93,93,93,1,50,30,2,23,7,46,3,35,34,6,21,20,30,2,23,30,3,
21,20,14,2,7,30,3,21,20,14,2,35,34,46,2,39,55,30,3,51,50,62,2,53,52,46,2,
39,46,3,53,52,62,2,55,46,3,53,52,54,1,52,46,2,39,14,3,21,20,30,2,23,62,3,
2,76,79,138,108,73,15,161,8,46,68,84,46,125,129,50,83,109,59,68,139,112,70,
28,55,82,54,49,79,55,30,58,112,164,107,93,154,117,79,19,161,12,54,78,100,
57,58,102,76,45,57,95,123,65,65,131,104,65,32,59,84,53,42,75,57,33,211,1,
225,53,88,113,61,58,89,60,31,49,82,108,60,54,93,68,39,5,204,30,63,98,69,20,
45,58,34,13,79,71,45,64,46,32,14,16,46,73,106,76,45,87,73,55,13,21,51,64,
81,51,73,117,83,44,27,64,104,77,31,55,67,37,13,18,40,65,47,54,72,51,36,16,
15,46,73,105,74,45,83,71,53,15,14,46,64,80,48,139,155,252,203,48,69,51,35,
14,3,33,52,69,39,46,66,48,34,15,1,24,47,70,0,0,0,0,2,0,45,4,195,2,90,5,123,
0,3,0,7,0,193,178,3,133,0,184,255,192,179,19,22,72,0,184,255,192,64,131,13,
16,72,0,7,133,4,64,19,22,72,4,64,14,17,72,4,1,5,145,0,59,4,1,45,4,1,11,4,
27,4,2,57,253,4,1,235,4,1,219,4,1,201,4,1,171,4,187,4,2,153,4,1,141,4,1,1,
4,128,44,48,72,27,4,43,4,2,15,4,1,235,4,251,4,2,191,4,207,4,223,4,3,171,4,
1,159,4,1,123,4,139,4,2,111,4,1,91,4,1,79,4,1,59,4,1,31,4,47,4,2,2,15,4,63,
4,175,4,191,4,4,4,64,22,25,72,4,64,14,17,72,4,0,47,43,43,93,95,113,113,113,
113,113,113,113,113,113,113,114,114,43,95,114,114,114,114,114,114,114,94,
93,93,93,51,237,50,1,47,43,43,237,220,43,43,237,49,48,1,53,51,21,33,53,51,
21,1,183,163,253,211,165,4,195,184,184,184,184,0,0,0,0,3,0,31,255,240,5,197,
5,150,0,25,0,49,0,91,0,245,64,111,138,81,1,10,73,26,73,42,73,3,10,69,26,69,
42,69,3,76,60,1,57,47,73,47,2,54,40,70,40,2,54,36,70,36,2,57,29,73,29,2,138,
90,154,90,2,53,81,69,81,2,58,61,1,133,52,149,52,2,54,46,70,46,2,54,41,70,
41,2,57,35,73,35,2,57,30,73,30,2,50,196,81,61,95,71,111,71,2,71,61,71,61,
14,0,195,0,26,16,26,48,26,64,26,4,16,26,32,26,64,26,3,26,184,255,192,64,68,
15,23,72,26,38,195,111,14,127,14,2,14,60,55,201,66,87,201,76,82,76,15,66,
127,66,2,15,66,31,66,127,66,143,66,159,66,255,66,6,0,76,1,0,76,16,76,112,
76,128,76,144,76,240,76,6,66,76,66,76,7,33,200,21,4,43,200,7,19,0,63,237,
63,237,18,57,57,47,47,93,113,93,113,17,51,16,237,16,237,51,1,47,113,237,47,
43,93,113,237,17,57,57,47,47,93,17,51,237,49,48,0,93,93,93,93,93,93,93,93,
1,93,93,93,93,113,93,93,113,1,20,14,4,35,34,46,4,53,52,62,4,51,50,4,22,18,
7,52,46,4,35,34,14,2,21,20,30,2,51,50,62,4,37,20,30,2,51,50,62,2,55,23,14,
3,35,34,46,2,53,52,62,2,51,50,30,2,23,7,46,3,35,34,14,2,5,197,52,94,131,161,
185,100,99,185,160,133,94,52,52,94,132,161,184,100,150,1,7,197,113,92,45,
82,116,140,161,87,130,228,171,99,99,171,228,130,87,161,140,116,82,45,252,
137,33,67,100,67,49,75,56,39,14,115,22,58,82,111,75,101,149,98,48,48,97,146,
98,75,112,80,55,18,114,12,38,55,72,47,69,99,64,30,2,195,100,185,161,131,94,
52,52,94,131,161,185,100,100,184,161,132,94,52,114,196,254,249,150,86,161,
139,115,82,45,99,171,228,130,131,229,171,98,45,81,115,140,161,89,72,120,86,
48,27,45,55,29,35,43,81,63,38,64,114,158,94,97,157,111,59,36,59,75,39,33,
26,50,38,23,46,83,118,0,2,0,26,2,139,2,253,5,152,0,50,0,65,0,203,64,21,45,
40,10,17,72,46,40,10,17,72,3,40,11,17,72,7,24,11,14,72,29,184,255,216,64,
16,9,17,72,23,51,1,39,39,32,226,47,11,212,56,1,56,184,255,192,64,18,19,22,
72,144,56,1,100,56,116,56,132,56,3,80,56,1,2,56,184,255,192,64,20,10,13,72,
56,20,227,21,21,63,227,5,64,22,38,72,5,192,67,1,67,184,255,192,64,51,13,18,
72,26,57,1,11,57,1,57,228,152,20,1,20,8,10,13,72,20,16,11,1,2,11,1,11,11,
26,35,7,51,1,51,228,0,42,42,0,0,32,0,80,0,3,0,0,17,228,26,222,0,63,237,51,
47,93,51,47,16,237,93,50,17,57,47,93,93,51,43,93,237,93,93,1,43,93,47,43,
237,51,47,237,47,43,95,93,93,93,43,113,51,51,237,50,47,0,93,49,48,1,43,43,
43,43,43,1,34,46,2,53,52,62,2,63,1,53,52,46,2,35,34,6,7,39,62,3,51,50,30,
2,21,17,20,22,51,50,54,55,21,14,1,35,34,46,2,39,35,14,1,39,50,62,2,61,1,7,
14,3,21,20,22,1,4,53,86,62,33,51,86,113,62,178,21,39,56,35,67,81,9,149,7,
43,75,108,71,68,109,77,42,28,35,12,22,9,19,42,22,41,57,38,20,2,4,38,132,51,
48,80,57,32,138,41,74,55,32,58,2,139,29,56,82,52,69,92,56,24,1,4,60,46,60,
35,14,59,76,10,47,82,62,35,29,60,95,66,254,204,58,50,5,3,104,5,8,22,39,51,
29,77,70,111,34,55,71,37,65,4,2,11,29,52,43,56,65,0,0,2,0,83,0,141,4,32,3,
172,0,8,0,17,0,113,64,84,106,12,122,12,138,12,3,106,9,122,9,138,9,3,106,3,
122,3,138,3,3,106,0,122,0,138,0,3,17,236,15,235,14,236,95,10,127,10,143,10,
3,64,10,96,10,2,31,10,1,10,7,236,6,235,5,236,176,1,1,95,1,1,32,1,96,1,128,
1,3,1,9,0,239,12,15,3,47,3,111,3,127,3,4,3,0,47,93,51,228,50,1,47,93,113,
113,237,237,237,47,93,93,113,237,237,237,49,48,93,93,93,93,37,1,53,1,51,21,
9,1,21,33,1,53,1,51,21,9,1,21,3,118,254,174,1,82,168,254,174,1,84,253,131,
254,176,1,80,167,254,177,1,81,141,1,109,63,1,115,31,254,140,254,145,29,1,
109,63,1,115,31,254,140,254,145,29,0,1,0,100,0,180,4,71,2,242,0,5,0,51,64,
19,223,2,1,32,2,1,2,5,170,224,0,1,159,0,1,80,0,1,0,184,255,192,64,9,9,12,
72,0,2,173,0,3,179,0,63,204,237,1,47,43,93,93,93,237,47,93,93,49,48,37,17,
33,53,33,17,3,182,252,174,3,227,180,1,172,146,253,194,0,0,4,0,31,255,240,
5,197,5,150,0,25,0,49,0,63,0,72,0,240,183,4,61,20,61,36,61,3,58,184,255,224,
64,94,11,16,72,57,47,73,47,2,54,40,70,40,2,54,36,70,36,2,57,29,73,29,2,61,
32,9,13,72,54,46,70,46,2,54,41,70,41,2,57,35,73,35,2,57,30,73,30,2,6,69,22,
69,2,51,62,62,69,63,69,53,196,54,64,196,59,59,50,63,63,16,54,63,54,63,14,
0,195,0,26,16,26,48,26,64,26,4,16,26,32,26,64,26,3,26,184,255,192,64,60,15,
23,72,26,38,195,111,14,127,14,2,14,50,50,54,62,52,201,69,9,68,25,68,2,68,
201,55,15,54,31,54,127,54,3,223,55,1,0,55,16,55,112,55,3,54,69,55,55,69,54,
3,7,33,200,21,4,43,200,7,19,0,63,237,63,237,18,23,57,47,47,47,93,113,93,16,
237,93,16,237,50,17,51,47,1,47,113,237,47,43,93,113,237,17,57,57,47,47,56,
17,51,51,47,237,16,237,50,17,18,57,17,51,0,93,49,48,93,93,93,93,43,1,93,93,
93,93,43,93,1,20,14,4,35,34,46,4,53,52,62,4,51,50,4,22,18,7,52,46,4,35,34,
14,2,21,20,30,2,51,50,62,4,1,3,35,17,35,17,33,50,22,21,20,6,7,19,3,52,38,
43,1,17,51,50,54,5,197,52,94,131,161,185,100,99,185,160,133,94,52,52,94,132,
161,184,100,150,1,7,197,113,92,45,82,116,140,161,87,130,228,171,99,99,171,
228,130,87,161,140,116,82,45,254,82,199,161,127,1,51,142,151,104,85,221,159,
95,81,170,182,80,84,2,195,100,185,161,131,94,52,52,94,131,161,185,100,100,
184,161,132,94,52,114,196,254,249,150,86,161,139,115,82,45,99,171,228,130,
131,229,171,98,45,81,115,140,161,254,181,1,80,254,176,3,63,126,111,102,123,
19,254,162,2,80,69,72,254,211,85,0,0,1,255,239,5,172,4,124,6,10,0,3,0,14,
180,1,0,2,140,1,0,47,237,1,47,47,49,48,1,33,53,33,4,124,251,115,4,141,5,172,
94,0,0,0,0,2,0,122,3,92,2,184,5,150,0,19,0,39,0,66,185,0,17,255,232,179,9,
12,72,13,184,255,232,64,33,9,12,72,7,24,9,12,72,3,24,9,12,72,20,172,0,30,
172,0,10,16,10,32,10,3,10,35,175,5,25,175,15,4,0,63,237,220,237,1,47,93,237,
220,237,49,48,0,43,43,43,43,1,20,14,2,35,34,46,2,53,52,62,2,51,50,30,2,7,
52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,2,184,45,78,105,59,59,104,78,46,
46,78,104,59,59,105,78,45,109,27,48,65,38,37,65,48,28,28,48,65,37,38,65,48,
27,4,121,59,104,77,45,45,77,104,59,60,104,77,44,44,77,104,60,37,66,49,28,
28,49,66,37,37,65,49,29,29,49,65,0,0,0,2,0,65,0,0,4,36,4,195,0,11,0,15,0,
85,64,53,13,222,4,1,140,4,1,4,2,14,209,11,1,131,11,1,11,9,1,170,6,32,2,1,
2,13,173,12,151,2,1,2,0,4,173,9,152,7,1,7,239,5,1,80,5,128,5,160,5,208,5,
4,5,0,47,93,93,51,93,51,237,50,50,93,47,237,1,47,93,51,253,50,222,93,93,196,
16,222,93,93,196,49,48,1,17,35,17,33,53,33,17,51,17,33,21,1,53,33,21,2,124,
147,254,88,1,168,147,1,168,252,29,3,227,2,168,254,117,1,139,145,1,138,254,
118,145,253,88,145,145,0,0,1,0,41,2,51,2,131,5,141,0,34,0,142,64,56,6,18,
1,6,17,1,6,12,1,106,31,122,31,138,31,3,89,15,105,15,2,106,14,1,73,14,89,14,
2,10,3,26,3,2,10,2,26,2,58,2,74,2,4,58,17,90,17,106,17,3,6,23,22,23,2,23,
184,255,224,64,40,9,15,72,33,25,225,32,8,1,32,8,96,8,160,8,224,8,4,8,14,224,
15,15,32,191,0,1,0,8,32,14,11,228,20,222,1,32,229,0,223,0,63,237,50,63,237,
51,18,57,1,47,93,51,51,47,237,47,93,113,237,50,49,48,43,0,93,93,1,93,93,0,
93,93,93,93,1,113,113,113,19,39,62,5,53,52,38,35,34,6,7,39,62,3,51,50,30,
2,21,20,14,4,7,33,21,43,2,27,88,100,103,82,52,71,74,68,88,8,133,6,46,76,107,
68,65,103,71,37,54,83,102,95,78,18,1,187,2,51,103,61,96,81,72,73,80,49,62,
75,73,68,8,51,87,64,37,33,60,86,54,62,100,86,75,73,74,42,113,0,0,1,0,27,2,
39,2,130,5,141,0,53,0,150,64,17,102,6,1,102,8,1,86,9,102,9,2,89,34,105,34,
2,42,184,255,232,64,80,11,15,72,2,32,9,13,72,48,45,21,21,15,8,28,225,45,45,
0,225,32,15,96,15,2,32,15,96,15,160,15,224,15,4,15,34,225,8,35,1,35,35,9,
225,191,8,1,8,64,24,37,72,8,49,21,228,22,22,12,105,34,1,72,34,88,34,2,34,
31,228,40,222,12,228,71,9,1,9,3,221,0,63,51,93,237,63,237,51,93,93,18,57,
47,237,57,1,47,43,93,237,51,47,113,237,47,93,113,237,50,47,237,17,18,57,47,
18,57,49,48,0,43,43,93,93,93,93,1,20,6,35,34,46,2,39,55,30,1,51,50,54,53,
52,46,2,43,1,53,51,50,62,2,53,52,38,35,34,6,7,39,62,3,51,50,30,2,21,20,6,
7,21,30,3,2,130,155,142,87,116,73,36,6,136,9,88,85,77,83,37,56,67,29,61,57,
29,61,50,32,74,71,68,84,6,135,7,50,79,102,59,69,104,70,35,86,90,52,75,48,
22,3,27,116,128,39,64,81,43,13,67,69,72,76,45,54,29,9,109,13,31,53,40,60,
69,70,65,12,58,86,57,28,33,59,79,46,75,110,20,2,5,37,54,69,0,0,1,0,72,4,177,
1,240,5,228,0,5,0,55,64,37,70,4,1,122,2,138,2,2,128,3,1,3,64,143,0,1,0,64,
9,13,72,0,2,149,128,15,0,47,0,63,0,127,0,239,0,5,0,0,47,93,26,237,1,47,43,
93,26,205,93,49,48,93,93,19,53,19,51,21,1,72,217,207,254,182,4,177,20,1,31,
29,254,234,0,1,0,140,254,87,4,109,4,58,0,39,0,136,64,74,29,32,9,17,72,138,
37,154,37,2,108,37,124,37,2,37,24,14,17,72,22,22,13,70,64,31,79,12,1,127,
12,143,12,159,12,3,12,64,32,35,72,12,64,20,23,72,0,12,1,12,41,128,39,2,70,
0,1,16,1,48,1,224,1,240,1,5,8,1,96,41,128,41,2,41,184,255,192,64,17,20,23,
72,31,8,80,35,22,19,80,26,22,12,1,15,0,27,0,63,63,51,63,237,63,237,50,1,43,
93,47,94,93,237,50,26,16,220,93,43,43,93,113,50,26,237,50,47,49,48,43,0,93,
93,1,43,19,17,51,17,20,30,2,51,50,54,53,17,51,17,20,30,2,51,50,54,55,21,14,
1,35,34,46,2,39,35,14,1,35,34,38,39,17,140,181,32,58,84,52,128,146,180,11,
20,29,18,11,32,11,26,51,36,54,71,44,20,2,3,52,147,100,67,109,31,254,87,5,
227,253,82,78,106,65,28,174,162,2,115,252,208,44,56,32,13,5,3,129,8,12,30,
52,71,41,95,99,41,38,254,28,0,0,0,0,1,0,80,254,248,3,245,5,129,0,19,0,61,
64,39,12,1,15,2,191,2,207,2,3,2,5,95,6,111,6,127,6,175,6,191,6,5,0,6,16,6,
48,6,3,6,7,7,1,0,4,17,3,6,1,0,47,51,63,205,50,18,57,47,1,47,93,93,205,220,
93,205,47,49,48,1,17,35,17,35,17,35,17,34,46,2,53,52,62,2,51,33,21,3,116,
112,217,113,80,133,96,53,50,95,138,87,2,51,5,27,249,221,6,35,249,221,3,190,
45,88,133,89,84,133,93,50,102,0,0,1,0,187,1,190,1,126,2,154,0,3,0,38,64,24,
3,150,0,0,16,0,176,0,3,7,0,0,155,15,1,31,1,2,1,64,15,38,72,1,0,47,43,93,237,
1,47,94,93,237,49,48,19,53,51,21,187,195,1,190,220,220,0,0,0,1,0,119,254,
78,1,227,0,0,0,27,0,126,64,16,24,32,20,23,72,25,32,20,23,72,70,26,86,26,2,
2,184,255,232,179,9,17,72,27,184,255,224,64,62,9,17,72,24,16,25,32,25,48,
25,3,25,131,23,22,22,8,16,131,47,0,1,31,0,1,15,0,111,0,2,8,0,239,8,1,8,19,
25,64,9,13,72,25,25,5,23,11,140,32,5,80,5,96,5,112,5,176,5,192,5,6,5,0,47,
93,237,47,18,57,47,43,205,1,47,93,221,94,93,113,114,237,18,57,47,51,237,93,
50,49,48,43,43,93,43,43,5,20,14,2,35,34,38,39,53,22,51,50,62,2,53,52,38,35,
42,1,7,55,51,7,30,1,1,227,30,65,104,75,20,45,25,49,37,41,56,35,15,61,72,14,
29,14,65,107,39,94,94,253,41,67,48,25,1,3,98,6,12,21,30,18,37,40,2,182,100,
3,81,0,0,1,0,80,2,51,2,125,5,129,0,10,0,75,64,44,32,5,48,5,2,96,9,1,9,9,8,
224,2,32,4,48,4,2,4,111,0,1,0,0,4,6,3,32,2,144,2,2,2,5,4,4,3,6,220,8,1,228,
0,223,0,63,237,50,63,51,51,47,51,1,47,93,23,51,47,93,47,0,93,1,16,237,50,
47,93,49,48,0,93,19,53,51,17,7,53,55,51,17,51,21,80,211,202,210,123,215,2,
51,107,2,108,138,120,137,253,29,107,0,0,0,0,2,0,27,2,139,2,211,5,152,0,15,
0,35,0,130,185,0,13,255,232,179,7,12,72,9,184,255,224,64,43,7,12,72,4,32,
7,12,72,2,32,7,12,72,0,227,4,16,36,16,52,16,100,16,4,148,16,180,16,196,16,
212,16,244,16,5,128,16,1,2,0,16,1,16,184,255,192,64,38,12,16,72,16,26,227,
6,64,22,33,72,6,239,37,1,112,37,128,37,2,47,37,1,31,228,0,3,32,3,80,3,3,3,
3,21,228,11,222,0,63,237,51,47,93,237,1,93,93,93,47,43,237,47,43,93,95,93,
93,113,237,49,48,0,43,43,43,43,1,20,6,35,34,38,53,52,62,2,51,50,30,2,7,52,
46,2,35,34,14,2,21,20,30,2,51,50,62,2,2,211,176,175,168,177,43,87,131,88,
93,131,84,39,149,25,50,72,48,48,75,51,26,28,51,70,43,49,75,52,27,4,18,188,
203,201,190,91,145,101,53,53,100,145,92,83,110,65,27,27,66,110,82,84,110,
66,26,26,66,110,0,2,0,83,0,141,4,32,3,172,0,8,0,17,0,133,64,100,101,15,117,
15,133,15,3,101,9,117,9,133,9,3,101,6,117,6,133,6,3,101,0,117,0,133,0,3,13,
236,10,236,17,235,15,12,1,239,12,1,112,12,128,12,2,208,12,1,63,12,111,12,
127,12,3,0,12,1,12,4,236,1,236,8,235,112,3,128,3,176,3,3,176,3,208,3,2,63,
3,1,0,3,32,3,2,3,10,0,239,14,15,5,47,5,111,5,127,5,4,5,0,47,93,51,228,50,
1,47,93,93,93,113,253,237,237,47,93,93,93,113,113,114,253,237,237,49,48,93,
93,93,93,37,35,53,9,1,53,51,1,21,1,35,53,9,1,53,51,1,21,2,206,168,1,82,254,
176,166,1,82,252,221,170,1,82,254,176,168,1,79,141,29,1,111,1,116,31,254,
141,63,254,147,29,1,111,1,116,31,254,141,63,255,255,0,56,0,0,6,78,5,129,16,
38,0,121,232,0,16,39,2,20,2,249,0,0,17,7,2,141,3,184,253,207,0,31,64,18,1,
191,12,1,112,12,1,96,12,1,16,12,1,12,3,2,17,24,0,63,53,53,1,17,93,93,93,93,
53,0,0,0,255,255,0,56,0,0,6,117,5,129,16,38,0,121,232,0,16,39,2,20,2,249,
0,0,17,7,0,114,3,242,253,207,0,47,64,30,2,111,15,1,47,15,1,15,1,191,12,1,
112,12,1,96,12,1,16,12,1,12,51,64,11,11,72,2,15,24,0,63,53,1,43,17,93,93,
93,93,53,17,93,93,53,0,0,0,255,255,0,73,0,0,6,78,5,141,16,39,2,20,3,13,0,
0,16,39,2,141,3,184,253,207,17,6,0,115,46,0,0,33,64,20,0,112,0,1,96,0,1,16,
0,1,0,83,64,11,11,72,1,2,6,24,0,63,53,53,1,43,17,93,93,93,53,0,0,2,0,131,
254,164,4,86,4,58,0,37,0,41,0,159,64,112,121,4,137,4,2,122,35,138,35,2,122,
36,138,36,2,84,26,100,26,2,58,6,74,6,122,6,138,6,4,10,72,9,9,176,39,192,39,
2,39,150,40,40,0,28,70,95,27,127,27,2,27,64,29,60,72,27,64,23,27,72,32,27,
1,27,19,70,0,64,29,60,72,0,64,23,27,72,0,64,13,17,72,32,0,1,0,32,43,1,19,
33,9,40,156,41,15,67,27,1,27,24,95,47,33,63,33,2,111,33,207,33,2,33,0,47,
93,113,237,51,93,63,253,206,17,57,1,93,47,93,43,43,43,237,47,93,43,43,93,
237,18,57,47,237,113,51,47,237,49,48,93,0,93,1,93,0,93,1,93,55,52,62,6,55,
51,14,7,21,20,30,2,51,50,54,55,23,14,3,35,34,46,2,1,21,35,53,131,37,62,79,
82,79,63,39,1,175,2,39,62,78,80,77,60,37,42,77,109,67,140,164,14,184,11,67,
121,179,122,114,178,123,64,2,113,195,50,71,108,85,67,60,58,68,83,55,69,104,
80,63,57,57,70,88,59,59,92,63,32,140,122,12,84,149,112,65,56,103,147,4,100,
201,201,0,0,0,255,255,0,4,0,0,5,82,6,240,18,38,0,36,0,0,17,7,2,148,1,78,0,
0,0,21,180,2,21,5,38,2,184,255,225,180,22,25,4,7,37,1,43,53,0,43,53,0,255,
255,0,4,0,0,5,82,6,240,18,38,0,36,0,0,17,7,2,149,1,219,0,0,0,19,64,11,2,21,
5,38,2,76,21,24,4,7,37,1,43,53,0,43,53,0,0,0,255,255,0,4,0,0,5,82,6,254,18,
38,0,36,0,0,17,7,2,150,1,96,0,0,0,19,64,11,2,22,5,38,2,0,27,21,4,7,37,1,43,
53,0,43,53,0,0,0,255,255,0,4,0,0,5,82,7,6,18,38,0,36,0,0,17,7,2,153,1,94,
0,0,0,19,64,11,2,21,5,38,2,2,30,44,4,7,37,1,43,53,0,43,53,0,0,0,255,255,0,
4,0,0,5,82,6,178,18,38,0,36,0,0,17,7,2,152,1,108,0,0,0,23,64,13,3,2,21,5,
38,3,2,4,25,23,4,7,37,1,43,53,53,0,43,53,53,0,0,0,255,255,0,4,0,0,5,82,6,
251,18,38,0,36,0,0,17,7,1,76,1,137,0,136,0,22,64,12,3,2,56,3,3,2,3,31,21,
4,7,37,1,43,53,53,0,63,53,53,0,2,0,24,0,0,7,168,5,129,0,15,0,26,0,136,64,
86,116,25,1,114,2,1,86,2,102,2,2,115,3,131,3,2,85,3,101,3,2,127,5,143,5,2,
109,5,1,92,5,1,25,5,41,5,2,0,7,1,11,7,11,7,0,16,14,32,14,2,14,2,25,3,17,3,
4,17,9,13,90,26,5,0,2,95,25,25,5,4,12,95,9,9,13,16,8,95,5,3,4,18,13,95,0,
18,0,63,237,63,63,237,50,18,57,47,237,17,18,57,47,237,1,47,51,51,237,50,51,
47,51,17,18,57,57,47,93,18,57,57,47,47,113,49,48,93,93,93,93,93,93,93,93,
93,33,17,33,3,35,1,33,21,33,17,33,21,33,17,33,21,1,35,14,5,7,3,33,3,201,253,
220,198,199,2,174,4,185,253,9,2,187,253,69,3,32,252,33,151,1,16,22,27,24,
18,2,217,1,222,1,156,254,100,5,129,156,254,60,154,254,21,156,4,238,3,35,50,
58,51,38,5,254,51,0,0,255,255,0,104,254,78,5,121,5,150,18,38,0,38,0,0,17,
7,0,120,1,254,0,0,0,11,182,1,58,48,40,26,16,37,1,43,53,0,0,0,255,255,0,168,
0,0,4,254,6,240,18,38,0,40,0,0,17,7,2,148,1,63,0,0,0,21,180,1,12,5,38,1,184,
255,170,180,13,16,0,10,37,1,43,53,0,43,53,0,255,255,0,168,0,0,4,254,6,240,
18,38,0,40,0,0,17,7,2,149,1,223,0,0,0,19,64,11,1,12,5,38,1,40,12,15,0,10,
37,1,43,53,0,43,53,0,0,0,255,255,0,168,0,0,4,254,6,254,18,38,0,40,0,0,17,
7,2,150,1,119,0,0,0,21,180,1,13,5,38,1,184,255,239,180,18,12,0,10,37,1,43,
53,0,43,53,0,255,255,0,168,0,0,4,254,6,178,18,38,0,40,0,0,17,7,2,152,1,121,
0,0,0,25,182,2,1,12,5,38,2,1,184,255,234,180,16,14,0,10,37,1,43,53,53,0,43,
53,53,0,255,255,0,9,0,0,1,177,6,240,18,38,0,44,0,0,17,6,2,148,159,0,0,21,
180,1,4,5,38,1,184,255,193,180,5,8,0,2,37,1,43,53,0,43,53,0,0,0,255,255,0,
142,0,0,2,54,6,240,18,38,0,44,0,0,17,6,2,149,70,0,0,19,64,11,1,4,5,38,1,69,
4,7,0,2,37,1,43,53,0,43,53,0,255,255,255,210,0,0,2,104,6,254,18,38,0,44,0,
0,17,6,2,150,210,0,0,19,64,11,1,5,5,38,1,0,10,4,0,2,37,1,43,53,0,43,53,0,
255,255,0,7,0,0,2,52,6,178,18,38,0,44,0,0,17,6,2,152,218,0,0,23,64,13,2,1,
4,5,38,2,1,1,8,6,0,2,37,1,43,53,53,0,43,53,53,0,0,2,0,14,0,0,5,101,5,129,
0,16,0,33,0,112,64,69,117,10,1,91,32,139,32,2,91,31,139,31,2,90,20,138,20,
2,91,19,1,10,31,26,31,2,10,20,26,20,2,26,26,28,8,90,64,15,17,1,17,35,128,
24,28,90,14,16,16,1,14,27,16,95,24,127,0,1,0,0,2,28,95,14,18,23,95,2,3,0,
63,237,63,237,17,57,47,113,51,237,50,1,47,51,51,47,16,237,50,26,16,220,113,
26,237,18,57,47,49,48,93,93,93,0,93,1,93,93,0,93,19,51,17,33,50,4,22,18,21,
20,2,14,1,35,33,17,35,37,52,46,2,35,33,17,33,21,33,17,33,50,62,2,14,154,1,
210,163,1,19,198,111,106,184,251,145,253,241,154,4,151,82,148,206,123,254,
241,1,150,254,106,1,58,111,189,138,78,3,33,2,96,81,169,254,252,180,176,254,
243,181,93,2,135,72,143,203,130,61,254,57,154,254,18,72,142,212,0,255,255,
0,168,0,0,5,32,7,6,18,38,0,49,0,0,17,7,2,153,1,161,0,0,0,19,64,11,1,20,5,
38,1,12,29,43,8,18,37,1,43,53,0,43,53,0,0,0,255,255,0,97,255,236,5,215,6,
240,18,38,0,50,0,0,17,7,2,148,1,182,0,0,0,21,180,2,40,5,38,2,184,255,216,
180,41,44,10,0,37,1,43,53,0,43,53,0,255,255,0,97,255,236,5,215,6,240,18,38,
0,50,0,0,17,7,2,149,2,37,0,0,0,19,64,11,2,40,5,38,2,37,40,43,10,0,37,1,43,
53,0,43,53,0,0,0,255,255,0,97,255,236,5,215,6,254,18,38,0,50,0,0,17,7,2,150,
1,213,0,0,0,19,64,11,2,41,5,38,2,4,46,40,10,0,37,1,43,53,0,43,53,0,0,0,255,
255,0,97,255,236,5,215,7,6,18,38,0,50,0,0,17,7,2,153,1,193,0,0,0,21,180,2,
40,5,38,2,184,255,245,180,49,63,10,0,37,1,43,53,0,43,53,0,255,255,0,97,255,
236,5,215,6,178,18,38,0,50,0,0,17,7,2,152,1,215,0,0,0,25,182,3,2,40,5,38,
3,2,184,255,255,180,44,42,10,0,37,1,43,53,53,0,43,53,53,0,0,1,0,142,0,225,
4,31,4,115,0,11,0,129,185,0,5,255,232,179,18,22,72,3,184,255,232,64,14,18,
22,72,11,24,18,22,72,9,24,18,22,72,8,184,255,232,179,18,22,72,6,184,255,232,
64,14,18,22,72,2,24,18,22,72,0,24,18,22,72,7,184,255,232,64,14,18,22,72,1,
24,18,22,72,10,24,18,22,72,4,184,255,232,64,23,18,22,72,212,4,228,4,2,180,
4,196,4,212,4,3,32,4,1,4,0,7,1,7,0,25,47,113,1,47,93,93,113,49,48,0,43,43,
1,43,43,43,43,43,43,0,43,43,43,43,19,9,1,55,9,1,23,9,1,7,9,1,142,1,98,254,
160,104,1,94,1,94,105,254,162,1,96,102,254,159,254,156,1,74,1,98,1,96,103,
254,159,1,95,105,254,164,254,160,105,1,97,254,157,0,3,0,71,255,203,5,244,
5,186,0,27,0,39,0,51,0,196,64,141,89,44,1,8,37,1,84,33,1,5,26,21,26,101,26,
3,139,23,1,123,22,139,22,2,108,22,1,90,22,1,105,16,1,10,12,26,12,2,132,9,
1,116,8,132,8,2,99,8,1,85,8,1,27,50,91,50,2,114,43,130,43,2,84,43,1,20,38,
84,38,2,85,37,1,140,31,1,74,31,90,31,122,31,3,4,21,20,21,100,21,3,11,7,27,
7,107,7,3,32,44,40,0,91,64,15,28,1,28,53,128,32,53,1,40,91,175,14,191,14,
2,32,14,1,15,14,31,14,2,14,43,31,35,47,95,23,19,4,35,95,9,5,19,0,63,51,237,
63,51,237,17,57,57,1,47,93,93,93,237,93,26,16,220,113,26,237,18,57,57,49,
48,0,93,93,93,93,93,93,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93,93,
93,1,20,2,6,4,35,34,38,39,7,35,55,38,2,53,52,18,54,36,51,50,22,23,55,51,7,
22,18,7,52,38,39,1,30,1,51,50,62,2,37,20,22,23,1,46,1,35,34,14,2,5,215,95,
180,254,252,165,127,206,81,120,190,200,88,86,92,178,1,5,169,125,207,82,121,
192,201,85,87,195,49,49,253,59,59,150,93,132,191,123,59,252,15,50,51,2,195,
59,151,92,126,190,127,63,2,199,165,254,242,192,104,58,54,145,241,97,1,10,
160,165,1,10,187,101,56,54,146,242,94,254,253,160,112,184,72,252,171,44,47,
86,153,212,125,113,190,75,3,85,42,46,80,148,208,0,0,255,255,0,158,255,236,
5,41,6,240,18,38,0,56,0,0,17,7,2,148,1,141,0,0,0,21,180,1,26,5,38,1,184,255,
232,180,27,30,5,20,37,1,43,53,0,43,53,0,255,255,0,158,255,236,5,41,6,240,
18,38,0,56,0,0,17,7,2,149,1,237,0,0,0,19,64,11,1,26,5,38,1,37,26,29,5,20,
37,1,43,53,0,43,53,0,0,0,255,255,0,158,255,236,5,41,6,254,18,38,0,56,0,0,
17,7,2,150,1,152,0,0,0,19,64,11,1,27,5,38,1,0,32,26,5,20,37,1,43,53,0,43,
53,0,0,0,255,255,0,158,255,236,5,41,6,178,18,38,0,56,0,0,17,7,2,152,1,158,
0,0,0,25,182,2,1,26,5,38,2,1,184,255,254,180,30,28,5,20,37,1,43,53,53,0,43,
53,53,0,255,255,0,45,0,0,5,41,6,240,18,38,0,60,0,0,17,7,2,149,1,208,0,0,0,
19,64,11,1,9,5,38,1,65,9,12,4,8,37,1,43,53,0,43,53,0,0,0,0,2,0,168,0,0,4,
234,5,129,0,16,0,27,0,95,64,63,150,15,1,116,26,132,26,2,123,18,139,18,2,0,
90,16,17,48,17,144,17,3,255,17,1,0,17,16,17,32,17,64,17,4,17,22,11,7,90,0,
8,16,8,64,8,3,7,8,22,95,6,21,95,11,6,11,6,11,7,9,3,7,18,0,63,63,18,57,57,
47,47,16,237,16,237,1,47,94,93,237,50,50,47,93,93,113,237,49,48,0,93,93,93,
1,20,14,2,35,33,17,35,17,51,21,33,50,30,2,7,52,38,35,33,17,33,50,62,2,4,234,
59,121,182,123,254,98,191,191,1,146,125,186,124,62,192,164,164,254,133,1,
131,82,121,79,38,2,223,88,159,120,71,254,215,5,129,252,60,111,156,99,134,
149,253,192,44,79,107,0,0,0,0,1,0,142,255,236,4,143,5,204,0,67,0,214,64,150,
149,51,1,133,63,149,63,2,133,47,149,47,2,133,46,149,46,2,118,65,1,118,56,
1,83,26,131,26,147,26,3,92,39,108,39,124,39,3,107,22,1,58,22,1,145,52,1,21,
52,37,52,2,22,66,38,66,118,66,3,26,3,42,3,2,61,72,24,54,72,31,32,24,1,31,
31,1,9,24,31,31,24,9,3,43,0,72,64,48,17,160,17,2,160,17,176,17,2,17,69,128,
42,70,0,43,16,43,48,43,3,8,43,112,69,1,63,69,79,69,2,212,31,1,197,31,1,182,
31,1,219,17,1,202,17,1,185,17,1,31,17,5,36,80,49,0,43,21,14,80,5,22,0,63,
237,63,63,237,18,57,57,93,93,93,93,93,93,1,93,93,47,94,93,237,26,16,220,93,
113,26,237,18,23,57,47,47,47,93,93,16,237,16,237,49,48,0,93,1,93,93,93,93,
93,0,93,93,1,93,93,0,93,93,93,93,1,20,14,2,35,34,38,47,1,30,3,51,50,54,53,
52,46,4,53,52,62,4,53,52,46,2,35,34,14,2,21,17,35,17,52,62,2,51,50,30,2,21,
20,14,4,21,20,30,4,4,143,41,87,136,94,80,148,55,2,25,67,74,78,37,92,98,54,
81,95,81,54,33,49,58,49,33,33,63,90,57,68,107,73,39,180,63,120,174,110,102,
155,105,53,33,51,58,51,33,55,82,95,82,55,1,39,66,115,85,49,25,24,164,14,25,
19,11,86,79,56,77,62,57,73,98,73,51,73,58,48,52,63,43,37,62,45,26,35,77,122,
88,252,3,4,3,118,173,112,54,46,80,109,62,61,90,69,53,47,48,28,38,59,57,64,
85,114,0,0,0,255,255,0,87,255,236,4,115,5,228,18,38,0,68,0,0,17,7,0,67,0,
188,0,0,0,21,180,2,66,17,38,2,184,255,149,180,67,70,3,36,37,1,43,53,0,43,
53,0,255,255,0,87,255,236,4,115,5,228,18,38,0,68,0,0,17,7,0,116,1,84,0,0,
0,19,64,11,2,66,17,38,2,11,66,69,3,36,37,1,43,53,0,43,53,0,0,0,255,255,0,
87,255,236,4,115,5,211,18,38,0,68,0,0,17,7,1,71,0,218,0,0,0,21,180,2,67,17,
38,2,184,255,192,180,72,66,3,36,37,1,43,53,0,43,53,0,255,255,0,87,255,236,
4,115,5,189,18,38,0,68,0,0,17,7,1,78,0,245,0,0,0,21,180,2,66,17,38,2,184,
255,224,180,75,89,3,36,37,1,43,53,0,43,53,0,255,255,0,87,255,236,4,115,5,
123,18,38,0,68,0,0,17,7,0,105,0,235,0,0,0,25,182,3,2,66,17,38,3,2,184,255,
202,180,70,68,3,36,37,1,43,53,53,0,43,53,53,0,255,255,0,87,255,236,4,115,
6,115,18,38,0,68,0,0,17,7,1,76,1,8,0,0,0,25,182,3,2,71,17,38,3,2,184,255,
200,180,76,66,3,36,37,1,43,53,53,0,43,53,53,0,0,3,0,66,255,236,6,194,4,78,
0,62,0,79,0,88,0,251,64,96,134,54,1,122,36,1,123,58,1,117,8,133,8,2,101,68,
117,68,133,68,3,124,86,1,106,86,1,126,81,1,106,81,1,101,4,117,4,2,41,47,1,
41,44,1,24,40,9,13,72,10,28,26,28,2,17,53,88,1,70,33,31,79,79,79,95,79,127,
79,4,79,79,80,25,9,73,10,10,61,71,64,31,80,47,80,63,80,3,144,80,1,80,90,128,
44,71,45,184,255,192,64,19,21,28,72,45,45,71,71,25,64,12,15,72,25,62,80,80,
80,6,53,184,255,184,64,43,17,73,53,83,80,56,16,63,81,33,33,74,50,143,44,1,
43,44,1,44,44,39,80,50,16,17,74,80,22,22,6,80,15,239,9,1,128,9,1,9,9,15,22,
0,63,51,47,93,93,16,237,63,237,50,63,237,51,47,93,93,17,18,57,47,237,63,237,
50,43,18,57,47,237,1,47,43,237,51,47,43,237,26,16,220,93,113,26,237,50,47,
237,17,18,57,47,93,51,237,50,57,57,49,48,93,43,0,93,93,1,93,0,93,93,93,93,
1,93,0,93,1,93,0,93,93,1,21,30,3,51,50,54,55,23,14,3,35,32,3,14,3,35,34,38,
53,52,62,4,63,1,53,52,46,2,35,34,14,2,7,39,62,3,51,50,22,23,62,1,51,50,30,
2,29,1,37,7,14,5,21,20,22,51,50,62,2,53,37,46,1,35,34,14,2,7,3,200,1,34,70,
109,78,117,141,25,158,17,61,102,153,108,254,191,102,29,74,102,137,93,167,
169,38,67,91,107,117,60,240,26,57,88,61,54,88,64,39,7,188,10,58,105,159,112,
128,172,49,63,177,106,136,183,111,47,252,80,195,40,81,76,66,49,28,100,93,
90,129,83,40,2,246,15,144,135,45,96,81,54,4,1,247,17,82,136,98,55,94,72,45,
45,91,73,47,1,1,51,93,71,42,172,150,71,108,78,51,32,13,1,4,59,67,94,58,27,
15,39,67,51,17,64,107,78,43,70,69,74,65,88,155,210,122,24,31,4,1,6,18,31,
51,73,51,87,97,63,98,116,53,196,171,157,29,74,127,98,255,255,0,87,254,78,
3,202,4,78,18,38,0,70,0,0,17,7,0,120,1,12,0,0,0,11,182,1,40,48,40,19,9,37,
1,43,53,0,0,0,255,255,0,87,255,236,4,24,5,228,18,38,0,72,0,0,17,7,0,67,0,
221,0,0,0,21,180,2,38,17,38,2,184,255,228,180,39,42,17,27,37,1,43,53,0,43,
53,0,255,255,0,87,255,236,4,24,5,228,18,38,0,72,0,0,17,7,0,116,1,112,0,0,
0,19,64,11,2,38,17,38,2,84,38,41,17,27,37,1,43,53,0,43,53,0,0,0,255,255,0,
87,255,236,4,24,5,211,18,38,0,72,0,0,17,7,1,71,0,245,0,0,0,19,64,11,2,39,
17,38,2,8,44,38,17,27,37,1,43,53,0,43,53,0,0,0,255,255,0,87,255,236,4,24,
5,123,18,38,0,72,0,0,17,7,0,105,0,248,0,0,0,23,64,13,3,2,38,17,38,3,2,4,42,
40,17,27,37,1,43,53,53,0,43,53,53,0,0,0,255,255,0,10,0,0,1,178,5,228,18,38,
0,241,0,0,17,6,0,67,160,0,0,21,180,1,4,17,38,1,184,255,194,180,5,8,0,2,37,
1,43,53,0,43,53,0,0,0,255,255,0,135,0,0,2,47,5,228,18,38,0,241,0,0,17,6,0,
116,63,0,0,19,64,11,1,4,17,38,1,63,4,7,0,2,37,1,43,53,0,43,53,0,255,255,255,
211,0,0,2,105,5,211,18,38,0,241,0,0,17,6,1,71,211,0,0,19,64,11,1,5,17,38,
1,2,10,4,0,2,37,1,43,53,0,43,53,0,255,255,0,8,0,0,2,53,5,123,18,38,0,241,
0,0,17,6,0,105,219,0,0,23,64,13,2,1,4,17,38,2,1,2,8,6,0,2,37,1,43,53,53,0,
43,53,53,0,0,2,0,86,255,236,4,39,5,234,0,39,0,57,0,190,64,94,100,51,1,100,
56,1,107,42,1,107,48,1,10,14,26,14,2,37,17,53,17,69,17,3,6,8,22,8,2,23,26,
29,3,50,15,28,31,28,2,28,28,50,35,71,40,64,19,16,13,3,40,17,64,14,19,72,22,
5,17,17,5,144,40,1,144,40,160,40,2,40,59,128,50,71,31,5,1,5,26,19,29,16,4,
17,27,27,22,45,80,13,80,10,1,10,184,255,192,64,28,7,10,72,82,17,1,36,17,52,
17,68,17,3,2,17,18,17,2,10,17,10,17,22,0,53,80,0,22,0,63,237,63,57,57,47,
47,93,93,93,43,93,51,237,17,51,47,18,23,57,1,47,93,237,26,16,204,93,113,17,
57,47,18,57,43,18,23,57,26,16,237,17,57,47,93,18,23,57,49,48,0,93,93,1,93,
0,93,93,93,93,5,34,46,2,53,52,62,2,51,50,22,23,46,1,39,5,53,55,46,1,39,51,
30,1,23,37,15,1,30,3,29,1,20,14,2,19,52,46,2,35,34,14,2,21,20,22,51,50,62,
2,2,54,125,181,118,56,52,116,186,133,71,117,43,43,115,76,254,211,218,56,120,
66,209,45,83,42,1,50,1,211,81,129,88,47,57,120,188,176,33,71,113,80,81,115,
73,33,144,145,81,118,75,36,20,73,132,185,111,107,182,134,75,32,27,86,176,
69,133,114,94,45,78,35,20,51,31,132,112,92,74,176,200,223,121,6,122,196,138,
74,1,245,94,137,90,44,45,92,137,91,190,178,44,90,139,0,255,255,0,140,0,0,
3,242,5,189,18,38,0,81,4,0,17,7,1,78,0,245,0,0,0,19,64,11,1,38,17,38,1,5,
47,61,19,36,37,1,43,53,0,43,53,0,0,0,255,255,0,86,255,236,4,29,5,228,18,38,
0,82,0,0,17,7,0,67,0,223,0,0,0,21,180,2,35,17,38,2,184,255,228,180,36,39,
8,0,37,1,43,53,0,43,53,0,255,255,0,86,255,236,4,29,5,228,18,38,0,82,0,0,17,
7,0,116,1,103,0,0,0,19,64,11,2,35,17,38,2,73,35,38,8,0,37,1,43,53,0,43,53,
0,0,0,255,255,0,86,255,236,4,29,5,211,18,38,0,82,0,0,17,7,1,71,0,240,0,0,
0,19,64,11,2,36,17,38,2,1,41,35,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,86,
255,236,4,29,5,189,18,38,0,82,0,0,17,7,1,78,0,247,0,0,0,19,64,11,2,35,17,
38,2,13,44,58,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,86,255,236,4,29,5,123,
18,38,0,82,0,0,17,7,0,105,0,250,0,0,0,23,64,13,3,2,35,17,38,3,2,4,39,37,8,
0,37,1,43,53,53,0,43,53,53,0,0,0,0,3,0,65,0,223,4,36,4,117,0,3,0,7,0,11,0,
75,64,48,3,11,171,0,8,8,4,128,6,160,6,2,95,6,1,32,6,1,6,63,4,95,4,111,4,3,
4,9,174,64,8,144,8,2,8,4,173,5,0,174,79,1,159,1,2,1,5,179,0,63,222,93,237,
16,253,222,93,237,1,47,93,47,93,93,93,18,57,47,51,237,50,49,48,1,53,51,21,
1,53,33,21,1,53,51,21,1,222,168,253,187,3,227,253,186,168,3,190,183,183,254,
162,146,146,254,127,183,183,0,0,3,0,44,255,218,4,180,4,92,0,22,0,34,0,45,
0,161,64,93,117,33,133,33,2,117,27,133,27,2,122,38,138,38,2,122,44,138,44,
2,150,16,1,66,16,1,77,5,1,68,21,1,75,10,1,27,38,35,0,71,64,15,23,207,23,2,
159,23,175,23,255,23,3,23,47,128,35,71,0,12,1,0,12,16,12,32,12,64,12,240,
12,5,7,12,144,47,160,47,240,47,3,224,47,1,223,47,1,0,47,32,47,2,47,184,255,
192,64,16,13,21,72,37,26,30,41,80,18,14,16,30,80,7,3,22,0,63,51,237,63,51,
237,17,57,57,1,43,93,93,93,113,47,94,93,113,237,26,16,220,93,113,26,237,18,
57,57,49,48,93,93,0,93,93,93,93,1,93,93,0,93,1,16,2,35,34,38,39,7,35,55,46,
1,53,16,33,50,22,23,55,51,7,30,1,7,52,38,39,1,30,1,51,50,62,2,37,20,23,1,
46,1,35,34,14,2,4,88,250,238,97,156,60,100,167,184,41,42,1,229,103,156,57,
91,167,173,42,39,189,12,11,254,29,38,105,62,69,112,78,42,253,179,24,1,226,
37,104,66,69,111,78,41,2,30,254,228,254,234,48,50,116,214,68,182,116,2,48,
46,45,105,201,69,185,119,68,109,44,253,206,49,39,39,98,166,126,130,85,2,49,
45,36,41,99,164,0,255,255,0,139,255,236,3,241,5,228,18,38,0,88,6,0,17,7,0,
67,0,236,0,0,0,21,180,1,38,17,38,1,184,255,236,180,39,42,36,19,37,1,43,53,
0,43,53,0,255,255,0,139,255,236,3,241,5,228,18,38,0,88,6,0,17,7,0,116,1,87,
0,0,0,19,64,11,1,38,17,38,1,53,38,41,36,19,37,1,43,53,0,43,53,0,0,0,255,255,
0,139,255,236,3,241,5,211,18,38,0,88,6,0,17,7,1,71,0,239,0,0,0,21,180,1,39,
17,38,1,184,255,252,180,44,38,36,19,37,1,43,53,0,43,53,0,255,255,0,139,255,
236,3,241,5,123,18,38,0,88,6,0,17,7,0,105,0,237,0,0,0,25,182,2,1,38,17,38,
2,1,184,255,243,180,42,40,36,19,37,1,43,53,53,0,43,53,53,0,255,255,0,5,254,
87,3,252,5,228,18,38,0,92,0,0,17,7,0,116,1,27,0,0,0,19,64,11,1,32,17,38,1,
54,32,35,17,31,37,1,43,53,0,43,53,0,0,0,0,2,0,138,254,87,4,29,5,204,0,34,
0,54,0,109,64,76,102,52,118,52,2,105,38,121,38,2,73,25,89,25,2,70,10,86,10,
2,25,21,41,21,137,21,153,21,4,22,15,38,15,134,15,150,15,4,18,71,64,160,35,
1,35,56,128,45,7,33,70,0,34,16,34,48,34,240,34,4,8,34,33,27,26,50,80,23,22,
7,40,80,13,16,0,0,0,63,63,237,50,63,237,50,63,1,47,94,93,237,50,50,26,16,
220,93,26,237,49,48,0,93,93,93,93,93,93,19,51,17,20,6,7,6,7,51,62,3,51,50,
30,2,21,20,14,2,35,34,38,39,35,30,3,21,17,35,1,52,46,2,35,34,14,2,21,20,30,
2,51,50,62,2,138,180,1,1,1,1,6,25,64,82,101,63,112,153,93,40,40,93,153,112,
116,174,46,5,1,1,1,1,180,2,214,24,59,98,74,60,106,79,46,38,73,108,70,75,99,
59,24,5,204,254,89,30,55,21,25,22,52,73,47,21,80,145,205,125,123,208,150,
85,88,100,2,32,48,59,29,254,89,3,199,100,156,108,56,34,96,169,135,115,159,
98,43,58,110,159,255,255,0,5,254,87,3,252,5,123,18,38,0,92,0,0,17,7,0,105,
0,187,0,0,0,25,182,2,1,32,17,38,2,1,184,255,254,180,36,34,17,31,37,1,43,53,
53,0,43,53,53,0,255,255,0,4,0,0,5,82,6,161,18,38,0,36,0,0,17,7,1,73,1,104,
1,78,0,19,64,11,2,21,5,38,2,2,22,21,4,7,37,1,43,53,0,43,53,0,0,0,255,255,
0,87,255,236,4,115,5,83,18,38,0,68,0,0,17,7,1,73,0,233,0,0,0,21,180,2,66,
17,38,2,184,255,202,180,67,66,3,36,37,1,43,53,0,43,53,0,255,255,0,4,0,0,5,
82,6,243,18,38,0,36,0,0,17,7,2,155,1,121,0,0,0,19,64,11,2,21,5,38,2,3,26,
34,4,7,37,1,43,53,0,43,53,0,0,0,255,255,0,87,255,236,4,115,5,230,18,38,0,
68,0,0,17,7,1,74,1,7,0,0,0,21,180,2,66,17,38,2,184,255,204,180,71,83,3,36,
37,1,43,53,0,43,53,0,255,255,0,4,254,96,5,99,5,129,18,38,0,36,0,0,17,7,1,
77,3,181,0,11,0,13,185,0,2,255,207,180,33,33,7,7,37,43,53,0,255,255,0,87,
254,85,4,115,4,78,18,38,0,68,0,0,17,7,1,77,2,197,0,0,0,13,185,0,2,255,194,
180,78,78,36,36,37,43,53,0,255,255,0,104,255,236,5,121,6,240,18,38,0,38,0,
0,17,7,2,149,2,83,0,0,0,19,64,11,1,40,5,38,1,126,40,43,26,16,37,1,43,53,0,
43,53,0,0,0,255,255,0,87,255,236,3,202,5,228,18,38,0,70,0,0,17,7,0,116,1,
103,0,0,0,19,64,11,1,40,17,38,1,114,40,43,19,9,37,1,43,53,0,43,53,0,0,0,255,
255,0,104,255,236,5,121,6,254,18,38,0,38,0,0,17,7,2,150,1,204,0,0,0,19,64,
11,1,41,5,38,1,38,46,40,26,16,37,1,43,53,0,43,53,0,0,0,255,255,0,87,255,236,
3,202,5,211,18,38,0,70,0,0,17,7,1,71,0,208,0,0,0,19,64,11,1,41,17,38,1,10,
46,40,19,9,37,1,43,53,0,43,53,0,0,0,255,255,0,104,255,236,5,121,6,241,18,
38,0,38,0,0,17,7,1,75,2,34,1,37,0,19,64,11,1,40,5,38,1,39,40,42,26,16,37,
1,43,53,0,43,53,0,0,0,255,255,0,87,255,236,3,202,5,204,18,38,0,70,0,0,17,
7,1,75,1,44,0,0,0,11,182,1,17,40,42,19,9,37,1,43,53,0,0,0,255,255,0,104,255,
236,5,121,6,254,18,38,0,38,0,0,17,7,2,151,1,204,0,0,0,19,64,11,1,40,5,38,
1,38,42,48,26,16,37,1,43,53,0,43,53,0,0,0,255,255,0,87,255,236,3,202,5,211,
18,38,0,70,0,0,17,7,1,72,0,214,0,0,0,19,64,11,1,40,17,38,1,16,42,48,19,9,
37,1,43,53,0,43,53,0,0,0,255,255,0,168,0,0,5,101,6,254,18,38,0,39,0,0,17,
7,2,151,1,102,0,0,0,21,180,2,26,5,38,2,184,255,171,180,28,34,6,0,37,1,43,
53,0,43,53,0,255,255,0,86,255,236,4,255,5,204,16,38,0,71,0,0,17,7,2,146,3,
186,0,75,0,18,64,10,2,61,0,2,83,61,61,19,19,37,1,43,53,0,63,53,255,255,0,
14,0,0,5,101,5,129,18,6,0,144,0,0,0,2,0,86,255,236,4,109,5,204,0,39,0,59,
0,146,64,86,85,42,101,42,2,90,58,106,58,2,57,1,73,1,2,54,10,70,10,2,9,4,25,
4,121,4,137,4,4,6,7,22,7,118,7,134,7,4,25,27,70,64,20,6,0,21,50,3,18,61,128,
40,71,31,6,1,6,63,61,1,143,61,1,33,21,27,19,81,24,15,20,1,239,20,255,20,2,
20,20,8,22,0,11,55,80,8,184,255,192,64,10,9,13,72,8,16,0,45,80,3,22,0,63,
237,50,63,43,237,50,63,18,57,47,93,113,51,237,50,63,1,93,114,47,93,237,26,
16,220,23,50,17,57,26,237,50,49,48,0,93,93,93,93,93,93,37,14,1,35,34,2,17,
16,33,50,22,23,51,52,46,1,52,61,1,33,53,33,53,51,21,51,21,35,17,20,30,2,23,
35,46,3,53,1,20,30,2,51,50,62,2,53,52,46,2,35,34,14,2,3,53,50,165,122,205,
193,1,142,123,164,50,2,1,1,254,212,1,44,180,132,132,1,2,2,1,172,2,3,3,2,253,
218,28,62,96,69,71,109,73,38,38,74,107,70,66,96,64,31,174,104,90,1,20,1,24,
2,54,90,98,10,43,47,42,9,141,131,147,147,131,252,41,39,72,60,43,9,10,37,48,
53,26,1,112,112,160,103,48,46,103,166,120,115,159,98,43,46,102,163,0,0,255,
255,0,168,0,0,4,254,6,161,18,38,0,40,0,0,17,7,1,73,1,122,1,78,0,21,180,1,
12,5,38,1,184,255,237,180,13,12,0,10,37,1,43,53,0,43,53,0,255,255,0,87,255,
236,4,24,5,83,18,38,0,72,0,0,17,7,1,73,0,245,0,0,0,19,64,11,2,38,17,38,2,
3,39,38,17,27,37,1,43,53,0,43,53,0,0,0,255,255,0,168,0,0,4,254,6,243,18,38,
0,40,0,0,17,7,2,155,1,137,0,0,0,21,180,1,12,5,38,1,184,255,235,180,17,25,
0,10,37,1,43,53,0,43,53,0,255,255,0,87,255,236,4,24,5,230,18,38,0,72,0,0,
17,7,1,74,1,16,0,0,0,19,64,11,2,38,17,38,2,2,43,55,17,27,37,1,43,53,0,43,
53,0,0,0,255,255,0,168,0,0,4,254,6,241,18,38,0,40,0,0,17,7,1,75,1,201,1,37,
0,21,180,1,12,5,38,1,184,255,236,180,12,14,0,10,37,1,43,53,0,43,53,0,255,
255,0,87,255,236,4,24,5,204,18,38,0,72,0,0,17,7,1,75,1,68,0,0,0,12,182,2,
2,38,40,17,27,37,1,43,53,0,0,0,255,255,0,168,254,85,4,254,5,129,18,38,0,40,
0,0,17,7,1,77,3,80,0,0,0,13,185,0,1,255,194,180,24,24,11,11,37,43,53,0,255,
255,0,87,254,85,4,24,4,78,18,38,0,72,0,0,17,7,1,77,1,125,0,0,0,13,185,0,2,
254,242,180,50,50,9,9,37,43,53,0,255,255,0,168,0,0,4,254,6,254,18,38,0,40,
0,0,17,7,2,151,1,111,0,0,0,21,180,1,12,5,38,1,184,255,231,180,14,20,0,10,
37,1,43,53,0,43,53,0,255,255,0,87,255,236,4,24,5,211,18,38,0,72,0,0,17,7,
1,72,0,234,0,0,0,21,180,2,38,17,38,2,184,255,254,180,40,46,17,27,37,1,43,
53,0,43,53,0,255,255,0,103,255,236,5,160,6,254,18,38,0,42,0,0,17,7,2,150,
1,219,0,0,0,19,64,11,1,47,5,38,1,34,52,46,0,35,37,1,43,53,0,43,53,0,0,0,255,
255,0,86,254,87,3,239,5,211,18,38,0,74,0,0,17,7,1,71,0,216,0,0,0,19,64,11,
2,71,17,38,2,0,76,70,26,41,37,1,43,53,0,43,53,0,0,0,255,255,0,103,255,236,
5,160,6,243,18,38,0,42,0,0,17,7,2,155,1,246,0,0,0,19,64,11,1,46,5,38,1,39,
51,59,0,35,37,1,43,53,0,43,53,0,0,0,255,255,0,86,254,87,3,239,5,230,18,38,
0,74,0,0,17,7,1,74,0,249,0,0,0,19,64,11,2,70,17,38,2,0,75,87,26,41,37,1,43,
53,0,43,53,0,0,0,255,255,0,103,255,236,5,160,6,241,18,38,0,42,0,0,17,7,1,
75,2,53,1,37,0,19,64,11,1,46,5,38,1,39,46,48,0,35,37,1,43,53,0,43,53,0,0,
0,255,255,0,86,254,87,3,239,5,204,18,38,0,74,0,0,17,7,1,75,1,45,0,0,0,11,
182,2,0,70,72,26,41,37,1,43,53,0,0,0,255,255,0,103,254,78,5,160,5,150,18,
38,0,42,0,0,17,7,2,140,2,78,0,0,0,11,182,1,46,50,46,0,35,37,1,43,53,0,0,0,
255,255,0,86,254,87,3,239,6,32,16,38,0,74,0,0,17,7,2,147,1,56,0,0,0,21,180,
2,79,17,38,2,184,255,252,180,70,74,26,41,37,1,43,53,0,43,53,0,255,255,0,168,
0,0,5,32,6,254,18,38,0,43,0,0,17,7,2,150,1,153,0,0,0,19,64,11,1,13,5,38,1,
0,18,12,4,10,37,1,43,53,0,43,53,0,0,0,255,255,0,142,0,0,3,238,7,62,18,38,
0,75,0,0,17,7,2,150,0,242,0,64,0,21,180,1,35,2,38,1,184,255,255,180,40,34,
25,10,37,1,43,53,0,43,53,0,0,2,0,14,0,0,5,185,5,129,0,19,0,23,0,166,64,72,
23,11,3,90,8,7,4,4,20,4,2,7,4,16,15,19,90,20,12,59,0,1,4,0,1,56,164,0,1,155,
0,1,68,0,1,244,0,1,235,0,1,68,0,148,0,2,224,0,1,2,0,0,48,0,112,0,208,0,4,
7,0,32,25,1,160,25,176,25,192,25,3,25,184,255,192,64,36,14,17,72,47,25,1,
22,18,6,95,15,11,80,7,96,7,2,7,2,95,64,23,1,160,23,208,23,2,23,23,13,9,3,
4,0,18,0,63,50,63,51,57,47,93,113,237,220,93,50,50,237,50,50,1,93,43,93,113,
47,94,93,95,93,113,113,113,114,114,114,94,93,93,51,51,237,50,50,47,94,93,
51,51,237,50,50,49,48,33,17,33,17,35,17,35,53,51,53,51,21,33,53,51,21,51,
21,35,17,3,53,33,21,4,102,253,1,191,154,154,191,2,255,186,153,153,186,253,
1,2,141,253,115,4,1,154,230,230,230,230,154,251,255,3,45,212,212,0,1,0,10,
0,0,3,238,5,204,0,41,0,150,185,0,7,255,232,64,66,9,13,72,0,7,16,7,2,7,33,
24,11,70,64,80,12,1,159,12,255,12,2,12,43,128,32,36,24,70,29,28,192,25,1,
0,25,16,25,48,25,224,25,240,25,5,8,25,176,43,192,43,208,43,3,176,43,240,43,
2,255,43,1,112,43,1,43,184,255,192,64,19,19,23,72,35,27,81,32,28,28,5,30,
0,25,11,21,0,18,80,5,184,255,192,180,9,13,72,5,15,0,63,43,237,50,63,51,63,
18,57,47,51,237,50,1,43,93,93,113,114,47,94,93,113,51,51,237,50,50,26,16,
220,93,113,26,237,18,57,49,48,0,94,93,43,1,62,3,51,50,30,2,21,17,35,17,52,
46,2,35,34,14,2,21,17,35,17,35,53,51,53,51,21,33,21,33,21,20,14,2,7,1,61,
30,70,84,100,62,104,133,77,29,181,17,48,88,70,64,103,73,40,180,132,132,180,
1,44,254,212,2,3,2,1,3,89,55,77,50,23,56,101,140,84,253,87,2,134,69,104,69,
35,46,84,120,75,253,170,4,182,131,147,147,131,148,33,66,56,39,7,255,255,255,
184,0,0,2,133,7,6,18,38,0,44,0,0,17,6,2,153,207,0,0,19,64,11,1,4,5,38,1,2,
13,27,0,2,37,1,43,53,0,43,53,0,255,255,255,184,0,0,2,133,5,189,18,38,0,241,
0,0,17,6,1,78,207,0,0,19,64,11,1,4,17,38,1,2,13,27,0,2,37,1,43,53,0,43,53,
0,255,255,0,12,0,0,2,49,6,161,18,38,0,44,0,0,17,7,1,73,255,217,1,78,0,19,
64,11,1,4,5,38,1,2,5,4,0,2,37,1,43,53,0,43,53,0,0,0,255,255,0,12,0,0,2,49,
5,83,18,38,0,241,0,0,17,6,1,73,217,0,0,19,64,11,1,4,17,38,1,2,5,4,0,2,37,
1,43,53,0,43,53,0,255,255,255,210,0,0,2,108,6,243,18,38,0,44,0,0,17,6,2,155,
234,0,0,19,64,11,1,4,5,38,1,2,9,17,0,2,37,1,43,53,0,43,53,0,255,255,255,210,
0,0,2,108,5,230,18,38,0,241,0,0,17,6,1,74,245,0,0,19,64,11,1,4,17,38,1,3,
9,21,0,2,37,1,43,53,0,43,53,0,255,255,0,92,254,85,1,186,5,129,18,38,0,44,
0,0,17,6,1,77,12,0,0,10,182,1,0,16,16,3,3,37,43,53,0,0,255,255,0,31,254,85,
1,125,5,204,18,38,0,76,0,0,17,6,1,77,207,0,0,15,64,10,23,22,1,2,0,20,20,7,
7,37,43,53,93,0,255,255,0,189,0,0,1,124,6,241,18,38,0,44,0,0,17,7,1,75,0,
39,1,37,0,19,64,11,1,4,5,38,1,0,4,6,0,2,37,1,43,53,0,43,53,0,0,0,0,1,0,194,
0,0,1,118,4,58,0,3,1,137,64,24,3,70,4,0,36,0,2,9,0,0,4,5,52,5,1,0,5,16,5,
32,5,3,229,5,184,255,192,64,55,225,228,72,240,5,1,228,5,1,176,5,192,5,208,
5,3,132,5,148,5,164,5,3,64,5,1,52,5,1,0,5,16,5,32,5,3,212,5,228,5,244,5,3,
144,5,1,116,5,132,5,2,96,5,1,5,184,255,192,64,22,193,196,72,224,5,1,196,5,
212,5,2,176,5,1,20,5,36,5,52,5,3,5,184,255,192,183,182,185,72,0,5,1,175,5,
184,255,192,179,171,174,72,5,184,255,192,182,161,167,72,128,5,1,5,184,255,
192,64,38,150,156,72,208,5,1,100,5,116,5,164,5,180,5,196,5,5,32,5,1,4,5,20,
5,2,4,5,20,5,180,5,196,5,244,5,5,117,5,184,255,192,179,121,124,72,5,184,255,
192,179,110,113,72,5,184,255,192,64,24,99,102,72,224,5,1,180,5,196,5,212,
5,3,48,5,1,4,5,20,5,36,5,3,5,184,255,192,183,67,70,72,11,5,1,62,5,184,255,
192,64,9,56,59,72,203,5,219,5,2,5,184,255,192,64,42,45,48,72,27,5,43,5,2,
196,5,212,5,228,5,3,107,5,123,5,2,64,5,1,2,16,5,32,5,48,5,3,191,5,207,5,2,
32,5,64,5,2,5,184,255,192,64,13,13,16,72,15,5,31,5,2,7,1,15,0,21,0,63,63,
1,94,93,43,93,93,113,95,113,113,113,114,43,114,43,94,93,43,113,113,113,113,
43,43,43,94,93,113,113,113,113,43,114,43,43,94,93,43,93,93,93,93,43,113,113,
113,113,114,114,114,114,114,114,114,43,94,93,93,17,18,57,47,94,93,237,49,
48,51,17,51,17,194,180,4,58,251,198,0,0,0,255,255,0,170,255,236,5,73,5,129,
16,38,0,44,237,0,16,7,0,45,1,225,0,0,255,255,0,137,254,87,3,3,5,204,16,38,
0,76,0,0,17,7,0,77,1,198,0,0,0,30,64,18,3,2,111,8,1,48,8,1,16,8,1,8,1,0,16,
0,1,0,17,93,53,53,17,93,93,93,53,53,255,255,0,32,255,236,3,205,6,254,18,38,
0,45,0,0,17,7,2,150,1,55,0,0,0,19,64,11,1,23,5,38,1,190,28,22,3,16,37,1,43,
53,0,43,53,0,0,0,0,2,255,153,254,87,2,47,5,211,0,19,0,29,1,148,64,25,150,
29,166,29,2,152,28,168,28,2,3,18,24,12,16,72,18,40,8,11,72,164,21,1,21,184,
255,192,64,49,11,15,72,21,251,26,1,59,26,1,26,64,12,15,72,36,26,1,26,15,70,
12,3,3,4,12,20,12,36,12,68,12,4,7,12,12,31,30,144,31,1,2,0,31,16,31,2,219,
31,184,255,192,64,9,223,227,72,31,64,210,213,72,31,184,255,192,64,51,205,
209,72,143,31,1,64,31,80,31,2,95,31,111,31,239,31,255,31,4,32,31,48,31,64,
31,3,144,31,160,31,224,31,240,31,4,79,31,1,0,31,1,160,175,31,191,31,207,31,
3,31,184,255,192,64,57,147,150,72,239,31,1,176,31,192,31,208,31,3,95,31,1,
32,31,1,31,31,47,31,63,31,143,31,191,31,207,31,6,0,31,1,111,239,31,1,208,
31,1,63,31,1,111,31,143,31,159,31,175,31,255,31,5,31,184,255,192,64,101,79,
82,72,223,31,1,144,31,160,31,176,31,3,47,31,63,31,79,31,3,0,31,1,61,31,64,
53,56,72,112,31,128,31,144,31,176,31,4,15,31,31,31,2,255,31,1,31,64,35,38,
72,144,31,1,79,31,1,255,31,1,112,31,128,31,192,31,208,31,224,31,5,31,31,1,
24,142,64,28,148,26,128,22,22,15,26,47,26,63,26,127,26,239,26,5,26,13,15,
7,80,0,27,0,63,237,63,47,93,51,47,26,16,253,26,237,1,93,93,93,113,113,43,
113,114,114,43,94,93,93,93,93,43,113,114,114,114,94,93,93,113,113,113,113,
43,114,94,93,93,93,113,113,114,114,43,43,43,94,93,95,93,17,18,57,47,94,93,
51,47,16,237,47,93,43,93,113,204,43,93,49,48,0,43,43,1,95,93,93,19,34,38,
39,53,30,1,51,50,62,2,53,17,51,17,20,14,2,1,21,35,39,35,7,35,53,19,51,77,
34,65,28,13,36,13,38,49,28,10,180,21,54,93,1,154,105,219,2,232,104,234,204,
254,87,4,5,139,2,4,20,43,67,46,4,165,251,64,62,106,78,45,6,110,20,169,169,
20,1,14,0,255,255,0,168,254,78,5,63,5,129,18,38,0,46,0,0,17,7,2,140,1,221,
0,0,0,14,185,0,1,255,205,180,16,12,4,11,37,1,43,53,255,255,0,138,254,78,4,
3,5,204,18,38,0,78,0,0,17,7,2,140,1,78,0,0,0,14,185,0,1,255,235,180,16,12,
4,11,37,1,43,53,0,1,0,138,0,0,4,3,4,58,0,11,0,166,64,72,123,1,1,116,7,1,86,
9,102,9,2,123,0,139,0,155,0,3,89,0,105,0,2,67,10,1,58,2,1,42,9,1,155,8,1,
122,8,138,8,2,44,8,1,1,10,8,10,9,16,112,9,128,9,144,9,3,9,9,0,11,16,80,11,
1,144,11,208,11,240,11,3,11,184,255,192,64,40,7,11,72,11,7,3,70,0,4,16,4,
48,4,240,4,4,8,4,128,13,192,13,224,13,3,63,13,1,2,1,7,10,4,8,8,5,15,4,0,21,
0,63,50,63,51,17,23,57,1,93,93,47,94,93,237,50,47,43,93,113,56,51,57,47,93,
56,57,51,17,51,49,48,93,93,93,93,0,93,1,93,93,93,93,0,93,1,93,33,1,7,17,35,
17,51,17,1,51,9,1,3,48,254,146,132,180,180,1,219,211,254,73,1,206,1,238,108,
254,126,4,58,253,243,2,13,254,47,253,151,0,0,0,255,255,0,168,0,0,4,47,6,240,
18,38,0,47,0,0,17,7,2,149,0,173,0,0,0,21,180,1,6,5,38,1,184,255,94,180,6,
9,0,4,37,1,43,53,0,43,53,0,255,255,0,91,0,0,2,3,7,62,18,38,0,79,0,0,17,6,
2,149,19,78,0,19,64,11,1,4,2,38,1,75,4,7,0,2,37,1,43,53,0,43,53,0,255,255,
0,168,254,78,4,47,5,129,18,38,0,47,0,0,17,7,2,140,1,133,0,0,0,14,185,0,1,
255,253,180,10,6,0,4,37,1,43,53,255,255,0,126,254,78,1,71,5,204,18,38,0,79,
0,0,17,6,2,140,255,0,0,14,185,0,1,255,255,180,8,4,0,2,37,1,43,53,0,0,255,
255,0,168,0,0,4,47,5,129,18,38,0,47,0,0,17,7,2,146,2,21,0,0,0,18,64,10,1,
15,3,1,138,10,6,0,4,37,1,43,53,0,63,53,255,255,0,138,0,0,2,105,5,204,16,38,
0,79,0,0,17,7,2,146,1,36,0,75,0,65,64,16,16,64,29,29,72,16,64,22,22,72,16,
64,18,18,72,16,184,255,192,179,17,17,72,16,184,255,192,64,12,16,16,72,16,
64,11,11,72,1,13,0,1,184,1,32,180,8,4,0,2,37,1,43,53,0,63,53,1,43,43,43,43,
43,43,0,255,255,0,168,0,0,4,47,5,129,18,38,0,47,0,0,17,7,1,75,1,213,253,143,
0,11,182,1,95,6,8,0,4,37,1,43,53,0,0,0,255,255,0,138,0,0,2,146,5,204,16,38,
0,79,0,0,17,7,1,75,1,66,253,143,0,14,185,0,1,1,84,180,4,6,0,2,37,1,43,53,
0,1,0,20,0,0,4,47,5,129,0,13,0,119,64,49,121,0,137,0,2,100,8,116,8,132,8,
3,86,8,1,134,8,1,86,7,1,134,7,1,12,2,90,9,5,16,3,1,0,3,32,3,64,3,96,3,128,
3,208,3,240,3,7,3,12,184,255,224,179,19,22,72,9,184,255,224,64,24,19,22,72,
6,1,9,12,4,16,7,1,7,0,13,1,13,13,5,10,3,2,95,5,18,0,63,237,63,18,57,47,93,
205,93,23,57,43,43,1,47,93,113,47,51,237,50,49,48,113,114,113,114,0,93,93,
1,5,17,33,21,33,17,7,53,55,17,51,17,37,2,104,254,255,2,200,252,121,148,148,
191,1,1,3,29,149,254,20,156,2,26,85,158,85,2,201,253,165,148,0,1,0,16,0,0,
1,186,5,204,0,11,0,102,64,42,39,3,1,39,2,1,8,7,11,70,4,2,0,0,16,0,32,0,64,
0,4,7,0,0,12,13,255,13,1,112,13,128,13,192,13,208,13,4,31,13,1,4,184,255,
224,64,23,18,22,72,10,32,18,22,72,1,10,4,7,4,2,79,8,1,8,8,5,0,0,21,0,63,63,
57,47,93,205,23,57,43,43,1,93,93,93,17,18,57,47,94,93,51,51,237,50,50,49,
48,113,113,51,17,7,53,55,17,51,17,55,21,7,17,138,122,122,180,124,124,2,30,
68,158,68,3,16,253,88,72,159,71,253,122,255,255,0,168,0,0,5,32,6,240,18,38,
0,49,0,0,17,7,2,149,2,17,0,0,0,19,64,11,1,20,5,38,1,73,20,23,8,18,37,1,43,
53,0,43,53,0,0,0,255,255,0,140,0,0,3,242,5,228,18,38,0,81,4,0,17,7,0,116,
1,132,0,0,0,19,64,11,1,38,17,38,1,97,38,41,19,36,37,1,43,53,0,43,53,0,0,0,
255,255,0,168,254,78,5,32,5,129,18,38,0,49,0,0,17,7,2,140,1,252,0,0,0,14,
185,0,1,255,252,180,24,20,8,18,37,1,43,53,255,255,0,140,254,78,3,242,4,78,
18,38,0,81,4,0,17,7,2,140,1,91,0,0,0,11,182,1,0,42,38,19,36,37,1,43,53,0,
0,0,255,255,0,168,0,0,5,32,6,254,18,38,0,49,0,0,17,7,2,151,1,147,0,0,0,21,
180,1,20,5,38,1,184,255,250,180,22,28,8,18,37,1,43,53,0,43,53,0,255,255,0,
140,0,0,3,242,5,211,18,38,0,81,4,0,17,7,1,72,0,242,0,0,0,21,180,1,38,17,38,
1,184,255,254,180,40,46,19,36,37,1,43,53,0,43,53,0,255,255,255,254,0,0,4,
80,5,129,16,38,0,81,98,0,16,7,2,3,255,127,0,0,0,1,0,165,255,236,5,52,5,149,
0,55,0,162,64,16,154,53,1,149,7,165,7,2,131,41,147,41,163,41,3,48,184,255,
232,179,12,15,72,47,184,255,216,64,91,12,15,72,42,54,58,54,154,54,170,54,
4,6,143,5,159,5,175,5,3,5,5,51,39,26,90,0,27,16,27,64,27,3,27,51,90,0,14,
64,14,80,14,112,14,160,14,176,14,6,48,14,80,14,144,14,240,14,4,224,14,1,143,
14,159,14,175,14,3,0,14,48,14,2,7,14,39,20,95,45,4,33,3,26,18,9,95,0,6,6,
0,19,0,63,50,47,16,237,63,63,63,237,50,1,47,94,93,93,93,113,114,237,47,93,
237,50,17,57,47,93,51,49,48,0,93,43,1,43,0,93,93,93,5,34,46,2,39,55,30,1,
51,50,62,2,53,17,52,46,2,35,34,14,2,21,17,35,17,52,46,2,39,51,30,3,21,51,
62,3,51,50,30,2,21,17,20,14,2,3,173,56,96,79,63,24,127,37,100,59,64,78,41,
13,39,81,127,87,94,163,121,70,191,1,1,1,1,184,1,3,2,1,4,34,103,130,153,86,
124,177,112,53,30,86,152,20,24,40,54,30,115,45,65,58,107,153,95,1,66,108,
154,98,46,62,105,139,77,252,133,4,68,37,92,90,76,22,22,63,69,69,28,61,101,
70,39,64,133,204,139,254,165,130,208,146,78,0,0,0,0,1,0,140,254,87,3,242,
4,78,0,53,0,135,64,18,121,52,137,52,2,90,52,106,52,2,43,52,59,52,75,52,3,
46,184,255,232,64,74,9,12,72,3,46,19,46,2,3,3,24,49,70,64,160,12,1,96,12,
208,12,2,31,12,1,175,12,1,12,55,128,37,24,70,160,25,176,25,2,0,25,192,25,
208,25,3,0,25,16,25,32,25,64,25,224,25,240,25,6,7,25,37,18,80,43,16,31,15,
24,21,7,80,0,27,0,63,237,63,63,63,237,50,1,47,94,93,113,114,237,50,26,16,
220,93,113,113,114,26,237,17,57,47,49,48,93,43,0,93,93,93,1,34,38,39,53,30,
1,51,50,62,2,53,17,52,46,2,35,34,14,2,21,17,35,17,52,46,2,39,51,30,3,21,51,
62,3,51,50,30,2,21,17,20,14,2,3,1,34,65,28,13,36,13,38,49,28,10,23,52,85,
63,64,103,73,40,180,1,2,2,1,170,1,2,3,2,3,26,62,82,106,70,90,130,84,39,22,
54,93,254,87,4,5,139,2,4,20,43,67,46,3,25,79,106,65,27,45,85,125,81,253,141,
3,83,34,75,67,48,7,5,44,57,59,20,47,76,53,29,44,92,145,100,252,169,62,106,
78,45,0,0,0,255,255,0,97,255,236,5,215,6,161,18,38,0,50,0,0,17,7,1,73,1,214,
1,78,0,19,64,11,2,40,5,38,2,0,41,40,10,0,37,1,43,53,0,43,53,0,0,0,255,255,
0,86,255,236,4,29,5,83,18,38,0,82,0,0,17,7,1,73,0,244,0,0,0,19,64,11,2,35,
17,38,2,0,36,35,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,97,255,236,5,215,6,
243,18,38,0,50,0,0,17,7,2,155,1,231,0,0,0,19,64,11,2,40,5,38,2,0,45,53,10,
0,37,1,43,53,0,43,53,0,0,0,255,255,0,86,255,236,4,29,5,230,18,38,0,82,0,0,
17,7,1,74,1,16,0,0,0,19,64,11,2,35,17,38,2,0,40,52,8,0,37,1,43,53,0,43,53,
0,0,0,255,255,0,97,255,236,5,215,6,241,18,38,0,50,0,0,17,7,2,154,1,226,0,
0,0,23,64,13,3,2,40,5,38,3,2,93,40,49,10,0,37,1,43,53,53,0,43,53,53,0,0,0,
255,255,0,86,255,236,4,34,5,228,18,38,0,82,0,0,17,7,1,79,1,9,0,0,0,23,64,
13,3,2,35,17,38,3,2,103,35,44,8,0,37,1,43,53,53,0,43,53,53,0,0,0,0,2,0,97,
255,246,7,166,5,140,0,30,0,49,0,170,64,119,137,13,1,102,13,1,105,12,1,86,
48,1,89,42,1,84,8,132,8,2,4,47,20,47,84,47,3,11,43,27,43,91,43,3,0,20,24,
28,90,34,0,26,32,26,48,26,3,26,22,26,22,29,15,34,47,34,79,34,3,63,34,95,34,
127,34,159,34,207,34,239,34,6,34,64,31,38,72,34,16,29,32,29,2,29,45,91,32,
10,1,15,10,31,10,2,10,127,51,1,27,95,24,24,21,29,95,30,18,22,95,21,3,40,95,
15,4,31,95,5,19,0,63,237,63,237,63,237,63,237,17,57,47,237,1,93,47,93,93,
237,47,93,47,43,93,113,18,57,57,47,47,93,16,237,50,57,57,49,48,0,93,93,93,
93,93,1,93,0,93,93,33,14,3,35,34,36,38,2,53,52,18,54,36,51,50,30,2,23,33,
21,33,17,33,21,33,17,33,21,37,50,54,55,17,46,2,34,35,34,14,2,21,20,30,2,3,
231,20,51,57,57,25,169,254,253,175,89,94,178,1,2,164,26,58,57,52,19,3,146,
252,221,2,231,253,25,3,76,251,111,32,76,26,11,32,37,37,15,125,187,125,63,
64,126,186,3,3,3,1,106,191,1,9,159,165,1,7,183,98,2,3,4,2,156,254,60,154,
254,21,156,145,2,2,4,87,1,2,1,74,142,206,131,129,209,148,80,0,3,0,86,255,
236,7,50,4,78,0,39,0,59,0,68,0,190,64,131,132,7,1,102,7,118,7,2,97,2,1,85,
2,1,90,66,106,66,2,108,61,1,90,61,1,69,58,85,58,101,58,3,69,52,85,52,101,
52,3,74,48,90,48,106,48,3,74,42,90,42,106,42,3,8,73,9,9,38,71,64,31,60,47,
60,63,60,3,144,60,1,60,70,128,17,30,68,0,71,144,40,1,32,40,1,40,50,71,25,
0,80,68,68,5,63,80,33,16,116,30,132,30,2,123,17,139,17,2,30,17,20,45,80,28,
16,55,80,20,22,5,80,14,239,8,1,128,8,1,8,8,14,22,0,63,51,47,93,93,16,237,
63,237,63,237,18,57,57,93,93,63,237,18,57,47,237,1,47,237,47,93,114,237,50,
57,57,26,16,220,93,113,26,237,50,47,237,49,48,0,93,93,93,93,93,93,93,93,93,
93,93,1,20,30,2,51,50,54,55,23,14,3,35,34,38,39,14,1,35,34,46,2,53,16,18,
51,32,23,62,1,51,50,30,2,29,1,37,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,
37,46,1,35,34,14,2,7,4,46,35,73,114,80,117,141,25,158,17,61,102,153,108,137,
198,61,63,201,137,113,181,127,68,253,242,1,25,117,67,200,119,136,183,111,
47,252,63,42,77,110,68,69,114,81,45,47,81,108,62,69,114,81,44,3,7,15,144,
135,45,99,84,58,4,1,247,85,143,103,57,94,72,45,45,91,73,47,91,92,93,90,68,
140,211,143,1,23,1,25,177,94,83,88,155,210,122,24,39,126,164,98,39,41,99,
164,123,126,165,98,40,39,98,166,225,171,157,29,74,127,98,255,255,0,168,0,
0,5,104,6,240,18,38,0,53,0,0,17,7,2,149,1,225,0,0,0,21,180,2,31,5,38,2,184,
255,245,180,31,34,4,17,37,1,43,53,0,43,53,0,255,255,0,136,0,0,2,166,5,228,
18,38,0,85,0,0,17,7,0,116,0,182,0,0,0,19,64,11,1,32,17,38,1,74,32,35,6,21,
37,1,43,53,0,43,53,0,0,0,255,255,0,168,254,78,5,104,5,129,18,38,0,53,0,0,
17,7,2,140,2,5,0,0,0,14,185,0,2,255,225,180,35,31,4,17,37,1,43,53,255,255,
0,129,254,78,2,136,4,78,18,38,0,85,0,0,17,6,2,140,2,0,0,14,185,0,1,255,94,
180,36,32,6,21,37,1,43,53,0,0,255,255,0,168,0,0,5,104,6,254,18,38,0,53,0,
0,17,7,2,151,1,102,0,0,0,21,180,2,31,5,38,2,184,255,169,180,33,39,4,17,37,
1,43,53,0,43,53,0,255,255,0,56,0,0,2,206,5,211,18,38,0,85,0,0,17,6,1,72,56,
0,0,21,180,1,32,17,38,1,184,255,251,180,34,40,6,21,37,1,43,53,0,43,53,0,0,
0,255,255,0,93,255,236,4,248,7,45,18,38,0,54,0,0,17,7,0,116,1,234,1,73,0,
19,64,11,1,64,5,38,1,91,64,67,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,57,255,
236,3,182,5,228,18,38,0,86,0,0,17,7,0,116,1,57,0,0,0,19,64,11,1,56,17,38,
1,93,56,59,10,0,37,1,43,53,0,43,53,0,0,0,255,255,0,93,255,236,4,248,7,26,
18,38,0,54,0,0,17,7,1,71,1,114,1,71,0,19,64,11,1,65,5,38,1,18,70,64,8,0,37,
1,43,53,0,43,53,0,0,0,255,255,0,57,255,236,3,182,5,211,18,38,0,86,0,0,17,
7,1,71,0,172,0,0,0,19,64,11,1,57,17,38,1,0,62,56,10,0,37,1,43,53,0,43,53,
0,0,0,255,255,0,93,254,78,4,248,5,150,18,38,0,54,0,0,17,7,0,120,1,166,0,0,
0,11,182,1,40,72,64,8,0,37,1,43,53,0,0,0,255,255,0,57,254,78,3,182,4,75,18,
38,0,86,0,0,17,7,0,120,0,218,0,0,0,11,182,1,15,64,56,10,0,37,1,43,53,0,0,
0,255,255,0,93,255,236,4,248,6,254,18,38,0,54,0,0,17,7,2,151,1,115,0,0,0,
19,64,11,1,64,5,38,1,19,66,72,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,57,255,
236,3,182,5,211,18,38,0,86,0,0,17,7,1,72,0,173,0,0,0,19,64,11,1,56,17,38,
1,0,58,64,10,0,37,1,43,53,0,43,53,0,0,0,255,255,0,46,254,78,4,180,5,129,18,
38,0,55,0,0,17,7,2,140,1,139,0,0,0,14,185,0,1,255,254,180,12,8,4,6,37,1,43,
53,255,255,0,31,254,78,2,42,5,44,16,38,0,87,0,0,17,6,2,140,115,0,2,233,64,
255,35,64,232,232,72,35,64,231,231,72,35,64,228,228,72,35,64,227,227,72,35,
64,226,226,72,35,64,221,221,72,35,64,217,217,72,35,64,216,216,72,35,64,215,
215,72,35,64,214,214,72,35,64,213,213,72,35,64,210,210,72,35,64,206,206,72,
35,64,205,205,72,35,64,203,203,72,35,64,202,202,72,35,64,199,199,72,35,64,
196,196,72,35,64,195,195,72,35,64,194,194,72,35,64,192,192,72,35,64,191,191,
72,35,64,190,190,72,35,64,185,185,72,35,64,184,184,72,35,64,181,181,72,35,
64,180,180,72,35,64,179,179,72,35,64,178,178,72,35,64,174,174,72,35,64,173,
173,72,35,64,170,170,72,35,64,169,169,72,35,64,168,168,72,35,64,167,167,72,
35,64,163,163,72,35,64,162,162,72,35,64,160,160,72,35,64,159,159,72,35,64,
158,158,72,35,64,157,157,72,35,64,156,156,72,35,64,152,152,72,35,64,149,149,
72,35,64,148,148,72,35,64,147,147,72,35,64,146,146,72,35,64,145,145,72,35,
64,144,144,72,35,64,142,142,72,35,64,141,141,72,64,221,35,64,138,138,72,35,
64,137,137,72,35,64,136,136,72,35,64,134,134,72,35,64,133,133,72,35,64,131,
131,72,35,64,130,130,72,35,64,127,127,72,35,64,126,126,72,35,64,125,125,72,
35,64,124,124,72,35,64,123,123,72,35,64,122,122,72,35,64,121,121,72,35,64,
120,120,72,35,64,116,116,72,35,64,115,115,72,35,64,113,113,72,35,64,112,112,
72,35,64,111,111,72,35,64,110,110,72,35,64,109,109,72,35,64,106,106,72,35,
64,105,105,72,35,64,104,104,72,35,64,102,102,72,35,64,101,101,72,35,64,100,
100,72,35,64,99,99,72,35,64,98,98,72,35,64,95,95,72,35,64,94,94,72,35,64,
93,93,72,35,64,91,91,72,35,64,90,90,72,35,64,89,89,72,35,128,88,88,72,35,
64,87,87,72,35,64,84,84,72,35,64,83,83,72,35,64,80,80,72,35,64,79,79,72,35,
64,78,78,72,35,64,77,77,72,35,184,255,192,179,74,74,72,35,184,255,192,179,
71,71,72,35,184,255,192,179,63,63,72,35,184,255,192,64,9,60,60,72,35,64,52,
52,72,35,184,255,192,179,50,50,72,35,184,255,192,179,49,49,72,35,184,255,
192,64,9,45,45,72,35,64,41,41,72,35,184,255,192,179,39,39,72,35,184,255,192,
64,9,38,38,72,35,64,30,30,72,35,184,255,192,179,28,28,72,35,184,255,192,64,
9,27,27,72,35,64,19,19,72,35,184,255,192,179,17,17,72,35,184,255,192,179,
13,13,72,35,184,255,192,64,15,9,9,72,35,64,8,8,72,1,50,27,23,7,0,37,1,43,
53,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,0,0,0,255,255,0,46,0,0,4,180,
6,254,18,38,0,55,0,0,17,7,2,151,1,33,0,0,0,21,180,1,8,5,38,1,184,255,251,
180,10,16,4,6,37,1,43,53,0,43,53,0,255,255,0,31,255,240,3,17,5,204,16,38,
0,87,0,0,17,7,2,146,1,204,0,75,0,17,177,1,1,184,1,136,180,27,23,7,0,37,1,
43,53,0,53,0,0,1,0,46,0,0,4,180,5,129,0,15,0,101,64,62,0,17,16,17,32,17,3,
9,3,2,5,15,14,6,12,5,14,9,6,127,12,175,12,191,12,3,47,12,143,12,2,12,64,23,
28,72,12,1,5,90,10,16,6,32,6,2,6,0,12,95,13,4,8,95,1,9,9,5,13,3,5,18,0,63,
63,18,57,47,51,237,50,16,237,50,1,47,93,51,253,50,204,43,93,113,17,57,43,
1,24,16,77,228,17,57,95,94,93,49,48,1,17,33,21,33,17,35,17,33,53,33,17,33,
53,33,21,2,208,1,25,254,231,190,254,233,1,23,254,28,4,134,4,229,254,60,154,
253,121,2,135,154,1,196,156,156,0,1,0,31,255,240,2,42,5,44,0,30,0,140,64,
91,40,30,1,40,29,1,40,26,1,40,25,1,12,32,9,15,72,156,12,172,12,2,12,40,9,
14,72,20,15,15,13,29,25,111,7,127,7,2,7,24,28,7,3,1,70,21,17,143,13,1,0,13,
16,13,32,13,3,7,13,128,32,1,47,32,1,27,19,80,20,0,15,80,28,127,16,191,16,
207,16,3,16,16,4,24,22,20,15,4,80,11,22,0,63,237,63,206,51,18,57,47,93,51,
237,50,16,237,50,1,93,93,47,94,93,113,51,51,237,23,50,47,93,51,51,17,51,17,
51,49,48,0,43,93,1,43,113,113,113,113,1,21,20,22,51,50,54,55,21,14,1,35,34,
53,17,35,53,51,17,35,53,51,55,51,21,51,21,35,17,51,21,1,80,51,63,26,49,29,
41,85,56,216,125,125,125,132,53,120,200,200,200,2,4,248,78,63,8,6,133,11,
13,245,1,31,131,1,48,131,242,242,131,254,208,131,255,255,0,158,255,236,5,
41,7,6,18,38,0,56,0,0,17,7,2,153,1,148,0,0,0,19,64,11,1,26,5,38,1,0,35,49,
5,20,37,1,43,53,0,43,53,0,0,0,255,255,0,133,255,236,3,235,5,189,18,38,0,88,
0,0,17,7,1,78,0,246,0,0,0,19,64,11,1,38,17,38,1,13,47,61,36,19,37,1,43,53,
0,43,53,0,0,0,255,255,0,158,255,236,5,41,6,156,18,38,0,56,0,0,17,7,1,73,1,
159,1,73,0,19,64,11,1,26,5,38,1,1,27,26,5,20,37,1,43,53,0,43,53,0,0,0,255,
255,0,133,255,236,3,235,5,83,18,38,0,88,0,0,17,7,1,73,0,240,0,0,0,21,180,
1,38,17,38,1,184,255,254,180,39,38,36,19,37,1,43,53,0,43,53,0,255,255,0,158,
255,236,5,41,6,243,18,38,0,56,0,0,17,7,2,155,1,174,0,0,0,19,64,11,1,26,5,
38,1,0,31,39,5,20,37,1,43,53,0,43,53,0,0,0,255,255,0,133,255,236,3,235,5,
230,18,38,0,88,0,0,17,7,1,74,1,11,0,0,0,21,180,1,38,17,38,1,184,255,253,180,
43,55,36,19,37,1,43,53,0,43,53,0,255,255,0,158,255,236,5,41,7,62,18,38,0,
56,0,0,17,7,1,76,1,191,0,203,0,23,64,13,2,1,31,5,38,2,1,0,36,26,5,20,37,1,
43,53,53,0,43,53,53,0,0,0,255,255,0,133,255,236,3,235,6,115,18,38,0,88,0,
0,17,7,1,76,1,20,0,0,0,23,64,13,2,1,43,17,38,2,1,1,48,38,36,19,37,1,43,53,
53,0,43,53,53,0,0,0,255,255,0,158,255,236,5,41,6,241,18,38,0,56,0,0,17,7,
2,154,1,157,0,0,0,23,64,13,2,1,26,5,38,2,1,81,26,35,5,20,37,1,43,53,53,0,
43,53,53,0,0,0,255,255,0,133,255,236,4,30,5,228,18,38,0,88,0,0,17,7,1,79,
1,5,0,0,0,23,64,13,2,1,38,17,38,2,1,100,38,47,36,19,37,1,43,53,53,0,43,53,
53,0,0,0,255,255,0,158,254,85,5,41,5,129,16,38,0,56,0,0,17,7,1,77,2,32,0,
0,0,40,185,0,1,254,103,181,39,39,21,21,37,51,184,255,192,179,21,21,72,51,
184,255,192,179,20,20,72,51,184,255,192,178,19,19,72,43,43,43,43,53,0,0,255,
255,0,133,254,85,4,5,4,58,18,38,0,88,0,0,17,7,1,77,2,87,0,0,0,13,185,0,1,
255,226,180,50,50,14,14,37,43,53,0,255,255,0,9,0,0,7,134,6,254,18,38,0,58,
0,0,17,7,2,150,2,121,0,0,0,21,180,1,48,5,38,1,184,255,253,180,53,47,15,46,
37,1,43,53,0,43,53,0,255,255,255,253,0,0,5,204,5,211,18,38,0,90,0,0,17,7,
1,71,1,148,0,0,0,21,180,1,44,17,38,1,184,255,251,180,49,43,15,42,37,1,43,
53,0,43,53,0,255,255,0,45,0,0,5,41,6,254,18,38,0,60,0,0,17,7,2,150,1,91,0,
0,0,21,180,1,10,5,38,1,184,255,251,180,15,9,4,8,37,1,43,53,0,43,53,0,255,
255,0,5,254,87,3,252,5,211,18,38,0,92,0,0,17,7,1,71,0,182,0,0,0,19,64,11,
1,33,17,38,1,0,38,32,17,31,37,1,43,53,0,43,53,0,0,0,255,255,0,45,0,0,5,41,
6,178,18,38,0,60,0,0,17,7,2,152,1,104,0,0,0,23,64,13,2,1,9,5,38,2,1,0,13,
11,4,8,37,1,43,53,53,0,43,53,53,0,0,0,255,255,0,65,0,0,4,163,6,240,18,38,
0,61,0,0,17,7,2,149,1,160,0,0,0,19,64,11,1,10,5,38,1,74,10,13,1,0,37,1,43,
53,0,43,53,0,0,0,255,255,0,49,0,0,3,182,5,228,18,38,0,93,0,0,17,7,0,116,1,
53,0,0,0,19,64,11,1,10,17,38,1,93,10,13,0,8,37,1,43,53,0,43,53,0,0,0,255,
255,0,65,0,0,4,163,6,241,18,38,0,61,0,0,17,7,1,75,1,124,1,37,0,19,64,11,1,
10,5,38,1,0,10,12,1,0,37,1,43,53,0,43,53,0,0,0,255,255,0,49,0,0,3,182,5,204,
18,38,0,93,0,0,17,7,1,75,0,253,0,0,0,12,182,1,0,10,12,0,8,37,1,43,53,0,0,
0,255,255,0,65,0,0,4,163,6,254,18,38,0,61,0,0,17,7,2,151,1,56,0,0,0,19,64,
11,1,10,5,38,1,17,12,18,1,0,37,1,43,53,0,43,53,0,0,0,255,255,0,49,0,0,3,182,
5,211,18,38,0,93,0,0,17,7,1,72,0,156,0,0,0,21,180,1,10,17,38,1,184,255,244,
180,12,18,0,8,37,1,43,53,0,43,53,0,0,1,0,138,0,0,2,17,5,202,0,19,0,125,185,
0,5,255,216,179,13,17,72,5,184,255,224,64,56,8,12,72,111,10,1,10,10,0,70,
0,1,16,1,48,1,240,1,4,8,1,255,21,1,224,21,1,223,21,1,176,21,192,21,2,159,
21,1,112,21,128,21,2,31,21,1,0,21,1,240,21,1,223,21,1,21,184,255,192,64,18,
34,37,72,79,21,1,112,21,1,31,21,1,14,80,7,0,0,21,0,63,63,237,1,93,93,113,
43,113,113,114,114,114,114,114,114,114,114,47,94,93,237,50,47,93,49,48,0,
43,43,33,35,17,52,62,2,51,50,22,23,21,46,1,35,34,14,2,21,1,62,180,22,59,102,
81,32,69,26,17,45,18,40,51,29,11,4,180,59,101,75,43,6,6,137,3,5,22,41,60,
39,0,0,0,0,1,0,192,254,78,3,195,5,174,0,27,0,148,64,107,133,6,1,122,18,138,
18,2,139,15,1,89,15,105,15,121,15,3,131,13,1,85,13,101,13,117,13,3,54,13,
1,38,7,1,38,8,1,34,22,50,22,114,22,130,22,4,21,17,37,17,53,17,3,27,212,8,
228,8,244,8,3,80,8,144,8,2,38,8,54,8,70,8,3,8,10,27,3,13,13,17,19,3,8,95,
14,159,14,2,14,12,16,80,9,17,17,13,3,81,15,24,127,24,175,24,3,24,13,0,47,
47,93,237,18,57,47,51,237,50,1,47,113,51,23,51,17,23,51,113,113,113,47,49,
48,93,0,93,1,93,93,93,93,93,93,93,93,93,1,46,1,35,34,14,2,15,1,51,7,35,3,
35,19,35,55,51,55,62,3,51,50,22,23,3,164,17,62,31,31,46,33,24,9,26,211,25,
213,254,180,254,152,27,151,29,12,40,71,109,81,32,82,35,5,32,5,10,19,40,64,
45,137,131,250,211,5,45,131,152,59,102,76,43,10,10,0,0,0,4,0,4,0,0,5,82,7,
62,0,26,0,39,0,61,0,67,1,36,64,18,122,64,138,64,2,102,5,118,5,134,5,3,86,
6,102,6,2,25,184,255,232,64,183,9,17,72,19,24,9,17,72,12,16,14,17,72,10,12,
1,12,38,9,10,32,8,39,32,7,32,40,130,0,68,66,132,66,2,66,62,50,130,17,175,
62,191,62,207,62,3,15,17,47,17,2,144,17,1,0,0,32,0,2,15,0,159,0,2,0,62,17,
17,62,0,3,6,11,5,32,32,10,7,139,7,1,90,7,106,7,122,7,3,7,16,6,32,6,48,6,3,
32,6,1,6,6,69,80,69,176,69,2,48,69,96,69,144,69,192,69,240,69,5,47,69,1,132,
10,1,85,10,101,10,117,10,3,10,11,62,62,45,141,112,22,128,22,2,22,22,57,127,
64,159,64,175,64,191,64,4,64,64,9,13,72,64,8,9,39,38,38,10,5,12,32,3,128,
57,1,63,57,1,0,57,1,57,7,7,10,0,47,51,47,47,93,93,93,23,51,18,57,47,51,205,
50,47,43,93,18,57,47,93,237,51,47,1,47,51,93,93,93,93,113,17,51,47,93,113,
51,93,93,17,18,57,17,51,17,18,23,57,47,47,47,93,113,93,113,93,16,237,16,205,
93,16,237,16,135,192,192,135,192,192,1,51,49,48,93,43,43,43,93,93,93,1,20,
6,7,6,7,1,35,3,33,3,35,1,38,39,46,1,53,52,62,2,51,50,30,2,3,46,3,39,14,3,
7,3,33,3,52,46,2,35,34,14,2,21,20,30,1,23,22,23,51,50,62,2,3,53,55,51,21,
5,3,158,38,33,16,18,2,29,195,161,253,126,162,198,2,36,21,18,33,38,38,66,88,
50,50,88,66,38,158,16,29,22,15,1,2,14,23,29,15,180,2,15,131,21,36,49,28,29,
49,36,21,21,36,24,21,24,9,28,49,36,21,247,217,207,254,202,5,112,45,79,30,
15,11,251,68,1,115,254,141,4,185,12,17,30,79,45,45,79,59,34,34,59,79,253,
254,36,74,60,41,4,4,41,62,73,36,254,95,3,119,25,44,33,19,19,33,44,25,26,44,
35,10,8,1,19,35,44,1,35,16,181,23,174,0,255,255,0,87,255,236,4,115,7,62,18,
38,0,68,0,0,16,39,1,76,1,20,255,85,17,7,0,116,1,99,1,90,0,35,64,14,3,2,101,
16,38,4,26,106,109,3,36,37,3,2,184,255,212,180,76,66,3,36,37,1,43,53,53,43,
53,0,43,53,53,0,0,0,255,255,0,24,0,0,7,168,6,240,18,38,0,134,0,0,17,7,2,149,
3,228,0,0,0,21,180,2,27,5,38,2,184,1,32,180,27,30,4,14,37,1,43,53,0,43,53,
0,255,255,0,66,255,236,6,194,5,228,18,38,0,166,0,0,17,7,0,116,2,175,0,0,0,
19,64,11,3,89,17,38,3,73,89,92,25,61,37,1,43,53,0,43,53,0,0,0,255,255,0,71,
255,203,5,244,6,240,18,38,0,152,0,0,17,7,2,149,2,75,0,0,0,19,64,11,3,52,5,
38,3,73,52,55,10,24,37,1,43,53,0,43,53,0,0,0,255,255,0,44,255,218,4,180,5,
228,18,38,0,184,0,0,17,7,0,116,1,178,0,0,0,19,64,11,3,46,17,38,3,94,46,49,
8,19,37,1,43,53,0,43,53,0,0,0,0,1,0,0,4,177,2,150,5,211,0,9,0,66,64,14,118,
9,134,9,2,120,8,136,8,2,128,0,1,0,184,255,192,64,27,11,15,72,0,191,6,1,6,
4,142,64,8,148,128,6,15,1,47,1,63,1,127,1,239,1,5,1,0,47,93,51,26,253,26,
237,1,47,93,204,43,93,49,48,93,93,1,21,35,39,35,7,35,53,19,51,2,150,105,219,
2,232,104,234,204,4,197,20,169,169,20,1,14,0,0,1,0,0,4,177,2,150,5,211,0,
9,0,66,64,14,118,0,134,0,2,120,1,136,1,2,128,8,1,8,184,255,192,64,27,11,15,
72,8,64,191,2,1,2,7,3,148,128,6,142,15,1,47,1,63,1,127,1,239,1,5,1,0,47,93,
237,26,237,50,1,47,93,26,204,43,93,49,48,93,93,1,35,3,53,51,23,51,55,51,21,
1,182,204,234,104,232,2,219,105,4,177,1,14,20,169,169,20,0,0,1,0,51,4,212,
2,88,5,83,0,3,0,81,64,59,4,1,1,228,1,244,1,2,1,164,0,1,91,0,107,0,2,52,0,
68,0,2,0,2,32,18,25,72,2,142,1,64,28,33,72,47,1,1,2,15,1,63,1,175,1,191,1,
4,1,64,22,26,72,1,64,14,17,72,1,0,47,43,43,93,95,113,43,237,43,1,47,93,93,
93,47,93,113,49,48,1,33,53,33,2,88,253,219,2,37,4,212,127,0,1,255,221,4,177,
2,119,5,230,0,21,0,73,64,51,133,14,1,133,8,1,31,17,79,17,127,17,175,17,223,
17,5,239,17,1,17,64,5,64,29,60,72,5,16,80,5,96,5,2,5,149,128,11,143,15,0,
47,0,63,0,127,0,239,0,5,0,0,47,93,237,26,237,113,50,1,47,43,26,204,93,113,
49,48,0,93,93,1,34,46,2,39,51,30,3,51,50,62,2,55,51,14,3,1,41,74,116,84,50,
8,117,8,39,56,72,42,42,71,56,38,8,117,9,50,83,116,4,177,51,85,112,61,43,59,
36,15,16,36,59,42,61,112,85,51,0,1,0,156,5,32,1,80,5,204,0,3,0,23,64,12,3,
134,0,64,14,17,72,0,0,83,1,0,0,63,237,1,47,43,237,49,48,19,53,51,21,156,180,
5,32,172,172,0,0,2,0,51,4,144,2,23,6,115,0,19,0,39,0,89,185,0,18,255,232,
64,14,9,14,72,12,24,9,14,72,8,24,9,14,72,2,184,255,232,64,42,9,14,72,20,130,
64,0,192,30,130,95,10,1,10,25,141,15,15,31,15,2,15,35,141,15,5,47,5,63,5,
79,5,127,5,159,5,191,5,239,5,8,5,0,47,93,237,220,93,237,1,47,93,237,26,220,
26,237,49,48,43,43,43,43,1,20,14,2,35,34,46,2,53,52,62,2,51,50,30,2,7,52,
46,2,35,34,14,2,21,20,30,2,51,50,62,2,2,23,38,66,88,50,50,88,66,38,38,66,
88,50,50,88,66,38,108,21,36,49,28,29,49,36,21,21,36,49,29,28,49,36,21,5,130,
50,88,66,38,38,66,88,50,50,88,65,38,38,65,88,50,28,49,36,21,21,36,49,28,29,
49,38,21,21,38,49,0,0,0,0,1,0,80,254,85,1,174,0,0,0,23,0,76,64,55,14,24,9,
13,72,9,24,9,13,72,5,32,9,17,72,12,17,132,15,0,31,0,2,95,0,191,0,2,0,6,11,
64,7,10,72,11,20,141,16,3,1,32,3,80,3,96,3,112,3,176,3,192,3,6,3,0,47,93,
113,237,47,43,1,47,205,93,113,237,50,49,48,43,43,43,1,14,1,35,34,38,53,52,
62,2,55,51,14,3,21,20,22,51,50,54,55,1,174,28,71,40,105,106,34,48,53,20,133,
25,52,43,27,49,45,29,58,28,254,112,12,15,102,85,47,79,61,42,11,14,45,59,70,
39,42,48,13,11,0,1,255,233,4,177,2,182,5,189,0,27,2,77,185,0,26,255,232,64,
182,9,17,72,12,24,9,17,72,41,29,1,25,29,41,29,57,29,89,29,105,29,5,29,64,
229,232,72,29,64,217,220,72,11,29,1,208,169,29,185,29,201,29,3,155,29,1,9,
29,57,29,2,185,29,201,29,217,29,3,29,64,195,198,72,155,29,171,29,2,137,29,
1,123,29,1,73,29,1,137,29,185,29,2,29,64,171,175,72,6,29,54,29,2,158,153,
29,1,125,29,141,29,2,111,29,1,45,29,61,29,77,29,3,27,29,1,13,29,1,237,29,
253,29,2,29,128,136,139,72,137,29,153,29,2,91,29,107,29,123,29,3,29,192,127,
130,72,9,29,1,249,29,1,235,29,1,201,29,217,29,2,171,29,187,29,2,153,29,1,
22,29,38,29,102,29,118,29,134,29,5,4,29,1,110,29,184,255,64,64,96,101,109,
72,148,29,1,112,29,128,29,2,82,29,98,29,2,64,29,1,18,29,34,29,50,29,3,4,29,
1,228,29,244,29,2,214,29,1,196,29,1,176,29,1,162,29,1,128,29,144,29,2,82,
29,98,29,114,29,3,36,29,52,29,68,29,3,6,29,22,29,2,246,29,1,210,29,226,29,
2,192,29,1,146,29,162,29,178,29,3,100,29,116,29,132,29,3,29,184,255,192,64,
9,60,64,72,2,29,1,59,1,29,184,255,128,64,57,53,58,72,164,29,180,29,2,144,
29,1,100,29,116,29,132,29,3,48,29,64,29,80,29,3,4,29,20,29,36,29,3,208,29,
224,29,2,164,29,180,29,196,29,3,112,29,128,29,2,148,29,164,29,228,29,3,29,
184,255,192,64,19,26,31,72,128,29,1,84,29,100,29,116,29,3,29,64,7,10,72,23,
184,255,128,64,9,36,39,72,148,23,164,23,2,23,184,255,128,64,23,30,33,72,68,
23,1,48,23,1,2,0,23,16,23,32,23,3,208,23,224,23,2,23,184,255,192,64,43,13,
19,72,15,23,1,23,9,22,22,5,143,64,15,14,31,14,2,255,14,1,14,64,16,19,72,14,
128,19,143,8,15,0,47,0,63,0,127,0,239,0,5,0,0,47,93,50,237,26,221,43,93,113,
26,237,51,47,1,47,204,93,43,93,113,95,113,113,43,113,43,43,93,93,43,93,113,
113,113,114,114,114,114,114,43,95,94,93,43,93,93,93,93,93,113,113,113,113,
113,113,113,113,113,114,114,114,114,114,114,43,94,93,93,93,93,93,93,93,113,
43,113,113,43,113,114,114,114,114,114,114,94,93,43,93,113,113,113,113,43,
113,114,114,114,94,93,43,43,93,113,49,48,43,43,1,34,46,2,35,34,6,7,35,62,
3,51,50,30,2,51,50,54,55,51,14,3,1,236,42,84,78,71,31,55,54,9,91,5,20,45,
74,59,44,84,78,69,30,54,55,8,92,5,20,43,74,4,177,37,45,37,62,57,45,95,78,
50,37,45,37,63,56,44,95,78,51,0,0,0,2,0,22,4,177,3,25,5,228,0,5,0,11,0,111,
64,82,164,10,1,102,10,1,154,8,170,8,2,98,4,162,4,2,98,3,1,154,2,170,2,2,10,
159,6,1,15,6,31,6,127,6,223,6,4,7,6,4,64,63,0,79,0,143,0,175,0,191,0,207,
0,6,0,64,30,41,72,0,64,23,26,72,0,8,2,149,128,6,15,0,47,0,63,0,127,0,239,
0,5,0,0,47,93,50,26,237,50,1,47,43,43,93,26,205,220,94,93,113,205,49,48,93,
93,93,93,93,93,19,53,19,51,21,1,51,53,19,51,21,1,22,217,207,254,182,253,217,
207,254,182,4,177,20,1,31,29,254,234,20,1,31,29,254,234,0,0,1,0,205,4,194,
1,225,6,7,0,5,0,64,64,43,2,16,12,17,72,41,2,1,10,5,26,5,42,5,3,3,43,3,1,3,
64,0,2,128,132,0,148,0,2,112,0,1,2,16,0,32,0,64,0,96,0,4,0,0,47,93,95,93,
93,26,205,1,47,26,205,93,49,48,95,93,93,43,19,53,19,51,21,3,205,69,207,201,
4,194,33,1,36,37,254,224,0,3,0,29,4,176,2,139,6,65,0,5,0,9,0,13,0,83,64,53,
2,16,11,17,72,10,5,26,5,42,5,3,47,4,1,4,47,1,1,1,1,6,192,13,208,13,2,13,10,
192,9,208,9,2,9,6,11,7,144,6,2,0,0,10,192,6,1,15,6,63,6,2,6,0,47,93,93,51,
51,47,205,16,237,50,1,47,205,93,47,205,93,18,57,47,113,205,93,49,48,93,43,
19,53,19,51,21,3,37,53,51,21,33,53,51,21,250,69,187,181,254,216,150,1,66,
150,4,176,33,1,112,37,254,148,31,172,172,172,172,0,0,255,255,0,4,0,0,5,82,
5,131,16,38,0,36,0,0,17,7,1,80,255,108,255,124,0,94,179,2,0,24,1,184,255,
10,181,24,24,5,5,37,28,184,255,192,179,36,36,72,28,184,255,192,179,30,30,
72,28,184,255,192,179,24,24,72,28,184,255,192,179,21,21,72,28,184,255,192,
179,18,18,72,28,184,255,192,179,15,15,72,28,184,255,192,64,11,12,12,72,28,
64,11,11,72,2,23,3,0,63,53,1,43,43,43,43,43,43,43,43,43,93,53,0,1,0,187,1,
190,1,126,2,154,0,3,2,10,179,3,134,0,5,184,255,128,64,12,229,233,72,6,5,22,
5,2,246,5,1,5,184,255,128,64,33,222,225,72,150,5,166,5,2,116,5,132,5,2,86,
5,102,5,2,68,5,1,38,5,54,5,2,2,5,18,5,2,211,5,184,255,128,64,22,207,210,72,
198,5,214,5,2,180,5,1,150,5,166,5,2,116,5,132,5,2,5,184,255,192,64,36,195,
199,72,4,5,20,5,2,214,5,230,5,246,5,3,194,5,1,148,5,164,5,180,5,3,118,5,134,
5,2,84,5,100,5,2,5,184,255,192,64,34,174,181,72,164,5,180,5,196,5,3,70,5,
86,5,118,5,134,5,150,5,5,52,5,1,38,5,1,4,5,20,5,2,161,5,184,255,192,179,157,
160,72,5,184,255,192,64,37,152,155,72,100,5,116,5,2,54,5,70,5,86,5,3,36,5,
1,6,5,22,5,2,244,5,1,214,5,230,5,2,178,5,194,5,2,5,184,255,128,64,28,135,
138,72,86,5,102,5,2,36,5,52,5,68,5,3,2,5,18,5,2,212,5,228,5,244,5,3,5,184,
255,192,64,23,119,124,72,82,5,98,5,2,1,32,5,48,5,64,5,3,4,5,20,5,2,112,5,
184,255,128,64,9,103,111,72,68,5,84,5,2,5,184,255,192,179,99,102,72,5,184,
255,128,179,92,95,72,5,184,255,192,179,87,91,72,5,184,255,128,64,21,81,86,
72,36,5,52,5,68,5,3,228,5,1,176,5,192,5,208,5,3,5,184,255,192,64,16,67,70,
72,48,5,1,36,5,1,0,5,16,5,2,60,5,184,255,192,64,12,56,59,72,187,5,1,128,5,
144,5,2,5,184,255,192,64,41,45,48,72,11,5,1,208,5,224,5,2,164,5,180,5,196,
5,3,32,5,48,5,2,2,0,5,16,5,2,240,5,1,159,5,175,5,2,0,5,1,5,184,255,192,181,
13,17,72,0,155,1,0,47,237,1,43,93,93,93,113,95,113,113,113,114,43,114,114,
43,94,93,93,93,43,93,93,113,43,43,43,43,114,43,94,93,93,95,93,43,93,113,113,
113,43,113,113,113,114,114,114,114,43,43,94,93,93,93,93,93,43,113,113,113,
113,113,114,43,114,114,114,114,43,94,93,93,93,93,93,93,43,93,113,43,47,237,
49,48,19,53,51,21,187,195,1,190,220,220,0,0,255,255,255,245,0,0,5,238,5,131,
16,39,0,40,0,240,0,0,17,7,1,80,255,40,255,124,0,49,64,10,1,14,3,1,16,15,1,
0,15,1,184,255,113,64,19,15,15,1,1,37,0,208,0,1,191,0,1,47,0,1,47,0,1,0,16,
93,93,93,93,53,43,93,93,53,0,63,53,0,0,0,255,255,255,242,0,0,6,13,5,131,16,
39,0,43,0,237,0,0,17,7,1,80,255,37,255,124,0,95,185,0,19,255,192,179,21,21,
72,19,184,255,192,179,20,20,72,19,184,255,192,179,19,19,72,19,184,255,192,
179,17,17,72,19,184,255,192,64,13,14,14,72,1,14,3,1,16,15,1,0,15,1,184,255,
113,64,19,15,15,5,5,37,0,207,0,1,191,0,1,111,0,1,47,0,1,0,16,93,93,93,93,
53,43,93,93,53,0,63,53,1,43,43,43,43,43,0,255,255,255,232,0,0,2,85,5,131,
16,39,0,44,0,217,0,0,17,7,1,80,255,27,255,124,0,92,185,0,11,255,192,179,17,
17,72,11,184,255,192,64,23,12,12,72,11,64,11,11,72,11,64,9,9,72,1,6,3,1,16,
7,1,0,7,1,184,255,102,64,28,7,7,1,1,37,0,128,0,1,127,0,1,111,0,1,95,0,1,79,
0,1,47,0,1,47,0,1,0,16,93,93,93,93,93,93,93,53,43,93,93,53,0,63,53,1,43,43,
43,43,255,255,255,187,255,236,5,211,5,150,16,38,0,50,252,0,17,7,1,80,254,
238,255,124,0,39,64,10,2,42,3,2,192,40,1,0,40,1,184,255,94,64,11,40,40,10,
10,37,1,0,47,0,1,0,16,93,53,53,43,93,93,53,0,63,53,0,0,0,255,255,0,65,0,0,
6,171,5,131,16,39,0,60,1,130,0,0,17,7,1,80,255,116,255,124,5,192,64,21,16,
64,233,233,72,16,64,229,229,72,16,64,227,227,72,16,64,226,226,72,16,184,255,
192,179,224,224,72,16,184,255,192,64,19,222,222,72,16,64,220,220,72,16,64,
219,219,72,16,64,216,216,72,16,184,255,192,179,215,215,72,16,184,255,192,
64,19,211,211,72,16,64,207,207,72,16,64,206,206,72,16,64,205,205,72,16,184,
255,192,179,204,204,72,16,184,255,192,64,19,202,202,72,16,64,199,199,72,16,
64,186,186,72,16,64,184,184,72,16,184,255,192,179,183,183,72,16,184,255,192,
64,14,182,182,72,16,64,179,179,72,16,64,177,177,72,16,184,255,192,64,19,172,
172,72,16,64,166,166,72,16,64,164,164,72,16,64,163,163,72,16,184,255,192,
64,24,161,161,72,16,64,156,156,72,16,128,153,153,72,16,64,152,152,72,16,64,
151,151,72,16,184,255,192,179,149,149,72,16,184,255,128,179,148,148,72,16,
184,255,128,179,147,147,72,16,184,255,192,179,146,146,72,16,184,255,128,179,
145,145,72,16,184,255,192,179,144,144,72,16,184,255,128,179,141,141,72,16,
184,255,128,179,140,140,72,16,184,255,192,179,139,139,72,16,184,255,128,179,
138,138,72,16,184,255,192,179,137,137,72,16,184,255,192,179,136,136,72,16,
184,255,192,179,135,135,72,16,184,255,128,179,134,134,72,16,184,255,192,179,
133,133,72,16,184,255,128,179,131,131,72,16,184,255,192,179,130,130,72,16,
184,255,0,179,129,129,72,16,184,255,0,179,128,128,72,16,184,254,192,179,127,
127,72,16,184,255,0,179,126,126,72,16,184,255,0,179,125,125,72,16,184,255,
64,179,124,124,72,16,184,255,64,179,123,123,72,16,184,255,64,179,122,122,
72,16,184,255,0,179,121,121,72,16,184,254,192,179,120,120,72,16,184,255,0,
179,119,119,72,16,184,255,0,179,118,118,72,16,184,255,64,179,117,117,72,16,
184,255,0,179,116,116,72,16,184,255,64,179,115,115,72,16,184,255,0,179,114,
114,72,16,184,255,64,179,113,113,72,16,184,255,64,179,112,112,72,16,184,255,
64,179,111,111,72,16,184,255,128,179,110,110,72,16,184,255,64,179,109,109,
72,16,184,255,128,179,108,108,72,16,184,255,0,179,107,107,72,16,184,255,64,
179,106,106,72,16,184,255,0,179,105,105,72,16,184,255,64,179,104,104,72,16,
184,255,64,179,103,103,72,16,184,255,64,179,102,102,72,16,184,255,128,179,
101,101,72,16,184,255,64,179,100,100,72,16,184,255,64,179,99,99,72,16,184,
255,0,179,98,98,72,16,184,255,64,179,97,97,72,16,184,255,64,179,96,96,72,
16,184,255,64,179,95,95,72,16,184,255,64,179,94,94,72,16,184,255,64,179,93,
93,72,16,184,255,128,179,92,92,72,16,184,255,64,179,91,91,72,16,184,255,128,
179,90,90,72,16,184,255,64,179,89,89,72,16,184,255,128,179,88,88,72,16,184,
255,64,179,87,87,72,16,184,255,64,179,86,86,72,16,184,255,64,179,85,85,72,
16,184,255,64,179,84,84,72,16,184,255,64,179,83,83,72,16,184,255,128,179,
82,82,72,16,184,255,192,179,81,81,72,16,184,255,128,179,80,80,72,16,184,255,
128,179,79,79,72,16,184,255,64,179,78,78,72,16,184,255,64,179,77,77,72,16,
184,255,64,179,76,76,72,16,184,255,128,179,75,75,72,16,184,255,128,179,74,
74,72,16,184,255,128,179,73,73,72,16,184,255,64,179,72,72,72,16,184,255,128,
179,71,71,72,16,184,255,192,179,70,70,72,16,184,255,128,179,69,69,72,16,184,
255,192,179,68,68,72,16,184,255,192,179,67,67,72,16,184,255,128,179,66,66,
72,16,184,255,64,179,65,65,72,16,184,255,128,179,64,64,72,16,184,255,128,
179,63,63,72,16,184,255,128,179,62,62,72,16,184,255,192,179,61,61,72,16,184,
255,192,179,60,60,72,16,184,255,192,179,59,59,72,16,184,255,128,179,58,58,
72,16,184,255,128,179,57,57,72,16,184,255,128,179,56,56,72,16,184,255,128,
179,55,55,72,16,184,255,128,179,54,54,72,16,184,255,192,179,53,53,72,16,184,
255,192,179,52,52,72,16,184,255,128,179,51,51,72,16,184,255,192,179,50,50,
72,16,184,255,128,179,49,49,72,16,184,255,128,179,48,48,72,16,184,255,128,
179,47,47,72,16,184,255,192,179,46,46,72,16,184,255,128,179,45,45,72,16,184,
255,128,179,44,44,72,16,184,255,128,179,43,43,72,16,184,255,192,179,42,42,
72,16,184,255,192,179,41,41,72,16,184,255,192,179,40,40,72,16,184,255,192,
179,39,39,72,16,184,255,128,179,38,38,72,16,184,255,128,179,37,37,72,16,184,
255,128,179,36,36,72,16,184,255,192,179,35,35,72,16,184,255,128,179,34,34,
72,16,184,255,192,179,33,33,72,16,184,255,192,179,32,32,72,16,184,255,192,
179,31,31,72,16,184,255,192,179,30,30,72,16,184,255,192,179,29,29,72,16,184,
255,192,179,28,28,72,16,184,255,192,179,27,27,72,16,184,255,192,179,26,26,
72,16,184,255,192,179,25,25,72,16,184,255,192,179,24,24,72,16,184,255,128,
179,23,23,72,16,184,255,192,179,22,22,72,16,184,255,192,179,21,21,72,16,184,
255,192,179,17,17,72,16,184,255,128,179,16,16,72,16,184,255,192,179,15,15,
72,16,184,255,192,179,14,14,72,16,184,255,192,64,30,12,12,72,16,64,11,11,
72,1,11,3,1,128,12,1,112,12,1,96,12,1,64,12,1,16,12,1,0,12,1,184,255,166,
64,13,12,12,4,4,37,0,176,0,1,0,0,1,0,16,93,93,53,43,93,93,93,93,93,93,53,
0,63,53,1,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,255,255,255,187,0,0,
5,173,5,150,16,38,1,114,10,0,17,7,1,80,254,238,255,124,0,68,64,15,65,64,19,
19,72,1,60,3,1,144,58,1,16,58,1,184,255,62,64,28,58,58,53,53,37,0,159,0,1,
95,0,1,31,0,1,223,0,1,175,0,1,159,0,1,31,0,1,0,16,93,93,93,93,113,113,113,
53,43,93,93,53,0,63,53,1,43,0,0,255,255,255,176,0,0,2,30,6,65,16,38,1,130,
0,0,17,6,1,81,147,0,2,60,64,11,29,64,227,227,72,29,64,226,226,72,29,184,255,
192,179,223,223,72,29,184,255,192,179,220,220,72,29,184,255,192,64,19,219,
219,72,29,64,213,213,72,29,64,212,212,72,29,64,211,211,72,29,184,255,192,
179,207,207,72,29,184,255,192,179,206,206,72,29,184,255,192,64,19,205,205,
72,29,64,200,200,72,29,64,199,199,72,29,64,198,198,72,29,184,255,192,64,14,
192,192,72,29,64,182,182,72,29,64,177,177,72,29,184,255,192,179,175,175,72,
29,184,255,192,64,19,174,174,72,29,64,168,168,72,29,64,167,167,72,29,64,164,
164,72,29,184,255,192,179,161,161,72,29,184,255,192,64,19,160,160,72,29,64,
155,155,72,29,64,154,154,72,29,64,153,153,72,29,184,255,192,179,152,152,72,
29,184,255,192,64,19,151,151,72,29,64,141,141,72,29,64,132,132,72,29,64,131,
131,72,29,184,255,192,64,9,129,129,72,29,64,119,119,72,29,184,255,192,64,
14,115,115,72,29,64,110,110,72,29,64,109,109,72,29,184,255,192,64,19,106,
106,72,29,64,101,101,72,29,64,100,100,72,29,64,96,96,72,29,184,255,192,179,
94,94,72,29,184,255,192,64,19,93,93,72,29,64,87,87,72,29,64,86,86,72,29,64,
85,85,72,29,184,255,192,179,84,84,72,29,184,255,192,64,9,79,79,72,29,64,74,
74,72,29,184,255,192,64,24,61,61,72,29,64,56,56,72,29,64,55,55,72,29,64,54,
54,72,29,64,51,51,72,29,184,255,192,179,50,50,72,29,184,255,192,179,49,49,
72,29,184,255,192,64,19,48,48,72,29,64,42,42,72,29,64,41,41,72,29,64,40,40,
72,29,184,255,192,179,36,36,72,29,184,255,192,179,35,35,72,29,184,255,192,
64,19,34,34,72,29,64,29,29,72,29,64,24,24,72,29,64,23,23,72,29,184,255,192,
179,21,21,72,29,184,255,192,179,17,17,72,29,184,255,192,64,14,16,16,72,29,
64,9,9,72,29,64,8,8,72,29,184,255,192,64,12,7,7,72,3,2,1,14,17,38,3,2,1,184,
255,220,180,20,26,5,13,37,1,43,53,53,53,0,43,53,53,53,1,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,255,255,0,4,0,0,5,82,5,129,
18,6,0,36,0,0,255,255,0,168,0,0,4,234,5,129,18,6,0,37,0,0,0,1,0,168,0,1,4,
47,5,130,0,5,0,56,64,40,3,90,0,4,16,4,64,4,3,4,16,0,48,0,80,0,3,0,0,16,0,
32,0,64,0,96,0,128,0,160,0,7,7,0,2,95,5,3,3,18,0,63,63,237,1,47,94,93,113,
47,93,237,49,48,1,21,33,17,35,17,4,47,253,56,191,5,130,156,251,27,5,129,0,
2,0,61,0,0,5,26,5,129,0,5,0,18,0,176,64,26,106,7,122,7,138,7,3,101,17,117,
17,133,17,3,89,8,1,86,16,1,6,24,13,17,72,18,184,255,232,64,64,13,17,72,132,
2,1,70,2,102,2,118,2,3,139,1,1,73,1,105,1,121,1,3,2,1,12,12,0,6,95,3,1,16,
3,1,15,3,1,175,3,207,3,223,3,255,3,4,79,3,127,3,2,48,3,1,31,3,1,3,18,128,
0,1,0,184,255,192,64,29,21,30,72,0,48,20,1,47,20,1,0,3,6,3,18,95,5,18,12,
32,19,22,72,153,12,1,12,1,3,0,63,51,93,43,63,237,23,50,1,93,93,47,43,93,51,
47,93,93,93,93,113,113,113,51,18,57,61,47,51,51,49,48,93,93,93,93,43,43,93,
93,93,93,49,48,55,1,51,1,21,33,37,1,46,3,39,14,3,7,1,62,2,5,217,1,254,251,
35,4,21,254,174,16,29,22,15,1,2,14,23,28,16,254,173,141,4,244,251,12,141,
156,3,94,40,82,69,48,8,8,49,70,82,40,252,164,255,255,0,168,0,0,4,254,5,129,
18,6,0,40,0,0,255,255,0,65,0,0,4,163,5,129,18,6,0,61,0,0,255,255,0,168,0,
0,5,32,5,129,18,6,0,43,0,0,0,3,0,97,255,236,5,215,5,150,0,19,0,39,0,43,0,
179,64,130,105,12,1,102,17,1,89,22,1,86,32,1,86,28,1,26,23,90,23,2,21,27,
85,27,2,9,42,1,6,43,1,10,37,26,37,90,37,3,5,33,21,33,85,33,3,9,43,42,30,0,
91,15,20,1,59,207,20,239,20,2,0,20,1,239,20,255,20,2,176,20,1,111,20,1,48,
20,1,31,20,1,0,20,16,20,32,20,64,20,80,20,160,20,6,7,20,30,91,175,10,191,
10,2,32,10,1,15,10,31,10,2,10,43,95,40,40,35,25,95,15,4,35,95,5,19,128,45,
1,32,45,1,93,93,0,63,237,63,237,18,57,47,237,1,47,93,93,93,237,47,94,93,113,
113,113,113,113,114,114,94,93,237,18,57,57,49,48,94,93,93,93,93,93,93,93,
93,93,93,93,1,20,2,6,4,35,34,36,38,2,53,52,18,54,36,51,50,4,22,18,7,52,46,
2,35,34,14,2,21,20,30,2,51,50,62,2,37,33,21,33,5,215,95,180,254,252,165,174,
254,250,174,88,92,178,1,5,169,168,1,5,177,92,195,65,127,188,123,126,190,127,
63,65,127,189,123,132,191,123,59,252,226,2,75,253,181,2,199,165,254,242,192,
104,109,195,1,12,159,165,1,10,187,101,102,188,254,246,163,127,208,148,80,
80,148,208,127,127,211,153,85,86,153,212,208,160,0,0,0,255,255,0,189,0,0,
1,124,5,129,18,6,0,44,0,0,255,255,0,168,0,0,5,63,5,129,18,6,0,46,0,0,0,1,
0,10,0,1,5,78,5,130,0,16,0,202,64,11,116,16,132,16,2,123,15,139,15,2,13,184,
255,232,182,14,17,72,54,13,1,12,184,255,240,64,127,13,17,72,2,16,13,17,72,
1,24,14,17,72,57,1,1,111,18,1,48,18,1,47,18,1,0,18,1,21,16,37,16,53,16,3,
6,16,1,230,16,246,16,2,16,26,15,42,15,58,15,3,9,15,1,233,15,249,15,2,15,7,
7,21,13,37,13,53,13,3,6,13,1,230,13,246,13,2,13,175,14,191,14,2,14,26,1,42,
1,58,1,3,9,1,1,233,1,249,1,2,1,16,0,32,0,48,0,3,111,0,1,0,0,48,0,2,0,118,
7,134,7,2,7,15,3,14,0,18,0,63,50,63,51,93,1,47,93,93,113,50,93,113,113,47,
93,51,93,113,113,57,61,47,51,93,113,113,51,93,113,113,93,93,93,93,49,48,93,
43,43,43,93,43,93,93,37,35,1,46,1,39,38,39,6,7,14,1,7,1,35,1,51,5,78,201,
254,124,17,29,12,14,12,13,14,12,30,15,254,122,201,2,63,198,1,3,224,47,89,
35,41,37,39,41,35,89,45,252,32,5,129,0,255,255,0,168,0,0,6,2,5,129,18,6,0,
48,0,0,255,255,0,168,0,0,5,32,5,129,18,6,0,49,0,0,0,3,0,90,0,0,4,217,5,129,
0,3,0,7,0,11,0,75,64,49,82,3,1,10,9,5,3,95,6,1,15,6,31,6,175,6,191,6,4,6,
2,16,5,48,5,2,32,5,64,5,112,5,160,5,4,5,10,95,11,11,0,7,95,6,18,3,95,0,3,
0,63,237,63,237,17,57,47,237,1,47,93,113,51,47,93,113,51,18,57,57,49,48,113,
19,33,21,33,1,21,33,53,1,21,33,53,125,4,57,251,199,4,92,251,129,3,228,252,
183,5,129,156,251,183,156,156,2,133,154,154,0,0,0,255,255,0,97,255,236,5,
215,5,150,18,6,0,50,0,0,0,1,0,168,0,0,5,32,5,129,0,7,0,79,64,40,3,90,0,4,
16,4,64,4,3,7,4,7,90,64,111,0,127,0,143,0,191,0,4,0,0,9,128,32,9,1,32,9,160,
9,176,9,192,9,4,9,184,255,192,64,10,14,17,72,2,95,5,3,4,0,18,0,63,50,63,237,
1,43,93,113,26,16,204,47,93,26,237,47,94,93,237,49,48,33,17,33,17,35,17,33,
17,4,97,253,6,191,4,120,4,224,251,32,5,129,250,127,255,255,0,168,0,0,4,234,
5,129,18,6,0,51,0,0,0,1,0,108,0,0,4,161,5,129,0,12,0,188,64,135,169,3,1,105,
9,1,116,9,132,9,164,9,3,148,8,164,8,2,87,8,103,8,2,145,7,1,84,7,100,7,2,146,
10,162,10,2,116,10,132,10,2,70,10,86,10,102,10,3,57,3,185,3,2,249,3,1,103,
3,1,168,8,1,103,8,1,8,100,2,1,39,2,1,175,6,1,2,6,2,6,1,208,11,1,0,11,16,11,
48,11,80,11,96,11,128,11,6,7,11,70,7,1,11,7,1,7,3,3,10,175,1,191,1,2,32,1,
1,15,1,1,1,3,7,95,9,2,8,3,0,4,3,1,10,95,0,18,0,63,237,50,63,18,23,57,237,
50,1,47,93,93,93,51,51,47,51,113,113,47,94,93,93,18,57,57,47,47,93,113,113,
51,113,113,113,113,114,49,48,93,93,93,93,93,93,93,93,113,93,51,53,9,1,53,
33,21,33,1,21,1,33,21,108,2,26,253,247,3,231,252,240,1,202,254,22,3,109,162,
2,67,1,251,161,156,254,67,124,253,240,156,0,255,255,0,46,0,0,4,180,5,129,
18,6,0,55,0,0,255,255,0,45,0,0,5,41,5,129,18,6,0,60,0,0,0,3,0,117,255,245,
5,238,5,139,0,29,0,40,0,51,0,180,185,0,28,255,240,179,12,15,72,17,184,255,
240,179,12,15,72,27,184,255,240,179,12,15,72,18,184,255,240,64,72,12,15,72,
41,90,11,15,123,15,171,15,3,15,8,30,90,4,0,116,0,164,0,3,0,35,24,7,90,47,
21,4,8,1,20,8,36,8,68,8,116,8,164,8,244,8,6,8,20,53,68,53,2,0,53,1,132,53,
164,53,196,53,244,53,4,112,53,1,2,96,53,1,53,184,255,192,64,24,10,13,72,35,
46,96,10,6,10,34,49,96,20,24,20,10,20,10,20,7,22,3,7,18,0,63,63,18,57,57,
47,47,17,51,16,237,50,17,51,16,237,50,1,43,93,95,93,93,113,113,47,93,113,
51,51,253,50,50,220,93,237,16,220,93,237,49,48,0,43,43,43,43,1,20,14,2,43,
1,21,35,53,35,34,46,2,53,52,62,2,59,1,53,51,21,51,50,30,2,7,52,38,43,1,17,
51,50,62,2,37,20,30,2,59,1,17,35,34,6,5,238,64,131,197,133,83,185,83,133,
197,131,64,67,133,201,135,72,185,71,135,202,133,67,192,185,183,48,56,92,136,
89,43,252,7,43,89,136,92,56,52,182,182,2,224,105,188,143,84,227,227,84,143,
188,105,113,185,131,72,182,182,72,131,185,117,187,180,253,22,53,98,140,88,
88,140,98,53,2,234,180,255,255,0,46,0,0,5,43,5,129,18,6,0,59,0,0,0,1,0,145,
0,0,6,30,5,129,0,35,0,203,64,127,90,31,106,31,2,85,30,101,30,2,90,4,106,4,
2,90,5,106,5,2,74,22,1,69,13,1,3,25,90,100,28,1,132,28,148,28,2,28,19,35,
90,0,10,90,107,7,1,139,7,155,7,2,7,16,219,0,1,4,0,100,0,132,0,3,219,0,1,4,
0,52,0,68,0,100,0,132,0,148,0,180,0,196,0,8,7,0,4,37,36,37,52,37,68,37,132,
37,196,37,212,37,7,228,37,244,37,2,160,37,1,132,37,148,37,2,96,37,112,37,
2,84,37,1,64,37,1,2,37,184,255,192,64,18,9,12,72,34,2,96,19,239,15,1,15,15,
26,17,8,3,0,18,0,63,63,51,51,57,47,93,51,237,50,1,43,95,93,93,93,93,93,93,
113,47,94,93,93,113,113,51,220,93,113,237,16,253,50,220,93,113,237,49,48,
95,93,93,93,0,93,1,93,0,93,33,17,35,34,46,2,53,17,51,17,20,30,2,59,1,17,51,
17,51,50,62,2,53,17,51,17,20,14,2,43,1,17,2,251,83,133,201,134,67,191,47,
93,139,92,56,185,56,95,140,91,45,191,68,134,201,132,83,1,171,84,142,189,104,
1,207,254,45,80,137,100,57,3,73,252,183,57,100,137,80,1,211,254,49,104,189,
142,84,254,85,0,0,0,1,0,87,0,0,5,163,5,150,0,57,0,225,64,91,101,36,1,101,
22,1,157,49,1,143,49,1,49,16,11,15,72,157,9,1,143,9,1,9,16,11,15,72,116,3,
132,3,2,54,3,1,54,2,118,2,2,54,56,118,56,2,116,55,132,55,2,54,55,1,42,26,
1,42,32,1,41,53,48,40,10,18,96,40,112,40,144,40,3,111,18,127,18,159,18,3,
40,18,40,18,24,34,91,80,53,1,53,184,255,192,64,69,27,30,72,191,53,207,53,
2,48,53,1,53,17,5,91,31,24,79,24,2,224,24,1,15,24,31,24,95,24,207,24,223,
24,5,160,24,1,111,24,159,24,2,0,24,32,24,48,24,3,8,24,95,59,1,10,15,19,39,
48,5,42,95,18,41,18,29,95,0,4,0,63,237,63,51,237,23,50,1,93,47,94,93,93,93,
113,113,114,253,196,47,93,93,43,114,237,17,57,57,47,47,93,93,17,51,17,51,
16,196,49,48,0,93,93,93,93,93,93,93,93,43,93,93,43,93,93,93,93,1,50,30,2,
21,20,14,2,7,54,55,62,1,59,1,21,33,53,62,3,53,52,46,2,35,34,14,2,21,20,30,
2,23,21,33,53,51,50,22,23,22,23,46,3,53,52,62,2,2,253,151,241,168,90,59,109,
157,99,42,39,33,71,23,244,253,179,96,139,89,42,61,116,169,108,109,170,116,
61,42,89,139,96,253,179,244,23,71,33,39,42,99,157,109,59,90,168,241,5,150,
86,162,234,147,106,191,167,138,54,2,3,2,4,156,224,51,126,143,159,85,116,181,
124,65,65,124,181,116,85,159,143,126,51,224,156,4,2,3,2,54,138,167,191,106,
147,234,162,86,0,0,255,255,0,7,0,0,2,52,6,178,18,38,0,44,0,0,17,6,2,152,218,
0,0,23,64,13,2,1,4,5,38,2,1,1,8,6,0,2,37,1,43,53,53,0,43,53,53,0,0,3,0,45,
0,0,5,41,6,178,0,8,0,12,0,16,2,114,64,20,30,7,1,12,7,1,7,24,12,15,72,17,5,
1,3,5,1,16,3,5,184,255,232,64,255,12,15,72,12,133,9,16,133,64,13,5,4,14,2,
1,8,14,7,105,8,169,8,2,6,8,22,8,54,8,70,8,4,14,8,6,1,90,38,2,86,2,150,2,3,
118,2,230,2,2,57,2,73,2,2,6,2,1,16,2,153,18,169,18,201,18,3,86,18,1,9,18,
57,18,2,25,18,89,18,137,18,249,18,4,6,18,1,202,249,18,1,230,18,1,9,18,25,
18,185,18,201,18,4,198,18,1,89,18,121,18,169,18,3,54,18,1,41,18,57,18,185,
18,233,18,4,11,18,1,153,249,18,1,198,18,214,18,2,178,18,1,164,18,1,150,18,
1,130,18,1,116,18,1,86,18,102,18,2,66,18,1,36,18,52,18,2,18,18,1,4,18,1,244,
18,1,230,18,1,196,18,212,18,2,166,18,182,18,2,146,18,1,132,18,1,118,18,1,
98,18,1,84,18,1,54,18,70,18,2,36,18,1,22,18,1,4,18,1,242,18,1,1,208,18,224,
18,2,196,18,1,160,18,176,18,2,148,18,1,112,18,1,100,18,1,64,18,1,20,18,36,
18,52,18,3,0,18,1,105,64,202,228,18,244,18,2,208,18,1,164,18,180,18,196,18,
3,128,18,144,18,2,116,18,1,80,18,96,18,2,68,18,1,32,18,1,4,18,20,18,2,244,
18,1,224,18,1,196,18,212,18,2,176,18,1,84,18,100,18,116,18,148,18,164,18,
5,48,18,64,18,2,36,18,1,0,18,1,196,18,244,18,2,144,18,1,4,18,20,18,36,18,
68,18,84,18,116,18,132,18,7,57,224,18,1,132,18,164,18,212,18,3,112,18,1,4,
18,36,18,52,18,84,18,100,18,5,228,18,244,18,2,192,18,1,180,18,1,144,18,1,
4,18,20,18,52,18,84,18,132,18,5,212,18,228,18,2,187,18,1,164,18,1,112,18,
1,2,48,18,96,18,2,15,18,47,18,2,10,14,145,9,95,13,1,13,64,9,12,72,13,0,3,
59,3,75,3,123,3,3,3,1,8,4,3,1,18,0,63,63,51,18,57,93,17,51,47,43,93,51,237,
50,1,93,93,95,93,93,93,93,113,113,113,113,113,114,114,114,114,94,93,93,93,
113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114,94,93,
93,93,93,93,93,93,93,93,95,93,113,113,113,113,113,113,113,113,113,113,113,
113,113,114,114,114,114,114,114,114,114,114,114,114,114,94,93,93,113,113,
113,114,114,114,94,93,93,113,113,113,47,94,93,93,93,113,253,57,206,94,93,
93,50,43,1,24,16,77,230,50,47,26,237,220,237,49,48,43,95,94,93,93,43,93,93,
1,17,35,19,1,51,9,1,51,37,53,51,21,33,53,51,21,3,9,190,2,253,224,205,1,178,
1,176,205,253,249,163,253,211,165,2,72,253,184,2,72,3,57,253,97,2,159,121,
184,184,184,184,255,255,0,86,255,236,4,101,6,7,18,38,1,122,0,0,17,7,1,80,
1,33,0,0,0,19,64,11,2,60,17,38,2,26,60,63,8,23,37,1,43,53,0,43,53,0,0,0,255,
255,0,70,255,236,3,106,6,7,18,38,1,126,0,0,17,7,1,80,0,202,0,0,0,19,64,11,
1,58,17,38,1,73,58,61,16,6,37,1,43,53,0,43,53,0,0,0,255,255,0,106,254,88,
3,238,6,7,18,38,1,128,0,0,17,7,1,80,1,57,0,0,0,19,64,11,1,36,17,38,1,100,
36,39,17,34,37,1,43,53,0,43,53,0,0,0,255,255,0,137,0,0,1,178,6,7,18,38,1,
130,0,0,17,6,1,80,209,0,0,27,64,17,1,14,17,38,1,16,14,1,0,14,1,29,14,17,5,
13,37,1,43,93,93,53,0,43,53,0,255,255,0,133,255,236,3,254,6,65,18,38,1,142,
0,0,17,7,1,81,0,222,0,0,0,30,64,9,3,2,1,32,17,38,3,2,1,184,255,241,180,38,
44,10,0,37,1,43,53,53,53,0,43,53,53,53,0,2,0,86,255,236,4,101,4,78,0,39,0,
59,1,15,64,196,122,48,138,48,2,121,52,137,52,2,101,43,1,90,58,106,58,2,54,
14,70,14,2,29,31,45,31,2,29,38,45,38,2,47,37,1,29,37,1,75,36,107,36,2,47,
36,63,36,2,29,36,1,139,35,1,47,35,1,29,35,1,47,34,1,29,34,1,47,22,1,27,22,
1,47,21,1,27,21,1,75,20,107,20,2,47,20,1,27,20,1,45,19,1,27,19,1,121,6,137,
6,2,11,6,27,6,2,34,48,18,22,72,34,33,22,48,18,22,72,22,23,26,33,42,33,2,73,
23,1,26,23,42,23,2,33,23,159,28,175,28,191,28,3,28,64,29,33,72,28,64,0,16,
22,34,4,144,50,160,50,176,50,3,127,50,1,32,50,64,50,2,50,61,128,40,71,8,16,
61,1,0,50,28,16,4,23,33,21,23,15,55,80,11,16,45,80,5,22,0,63,237,63,237,63,
63,18,23,57,1,93,47,237,26,16,220,93,93,93,23,50,26,205,43,93,50,50,93,93,
93,17,51,43,17,51,43,49,48,0,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93,
93,93,93,93,93,93,93,93,93,93,0,93,1,93,0,93,1,93,37,14,3,35,34,2,17,16,18,
51,50,30,2,23,51,62,3,55,51,14,3,7,30,3,23,35,46,3,39,1,20,30,2,51,50,62,
2,55,46,3,35,34,14,2,3,75,26,65,87,111,70,205,193,217,209,69,112,86,63,20,
2,4,14,19,23,13,188,22,46,39,30,5,3,23,31,36,18,183,11,21,16,13,3,253,196,
28,59,93,66,54,100,82,61,14,12,45,71,102,70,66,96,64,31,237,56,94,69,38,1,
20,1,24,1,28,1,26,39,69,93,54,21,56,63,65,30,47,128,139,139,58,103,175,144,
110,39,28,66,65,58,20,1,49,112,160,103,48,52,107,160,108,86,154,115,68,46,
102,163,0,2,0,142,254,87,4,73,5,204,0,32,0,62,0,185,64,68,149,20,1,154,16,
1,123,7,139,7,2,122,60,138,60,2,106,3,122,3,138,3,3,102,31,118,31,2,74,50,
90,50,106,50,3,21,2,37,2,101,2,117,2,133,2,5,147,21,1,21,21,37,21,2,28,48,
23,72,52,48,48,64,48,2,96,48,1,48,184,255,192,64,58,20,23,72,48,52,48,52,
14,0,72,64,48,43,64,43,160,43,3,160,43,176,43,192,43,3,43,64,128,33,13,70,
0,14,16,14,48,14,3,8,14,28,48,80,49,49,38,57,80,18,0,13,27,33,38,80,9,5,22,
0,63,51,237,50,63,63,237,18,57,47,237,57,1,47,94,93,237,50,26,16,220,93,113,
26,237,18,57,57,47,47,43,93,113,16,237,17,57,49,48,93,93,93,93,93,0,93,93,
93,1,93,93,1,20,14,2,35,34,38,39,35,30,1,21,17,35,17,52,54,51,50,30,2,21,
20,14,2,7,30,3,1,30,3,51,50,62,2,53,52,46,2,35,53,62,1,53,52,46,2,35,34,14,
2,21,4,73,53,111,173,120,102,160,56,6,3,3,180,228,226,99,152,102,53,35,61,
81,46,57,114,91,56,252,249,28,71,81,87,43,72,110,73,38,38,81,128,89,127,113,
27,57,87,60,70,104,68,34,1,149,89,154,116,66,55,39,57,92,53,254,215,5,172,
237,220,47,90,130,82,73,111,82,56,18,11,55,93,137,254,218,19,34,25,14,41,
76,106,66,65,110,81,45,142,27,139,122,44,77,57,32,35,77,122,88,0,0,0,0,1,
0,7,254,88,3,249,4,58,0,24,0,237,64,59,59,22,75,22,2,41,22,1,59,21,75,21,
2,26,21,42,21,2,9,21,1,42,12,58,12,74,12,3,25,12,1,77,13,1,13,16,13,16,72,
66,2,1,54,2,1,34,2,1,6,2,22,2,2,13,2,1,1,17,1,184,255,240,64,76,13,16,72,
24,15,7,7,13,14,16,15,14,47,14,2,57,31,14,63,14,95,14,127,14,159,14,191,14,
223,14,255,14,8,63,14,127,14,159,14,191,14,223,14,255,14,6,0,14,32,14,2,224,
14,1,191,14,1,160,14,1,95,14,159,14,2,0,14,16,14,64,14,3,8,14,1,0,184,255,
240,64,17,127,0,1,0,64,26,1,0,26,48,26,96,26,144,26,4,26,184,255,192,64,14,
21,26,72,7,15,24,3,25,20,27,13,13,0,15,0,63,50,47,63,17,23,51,1,43,93,113,
47,93,56,50,47,94,93,93,93,93,93,113,113,114,94,93,56,51,57,61,47,51,51,49,
48,43,94,93,94,93,93,93,93,43,93,93,93,93,93,93,93,93,19,51,19,30,3,23,62,
3,55,19,51,1,14,3,7,35,62,1,55,7,192,245,7,21,20,17,4,5,18,21,22,8,239,191,
254,122,17,31,27,23,7,191,17,48,24,4,58,253,93,22,63,67,63,22,21,62,67,63,
22,2,165,251,251,45,111,124,132,65,131,213,91,0,0,0,2,0,86,255,236,4,29,5,
204,0,19,0,50,0,156,64,81,115,28,131,28,2,106,28,1,118,46,134,46,2,106,46,
1,90,2,106,2,2,90,17,106,17,2,85,13,101,13,2,114,26,130,26,2,38,26,1,128,
25,1,114,25,1,51,25,67,25,2,50,50,31,71,0,64,25,46,5,47,47,41,31,0,1,144,
0,1,0,52,128,10,71,31,41,1,41,47,20,80,5,184,255,224,64,22,23,28,72,5,24,
18,22,72,111,5,1,90,5,1,5,46,48,0,15,80,36,22,0,63,237,63,57,57,93,93,43,
43,237,50,1,47,93,237,26,16,204,93,113,17,57,47,57,57,51,26,16,237,50,47,
49,48,93,93,93,93,93,93,93,93,93,93,93,93,1,52,46,2,39,14,3,21,20,30,2,51,
50,62,2,1,34,46,2,39,1,30,3,21,20,14,2,35,34,46,2,53,52,62,2,55,1,53,33,21,
3,96,49,69,76,26,73,134,102,60,35,73,111,77,81,112,69,31,254,255,13,42,45,
41,13,1,60,54,102,79,49,64,123,180,115,114,180,125,66,73,127,169,96,254,193,
2,221,1,215,85,145,115,86,27,26,81,114,146,91,76,131,96,55,54,95,131,3,191,
2,3,2,1,254,188,55,116,134,159,97,110,182,131,72,68,127,183,115,112,176,135,
97,33,1,83,119,132,0,1,0,70,255,236,3,106,4,78,0,57,0,179,64,49,140,37,1,
133,3,1,53,36,69,36,2,55,34,1,42,8,1,37,5,1,14,24,9,12,72,10,29,26,29,42,
29,3,42,70,21,48,27,48,27,48,16,35,35,6,64,37,48,72,6,184,255,192,179,14,
17,72,6,184,255,192,64,66,8,11,72,6,59,53,71,31,16,63,16,79,16,95,16,4,16,
64,37,43,72,16,128,59,1,31,59,95,59,2,21,48,80,15,47,31,47,79,47,95,47,175,
47,223,47,239,47,7,191,47,207,47,2,47,47,0,39,80,36,32,16,0,80,5,11,22,0,
63,51,237,63,51,237,18,57,47,93,113,237,57,1,93,113,47,43,93,237,16,198,43,
43,43,50,47,17,57,57,47,47,18,57,237,49,48,93,43,0,93,1,93,0,93,93,93,93,
37,50,62,2,55,23,14,3,35,34,46,2,53,52,62,2,55,53,46,3,53,52,62,2,51,50,22,
23,7,46,1,35,34,6,21,20,30,2,51,21,34,14,2,21,20,30,2,1,200,54,96,79,63,21,
105,32,84,106,130,78,96,141,92,45,42,72,96,54,51,85,61,34,50,95,136,87,118,
191,67,128,47,125,75,91,96,55,97,131,75,72,139,109,66,29,52,74,114,31,48,
56,26,100,39,71,53,32,46,84,116,69,58,95,69,42,5,2,6,40,64,86,51,62,106,77,
44,86,99,88,71,68,85,74,57,70,37,12,135,11,40,80,69,45,69,46,24,0,0,0,1,0,
86,254,159,3,96,5,204,0,56,0,209,64,117,169,38,1,156,29,172,29,2,149,55,165,
55,2,173,39,1,124,39,140,39,156,39,3,117,8,1,115,2,1,100,36,132,36,148,36,
164,36,4,139,24,155,24,171,24,3,57,24,1,44,31,156,31,172,31,3,44,30,60,30,
76,30,3,100,54,132,54,164,54,3,38,54,86,54,2,240,47,1,47,47,21,0,71,33,40,
50,50,10,31,21,79,21,2,191,21,1,21,64,29,33,72,0,21,16,21,32,21,64,21,4,7,
21,50,47,80,5,26,0,184,255,240,64,31,19,22,72,135,0,151,0,2,218,33,1,169,
33,185,33,201,33,3,136,33,152,33,2,26,33,0,3,15,48,0,15,0,47,63,18,23,57,
93,93,93,93,43,17,51,237,50,1,47,94,93,43,93,113,205,50,47,51,47,237,18,57,
47,113,49,48,93,93,93,93,0,93,93,1,93,0,93,93,1,93,93,93,0,93,1,93,1,20,30,
2,23,30,3,21,20,14,2,7,39,62,3,53,52,46,2,39,46,5,53,52,62,4,55,53,14,3,35,
33,53,33,21,14,5,1,21,43,74,100,57,54,111,90,58,18,26,29,10,126,9,19,16,11,
36,66,94,57,42,89,82,73,54,31,49,85,113,127,135,64,12,34,36,34,11,254,167,
2,130,62,131,123,108,81,47,1,123,64,79,49,31,15,15,34,57,88,68,34,68,62,51,
17,56,12,33,38,39,19,34,45,33,25,13,10,23,36,50,74,100,67,83,176,176,175,
166,155,68,4,1,1,1,1,131,127,70,157,166,172,171,166,0,0,0,0,1,0,106,254,88,
3,238,4,78,0,35,0,100,185,0,32,255,232,64,46,9,12,72,35,70,64,80,0,1,159,
0,255,0,2,0,37,128,23,12,70,192,13,1,0,13,16,13,48,13,224,13,240,13,5,8,13,
240,37,1,255,37,1,112,37,1,37,184,255,192,64,14,19,23,72,35,27,23,6,80,29,
16,17,15,12,21,0,63,63,63,237,50,63,1,43,93,93,113,47,94,93,113,237,50,26,
16,220,93,113,26,237,49,48,43,1,17,52,46,2,35,34,14,2,21,17,35,17,52,38,39,
51,30,3,21,51,62,3,51,50,30,2,21,17,3,57,23,52,85,63,64,103,73,40,180,22,
14,170,9,14,10,5,3,26,62,82,106,70,90,130,84,39,254,88,4,86,79,106,65,27,
45,85,125,81,253,141,3,83,68,121,42,21,48,49,47,20,47,76,53,29,44,92,145,
100,251,135,0,0,0,0,3,0,106,255,236,4,9,5,203,0,15,0,26,0,37,0,194,64,108,
153,19,169,19,2,150,24,166,24,2,138,2,1,133,5,1,138,14,1,133,10,1,124,36,
140,36,2,115,29,131,29,2,85,29,101,29,2,124,18,140,18,2,74,18,90,18,106,18,
3,115,25,131,25,2,69,25,85,25,101,25,3,6,13,22,13,2,6,10,1,9,5,1,9,2,1,7,
33,0,71,64,15,21,31,21,127,21,143,21,239,21,255,21,6,21,64,45,48,72,21,39,
128,32,22,71,32,8,1,8,184,255,192,183,29,35,72,8,48,39,1,39,184,255,192,64,
19,30,35,72,223,39,1,22,80,32,32,16,27,80,11,0,16,80,3,22,0,63,237,63,237,
18,57,47,237,1,93,43,113,47,43,93,237,50,26,16,220,43,113,26,237,51,49,48,
0,94,93,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93,93,1,16,2,35,34,46,
1,2,53,16,18,51,50,30,1,18,1,50,62,2,55,33,30,3,19,34,14,2,7,33,46,3,4,9,
240,228,108,171,118,62,233,232,121,175,112,54,254,42,62,100,73,42,3,253,221,
3,44,71,94,66,62,99,72,42,3,2,35,3,40,69,97,2,221,254,131,254,140,92,186,
1,27,192,1,117,1,121,93,188,254,231,252,216,52,128,216,164,164,215,129,52,
4,217,51,126,212,161,161,212,126,51,0,0,0,1,0,137,0,0,1,141,4,58,0,13,1,13,
64,210,13,8,70,207,5,223,5,2,0,5,32,5,208,5,3,9,5,5,14,15,95,15,111,15,2,
32,15,1,224,15,240,15,2,111,15,127,15,143,15,3,0,15,16,15,32,15,3,205,207,
15,223,15,239,15,3,96,15,1,127,15,207,15,2,64,15,80,15,2,175,15,223,15,239,
15,3,96,15,112,15,2,15,15,31,15,2,154,255,15,1,208,15,224,15,2,63,15,1,159,
15,175,15,2,112,15,1,223,15,1,144,15,1,63,15,79,15,2,0,15,1,106,159,15,223,
15,239,15,3,96,15,112,15,2,15,15,1,239,15,255,15,2,128,15,208,15,2,63,15,
1,96,15,1,15,15,31,15,2,55,207,15,255,15,2,144,15,160,15,176,15,3,31,15,47,
15,63,15,3,176,15,192,15,208,15,3,15,15,31,15,111,15,3,144,15,160,15,224,
15,3,31,15,63,15,2,0,15,1,7,6,15,0,21,0,63,63,1,94,93,93,93,113,113,114,114,
114,94,93,93,113,113,113,114,114,114,94,93,93,93,93,113,113,114,114,114,94,
93,93,93,113,113,114,114,94,93,93,93,113,113,17,18,57,47,94,93,113,237,50,
49,48,51,46,3,53,17,51,17,20,30,2,23,199,15,24,15,8,180,11,21,30,18,16,53,
64,70,33,3,78,252,169,32,64,60,52,19,0,0,0,1,0,138,0,0,4,3,4,58,0,11,0,158,
64,114,148,9,164,9,2,102,9,118,9,134,9,3,172,0,1,139,0,155,0,2,105,0,121,
0,2,86,10,150,10,166,10,3,151,10,167,10,2,84,10,1,70,7,134,7,2,1,10,247,8,
1,8,10,9,16,9,9,0,11,16,0,11,160,11,2,0,11,16,11,32,11,64,11,160,11,224,11,
6,7,11,7,3,70,0,4,16,4,48,4,240,4,4,8,4,128,13,192,13,224,13,3,63,13,1,2,
1,7,10,4,8,5,15,4,0,21,0,63,50,63,51,23,57,1,93,93,47,94,93,237,50,47,94,
93,113,56,51,57,47,56,57,51,113,17,51,49,48,0,93,93,93,1,93,93,93,93,93,93,
33,1,7,17,35,17,51,17,1,51,9,1,3,48,254,146,132,180,180,1,219,211,254,73,
1,206,1,238,109,254,127,4,58,253,243,2,13,254,47,253,151,0,0,0,0,1,0,14,0,
0,3,238,5,204,0,33,1,60,64,101,149,15,1,157,23,1,138,2,1,137,1,1,137,25,153,
25,2,140,21,156,21,2,115,0,131,0,147,0,3,140,20,156,20,2,106,20,122,20,2,
146,32,1,132,32,1,101,32,117,32,2,3,102,26,118,26,150,26,3,141,26,157,26,
2,2,126,26,1,108,26,1,3,84,18,1,148,31,1,101,31,117,31,133,31,3,86,31,1,146,
29,1,2,128,29,1,84,29,1,144,28,1,28,184,255,224,64,59,13,16,72,146,27,1,84,
27,100,27,116,27,3,93,0,109,0,2,149,17,1,73,17,1,150,18,1,138,18,1,101,18,
117,18,2,38,18,86,18,2,42,3,58,3,74,3,122,3,138,3,5,26,0,20,10,10,19,32,33,
184,255,240,64,69,33,20,19,16,31,19,63,19,2,31,19,63,19,95,19,127,19,159,
19,191,19,223,19,255,19,8,223,19,255,19,2,192,19,1,95,19,159,19,2,0,19,16,
19,64,19,3,8,19,0,35,48,35,96,35,160,35,176,35,5,26,0,13,33,19,21,6,80,13,
0,0,63,237,63,51,18,57,57,1,93,47,94,93,93,93,93,113,114,56,51,47,56,51,18,
57,47,18,57,57,49,48,93,93,93,93,93,93,93,0,93,1,93,93,43,93,93,93,95,93,
93,93,93,0,93,95,93,93,95,93,1,93,95,93,93,93,93,93,93,93,93,93,93,93,0,93,
1,39,46,3,35,34,6,7,39,62,1,51,50,30,2,23,1,35,3,46,3,39,14,3,7,1,35,1,207,
36,27,42,45,57,40,11,32,6,35,25,72,32,55,87,73,67,36,1,171,190,207,8,18,18,
16,5,7,22,25,24,8,254,255,187,3,197,99,73,105,67,31,7,3,130,9,15,36,81,131,
95,251,139,2,65,22,56,59,56,21,21,60,62,55,18,253,193,0,0,0,1,0,138,254,119,
4,6,4,58,0,41,0,108,64,55,13,40,14,17,72,90,8,106,8,2,35,70,5,15,34,95,34,
2,159,34,175,34,255,34,3,0,34,16,34,32,34,3,7,34,43,23,19,70,0,20,16,20,48,
20,240,20,4,8,20,96,43,128,43,2,43,184,255,192,64,15,20,23,72,41,21,34,21,
15,19,5,28,80,14,11,22,0,63,51,237,50,47,63,51,63,1,43,93,47,94,93,237,50,
16,220,94,93,93,113,50,237,49,48,0,93,1,43,33,46,3,53,35,14,3,35,34,38,39,
35,30,1,21,17,35,17,51,17,20,30,2,51,50,62,2,53,17,51,17,20,30,2,23,3,94,
1,3,3,3,4,26,56,69,86,57,82,120,32,4,3,1,182,182,25,59,98,74,67,100,67,33,
181,1,2,2,1,6,46,59,59,20,51,79,53,27,64,58,32,63,27,254,139,5,195,253,124,
69,116,85,47,52,91,126,75,2,105,252,175,34,76,67,49,7,0,0,1,0,0,0,0,3,178,
4,58,0,18,2,35,64,79,130,17,146,17,162,17,3,153,6,169,6,2,131,8,147,8,163,
8,3,3,87,8,103,8,119,8,3,6,5,9,32,14,17,72,9,9,7,15,16,16,0,70,64,91,12,107,
12,123,12,3,91,12,219,12,235,12,3,180,12,196,12,2,11,12,27,12,59,12,91,12,
107,12,5,7,12,20,128,8,7,184,255,240,64,255,7,11,20,27,20,2,11,20,27,20,75,
20,91,20,139,20,155,20,203,20,219,20,8,255,20,1,196,20,212,20,2,160,20,1,
132,20,148,20,2,96,20,1,68,20,84,20,2,32,20,1,4,20,20,20,2,199,224,20,1,196,
20,212,20,2,160,20,1,4,20,20,20,68,20,84,20,132,20,148,20,6,68,20,84,20,132,
20,148,20,196,20,212,20,6,27,20,1,4,20,1,219,20,1,196,20,1,155,20,1,132,20,
1,91,20,1,68,20,1,27,20,1,4,20,1,151,11,20,27,20,75,20,91,20,139,20,155,20,
203,20,219,20,8,155,20,203,20,219,20,3,132,20,1,96,20,1,68,20,84,20,2,32,
20,1,4,20,20,20,2,224,20,1,196,20,212,20,2,160,20,1,132,20,148,20,2,96,20,
1,4,20,20,20,68,20,84,20,4,103,4,20,20,20,68,20,84,20,132,20,148,20,196,20,
212,20,8,219,20,1,196,20,1,155,20,1,132,20,1,91,20,1,68,20,1,27,20,1,4,20,
1,219,20,1,196,20,1,11,20,27,20,75,20,91,20,139,20,155,20,64,93,6,55,75,20,
91,20,139,20,155,20,203,20,219,20,6,63,20,1,32,20,1,4,20,20,20,2,224,20,1,
196,20,212,20,2,160,20,1,132,20,148,20,2,96,20,1,68,20,84,20,2,32,20,1,4,
20,20,20,2,196,20,212,20,2,160,20,1,132,20,148,20,2,96,20,1,2,80,20,1,47,
20,1,0,20,16,20,2,7,15,7,15,9,6,21,0,63,51,63,51,1,94,93,93,93,95,93,93,93,
93,113,113,113,113,113,113,113,113,114,114,114,114,94,93,93,93,113,113,113,
113,113,113,113,113,114,94,93,93,93,93,93,93,113,113,113,113,113,113,114,
94,93,93,93,93,93,93,93,93,113,113,113,114,114,114,114,94,93,93,93,93,93,
93,93,93,113,114,47,56,51,26,16,220,94,93,93,113,114,26,237,50,17,51,17,57,
61,47,43,51,51,49,48,93,95,93,93,93,1,20,14,2,7,35,1,51,1,54,18,53,52,38,
39,51,30,1,3,178,63,106,140,77,170,254,122,189,1,55,142,124,29,20,177,24,
28,3,78,99,218,221,214,94,4,58,252,96,185,1,86,156,81,119,45,45,113,0,0,0,
1,0,86,254,159,3,106,5,204,0,74,1,0,64,125,122,71,138,71,2,101,33,117,33,
133,33,3,105,39,1,85,50,1,83,44,1,57,2,1,110,66,126,66,142,66,3,26,66,42,
66,2,12,29,28,29,44,29,3,13,40,9,12,72,12,73,28,73,44,73,108,73,124,73,140,
73,6,5,11,95,37,1,79,37,1,112,37,128,37,2,37,17,95,26,1,111,26,1,26,37,26,
52,63,31,70,11,32,11,1,23,11,23,11,0,31,63,63,63,79,63,111,63,127,63,143,
63,175,63,191,63,207,63,9,159,63,175,63,255,63,3,63,184,255,192,64,17,7,11,
72,63,42,71,31,0,1,0,5,37,80,31,11,24,42,184,255,240,64,32,19,22,72,151,42,
1,0,16,19,22,72,152,0,1,52,0,42,3,57,32,36,1,36,36,24,57,26,17,23,80,24,0,
0,63,237,50,50,47,18,57,47,93,18,23,57,93,43,93,43,18,57,57,237,57,1,47,93,
237,47,43,93,113,18,57,57,47,47,93,16,237,16,205,50,50,47,93,114,51,47,93,
113,114,18,57,49,48,93,43,93,0,93,93,1,93,0,93,93,93,1,93,0,93,19,52,62,2,
55,53,46,3,53,52,62,2,55,53,14,3,43,1,53,33,21,14,3,21,20,30,2,23,21,14,3,
21,20,30,2,23,30,3,21,20,14,2,7,39,62,3,53,52,46,2,39,46,5,86,51,110,175,
125,68,118,87,51,50,79,97,47,12,68,80,76,18,74,2,122,77,144,112,68,60,99,
130,69,100,175,131,76,43,74,100,57,54,114,94,61,18,26,29,10,126,9,19,16,11,
39,70,97,57,42,89,82,73,54,31,1,98,76,147,124,90,19,2,5,39,68,96,62,64,93,
64,40,10,8,1,2,3,2,131,125,9,34,59,90,67,63,81,49,24,6,131,13,54,89,127,84,
64,79,49,31,15,15,34,57,88,68,34,68,62,51,17,56,12,33,38,39,19,34,45,33,25,
13,10,23,36,50,74,100,255,255,0,86,255,236,4,29,4,78,18,6,0,82,0,0,0,1,0,
79,255,236,5,43,4,58,0,48,0,115,64,35,53,12,117,12,133,12,3,3,40,7,17,72,
3,40,7,17,72,46,80,32,96,32,2,46,32,35,70,64,111,5,1,80,5,1,5,184,255,192,
64,38,8,11,72,5,50,128,15,50,47,50,2,13,7,72,79,25,95,25,111,25,207,25,4,
25,14,20,34,7,20,80,31,15,14,21,40,80,0,22,0,63,237,63,63,237,50,50,1,47,
50,50,93,237,50,93,26,16,220,43,93,113,26,237,50,50,93,47,49,48,43,0,43,1,
93,5,34,46,2,53,17,33,21,20,14,2,7,35,62,3,61,1,34,14,2,7,53,62,3,51,33,21,
35,17,20,30,2,51,50,62,2,55,21,14,1,4,102,59,82,52,24,254,110,16,27,36,19,
188,19,39,32,20,39,79,69,53,12,12,43,51,54,23,4,37,234,13,24,35,22,7,23,25,
23,8,31,69,20,28,59,94,66,2,212,72,131,251,228,195,74,76,197,226,247,125,
80,7,10,13,7,139,6,11,8,4,131,253,83,44,56,32,13,2,2,3,1,129,8,12,0,2,0,132,
254,87,4,59,4,79,0,26,0,47,0,129,64,64,122,25,1,101,20,117,20,2,106,19,122,
19,2,106,45,122,45,2,75,8,91,8,107,8,3,125,30,1,107,30,1,74,30,90,30,2,0,
71,64,160,27,1,27,49,128,38,15,70,223,16,1,0,16,16,16,48,16,3,8,16,48,49,
1,49,184,255,192,64,21,30,35,72,223,49,1,96,49,128,49,2,32,80,22,16,15,27,
43,80,5,22,0,63,237,63,63,237,1,93,93,43,113,47,94,93,113,237,50,26,16,220,
93,26,237,49,48,93,93,93,0,93,1,93,93,0,93,1,93,1,20,14,2,35,34,46,2,39,35,
30,1,21,17,35,17,52,62,2,51,50,30,2,7,52,46,2,35,34,14,2,21,17,30,3,51,50,
62,2,4,59,63,115,161,98,62,98,80,66,28,4,2,2,180,60,116,169,110,103,181,134,
78,193,44,83,116,72,69,100,64,30,28,72,80,87,44,67,100,67,33,2,4,118,197,
142,79,20,37,53,33,30,61,32,254,87,3,238,119,193,136,74,79,150,219,131,104,
166,115,61,53,101,146,93,254,195,35,55,37,20,58,107,152,0,0,1,0,86,254,159,
3,156,4,78,0,57,0,209,64,38,137,55,1,139,54,1,143,53,1,123,53,1,106,50,1,
96,2,1,52,15,68,15,84,15,3,82,10,98,10,130,10,3,51,10,67,10,2,3,184,255,224,
64,52,12,17,72,3,24,11,14,72,26,31,106,31,122,31,138,31,4,139,30,1,10,37,
26,37,2,7,71,31,40,1,40,52,17,79,28,1,143,28,159,28,223,28,3,28,64,24,27,
72,96,28,1,28,184,255,192,183,7,12,72,28,48,59,1,59,184,255,192,64,19,30,
35,72,223,59,1,12,33,40,16,19,22,72,136,40,152,40,2,7,184,255,240,64,19,19,
22,72,135,7,151,7,2,33,7,40,3,22,53,0,80,47,16,22,0,47,63,237,51,18,23,57,
93,43,93,43,17,51,1,93,43,113,47,43,93,43,93,113,205,50,47,93,237,49,48,93,
93,0,93,43,1,43,0,93,93,93,1,93,0,93,1,93,93,0,93,93,1,34,14,4,21,20,30,2,
23,30,3,21,20,14,2,7,39,62,3,53,52,46,2,39,46,5,53,52,62,4,51,50,30,2,23,
7,46,3,2,70,54,88,67,49,32,15,32,76,124,92,53,114,95,61,18,26,29,10,126,9,
19,16,11,35,68,97,63,66,113,94,72,50,26,20,46,75,110,148,97,68,99,73,54,22,
116,18,42,49,57,3,193,49,80,104,108,106,42,68,96,72,57,30,17,37,59,89,68,
34,68,62,51,17,56,12,33,38,39,19,30,44,36,31,17,18,40,51,68,93,122,81,47,
130,140,136,108,66,21,34,44,23,119,19,36,28,17,0,2,0,86,255,236,4,209,4,58,
0,28,0,47,0,132,64,94,133,12,1,122,13,138,13,2,131,46,1,101,46,117,46,2,100,
42,116,42,132,42,3,124,33,140,33,2,90,33,106,33,2,143,38,1,108,38,124,38,
2,74,38,90,38,2,15,17,31,17,111,17,127,17,4,7,17,0,71,64,15,29,143,29,191,
29,3,0,29,32,29,64,29,3,29,49,128,40,71,31,10,143,10,2,10,23,35,80,15,15,
43,80,5,22,0,63,237,63,237,50,1,47,93,237,26,16,220,93,113,26,237,196,94,
93,49,48,0,93,93,93,1,93,93,93,0,93,93,93,1,93,1,20,14,2,35,34,46,2,53,52,
62,2,51,33,21,35,34,46,2,39,21,30,3,7,52,46,2,39,35,34,14,2,21,20,22,51,50,
62,2,4,48,61,123,183,123,123,186,124,63,86,153,213,126,2,57,165,9,35,43,44,
17,28,55,43,26,189,20,34,45,25,89,83,143,107,61,151,147,78,117,76,38,1,235,
112,188,135,76,74,139,202,129,144,210,138,66,131,1,2,2,1,4,42,99,115,131,
78,74,132,116,99,42,50,105,160,110,207,206,52,97,139,0,1,0,29,255,236,3,24,
4,58,0,35,0,99,64,50,35,13,131,13,2,31,32,12,17,72,13,31,29,31,45,31,3,26,
13,26,127,5,143,5,2,5,15,70,0,34,32,34,2,34,34,36,37,79,37,1,208,37,1,159,
37,1,16,37,1,37,184,255,192,64,12,14,17,72,20,80,29,22,14,35,80,11,15,0,63,
237,50,63,237,1,43,93,93,93,113,17,18,57,47,93,253,204,93,51,51,47,49,48,
0,93,43,1,93,1,34,14,2,7,53,62,3,51,33,21,33,17,20,30,2,51,50,62,2,55,21,
14,1,35,34,46,2,53,17,1,25,39,79,69,53,12,12,43,51,54,23,2,68,254,208,13,
24,35,22,7,23,25,23,8,31,69,43,59,82,52,24,3,183,7,10,13,7,139,6,11,8,4,131,
253,83,44,56,32,13,2,2,3,1,129,8,12,28,59,94,66,2,212,0,0,0,1,0,133,255,236,
3,254,4,58,0,31,0,113,64,62,134,3,1,133,15,149,15,2,106,18,122,18,2,86,28,
1,25,8,41,8,2,27,0,71,64,15,21,1,47,21,159,21,2,160,21,1,21,33,128,13,70,
0,10,16,10,48,10,240,10,4,8,10,240,33,1,255,33,1,112,33,1,33,184,255,192,
64,13,20,23,72,31,33,1,26,11,15,16,80,5,22,0,63,237,63,51,1,93,43,93,93,113,
47,94,93,237,26,16,220,93,113,114,26,237,50,49,48,93,93,93,93,93,1,20,14,
2,35,34,46,2,53,17,51,17,20,22,51,50,62,2,53,52,46,2,39,51,30,3,3,254,53,
113,176,123,109,160,104,51,181,117,134,73,104,65,30,20,33,40,21,188,18,40,
32,21,2,59,137,218,154,82,50,107,166,116,2,151,253,99,146,148,50,108,170,
120,68,147,139,120,41,40,113,134,149,0,2,0,85,254,87,4,218,4,82,0,35,0,45,
0,130,64,21,101,34,1,101,33,117,33,133,33,3,74,21,90,21,2,69,21,85,21,2,45,
184,255,192,179,11,14,72,25,184,255,224,64,54,11,14,72,11,29,27,29,2,64,19,
80,19,2,19,19,24,71,13,7,36,71,224,0,1,0,43,6,72,27,0,7,64,7,2,7,64,47,1,
19,80,18,18,39,80,31,16,43,27,80,5,8,22,6,27,0,63,63,51,237,50,63,237,51,
47,237,1,113,47,93,51,253,50,220,113,237,16,220,237,50,47,93,49,48,93,0,43,
43,1,93,0,93,1,93,93,1,20,14,2,7,17,35,17,46,3,53,52,62,2,55,23,14,3,21,20,
22,23,17,52,54,51,50,30,2,7,52,38,35,34,6,21,17,62,1,4,218,74,132,184,110,
170,114,181,125,67,49,103,159,109,21,69,96,60,27,147,151,154,158,84,133,92,
49,189,87,80,68,76,162,149,2,53,151,215,140,71,6,254,105,1,151,5,72,138,207,
141,102,188,150,103,18,136,15,77,114,143,80,213,201,8,2,68,193,212,76,141,
199,121,193,211,129,140,253,185,7,218,0,0,0,1,0,21,254,88,4,27,4,80,0,27,
1,26,64,51,169,25,1,153,3,1,138,6,154,6,2,174,23,1,123,23,139,23,155,23,3,
84,21,1,173,27,1,140,27,156,27,2,123,27,1,90,27,106,27,2,41,27,57,27,2,26,
16,9,17,72,2,184,255,240,64,99,9,17,72,162,1,1,131,1,147,1,2,116,1,1,69,1,
85,1,101,1,3,38,1,54,1,2,166,25,1,153,25,1,39,25,55,25,71,25,3,3,101,19,117,
19,2,86,19,1,39,19,55,19,2,25,22,0,3,4,2,26,23,24,24,27,26,16,27,26,59,26,
91,26,123,26,155,26,187,26,219,26,7,219,26,251,26,2,4,26,20,26,68,26,3,7,
26,13,13,1,2,184,255,240,183,2,36,29,1,11,29,1,22,184,255,208,64,41,14,17,
72,70,22,1,53,22,1,139,0,1,125,0,1,2,75,0,91,0,107,0,3,63,0,1,0,25,3,22,4,
1,23,15,9,80,16,16,27,1,27,0,63,51,63,237,63,18,23,57,93,93,95,93,93,93,93,
43,1,93,93,47,56,51,51,47,47,94,93,93,113,56,51,51,47,51,17,18,23,57,49,48,
93,93,93,95,93,93,93,93,93,93,93,93,43,43,93,93,93,93,93,93,93,93,93,93,0,
93,37,1,35,1,3,46,3,35,34,6,7,39,62,1,51,50,30,2,23,19,1,51,9,1,35,2,30,254,
179,188,1,184,170,27,44,40,42,25,11,32,7,34,24,62,32,48,70,60,59,36,142,1,
8,187,254,144,1,150,190,239,253,105,3,57,1,87,54,82,55,28,7,3,131,9,11,27,
62,102,75,254,217,2,27,253,71,252,215,0,0,1,0,135,254,87,5,44,5,60,0,31,0,
128,64,90,121,18,1,18,16,7,10,72,121,19,137,19,153,19,3,121,11,1,11,16,7,
10,72,121,10,137,10,153,10,3,24,70,21,15,5,70,8,0,14,72,29,0,15,16,15,160,
15,208,15,4,8,15,128,33,176,33,224,33,3,111,33,1,32,33,1,255,33,1,80,33,128,
33,144,33,192,33,4,30,30,6,22,15,0,29,80,13,16,22,14,27,0,63,63,51,237,50,
63,51,51,47,1,93,93,113,113,113,47,94,93,51,253,50,220,237,16,220,237,49,
48,0,93,43,93,93,43,93,37,62,3,53,17,51,17,20,14,2,7,17,35,17,46,3,53,17,
51,17,20,30,2,23,17,51,3,46,87,124,80,37,182,59,124,193,134,170,134,192,124,
59,181,38,79,124,87,170,119,1,31,73,121,91,2,134,253,124,122,172,110,53,1,
254,107,1,149,1,53,110,172,122,2,132,253,122,90,121,73,32,1,4,197,0,0,0,0,
1,0,83,255,236,5,235,4,79,0,63,0,176,64,83,153,33,169,33,2,153,26,169,26,
2,119,16,1,122,58,138,58,2,10,37,26,37,42,37,154,37,170,37,5,10,22,26,22,
42,22,154,22,170,22,5,29,0,73,61,61,40,8,46,13,46,13,51,19,71,64,128,8,176,
8,2,15,8,1,7,8,65,128,51,71,63,40,1,40,0,65,1,48,65,1,240,65,1,65,184,255,
192,64,32,30,35,72,175,65,223,65,2,0,65,32,65,64,65,3,30,35,62,62,14,3,56,
80,24,35,22,46,13,80,45,14,16,0,63,51,237,50,63,51,237,50,17,57,47,18,57,
1,93,93,43,93,113,114,47,93,237,26,16,220,94,93,93,26,237,18,57,57,47,47,
17,18,57,47,237,57,49,48,0,93,93,1,93,93,0,93,93,1,20,22,51,50,62,2,53,52,
46,2,39,55,30,3,21,20,14,2,35,34,46,2,39,35,14,3,35,34,46,2,53,52,62,2,55,
23,14,3,21,20,30,2,51,50,62,2,61,1,51,3,115,114,102,65,87,53,22,29,61,97,
67,23,109,159,103,49,53,101,148,95,68,104,77,52,16,4,16,52,77,105,67,95,148,
101,53,49,103,159,109,23,68,96,62,28,22,52,86,65,51,82,57,30,166,1,193,157,
173,56,102,145,90,82,150,121,84,15,139,18,112,161,194,101,128,200,137,72,
36,68,99,64,64,99,68,36,72,137,200,128,101,194,161,112,18,139,15,84,121,150,
82,90,145,102,56,45,84,123,78,252,0,0,0,255,255,255,205,0,0,1,250,5,123,18,
38,1,130,0,0,17,6,0,105,160,0,0,25,182,2,1,14,17,38,2,1,184,255,217,180,18,
16,5,13,37,1,43,53,53,0,43,53,53,0,0,0,255,255,0,133,255,236,3,254,5,123,
18,38,1,142,0,0,17,7,0,105,0,242,0,0,0,25,182,2,1,32,17,38,2,1,184,255,244,
180,36,34,10,0,37,1,43,53,53,0,43,53,53,0,255,255,0,86,255,236,4,29,6,7,18,
38,0,82,0,0,17,7,1,80,1,41,0,0,0,19,64,11,2,35,17,38,2,70,35,38,8,0,37,1,
43,53,0,43,53,0,0,0,255,255,0,133,255,236,3,254,6,7,18,38,1,142,0,0,17,7,
1,80,0,252,0,0,0,19,64,11,1,32,17,38,1,17,32,35,10,0,37,1,43,53,0,43,53,0,
0,0,255,255,0,83,255,236,5,235,6,7,18,38,1,146,0,0,17,7,1,80,1,255,0,0,0,
19,64,11,1,64,17,38,1,55,64,67,40,19,37,1,43,53,0,43,53,0,0,0,255,255,0,168,
0,0,4,254,6,178,16,38,0,40,0,0,17,7,2,152,1,121,0,0,0,153,185,0,21,255,192,
179,233,233,72,21,184,255,192,179,230,230,72,21,184,255,192,179,227,227,72,
21,184,255,192,179,224,224,72,21,184,255,192,179,221,221,72,21,184,255,192,
179,218,218,72,21,184,255,192,179,215,215,72,21,184,255,192,179,212,212,72,
21,184,255,192,179,209,209,72,21,184,255,192,179,206,206,72,21,184,255,192,
179,203,203,72,21,184,255,192,179,200,200,72,21,184,255,192,179,197,197,72,
21,184,255,192,64,10,11,11,72,2,1,12,5,38,2,1,184,255,234,180,16,14,0,10,
37,1,43,53,53,0,43,53,53,1,43,43,43,43,43,43,43,43,43,43,43,43,43,43,0,0,
1,0,46,255,236,6,79,5,129,0,45,0,133,64,13,155,31,171,31,2,101,37,117,37,
133,37,3,2,184,255,224,64,71,13,17,72,18,16,12,15,72,42,13,58,13,2,36,7,52,
7,2,20,20,10,42,1,39,90,45,175,40,1,0,40,1,40,10,90,0,29,16,29,176,29,224,
29,4,7,29,0,42,95,43,38,33,95,1,6,6,40,43,3,40,18,26,95,15,63,21,1,21,21,
15,19,0,63,51,47,93,16,237,63,63,18,57,47,51,237,50,16,237,50,1,47,94,93,
237,47,93,93,204,253,50,204,18,57,47,49,48,0,93,93,43,43,93,93,1,17,62,3,
51,50,22,29,1,20,14,2,35,34,46,2,39,55,30,3,51,50,54,61,1,52,38,35,34,14,
2,7,17,35,17,33,53,33,21,2,208,33,109,127,130,53,226,217,41,86,133,92,53,
88,75,64,29,111,18,41,48,56,33,84,80,129,144,51,123,120,105,33,190,254,28,
4,134,4,229,254,160,7,20,19,13,187,188,214,93,145,100,53,17,32,46,28,123,
16,33,26,17,101,111,219,119,122,10,15,17,8,253,12,4,229,156,156,0,255,255,
0,168,0,1,4,47,6,240,16,38,1,93,0,0,17,7,2,149,1,113,0,0,0,19,64,11,1,6,5,
38,1,33,6,9,4,0,37,1,43,53,0,43,53,0,0,0,0,1,0,104,255,236,5,121,5,150,0,
42,0,218,64,156,156,17,172,17,2,156,15,172,15,2,156,39,172,39,2,138,39,1,
156,41,172,41,2,138,41,1,137,31,1,117,11,1,117,10,165,10,2,166,26,1,73,26,
137,26,2,70,32,134,32,2,37,10,53,10,2,42,3,58,3,2,3,68,44,1,7,7,19,5,8,91,
116,29,132,29,2,203,29,219,29,2,68,29,1,43,29,1,29,37,235,19,1,100,19,116,
19,164,19,212,19,4,64,19,1,2,0,19,48,19,2,7,19,8,95,127,5,175,5,2,5,5,13,
34,79,38,1,38,38,0,95,34,4,13,95,24,16,18,32,18,2,48,18,64,18,112,18,128,
18,192,18,208,18,6,18,18,24,19,0,63,51,47,93,113,16,237,63,237,51,47,93,17,
18,57,47,113,237,1,47,94,93,95,93,93,113,51,47,93,93,93,113,237,50,17,57,
47,93,49,48,0,95,93,93,93,93,93,1,93,0,93,1,93,93,93,93,93,93,93,1,34,14,
2,7,33,21,33,30,3,51,50,62,2,55,23,14,3,35,34,36,38,2,53,52,18,54,36,51,50,
4,23,7,46,3,3,24,111,173,124,73,10,2,142,253,114,9,77,128,176,109,90,141,
108,79,27,156,40,108,148,191,123,171,254,255,173,86,91,175,1,0,164,225,1,
46,71,181,20,68,102,137,4,250,68,126,178,110,154,112,185,132,72,50,82,105,
55,77,79,136,100,57,109,195,1,12,159,165,1,10,187,101,176,173,60,50,91,70,
42,0,0,255,255,0,93,255,236,4,248,5,150,18,6,0,54,0,0,255,255,0,189,0,0,1,
124,5,129,18,6,0,44,0,0,255,255,0,7,0,0,2,52,6,178,18,38,0,44,0,0,17,6,2,
152,218,0,0,23,64,13,2,1,4,5,38,2,1,1,8,6,0,2,37,1,43,53,53,0,43,53,53,0,
255,255,0,32,255,236,3,104,5,129,18,6,0,45,0,0,0,2,0,18,255,240,8,11,5,129,
0,38,0,47,0,215,64,98,57,29,1,166,8,1,167,11,1,162,10,1,133,10,149,10,2,58,
10,1,154,15,170,15,2,141,13,157,13,173,13,3,121,13,1,116,47,132,47,148,47,
3,123,40,139,40,155,40,3,101,11,1,141,14,157,14,173,14,3,14,32,10,14,72,43,
30,123,30,139,30,155,30,4,42,31,122,31,2,0,90,48,39,1,0,39,16,39,2,7,39,20,
13,36,13,52,13,3,13,184,255,248,64,14,22,25,72,73,8,1,20,8,36,8,52,8,3,8,
184,255,248,64,39,22,25,72,9,31,73,31,2,8,13,31,3,175,20,191,20,2,20,33,44,
90,6,43,95,33,33,6,8,95,31,3,23,95,16,19,44,95,6,18,0,63,237,63,237,63,237,
18,57,47,237,1,47,237,50,47,93,23,51,113,43,113,113,43,113,47,94,93,113,237,
49,48,93,93,0,43,93,1,93,0,93,93,93,93,93,1,93,93,93,93,93,93,1,20,14,2,35,
33,17,33,3,6,2,14,3,35,34,38,39,53,30,1,51,50,62,4,55,19,33,17,33,50,30,2,
7,52,38,35,33,17,33,50,54,8,11,61,121,182,121,253,183,254,96,49,22,43,49,
60,78,102,66,25,47,14,11,35,10,30,52,45,42,39,40,21,67,3,2,1,126,125,186,
124,62,192,164,164,254,153,1,111,164,156,1,157,87,150,112,64,4,225,254,144,
172,254,245,199,137,85,37,5,5,152,4,3,23,62,107,169,238,161,1,254,253,172,
58,105,147,92,121,129,254,2,136,0,0,0,2,0,168,0,0,7,171,5,129,0,22,0,31,0,
110,64,25,116,31,132,31,148,31,3,123,24,139,24,155,24,3,38,20,54,20,2,0,90,
176,23,1,23,184,255,192,64,43,7,11,72,23,13,9,90,0,10,16,10,64,10,3,7,10,
17,28,90,14,0,6,1,8,6,27,95,17,17,8,95,13,13,10,15,11,3,10,18,28,95,6,18,
0,63,237,63,63,51,18,57,47,237,51,47,237,1,47,94,93,51,237,50,47,94,93,237,
50,47,43,93,237,49,48,0,93,93,93,1,20,14,2,35,33,17,33,17,35,17,51,17,33,
17,51,17,33,50,30,2,7,52,38,35,33,17,33,50,54,7,171,61,121,182,121,253,223,
253,194,191,191,2,62,191,1,86,125,186,124,62,192,164,164,254,193,1,71,164,
156,1,157,87,150,112,64,2,141,253,115,5,129,253,172,2,84,253,172,58,105,147,
92,121,129,254,2,136,0,0,0,0,1,0,46,0,0,6,47,5,129,0,27,0,131,64,13,155,2,
171,2,2,101,8,117,8,133,8,3,19,184,255,224,64,76,13,17,72,37,24,53,24,69,
24,3,18,13,10,90,16,175,11,1,0,11,48,11,2,11,27,90,0,0,48,0,192,0,208,0,4,
7,0,176,29,192,29,208,29,3,176,29,240,29,2,255,29,1,16,29,112,29,160,29,176,
29,4,9,4,95,18,23,23,0,17,13,95,14,3,11,0,18,0,63,50,63,237,50,18,57,47,51,
237,50,1,93,93,113,114,47,94,93,237,47,93,93,204,253,204,51,49,48,0,93,43,
93,93,33,17,52,38,35,34,14,2,7,17,35,17,33,53,33,21,33,17,62,3,51,50,22,21,
17,5,113,128,133,53,116,110,98,35,190,254,28,4,179,253,239,36,98,112,118,
56,229,214,2,63,122,109,10,15,18,7,253,12,4,229,156,156,254,160,8,20,18,13,
187,178,253,173,0,0,0,255,255,0,168,0,0,4,157,6,240,18,38,1,176,0,0,17,7,
2,149,1,172,0,0,0,19,64,11,1,23,5,38,1,37,23,26,0,13,37,1,43,53,0,43,53,0,
0,0,255,255,0,55,255,236,5,31,7,58,18,38,1,185,0,0,17,7,2,145,1,94,1,74,0,
19,64,11,1,26,5,38,1,7,31,39,21,25,37,1,43,53,0,43,53,0,0,0,0,1,0,168,254,
104,5,24,5,129,0,11,0,94,64,64,11,92,0,0,2,9,90,127,6,1,0,6,48,6,64,6,3,143,
6,159,6,207,6,3,0,6,64,6,2,6,5,90,0,2,16,2,64,2,3,7,2,16,13,1,32,13,128,13,
224,13,3,15,13,1,7,7,3,3,10,5,95,2,18,0,0,47,63,237,51,63,51,47,1,93,93,113,
47,94,93,237,47,93,93,113,113,237,18,57,47,237,49,48,1,17,33,17,51,17,33,
17,51,17,33,17,2,134,254,34,191,2,247,186,254,34,254,104,1,152,5,129,251,
31,4,225,250,127,254,104,255,255,0,4,0,0,5,82,5,129,18,6,0,36,0,0,0,2,0,168,
0,0,4,214,5,129,0,16,0,25,0,142,64,70,116,25,132,25,148,25,3,123,18,139,18,
155,18,3,153,14,1,38,14,1,9,9,0,90,223,17,1,80,17,128,17,2,31,17,1,255,17,
1,192,17,1,159,17,1,0,17,16,17,32,17,64,17,4,17,11,22,90,0,6,16,6,64,6,3,
7,6,48,27,1,27,184,255,192,64,27,30,35,72,223,27,1,21,95,64,11,1,160,11,208,
11,2,11,11,6,10,95,7,3,22,95,6,18,0,63,237,63,237,18,57,47,93,113,237,1,93,
43,113,47,94,93,237,50,47,93,93,93,93,113,113,113,237,50,47,49,48,0,93,93,
93,93,1,20,14,2,35,33,17,33,21,33,17,33,50,30,2,7,52,38,35,33,17,33,50,54,
4,214,61,121,182,121,253,183,3,158,253,33,1,126,125,186,124,62,192,164,164,
254,153,1,111,164,156,1,157,87,150,112,64,5,129,156,254,72,58,105,147,92,
121,129,254,2,136,0,0,0,255,255,0,168,0,0,4,234,5,129,18,6,0,37,0,0,255,255,
0,168,0,1,4,47,5,130,16,6,1,93,0,0,0,2,0,15,254,104,5,69,5,129,0,16,0,25,
0,194,64,95,150,10,1,150,20,1,150,15,1,144,19,1,134,19,1,115,22,131,22,2,
3,147,24,1,2,128,24,1,114,24,1,102,24,1,85,11,101,11,2,90,14,106,14,2,97,
23,145,23,2,83,23,1,53,23,69,23,2,2,92,3,3,0,90,191,17,207,17,2,160,17,1,
31,17,95,17,127,17,143,17,159,17,5,0,17,1,8,17,20,25,36,25,52,25,3,25,184,
255,248,64,11,22,25,72,20,19,36,19,52,19,3,19,184,255,248,64,28,22,25,72,
9,15,19,25,4,6,92,7,15,27,47,27,2,19,95,15,3,8,0,25,95,5,18,7,2,0,47,51,63,
237,50,50,63,237,1,93,47,237,23,51,43,113,43,113,47,94,93,93,93,93,237,50,
47,237,49,48,93,93,93,93,93,93,93,93,95,93,95,93,93,93,93,93,93,37,51,17,
35,17,33,17,35,17,51,62,3,55,19,33,3,17,33,3,14,3,7,4,150,175,180,252,50,
180,144,41,66,55,44,18,67,2,212,186,254,137,49,18,40,46,54,32,160,253,200,
1,152,254,104,2,56,51,138,181,228,141,1,254,251,31,4,65,254,144,134,221,178,
137,51,255,255,0,168,0,0,4,254,5,129,18,6,0,40,0,0,0,1,0,28,0,0,7,71,5,129,
0,41,1,72,64,41,133,8,1,117,31,133,31,2,117,14,1,99,24,1,108,25,124,25,140,
25,3,108,26,124,26,140,26,3,101,13,117,13,133,13,3,33,40,14,17,72,6,184,255,
216,64,35,14,17,72,58,24,74,24,2,41,24,1,53,15,69,15,117,15,3,3,39,15,1,27,
48,14,17,72,40,27,56,27,72,27,3,12,184,255,208,64,11,14,17,72,39,12,55,12,
71,12,3,31,184,255,224,179,14,17,72,31,184,255,240,64,73,10,13,72,8,32,14,
17,72,8,16,10,13,72,34,31,27,31,28,28,32,21,40,90,41,5,8,12,8,41,11,11,7,
18,52,41,1,116,41,196,41,228,41,3,41,33,32,16,32,64,29,32,72,228,32,1,155,
32,171,32,2,68,32,116,32,2,11,32,43,32,2,32,6,7,184,255,240,64,51,171,7,187,
7,2,7,68,43,116,43,132,43,228,43,4,47,43,1,2,15,43,1,31,8,34,5,8,5,39,0,96,
21,127,18,175,18,2,47,18,1,18,18,6,27,19,11,3,41,33,6,18,0,63,51,51,63,51,
51,18,57,47,93,113,51,237,50,57,57,17,51,17,51,1,93,95,93,93,47,93,56,51,
47,93,93,93,93,43,56,51,47,93,113,51,18,57,47,18,57,51,17,51,16,237,50,17,
57,47,57,51,17,51,49,48,43,43,43,43,93,43,93,43,93,95,93,93,93,43,43,93,93,
93,0,93,1,93,0,93,93,1,34,46,2,39,1,35,1,38,39,1,51,19,30,3,51,17,51,17,50,
62,2,55,19,51,1,6,7,1,35,1,14,3,35,17,35,3,82,17,45,48,46,17,254,85,222,1,
253,48,131,254,229,200,205,66,90,76,81,57,191,57,81,76,90,66,205,200,254,
229,131,48,1,253,222,254,85,17,46,48,45,17,191,2,133,6,11,13,8,253,85,3,7,
35,189,1,154,254,207,99,123,68,24,2,107,253,149,24,68,123,99,1,49,254,102,
189,35,252,249,2,171,8,13,11,6,253,123,0,1,0,67,255,236,4,112,5,149,0,60,
1,7,64,51,138,33,1,134,7,1,124,28,140,28,2,3,112,21,1,112,20,1,2,96,20,1,
101,8,117,8,133,8,3,132,34,1,101,34,117,34,2,124,13,1,90,13,106,13,2,59,23,
75,23,2,33,184,255,232,64,122,11,16,72,5,43,1,3,51,20,25,90,46,64,25,37,72,
46,46,56,90,16,139,36,155,36,171,36,3,127,20,1,2,95,20,111,20,2,36,20,36,
20,5,112,16,1,79,16,111,16,2,255,16,1,160,16,1,127,16,1,0,16,16,16,48,16,
3,16,175,5,191,5,2,5,64,32,45,72,5,64,13,16,72,5,51,20,95,127,21,175,21,2,
21,21,11,41,35,64,13,16,72,35,35,30,95,41,4,11,95,0,32,6,48,6,112,6,128,6,
4,208,6,1,6,184,255,192,182,13,17,72,6,6,0,19,0,63,50,47,43,93,113,16,237,
63,237,51,47,43,17,18,57,47,113,237,57,1,47,43,43,93,47,93,93,93,93,113,113,
18,57,57,47,47,93,95,93,113,16,237,50,47,43,237,18,57,49,48,0,95,93,1,43,
93,93,93,93,93,93,93,95,93,93,95,93,93,0,93,5,34,46,2,39,55,30,3,51,50,62,
2,53,52,38,43,1,53,51,50,54,53,52,46,2,35,34,14,2,7,39,62,3,51,50,30,2,21,
20,14,2,7,30,3,21,20,14,2,2,109,118,176,130,94,36,165,24,66,91,121,80,77,
122,85,45,192,202,71,71,181,173,39,72,104,65,77,114,83,56,19,178,33,96,132,
168,105,108,172,120,64,40,73,104,63,67,117,87,51,69,132,192,20,50,91,128,
79,77,55,98,75,44,37,69,100,64,133,118,148,119,123,55,86,59,30,40,68,90,49,
61,82,127,87,45,53,96,136,83,68,107,80,55,15,10,50,82,115,73,95,156,113,62,
0,1,0,168,0,0,5,24,5,129,0,19,0,123,64,17,172,18,1,138,18,154,18,2,147,8,
163,8,2,133,8,1,19,184,255,232,64,65,9,17,72,9,24,9,17,72,11,92,41,9,1,9,
64,12,80,12,144,12,3,224,12,1,143,12,159,12,175,12,3,0,12,48,12,2,12,166,
19,1,19,2,92,0,1,16,1,2,7,1,15,21,47,21,2,9,18,9,1,3,12,12,8,0,18,0,63,50,
50,47,63,51,51,47,1,93,47,94,93,237,50,113,47,93,93,93,113,51,113,237,49,
48,43,43,0,93,93,93,93,51,17,51,17,20,6,7,6,7,1,51,17,35,17,52,54,55,54,55,
1,168,172,2,2,2,2,2,238,222,170,1,2,1,2,253,26,5,129,252,100,51,98,39,46,
40,4,174,250,127,3,168,39,89,38,44,44,251,90,0,255,255,0,168,0,0,5,24,7,58,
18,38,1,174,0,0,17,7,2,145,1,146,1,74,0,19,64,11,1,20,5,38,1,6,25,33,0,10,
37,1,43,53,0,43,53,0,0,0,0,1,0,168,0,0,4,157,5,129,0,22,0,151,64,104,84,12,
116,12,132,12,3,84,15,1,139,8,1,122,8,1,89,8,105,8,2,140,14,1,14,24,13,16,
72,58,5,1,100,12,116,12,132,12,3,80,12,1,53,12,69,12,2,15,12,8,12,9,16,32,
9,96,9,128,9,3,9,9,13,2,21,90,32,22,1,22,14,13,16,15,13,127,13,207,13,239,
13,4,47,13,1,13,47,24,1,15,12,20,96,47,2,1,2,2,22,13,18,8,0,3,0,63,50,63,
51,57,47,93,237,50,57,1,93,47,93,113,56,51,47,93,237,50,17,57,47,93,56,57,
51,17,51,49,48,93,93,93,93,43,93,93,93,93,93,0,93,19,51,17,50,62,2,55,19,
51,1,6,7,1,35,1,14,3,35,17,35,168,191,57,81,76,90,66,205,200,254,229,131,
48,1,253,222,254,85,17,46,48,45,17,191,5,129,253,149,24,68,123,99,1,49,254,
102,189,35,252,249,2,171,8,13,11,6,253,123,0,0,0,0,1,0,18,255,240,4,153,5,
129,0,27,0,176,64,35,150,1,1,147,3,1,117,3,133,3,2,85,4,149,4,2,145,7,1,115,
7,131,7,2,85,7,101,7,2,129,6,145,6,2,6,184,255,216,64,46,12,15,72,37,6,53,
6,2,26,2,1,26,23,106,23,122,23,138,23,4,26,90,32,27,64,27,2,224,27,1,95,27,
1,0,27,1,8,27,20,6,36,6,52,6,3,6,184,255,248,64,14,22,25,72,73,1,1,20,1,36,
1,52,1,3,1,184,255,248,64,26,22,25,72,9,24,73,24,2,1,6,24,3,12,128,29,1,27,
18,1,95,24,3,16,95,9,19,0,63,237,63,237,63,1,93,47,23,51,113,43,113,113,43,
113,47,94,93,93,93,113,237,49,48,93,93,93,43,93,93,93,93,93,93,93,93,1,33,
3,6,2,14,3,35,34,38,39,53,30,1,51,50,62,4,55,19,33,17,35,3,223,254,94,49,
22,43,49,60,78,102,66,25,47,14,11,35,10,30,52,45,42,39,40,21,67,2,255,186,
4,225,254,144,172,254,245,199,137,85,37,5,5,152,4,3,23,62,107,169,238,161,
1,254,250,127,255,255,0,168,0,0,6,2,5,129,18,6,0,48,0,0,255,255,0,168,0,0,
5,32,5,129,18,6,0,43,0,0,255,255,0,97,255,236,5,215,5,150,18,6,0,50,0,0,255,
255,0,166,0,0,5,30,5,129,17,6,1,106,254,0,0,88,185,0,9,255,192,179,27,27,
72,9,184,255,192,179,21,21,72,9,184,255,192,179,20,20,72,9,184,255,192,179,
19,19,72,9,184,255,192,179,17,17,72,9,184,255,192,179,16,16,72,9,184,255,
192,179,15,15,72,9,184,255,192,179,14,14,72,9,184,255,192,183,11,11,72,9,
64,9,9,72,43,43,43,43,43,43,43,43,43,43,0,0,255,255,0,168,0,0,4,234,5,129,
18,6,0,51,0,0,255,255,0,104,255,236,5,121,5,150,18,6,0,38,0,0,255,255,0,46,
0,0,4,180,5,129,18,6,0,55,0,0,0,1,0,55,255,236,5,31,5,129,0,25,0,181,64,111,
217,24,1,139,24,1,90,24,106,24,122,24,3,41,24,1,85,23,101,23,133,23,3,70,
23,1,214,22,1,131,22,1,100,22,116,22,2,86,22,1,121,18,1,128,2,1,5,2,21,2,
2,132,1,1,131,0,1,84,0,100,0,2,70,0,1,198,23,214,23,2,113,23,129,23,2,86,
23,102,23,2,143,3,1,58,3,74,3,2,20,23,24,32,25,144,25,2,25,16,25,22,10,63,
21,79,21,111,21,127,21,4,21,184,255,240,64,14,21,23,20,21,5,24,24,21,3,11,
14,95,5,19,0,63,237,50,63,51,47,17,18,57,57,1,47,56,93,50,50,47,56,93,51,
57,57,49,48,0,93,93,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93,93,93,
93,93,93,1,14,3,35,34,46,2,39,55,30,1,51,50,62,2,63,1,1,51,9,1,51,2,222,47,
81,90,109,75,32,66,64,58,23,81,35,83,48,37,58,53,57,38,49,253,195,218,1,193,
1,128,205,1,62,88,128,82,40,10,18,26,16,144,22,37,21,52,90,68,89,3,186,252,
240,3,16,0,0,3,0,118,255,245,5,159,5,139,0,29,0,40,0,51,0,143,64,92,70,28,
86,28,102,28,3,73,17,89,17,105,17,3,59,51,1,59,31,1,53,43,1,38,43,1,53,39,
1,38,39,1,41,90,15,8,30,90,0,35,24,7,90,46,21,224,8,1,79,8,1,32,8,1,8,32,
53,1,112,53,208,53,224,53,3,79,53,1,16,53,1,36,47,96,10,6,10,34,49,96,20,
24,20,10,20,10,20,7,22,3,7,18,0,63,63,18,57,57,47,47,17,51,16,237,50,17,51,
16,237,50,1,93,93,93,113,47,93,93,93,51,51,253,50,50,220,237,16,220,237,49,
48,0,93,93,93,93,93,93,1,93,93,1,20,14,2,43,1,21,35,53,35,34,46,2,53,52,62,
2,59,1,53,51,21,51,50,30,2,7,52,38,43,1,17,51,50,62,2,37,20,30,2,59,1,17,
35,34,6,5,159,64,131,197,133,40,191,40,133,197,131,64,67,133,201,135,29,191,
28,135,202,133,67,192,185,183,5,13,92,136,89,43,252,87,43,89,136,92,13,9,
182,182,2,224,105,188,143,84,227,227,84,143,188,105,113,185,131,72,182,182,
72,131,185,117,187,180,253,22,53,98,140,88,88,140,98,53,2,234,180,0,255,255,
0,46,0,0,5,43,5,129,18,6,0,59,0,0,0,1,0,168,254,104,5,197,5,129,0,11,0,74,
64,47,1,92,2,2,11,90,0,8,1,175,8,1,0,8,64,8,112,8,3,8,7,90,0,4,16,4,64,4,
3,7,4,32,13,224,13,2,9,9,5,3,11,11,7,95,4,18,2,0,47,63,237,50,47,63,51,47,
1,93,47,94,93,237,47,93,93,113,237,50,47,237,49,48,37,17,35,17,33,17,51,17,
33,17,51,17,5,197,180,251,151,191,2,245,186,160,253,200,1,152,5,129,251,31,
4,225,251,31,0,0,0,1,0,160,0,0,4,174,5,129,0,25,0,134,64,70,164,14,1,20,40,
13,17,72,1,32,13,17,72,42,7,58,7,74,7,3,23,90,25,144,22,1,143,22,1,48,22,
64,22,2,207,22,1,112,22,1,111,22,1,16,22,64,22,2,22,12,90,207,11,1,0,11,16,
11,64,11,3,7,11,32,27,1,32,27,1,27,184,255,192,64,19,14,17,72,0,5,95,21,47,
16,1,16,16,11,24,18,22,22,11,3,0,63,51,47,63,18,57,47,93,51,237,50,1,43,93,
113,47,94,93,93,237,47,93,93,93,93,113,113,113,51,237,49,48,0,93,43,43,93,
1,14,3,35,34,46,2,53,17,51,17,20,22,51,50,62,2,55,17,51,17,35,3,240,36,94,
107,115,56,114,166,108,52,190,130,134,53,110,104,92,35,190,190,1,252,8,20,
18,12,47,92,137,89,2,82,253,194,123,108,10,15,17,7,2,244,250,127,0,0,1,0,
168,0,0,6,173,5,129,0,11,0,114,64,76,7,90,4,4,0,11,90,36,8,1,11,8,1,228,8,
1,219,8,1,148,8,1,123,8,1,4,8,20,8,100,8,3,8,3,90,4,0,68,0,228,0,3,7,0,235,
13,1,196,13,1,187,13,1,132,13,1,112,13,1,2,64,13,1,15,13,1,9,5,1,3,7,7,3,
95,0,18,0,63,237,50,47,63,51,51,1,93,93,95,93,93,93,93,93,47,94,93,237,47,
93,93,93,93,93,113,113,237,18,57,47,237,49,48,51,17,51,17,33,17,51,17,33,
17,51,17,168,191,1,233,186,1,233,186,5,129,251,31,4,225,251,31,4,225,250,
127,0,1,0,168,254,104,7,47,5,129,0,15,0,125,64,84,132,17,148,17,180,17,3,
123,17,1,84,17,1,1,92,2,2,15,90,12,11,90,8,8,4,11,12,59,12,75,12,91,12,123,
12,139,12,155,12,203,12,8,219,12,251,12,2,207,12,1,2,159,12,1,128,12,1,111,
12,1,0,12,1,8,12,7,90,32,4,1,4,13,9,5,3,15,15,11,11,7,95,4,18,2,0,47,63,237,
50,47,50,47,63,51,51,1,47,93,237,47,94,93,93,93,93,95,93,93,113,18,57,47,
237,16,237,50,47,237,93,93,93,49,48,37,17,35,17,33,17,51,17,33,17,51,17,33,
17,51,17,7,47,180,250,45,191,1,211,186,1,210,186,160,253,200,1,152,5,129,
251,31,4,225,251,31,4,225,251,31,0,2,0,46,0,0,5,235,5,129,0,16,0,25,0,100,
64,68,116,25,132,25,148,25,3,123,18,139,18,155,18,3,153,3,1,38,3,1,64,27,
1,6,90,47,17,127,17,2,176,17,1,159,17,1,0,17,16,17,32,17,64,17,4,7,17,14,
0,22,90,32,12,1,12,21,95,0,0,12,14,95,15,3,22,95,12,18,0,63,237,63,237,18,
57,47,237,1,47,93,253,50,204,47,94,93,93,93,113,237,93,49,48,0,93,93,93,93,
1,33,50,30,2,21,20,14,2,35,33,17,33,53,33,1,52,38,35,33,17,33,50,54,2,184,
1,66,125,186,124,62,61,121,182,121,253,243,254,53,2,138,2,115,164,164,254,
213,1,51,164,156,3,45,58,105,147,90,87,150,112,64,4,229,156,252,26,121,129,
254,2,136,0,3,0,168,0,0,6,109,5,129,0,14,0,23,0,27,0,140,64,76,116,23,132,
23,148,23,3,123,16,139,16,155,16,3,153,12,1,38,12,1,27,90,159,24,207,24,223,
24,3,16,24,64,24,80,24,112,24,4,24,0,90,0,15,1,224,15,1,159,15,1,0,15,16,
15,32,15,64,15,4,15,9,20,90,0,6,16,6,64,6,3,7,6,128,29,1,29,184,255,192,64,
19,11,14,72,19,95,9,9,6,7,25,25,7,3,24,24,20,95,6,18,0,63,237,51,47,63,51,
47,17,18,57,47,237,1,43,93,47,94,93,237,50,47,93,93,93,113,237,47,93,93,237,
49,48,0,93,93,93,93,1,20,14,2,35,33,17,51,17,33,50,30,2,7,52,38,35,33,17,
33,50,54,1,17,51,17,4,214,61,121,182,121,253,183,191,1,126,125,186,124,62,
192,164,164,254,153,1,111,164,156,1,152,191,1,157,87,150,112,64,5,129,253,
172,58,105,147,92,121,129,254,2,136,254,225,5,129,250,127,0,2,0,168,0,0,4,
214,5,129,0,14,0,23,0,107,64,76,116,23,132,23,148,23,3,123,16,139,16,155,
16,3,153,12,1,38,12,1,0,90,31,15,1,160,15,176,15,2,159,15,1,0,15,16,15,32,
15,64,15,96,15,5,15,9,20,90,0,6,16,6,2,7,6,175,25,1,64,25,128,25,144,25,3,
19,95,9,9,6,7,3,20,95,6,18,0,63,237,63,18,57,47,237,1,93,93,47,94,93,237,
50,47,93,93,93,113,237,49,48,0,93,93,93,93,1,20,14,2,35,33,17,51,17,33,50,
30,2,7,52,38,35,33,17,33,50,54,4,214,61,121,182,121,253,183,191,1,126,125,
186,124,62,192,164,164,254,153,1,111,165,155,1,157,87,150,112,64,5,129,253,
172,58,105,147,96,121,131,254,4,131,0,1,0,105,255,236,5,121,5,150,0,42,0,
206,64,81,115,26,131,26,2,115,28,131,28,2,101,28,1,115,4,131,4,2,101,4,1,
115,2,131,2,2,101,2,1,101,12,1,101,11,1,135,17,1,106,17,1,90,33,138,33,2,
10,32,26,32,90,32,3,10,40,26,40,2,36,36,24,38,14,91,32,35,112,35,2,144,35,
176,35,2,127,35,1,64,35,1,35,184,255,192,64,63,7,10,72,35,6,80,24,96,24,2,
175,24,191,24,2,32,24,1,24,35,95,127,38,175,38,2,38,38,9,30,95,19,16,25,32,
25,2,48,25,64,25,112,25,128,25,192,25,208,25,6,25,25,19,19,79,5,1,5,5,0,95,
9,4,0,63,237,51,47,93,63,51,47,93,113,16,237,17,57,47,113,237,1,47,93,93,
113,51,47,43,93,93,93,113,237,51,18,57,47,49,48,0,93,1,93,93,0,93,93,93,1,
93,93,93,93,93,93,93,93,1,34,14,2,7,39,54,36,51,50,4,22,18,21,20,2,6,4,35,
34,46,2,39,55,30,3,51,50,62,2,55,33,53,33,46,3,2,201,88,137,102,69,19,181,
71,1,46,225,164,1,0,175,91,86,172,254,255,171,118,189,149,113,41,156,27,81,
109,140,87,109,176,128,77,9,253,114,2,142,10,73,124,173,4,250,42,70,91,50,
60,173,176,101,187,254,246,165,159,254,244,195,109,54,99,136,83,78,55,105,
83,50,72,132,185,112,154,110,178,126,68,0,0,2,0,168,255,236,7,179,5,150,0,
26,0,46,0,168,64,63,165,7,1,133,24,1,138,20,1,121,29,1,118,35,1,118,39,1,
74,19,138,19,2,58,30,122,30,2,53,34,117,34,2,42,44,58,44,122,44,3,37,40,53,
40,117,40,3,160,48,1,0,91,144,27,160,27,2,160,27,176,27,2,27,184,255,192,
64,54,7,11,72,27,16,12,90,0,13,16,13,64,13,3,7,13,37,91,17,48,10,112,10,2,
10,32,95,22,4,11,95,80,16,1,176,16,224,16,2,15,16,1,8,16,16,13,14,3,13,18,
42,95,5,19,0,63,237,63,63,18,57,47,94,93,93,113,237,63,237,1,47,93,51,237,
47,94,93,237,50,47,43,93,113,237,93,49,48,93,93,93,93,93,93,93,93,93,93,93,
1,20,2,14,1,35,34,46,2,39,33,17,35,17,51,17,33,62,3,51,50,30,1,18,7,52,46,
2,35,34,14,2,21,20,30,2,51,50,62,2,7,179,90,170,245,155,156,239,165,90,7,
254,217,191,191,1,42,13,99,166,232,146,159,245,167,87,195,60,117,173,113,
116,175,117,58,60,117,173,114,121,176,114,54,2,199,165,254,242,192,104,99,
179,247,148,253,115,5,129,253,172,142,229,160,86,102,188,254,246,163,127,
208,148,80,80,148,208,127,127,211,153,85,86,153,212,0,2,0,96,0,0,5,32,5,129,
0,17,0,30,0,239,64,22,156,29,172,29,2,138,29,1,147,20,1,117,20,133,20,2,67,
17,83,17,2,17,184,255,216,64,25,33,36,72,130,17,146,17,162,17,3,100,17,116,
17,2,86,17,1,67,16,83,16,2,3,16,184,255,216,64,117,33,36,72,172,16,1,155,
16,1,125,16,141,16,2,2,94,16,110,16,2,73,16,1,44,16,60,16,2,3,175,1,1,2,1,
104,14,16,72,94,1,110,1,2,73,1,1,44,1,60,1,2,16,1,1,6,24,24,14,18,90,6,6,
0,13,90,224,14,1,143,14,159,14,175,14,207,14,4,0,14,64,14,2,7,14,17,32,0,
1,15,0,31,0,2,0,1,15,95,47,24,95,24,111,24,143,24,4,24,24,0,26,95,11,3,14,
14,0,18,0,63,50,47,63,237,18,57,47,93,237,50,1,47,93,93,51,47,94,93,93,93,
237,18,57,47,237,17,51,17,18,57,17,51,49,48,93,93,93,43,95,93,95,93,93,93,
95,93,93,93,43,95,113,93,93,93,43,113,0,93,93,93,93,51,1,46,3,53,52,62,2,
51,33,17,35,17,33,1,19,20,30,2,51,33,17,33,34,14,2,96,1,144,91,130,84,39,
66,126,185,120,2,151,191,254,73,254,146,28,37,77,119,83,1,205,254,59,76,120,
84,44,2,95,16,78,108,130,67,94,150,104,55,250,127,2,73,253,183,3,236,57,98,
72,41,2,8,31,63,94,255,255,0,87,255,236,4,115,4,78,18,6,0,68,0,0,0,2,0,120,
255,236,4,63,5,222,0,19,0,56,0,158,64,69,137,44,1,122,45,138,45,2,102,21,
118,21,134,21,3,84,18,1,84,12,1,91,2,1,90,35,122,35,138,35,3,90,47,106,47,
138,47,3,123,46,139,46,2,73,46,105,46,2,42,42,23,71,64,208,0,1,144,0,1,0,
58,128,48,58,1,128,58,1,58,184,255,192,64,12,30,35,72,52,10,71,0,31,32,31,
2,31,184,255,192,64,23,26,35,72,31,52,5,80,20,20,42,48,41,1,64,41,240,41,
2,41,15,80,26,22,0,63,237,47,93,113,51,57,47,237,50,1,47,43,93,237,57,43,
93,113,26,16,220,93,113,26,237,50,47,49,48,0,93,93,93,93,93,93,93,93,93,93,
1,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,3,50,18,17,16,2,35,34,46,2,53,
52,18,62,1,55,62,3,55,21,14,1,7,14,5,7,62,3,3,130,39,73,104,65,69,114,81,
44,44,77,105,62,69,112,78,42,243,222,210,250,238,113,178,123,65,58,128,206,
147,57,100,91,86,43,86,161,91,78,124,94,67,44,23,2,19,67,97,126,1,246,114,
151,91,37,39,92,150,112,114,150,89,36,36,88,151,2,127,254,251,254,250,254,
247,254,253,70,156,250,180,192,1,22,193,115,28,11,17,14,12,6,161,11,23,17,
14,33,50,73,108,149,101,55,97,72,41,0,0,0,0,3,0,142,0,0,3,231,4,58,0,23,0,
36,0,47,0,149,64,12,42,19,1,37,2,1,26,18,42,18,2,3,184,255,232,64,33,9,12,
72,139,10,155,10,2,10,38,44,71,5,5,24,16,71,64,47,30,159,30,2,160,30,1,30,
49,128,64,49,1,49,184,255,192,64,50,30,35,72,31,49,63,49,239,49,3,38,24,70,
192,22,1,0,22,16,22,48,22,224,22,240,22,5,8,22,10,36,81,143,38,159,38,175,
38,3,38,38,24,37,80,23,15,24,80,22,21,0,63,237,63,237,18,57,47,113,237,57,
1,47,94,93,113,237,50,93,43,113,26,16,220,93,113,26,237,17,57,47,237,18,57,
93,49,48,0,43,93,93,93,1,50,30,2,21,20,14,2,7,21,30,3,21,20,14,2,35,33,17,
19,51,50,62,2,53,52,46,2,43,1,25,1,51,50,62,2,53,52,38,35,2,52,76,144,112,
68,35,60,82,46,54,95,69,40,61,109,151,91,254,67,180,236,69,95,59,27,28,63,
100,71,224,216,68,91,55,23,102,121,4,58,24,62,104,81,53,81,58,37,9,7,7,35,
61,90,61,78,117,78,39,4,58,252,75,20,44,67,47,50,70,44,20,1,194,254,192,19,
39,61,43,82,76,0,1,0,142,0,0,2,175,4,58,0,5,0,54,64,35,0,64,18,39,72,48,0,
1,0,0,7,3,70,192,4,1,0,4,16,4,48,4,224,4,240,4,5,8,4,2,80,5,15,3,21,0,63,
63,237,1,47,94,93,113,237,17,51,47,93,43,49,48,1,21,33,17,35,17,2,175,254,
147,180,4,58,131,252,73,4,58,0,0,0,2,0,20,254,104,4,136,4,58,0,7,0,23,0,159,
64,65,134,3,1,32,3,1,102,1,1,34,5,114,5,130,5,3,34,20,1,34,17,1,137,18,1,
34,18,1,25,19,121,19,2,102,2,118,2,2,34,2,1,25,2,1,34,16,1,4,16,1,98,4,1,
4,4,36,4,68,4,84,4,4,8,73,9,184,255,192,64,42,18,25,72,9,9,22,70,64,111,7,
127,7,143,7,3,32,7,64,7,2,7,25,128,20,15,12,73,6,1,13,1,80,20,15,22,6,14,
80,11,21,13,8,0,47,51,63,237,50,50,63,237,1,47,51,51,237,51,51,26,16,220,
93,93,26,237,50,47,43,237,49,48,93,93,93,93,93,93,93,93,93,93,93,93,93,93,
93,93,1,33,6,2,14,1,7,33,1,35,17,33,17,35,17,51,62,2,18,55,33,17,51,3,66,
254,206,24,49,48,48,22,1,241,1,70,163,252,210,163,119,30,58,58,57,28,2,132,
146,3,183,177,254,249,194,136,50,253,229,1,152,254,104,2,27,50,143,220,1,
59,223,252,73,255,255,0,87,255,236,4,24,4,78,18,6,0,72,0,0,0,1,0,7,0,0,5,
83,4,58,0,39,1,97,64,88,165,23,1,165,14,1,171,34,1,164,3,1,172,24,1,154,24,
1,163,13,1,149,13,1,90,6,106,6,122,6,3,85,31,101,31,117,31,3,74,33,154,33,
170,33,3,69,4,149,4,165,4,3,42,28,58,28,2,37,9,53,9,2,34,31,170,26,1,26,31,
27,16,27,27,32,20,38,70,39,165,11,1,11,10,3,6,6,39,10,184,255,240,64,49,10,
10,17,39,39,5,33,32,16,15,32,1,255,32,1,160,32,1,159,32,1,80,32,1,63,32,1,
32,32,1,207,32,1,128,32,144,32,2,95,32,1,32,32,48,32,2,32,4,5,184,255,240,
64,64,31,5,47,5,2,127,5,159,5,2,63,5,159,5,223,5,255,5,4,5,15,41,1,255,41,
1,160,41,1,111,41,159,41,2,80,41,1,63,41,1,32,41,1,207,41,1,128,41,144,41,
2,79,41,95,41,2,48,41,1,31,6,34,3,6,184,255,240,64,37,11,17,72,6,3,37,0,80,
20,15,17,31,17,79,17,95,17,4,15,17,31,17,79,17,3,7,17,17,4,26,18,10,15,39,
33,4,21,0,63,51,51,63,51,51,18,57,47,94,93,113,51,237,50,57,57,43,17,51,17,
51,1,93,93,93,93,113,113,113,113,113,113,114,47,93,113,114,56,51,47,93,93,
93,93,113,113,113,113,113,113,114,56,51,18,57,47,51,57,47,56,18,57,17,51,
17,51,93,16,237,50,17,57,47,56,57,51,93,17,51,49,48,93,93,93,93,93,93,93,
93,93,93,93,93,0,93,93,1,34,38,39,1,35,1,46,1,39,3,51,23,30,3,51,17,51,17,
50,62,2,63,1,51,3,14,1,7,1,35,1,14,1,35,17,35,2,83,26,65,19,254,234,200,1,
97,17,66,45,216,188,148,48,65,52,48,30,180,30,48,52,65,48,148,188,216,45,
66,17,1,97,200,254,234,19,65,26,180,1,221,12,8,254,15,2,80,14,85,66,1,69,
239,77,92,50,16,1,218,254,38,16,50,92,77,239,254,187,66,85,14,253,176,1,241,
8,12,254,35,0,0,0,1,0,49,255,236,3,94,4,78,0,55,0,175,64,28,5,53,21,53,2,
5,38,21,38,37,38,3,131,45,1,45,15,21,70,40,40,51,71,10,29,73,64,30,184,255,
192,64,86,30,36,72,143,15,1,30,15,30,15,3,144,10,1,144,10,160,10,2,31,10,
1,10,57,128,16,57,1,4,73,3,64,12,20,72,3,45,15,80,143,16,159,16,175,16,3,
16,16,35,7,0,29,1,144,29,224,29,240,29,3,29,29,24,80,35,16,7,80,0,96,4,112,
4,128,4,3,239,4,1,32,4,1,4,4,0,22,0,63,50,47,93,93,113,16,237,63,237,51,47,
93,113,17,18,57,47,113,237,57,1,47,43,237,93,26,16,204,93,93,113,17,57,57,
47,47,93,43,26,237,16,237,50,47,237,18,57,113,49,48,93,93,5,34,38,39,55,30,
1,51,50,54,53,52,46,2,35,53,50,62,2,53,52,38,35,34,14,2,7,39,62,3,51,50,30,
2,21,20,14,2,7,21,30,3,21,20,14,2,1,202,167,197,45,159,25,126,103,96,113,
55,92,120,64,64,114,86,49,99,93,35,70,60,42,7,162,12,62,97,128,78,85,138,
98,53,44,71,88,45,56,100,75,43,49,101,152,20,125,129,44,78,86,94,91,59,78,
45,18,137,15,38,67,52,74,86,14,33,55,42,20,68,98,63,29,42,76,104,63,57,88,
61,36,4,2,6,41,67,93,58,69,119,87,49,0,0,0,0,1,0,142,0,0,3,234,4,58,0,19,
0,186,64,25,9,17,1,233,17,249,17,2,4,15,1,228,15,244,15,2,11,5,1,235,5,251,
5,2,16,184,255,192,64,107,29,60,72,153,16,1,6,64,29,60,72,119,6,151,6,2,6,
7,1,230,7,246,7,2,156,7,1,105,7,137,7,2,31,17,47,17,79,17,3,9,72,64,7,64,
10,1,80,10,1,159,10,255,10,2,10,21,128,0,21,192,21,208,21,224,21,4,192,21,
1,128,21,144,21,176,21,192,21,208,21,5,17,1,72,192,18,1,0,18,16,18,48,18,
224,18,240,18,5,8,18,16,7,19,15,10,6,18,21,0,63,51,51,63,51,51,1,47,94,93,
113,237,50,93,113,114,26,16,220,93,113,114,50,26,237,49,48,0,93,1,93,93,113,
114,0,93,43,93,43,113,114,113,114,1,113,114,1,17,20,14,2,7,1,51,17,35,17,
52,62,2,55,1,35,17,1,60,3,3,3,1,1,243,197,172,2,3,3,2,254,6,192,4,58,253,
176,23,77,82,74,21,3,101,251,198,2,148,19,57,60,57,20,252,151,4,58,0,255,
255,0,142,0,0,3,234,5,240,18,38,1,206,0,0,17,7,2,145,0,234,0,0,0,19,64,11,
1,20,17,38,1,2,25,33,18,8,37,1,43,53,0,43,53,0,0,0,0,1,0,138,0,0,3,138,4,
58,0,21,0,202,64,17,117,16,133,16,149,16,3,57,15,121,15,137,15,153,15,4,13,
184,255,208,64,123,12,17,72,133,11,149,11,2,120,5,1,133,13,149,13,2,47,23,
79,23,2,73,16,1,56,16,1,16,13,121,8,137,8,153,8,3,8,71,13,1,54,13,1,13,9,
16,9,9,14,2,20,70,0,21,16,21,48,21,240,21,4,21,57,15,73,15,2,15,32,14,1,32,
14,144,14,2,144,14,1,79,14,1,48,14,1,47,14,1,16,14,1,14,16,14,13,19,80,15,
2,63,2,79,2,3,15,2,63,2,255,2,3,8,2,2,14,21,21,14,21,8,8,0,15,0,63,50,47,
63,51,47,17,57,47,94,93,113,237,50,1,47,56,93,93,93,93,93,113,114,51,113,
47,93,237,50,17,57,47,56,57,113,113,51,93,17,51,113,113,93,49,48,0,93,1,93,
93,43,93,93,19,51,17,50,62,2,63,1,51,3,14,1,7,1,35,1,14,1,35,17,35,138,180,
30,48,52,65,48,148,188,216,45,66,17,1,97,200,254,234,19,65,26,180,4,58,254,
38,16,50,92,77,239,254,187,66,85,14,253,176,1,241,8,12,254,35,0,0,0,0,1,0,
11,255,236,4,29,4,58,0,25,0,186,64,42,26,21,1,130,7,1,116,7,1,85,7,101,7,
2,130,6,1,117,6,1,22,6,38,6,102,6,3,114,5,130,5,2,100,5,1,86,5,1,134,4,1,
4,184,255,240,64,61,12,15,72,26,3,1,116,2,1,7,24,12,17,72,25,70,64,127,0,
143,0,239,0,3,0,27,128,176,27,192,27,208,27,3,176,27,240,27,2,64,27,96,27,
112,27,160,27,176,27,192,27,6,131,23,1,23,54,6,1,6,2,184,255,240,64,26,24,
28,72,215,2,231,2,2,128,2,1,2,143,12,1,12,2,80,23,15,16,80,9,22,0,21,0,63,
63,237,63,237,1,47,93,51,93,93,43,51,113,51,93,93,113,114,26,16,220,93,26,
237,49,48,0,43,1,93,93,43,93,93,93,93,93,93,93,93,93,93,93,33,17,33,6,2,14,
3,35,34,38,39,53,30,1,51,50,62,3,18,55,33,17,3,104,254,137,25,42,44,51,71,
94,65,29,48,17,11,38,19,35,51,40,33,34,38,25,2,206,3,183,184,254,225,216,
149,93,42,8,5,129,4,5,42,94,149,216,1,29,183,251,198,0,0,1,0,142,0,0,4,243,
4,58,0,28,1,3,64,21,137,18,153,18,2,134,12,150,12,2,107,17,123,17,2,100,13,
116,13,2,1,184,255,224,64,122,29,60,72,138,1,154,1,2,57,1,1,0,32,29,60,72,
133,0,149,0,2,54,0,86,0,2,143,19,159,19,2,93,19,109,19,125,19,3,59,19,75,
19,2,25,19,41,19,2,128,11,144,11,2,82,11,98,11,114,11,3,52,11,68,11,2,22,
11,38,11,2,1,0,15,15,8,21,72,64,19,80,22,1,159,22,255,22,2,22,30,128,144,
30,192,30,208,30,3,79,30,1,11,8,72,192,9,1,0,9,16,9,48,9,224,9,240,9,5,8,
9,28,2,2,184,255,192,64,22,29,60,72,2,32,19,22,72,84,2,1,19,2,10,15,22,15,
64,29,60,72,15,184,255,224,64,18,19,22,72,47,15,63,15,79,15,127,15,143,15,
5,15,1,9,21,0,63,51,51,93,43,43,51,63,51,51,93,43,43,17,51,1,47,94,93,113,
237,50,93,93,26,16,220,93,113,50,26,237,18,57,61,47,51,51,49,48,93,93,93,
93,93,93,93,93,93,93,43,93,93,43,93,93,93,93,33,35,1,30,3,21,17,35,17,33,
19,30,1,23,62,1,55,19,33,17,35,17,52,62,2,55,3,19,153,254,188,1,3,1,1,174,
1,24,220,23,37,8,10,35,23,220,1,13,173,1,3,2,2,3,183,26,60,61,57,23,253,44,
4,58,253,107,63,151,72,72,151,63,2,149,251,198,2,212,22,60,64,60,23,0,1,0,
142,0,0,3,221,4,58,0,11,0,139,64,48,5,70,64,2,15,6,79,6,2,57,47,6,111,6,143,
6,255,6,4,191,6,1,143,6,159,6,255,6,3,6,13,128,0,13,192,13,208,13,224,13,
4,192,13,1,128,13,1,13,184,255,192,64,49,19,23,72,1,9,70,192,10,1,0,10,16,
10,48,10,224,10,240,10,5,10,8,80,176,1,192,1,2,159,1,175,1,191,1,3,15,1,63,
1,2,8,1,1,10,5,21,3,0,15,0,63,50,63,51,57,47,94,93,113,114,237,1,47,93,113,
237,50,43,93,113,114,26,16,220,93,113,114,94,93,50,26,237,49,48,1,17,33,17,
51,17,35,17,33,17,35,17,1,66,1,231,180,180,254,25,180,4,58,254,54,1,202,251,
198,1,237,254,19,4,58,255,255,0,86,255,236,4,29,4,78,18,6,0,82,0,0,0,1,0,
142,0,0,3,199,4,58,0,7,0,109,64,80,1,70,64,15,2,79,2,2,57,47,2,111,2,143,
2,255,2,4,191,2,1,143,2,159,2,255,2,3,2,9,128,0,9,192,9,208,9,224,9,4,192,
9,1,128,9,176,9,192,9,208,9,4,47,9,1,5,70,192,6,1,0,6,16,6,48,6,224,6,240,
6,5,8,6,4,80,7,15,6,1,21,0,63,51,63,237,1,47,94,93,113,237,93,93,113,114,
26,16,220,93,113,114,94,93,26,237,49,48,1,17,35,17,33,17,35,17,3,199,180,
254,47,180,4,58,251,198,3,183,252,73,4,58,0,255,255,0,132,254,87,4,29,4,77,
18,6,0,83,0,0,255,255,0,87,255,236,3,202,4,78,18,6,0,70,0,0,0,1,0,35,0,0,
3,135,4,58,0,7,0,72,64,43,7,14,4,2,5,14,223,2,1,2,4,70,0,5,16,5,2,8,5,5,8,
9,160,9,1,95,9,1,48,9,64,9,2,47,9,1,4,21,3,7,80,0,15,0,63,237,50,63,1,93,
93,93,93,17,18,57,47,94,93,237,204,93,43,1,24,16,77,228,49,48,19,33,21,33,
17,35,17,33,35,3,100,254,168,180,254,168,4,58,131,252,73,3,183,0,0,0,255,
255,0,5,254,87,3,252,4,58,18,6,0,92,0,0,0,3,0,86,254,87,6,62,5,204,0,53,0,
74,0,95,0,229,64,13,141,93,157,93,173,93,3,78,24,14,17,72,72,184,255,232,
179,14,17,72,57,184,255,232,182,14,17,72,109,82,1,51,184,255,224,64,75,7,
10,72,15,26,31,26,47,26,3,24,32,7,10,72,0,3,16,3,32,3,3,7,4,54,71,64,25,14,
13,0,14,14,75,71,36,0,68,0,148,0,164,0,4,0,85,39,13,72,65,38,4,14,1,4,14,
36,14,68,14,100,14,132,14,180,14,228,14,7,7,14,52,97,1,97,184,255,192,64,
52,30,35,72,219,97,1,84,97,100,97,132,97,148,97,4,64,97,1,2,32,97,48,97,2,
31,97,1,0,97,1,38,0,31,45,80,3,70,80,49,28,16,8,18,91,3,59,80,5,22,22,13,
27,0,63,63,51,237,23,50,63,51,237,23,50,63,1,93,93,93,95,93,93,93,43,113,
47,94,93,113,51,51,237,50,50,220,93,237,43,1,24,16,77,244,26,237,49,48,95,
94,93,43,93,0,43,93,1,43,43,43,93,1,20,14,2,35,34,38,39,35,30,1,21,17,35,
17,52,54,55,35,14,1,35,34,2,17,16,18,51,50,22,23,51,52,46,2,53,17,51,17,20,
14,2,21,51,62,1,51,50,30,2,5,20,30,2,51,50,62,2,55,53,52,46,2,35,34,14,2,
5,52,46,2,35,34,14,2,29,1,30,3,51,50,62,2,6,62,38,86,140,101,105,158,42,6,
2,3,170,2,3,5,46,149,111,186,179,185,180,112,149,45,5,2,2,1,170,1,1,1,5,46,
144,114,101,140,86,38,250,213,26,56,85,60,60,94,65,34,2,34,64,94,61,57,86,
57,29,4,110,23,52,88,64,53,92,70,40,1,35,65,92,60,65,88,53,23,2,34,123,208,
150,85,88,100,35,77,58,254,89,1,167,54,82,40,104,90,1,19,1,25,1,28,1,26,90,
98,10,41,46,42,12,1,163,254,92,11,43,47,43,12,104,89,80,145,205,129,112,160,
103,48,43,98,157,113,24,115,159,98,43,46,102,163,116,100,156,108,56,34,96,
169,135,23,108,150,93,41,58,110,159,0,0,0,255,255,0,23,0,0,3,234,4,58,18,
6,0,91,0,0,0,1,0,142,254,104,4,102,4,58,0,11,0,91,178,7,73,8,184,255,192,
64,54,18,21,72,8,8,5,70,64,223,2,1,207,2,223,2,2,2,64,25,28,72,0,2,48,2,2,
2,13,128,111,13,1,1,70,0,10,16,10,48,10,240,10,4,8,10,5,1,80,10,21,8,3,0,
15,0,63,50,47,63,237,50,1,47,94,93,237,93,26,16,220,93,43,93,113,26,237,50,
47,43,237,49,48,1,17,33,17,51,17,51,17,35,17,33,17,1,66,1,221,180,147,163,
252,203,4,58,252,73,3,183,252,73,253,229,1,152,4,58,0,1,0,122,0,0,3,156,4,
58,0,25,0,92,64,37,108,15,124,15,140,15,3,22,32,7,10,72,21,24,7,12,72,12,
70,64,9,175,13,1,127,13,143,13,239,13,3,13,27,128,1,70,24,184,255,192,64,
20,9,12,72,24,14,19,80,9,15,6,31,6,2,6,6,12,21,10,0,15,0,63,50,63,57,47,93,
51,237,50,1,47,43,237,26,16,220,93,113,50,26,237,49,48,43,43,0,93,1,17,20,
30,2,51,50,54,55,17,51,17,35,17,14,3,35,34,46,2,53,17,1,46,16,39,64,47,70,
132,74,180,180,38,81,87,93,51,66,101,69,36,4,58,254,110,34,59,44,25,26,21,
2,5,251,198,1,205,15,31,24,16,41,76,110,69,1,155,0,0,0,1,0,142,0,0,5,221,
4,58,0,11,0,116,64,52,7,70,4,4,0,11,70,64,4,8,52,8,2,36,8,132,8,212,8,228,
8,4,11,8,1,139,8,251,8,2,8,13,128,251,13,1,180,13,212,13,2,128,13,1,2,112,
13,1,95,13,1,13,184,255,192,64,23,9,12,72,3,70,0,0,16,0,48,0,3,8,0,9,5,1,
15,7,3,80,0,21,0,63,237,50,63,51,51,1,47,94,93,237,43,93,93,95,93,93,93,26,
16,220,93,113,113,114,26,237,18,57,47,237,49,48,51,17,51,17,33,17,51,17,33,
17,51,17,142,180,1,154,180,1,153,180,4,58,252,73,3,183,252,73,3,183,251,198,
0,0,0,1,0,142,254,104,6,102,4,58,0,15,0,141,64,96,13,73,244,14,1,14,14,11,
70,8,7,70,64,4,4,0,107,8,1,4,8,1,84,8,228,8,2,59,8,1,107,8,123,8,139,8,251,
8,4,84,8,1,8,17,128,251,17,1,212,17,1,128,17,176,17,2,2,96,17,112,17,2,95,
17,1,32,17,48,17,64,17,3,3,70,0,0,16,0,48,0,240,0,4,8,0,14,9,5,1,15,11,7,
3,80,0,21,0,63,237,50,50,63,51,51,47,1,47,94,93,237,93,93,93,95,93,93,93,
26,16,204,93,93,113,113,114,114,17,57,47,26,237,16,237,50,47,93,237,49,48,
51,17,51,17,33,17,51,17,33,17,51,17,51,17,35,17,142,180,1,149,180,1,148,180,
147,163,4,58,252,73,3,183,252,73,3,183,252,73,253,229,1,152,0,0,0,0,2,0,45,
0,0,4,172,4,58,0,14,0,25,0,113,185,0,5,255,224,179,7,10,72,2,184,255,224,
64,16,7,11,72,3,71,64,176,21,1,21,27,128,80,27,1,27,184,255,192,64,45,30,
35,72,255,27,1,14,11,15,70,32,9,1,32,9,1,9,25,81,175,14,191,14,207,14,3,15,
14,31,14,79,14,3,7,14,14,9,11,80,12,15,15,81,9,21,0,63,237,63,237,18,57,47,
94,93,113,237,1,47,93,113,253,204,51,93,43,113,26,16,220,93,26,237,49,48,
43,43,1,50,22,21,20,14,2,35,33,17,33,53,33,25,1,51,50,62,2,53,52,38,43,1,
3,13,205,210,52,104,155,103,254,103,254,184,1,252,202,69,96,59,26,116,133,
203,2,112,147,159,74,118,82,44,3,183,131,254,54,254,15,25,49,71,46,94,87,
0,3,0,142,0,0,5,50,4,58,0,12,0,23,0,27,0,105,185,0,5,255,224,179,7,10,72,
2,184,255,224,64,58,7,10,72,3,71,19,19,9,27,70,64,159,24,175,24,2,24,29,128,
12,13,70,16,9,32,9,64,9,3,9,23,81,175,12,191,12,207,12,3,15,12,31,12,79,12,
3,7,12,12,9,25,10,15,24,13,81,9,21,0,63,237,51,63,51,18,57,47,94,93,113,237,
1,47,93,237,50,26,16,220,93,26,237,18,57,47,237,49,48,43,43,1,50,22,21,20,
14,2,35,33,17,51,25,1,51,50,62,2,53,52,38,43,1,1,17,51,17,2,38,205,210,52,
104,155,103,254,103,180,202,69,96,59,26,116,133,203,3,60,180,2,112,147,159,
74,118,82,44,4,58,254,54,254,15,25,49,71,46,94,87,254,13,4,58,251,198,0,0,
0,0,2,0,142,0,0,3,215,4,58,0,12,0,23,0,132,185,0,5,255,224,179,7,10,72,2,
184,255,224,64,86,7,10,72,3,71,64,176,19,1,19,25,128,47,25,1,47,25,175,25,
2,63,25,95,25,127,25,159,25,191,25,207,25,223,25,255,25,8,25,64,35,39,72,
12,13,70,0,9,208,9,2,16,9,32,9,64,9,240,9,4,9,23,81,175,12,191,12,207,12,
3,15,12,31,12,79,12,3,7,12,12,9,10,15,13,81,9,21,0,63,237,63,18,57,47,94,
93,113,237,1,47,93,113,237,50,43,93,113,114,26,16,220,93,26,237,49,48,43,
43,1,50,22,21,20,14,2,35,33,17,51,25,1,51,50,62,2,53,52,38,43,1,2,56,205,
210,52,104,155,103,254,85,180,220,69,96,59,26,116,133,221,2,112,147,159,74,
118,82,44,4,58,254,54,254,15,25,49,71,46,94,87,0,0,0,0,1,0,55,255,236,3,190,
4,78,0,40,0,170,64,87,118,34,1,22,29,1,118,28,1,107,15,1,107,6,1,16,10,32,
10,2,10,10,0,31,71,64,12,31,9,1,144,9,1,9,42,128,20,70,21,21,1,70,31,0,1,
223,0,1,0,64,12,18,72,0,10,80,143,11,159,11,175,11,3,11,11,26,4,80,36,0,1,
16,1,32,1,96,1,112,1,128,1,192,1,208,1,8,1,184,255,192,64,29,27,34,72,1,1,
36,22,31,20,47,20,127,20,143,20,223,20,5,20,64,29,32,72,20,20,17,80,26,16,
0,63,237,51,47,43,93,63,51,47,43,93,16,237,17,57,47,113,237,1,47,43,113,114,
237,51,47,237,26,16,220,93,113,50,26,237,18,57,47,93,49,48,93,93,93,93,93,
19,55,30,1,51,50,62,2,55,33,53,33,46,3,35,34,6,7,39,62,3,51,50,30,2,21,20,
14,2,35,34,46,2,55,182,16,133,100,73,103,68,34,5,254,99,1,157,4,34,67,103,
73,109,118,15,185,13,66,105,145,93,90,170,134,81,51,114,182,130,99,151,106,
61,1,59,12,108,104,53,97,135,82,131,90,133,88,44,105,91,14,68,116,84,48,53,
128,216,163,120,205,151,86,54,92,122,0,0,0,0,2,0,142,255,236,5,170,4,78,0,
19,0,39,0,128,64,85,121,37,137,37,2,116,33,132,33,2,118,27,134,27,2,121,23,
137,23,2,150,18,166,18,2,30,71,15,15,8,31,8,2,7,8,8,11,0,71,64,160,20,1,20,
41,128,14,10,70,192,11,1,0,11,16,11,48,11,224,11,240,11,5,8,11,25,80,17,16,
9,80,47,14,1,14,14,11,12,15,11,21,35,80,3,22,0,63,237,63,63,18,57,47,93,237,
63,237,1,47,94,93,113,237,50,26,16,220,93,26,237,18,57,47,94,93,51,237,49,
48,0,93,1,93,93,93,93,1,16,2,35,34,46,2,39,35,17,35,17,51,17,51,18,33,50,
18,3,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,5,170,235,223,102,161,115,65,
5,222,180,180,223,33,1,164,237,215,189,35,67,97,61,63,99,70,37,39,70,94,56,
62,100,70,38,2,30,254,228,254,234,62,128,192,131,254,19,4,58,254,54,1,222,
254,232,254,232,126,164,98,39,41,99,164,123,126,165,98,40,39,98,166,0,0,2,
0,17,0,0,3,199,4,58,0,13,0,22,0,143,64,68,117,1,133,1,2,3,32,11,17,72,0,32,
40,43,72,223,0,239,0,2,0,32,29,37,72,52,0,1,43,0,1,41,4,1,4,48,7,10,72,7,
32,7,11,72,18,71,0,3,3,12,6,6,2,22,11,70,64,175,12,1,239,12,1,12,24,128,1,
2,184,255,240,64,22,91,2,107,2,2,2,3,0,81,47,21,1,21,21,1,15,81,9,15,12,1,
21,0,63,51,63,237,18,57,47,93,237,50,1,47,93,56,51,26,16,220,93,113,26,237,
51,18,57,47,18,57,17,51,237,49,48,43,0,43,93,1,93,113,43,113,43,43,93,9,1,
35,1,46,1,53,52,54,51,33,17,35,25,1,35,34,6,21,20,22,59,1,2,23,254,197,203,
1,88,131,118,216,207,1,176,180,234,130,120,107,124,253,1,202,254,54,1,215,
27,163,122,149,150,251,198,1,202,1,241,92,93,94,93,0,255,255,0,87,255,236,
4,24,5,123,18,38,0,72,0,0,17,7,0,105,0,248,0,0,0,23,64,13,3,2,38,17,38,3,
2,4,42,40,17,27,37,1,43,53,53,0,43,53,53,0,0,0,0,1,0,10,254,87,3,238,5,204,
0,57,0,162,64,9,170,49,1,31,32,9,15,72,24,184,255,232,64,86,9,13,72,0,24,
16,24,2,7,36,36,57,28,70,64,80,45,1,159,45,1,45,59,128,10,7,57,70,4,3,192,
0,1,0,0,16,0,48,0,224,0,240,0,5,8,0,176,59,192,59,208,59,3,176,59,240,59,
2,255,59,1,112,59,160,59,176,59,3,57,21,40,80,33,27,15,51,80,22,10,2,81,7,
3,3,5,22,184,255,192,182,7,13,72,22,15,5,0,0,63,63,43,18,57,47,51,237,50,
16,237,50,63,237,63,1,93,93,113,114,47,94,93,113,51,51,237,50,50,26,16,220,
93,113,26,237,17,57,47,49,48,0,94,93,43,43,1,93,51,17,35,53,51,53,51,21,33,
21,33,21,20,14,2,7,51,62,3,51,50,30,2,21,17,20,14,2,35,34,38,39,53,30,1,51,
50,62,2,53,17,52,46,2,35,34,14,2,21,17,142,132,132,180,1,44,254,212,2,3,2,
1,3,30,70,84,100,62,104,133,77,29,21,54,93,72,34,65,28,13,36,13,38,49,27,
10,17,48,88,70,64,103,73,40,4,182,131,147,147,131,148,33,66,56,39,7,55,77,
50,23,56,101,140,84,252,209,62,106,78,45,4,5,139,2,4,20,43,67,46,2,241,69,
104,69,35,46,84,120,75,253,170,0,0,0,255,255,0,142,0,0,2,200,5,228,18,38,
1,201,0,0,17,7,0,116,0,216,0,0,0,19,64,11,1,6,17,38,1,85,6,9,4,0,37,1,43,
53,0,43,53,0,0,0,0,1,0,87,255,236,3,222,4,78,0,40,0,171,64,113,116,30,1,116,
21,1,137,8,1,137,2,1,47,42,1,63,26,1,26,26,27,36,16,70,15,15,35,70,0,36,32,
36,2,0,36,64,36,96,36,128,36,160,36,192,36,224,36,7,8,36,24,27,71,31,5,1,
5,27,80,143,24,159,24,175,24,3,24,24,32,19,80,10,31,16,47,16,127,16,143,16,
223,16,5,16,64,29,32,72,16,16,10,16,32,80,0,0,35,16,35,32,35,96,35,112,35,
128,35,192,35,208,35,8,35,184,255,192,182,27,34,72,35,35,0,22,0,63,50,47,
43,93,16,237,63,51,47,43,93,16,237,18,57,47,113,237,1,47,93,237,50,47,94,
93,113,237,51,47,237,17,18,57,47,93,93,49,48,93,93,93,93,5,34,46,2,53,52,
62,2,51,50,30,2,23,7,46,1,35,34,14,2,7,33,21,33,30,3,51,50,54,55,23,14,3,
2,52,130,182,114,51,81,134,170,90,93,145,105,66,13,185,15,118,109,73,103,
67,34,4,1,156,254,99,4,35,68,103,74,100,133,16,182,9,61,106,151,20,86,151,
205,120,163,216,128,53,48,84,116,68,14,91,105,44,88,133,90,131,82,135,97,
53,103,109,12,67,122,92,54,0,255,255,0,57,255,236,3,182,4,75,18,6,0,86,0,
0,255,255,0,137,0,0,1,61,5,204,16,38,0,241,199,0,17,6,1,75,237,0,0,212,181,
9,64,56,56,72,9,184,255,192,64,9,55,55,72,9,64,54,54,72,9,184,255,192,179,
53,53,72,9,184,255,192,64,9,52,52,72,9,64,50,50,72,9,184,255,192,179,49,49,
72,9,184,255,192,64,9,48,48,72,9,64,42,42,72,9,184,255,192,179,41,41,72,9,
184,255,192,64,9,40,40,72,9,64,38,38,72,9,184,255,192,179,37,37,72,9,184,
255,192,179,36,36,72,9,184,255,192,179,35,35,72,9,184,255,192,64,16,34,34,
72,9,64,29,29,72,9,64,10,10,72,1,0,0,184,255,192,179,49,49,72,0,184,255,192,
64,9,40,41,72,0,64,25,27,72,0,184,255,192,182,18,18,72,128,0,1,0,184,255,
192,64,11,8,8,72,0,1,0,4,7,1,2,37,1,43,53,17,43,93,43,43,43,43,53,53,1,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,255,255,255,248,0,0,2,
37,5,123,18,38,0,241,0,0,17,6,0,105,203,0,0,25,182,2,1,4,17,38,2,1,184,255,
243,180,8,6,0,2,37,1,43,53,53,0,43,53,53,0,0,0,255,255,255,206,254,87,1,61,
5,204,18,6,0,77,0,0,0,2,0,11,255,236,6,236,4,58,0,34,0,45,1,42,64,82,163,
16,1,148,16,1,117,16,133,16,2,106,14,1,57,14,1,14,16,18,22,72,131,14,147,
14,163,14,3,117,14,1,106,13,1,57,13,1,13,16,18,22,72,163,13,1,87,13,103,13,
119,13,3,16,24,12,17,72,109,15,1,15,32,18,22,72,162,15,1,117,15,133,15,149,
15,3,54,15,70,15,2,5,184,255,224,179,7,10,72,2,184,255,224,64,18,7,11,72,
34,35,70,64,9,1,9,9,22,3,71,176,41,1,41,184,255,192,64,9,8,11,72,41,47,80,
47,1,47,184,255,192,64,93,30,35,72,255,47,1,48,47,1,109,11,1,31,11,63,11,
2,255,11,1,233,11,1,187,11,203,11,219,11,3,163,11,1,149,11,1,31,32,63,32,
2,255,32,1,106,32,1,41,32,1,163,32,1,53,32,1,11,15,32,3,22,45,81,175,34,191,
34,207,34,3,15,34,31,34,79,34,3,7,34,34,9,11,80,32,15,25,80,18,22,35,81,9,
21,0,63,237,63,237,63,237,18,57,47,94,93,113,237,1,47,23,51,93,93,113,113,
93,113,93,93,93,93,93,113,113,93,93,43,113,16,220,43,93,237,18,57,47,93,237,
50,49,48,43,43,93,93,93,43,113,0,43,1,93,93,43,113,113,93,93,43,113,113,93,
93,93,1,50,22,21,20,14,2,35,33,17,33,6,2,14,3,35,34,38,39,53,30,1,51,50,62,
3,18,55,33,25,1,51,50,62,2,53,52,38,43,1,5,77,205,210,52,104,155,103,254,
62,254,101,25,42,44,51,71,94,65,29,48,17,11,38,19,35,51,40,33,34,38,25,2,
242,242,69,96,59,26,116,133,243,2,112,147,159,74,118,82,44,3,183,184,254,
225,216,149,93,42,8,5,129,4,5,42,94,149,216,1,29,183,254,54,254,15,25,49,
71,46,94,87,0,0,2,0,142,0,0,6,44,4,58,0,20,0,31,0,133,185,0,7,255,224,179,
7,10,72,4,184,255,224,64,23,7,11,72,1,21,70,19,11,11,15,5,71,64,176,27,1,
27,33,128,80,33,1,33,184,255,192,64,50,30,35,72,255,33,1,18,14,70,16,15,32,
15,64,15,3,15,31,81,1,1,13,80,175,18,191,18,207,18,3,15,18,31,18,79,18,3,
7,18,18,0,15,21,21,81,11,21,16,0,15,0,63,50,63,237,63,18,57,47,94,93,113,
237,51,47,237,1,47,93,237,50,93,43,113,26,16,220,93,26,237,18,57,47,51,237,
50,49,48,43,43,1,17,51,50,22,21,20,14,2,35,33,17,33,17,35,17,51,17,33,17,
19,51,50,62,2,53,52,38,43,1,3,169,228,205,210,52,104,155,103,254,102,254,
78,180,180,1,178,181,202,69,96,59,26,116,133,203,4,58,254,54,147,159,74,118,
82,44,1,237,254,19,4,58,254,54,1,202,252,69,25,49,71,46,94,87,0,0,0,0,1,0,
10,0,0,3,238,5,204,0,41,0,144,185,0,7,255,232,64,85,9,13,72,0,7,16,7,2,7,
33,24,11,70,64,80,12,1,159,12,255,12,2,12,43,128,35,32,24,70,29,28,192,25,
1,0,25,16,25,48,25,224,25,240,25,5,8,25,176,43,192,43,208,43,3,176,43,240,
43,2,255,43,1,112,43,160,43,176,43,3,35,27,81,32,28,28,5,30,0,25,11,21,0,
18,80,5,184,255,192,180,9,13,72,5,15,0,63,43,237,50,63,51,63,18,57,47,51,
237,50,1,93,93,113,114,47,94,93,113,51,51,237,50,50,26,16,220,93,113,26,237,
17,57,49,48,0,94,93,43,1,62,3,51,50,30,2,21,17,35,17,52,46,2,35,34,14,2,21,
17,35,17,35,53,51,53,51,21,33,21,33,21,20,14,2,7,1,61,30,70,84,100,62,104,
133,77,29,181,17,48,88,70,64,103,73,40,180,132,132,180,1,44,254,212,2,3,2,
1,3,89,55,77,50,23,56,101,140,84,253,87,2,134,69,104,69,35,46,84,120,75,253,
170,4,182,131,147,147,131,148,33,66,56,39,7,0,0,255,255,0,138,0,0,3,138,5,
228,18,38,1,208,0,0,17,7,0,116,1,63,0,0,0,19,64,11,1,22,17,38,1,81,22,25,
0,14,37,1,43,53,0,43,53,0,0,0,255,255,0,5,254,87,3,252,5,240,18,38,0,92,0,
0,17,7,2,145,0,183,0,0,0,19,64,11,1,32,17,38,1,10,37,45,17,31,37,1,43,53,
0,43,53,0,0,0,0,1,0,142,254,104,3,221,4,58,0,11,0,125,64,89,9,73,15,10,79,
10,2,38,10,10,0,7,70,64,15,4,79,4,2,57,47,4,111,4,143,4,255,4,4,191,4,1,143,
4,159,4,255,4,3,4,13,128,3,70,192,0,1,0,0,16,0,48,0,224,0,240,0,5,8,0,176,
13,192,13,208,13,3,176,13,240,13,2,112,13,160,13,176,13,192,13,4,9,5,1,15,
8,3,80,0,0,47,237,51,63,51,47,1,93,113,114,47,94,93,113,237,26,16,220,93,
113,114,94,93,26,237,18,57,47,94,93,237,49,48,51,17,51,17,33,17,51,17,33,
17,35,17,142,180,1,231,180,254,170,163,4,58,252,73,3,183,251,198,254,104,
1,152,0,0,1,0,168,0,1,3,186,7,28,0,7,0,55,64,37,5,90,0,6,16,6,64,6,3,6,3,
70,255,0,1,0,0,16,0,64,0,128,0,176,0,208,0,6,7,0,4,95,1,7,3,5,18,0,63,63,
51,237,1,47,94,93,93,237,47,93,237,49,48,1,17,51,17,33,17,35,17,3,6,180,253,
173,191,5,129,1,155,253,201,251,28,5,128,0,0,0,0,1,0,142,0,0,3,10,5,204,0,
7,0,56,64,36,6,73,16,3,48,3,2,3,3,9,0,70,192,1,1,0,1,16,1,48,1,224,1,240,
1,5,8,1,4,0,7,80,2,15,0,21,0,63,63,237,63,1,47,94,93,113,237,17,51,47,93,
237,49,48,33,35,17,33,17,51,17,33,1,66,180,1,217,163,254,56,4,58,1,146,253,
235,255,255,0,9,0,0,7,134,6,240,18,38,0,58,0,0,17,7,2,148,2,65,0,0,0,21,180,
1,47,5,38,1,184,255,184,180,48,51,15,46,37,1,43,53,0,43,53,0,255,255,255,
253,0,0,5,204,5,228,18,38,0,90,0,0,17,7,0,67,1,72,0,0,0,21,180,1,43,17,38,
1,184,255,162,180,44,47,15,42,37,1,43,53,0,43,53,0,255,255,0,9,0,0,7,134,
6,240,18,38,0,58,0,0,17,7,2,149,2,247,0,0,0,19,64,11,1,47,5,38,1,75,47,50,
15,46,37,1,43,53,0,43,53,0,0,0,255,255,255,253,0,0,5,204,5,228,18,38,0,90,
0,0,17,7,0,116,2,38,0,0,0,19,64,11,1,43,17,38,1,93,43,46,15,42,37,1,43,53,
0,43,53,0,0,0,255,255,0,9,0,0,7,134,6,178,18,38,0,58,0,0,17,7,2,152,2,134,
0,0,0,23,64,13,2,1,47,5,38,2,1,2,51,49,15,46,37,1,43,53,53,0,43,53,53,0,0,
0,255,255,255,253,0,0,5,204,5,123,18,38,0,90,0,0,17,7,0,105,1,161,0,0,0,23,
64,13,2,1,43,17,38,2,1,0,47,45,15,42,37,1,43,53,53,0,43,53,53,0,0,0,255,255,
0,45,0,0,5,41,6,240,18,38,0,60,0,0,17,7,2,148,1,34,0,0,0,21,180,1,9,5,38,
1,184,255,181,180,10,13,4,8,37,1,43,53,0,43,53,0,255,255,0,5,254,87,3,252,
5,228,18,38,0,92,0,0,17,6,0,67,105,0,0,21,180,1,32,17,38,1,184,255,167,180,
33,36,17,31,37,1,43,53,0,43,53,0,0,0,0,1,0,0,1,195,4,114,2,76,0,3,0,43,64,
30,2,0,0,186,15,1,31,1,63,1,79,1,4,47,1,63,1,111,1,175,1,223,1,5,1,64,38,
43,72,1,0,47,43,93,113,237,1,47,47,49,48,17,53,33,21,4,114,1,195,137,137,
0,0,1,0,0,1,195,8,0,2,76,0,3,0,43,64,30,2,0,0,186,15,1,31,1,63,1,79,1,4,47,
1,63,1,111,1,175,1,223,1,5,1,64,38,43,72,1,0,47,43,93,113,237,1,47,47,49,
48,17,53,33,21,8,0,1,195,137,137,0,0,1,0,0,1,195,8,0,2,76,0,3,0,43,64,30,
2,0,0,186,15,1,31,1,63,1,79,1,4,47,1,63,1,111,1,175,1,223,1,5,1,64,38,43,
72,1,0,47,43,93,113,237,1,47,47,49,48,17,53,33,21,8,0,1,195,137,137,0,255,
255,255,225,254,78,4,138,255,169,16,38,0,66,0,229,16,7,0,66,0,0,0,190,0,1,
0,127,3,184,1,72,5,129,0,12,0,47,64,16,4,32,11,17,72,7,64,11,17,72,7,12,150,
10,151,0,184,255,192,64,10,8,11,72,0,10,156,0,169,7,3,0,63,244,237,1,47,43,
237,237,50,43,49,48,43,19,53,52,62,2,55,51,14,1,21,51,21,127,10,20,30,20,
121,45,50,89,3,184,146,52,86,75,66,32,65,132,65,195,0,0,0,1,0,127,3,184,1,
72,5,129,0,12,0,52,185,0,3,255,224,183,11,17,72,9,151,0,150,6,184,255,192,
180,11,17,72,6,11,184,255,192,64,10,8,11,72,11,10,156,5,169,11,3,0,63,228,
237,1,47,43,51,43,253,237,49,48,43,1,20,14,2,7,35,62,1,53,35,53,51,1,72,9,
20,29,20,123,45,49,88,195,4,240,53,86,75,66,32,65,132,63,197,0,1,0,127,254,
250,1,72,0,195,0,12,0,51,185,0,3,255,224,183,11,17,72,9,151,0,150,6,184,255,
192,180,11,17,72,6,11,184,255,192,64,9,8,11,72,11,5,169,11,156,10,0,47,253,
228,1,47,43,51,43,253,237,49,48,43,37,20,14,2,7,35,62,1,53,35,53,51,1,72,
9,20,29,20,123,45,49,88,195,51,53,87,75,66,32,65,132,65,195,0,0,0,1,0,126,
3,184,1,71,5,129,0,12,0,47,64,16,8,32,11,17,72,5,64,11,17,72,5,1,150,2,151,
11,184,255,192,64,10,8,11,72,11,5,169,2,156,12,3,0,63,237,228,1,47,43,237,
237,50,43,49,48,43,1,21,35,20,22,23,35,46,3,61,1,1,65,88,49,45,123,20,29,
20,9,5,129,197,63,132,65,32,66,75,86,53,145,0,0,0,2,0,75,3,184,2,95,5,129,
0,12,0,25,0,89,64,58,17,32,11,17,72,4,32,11,17,72,20,64,11,17,72,20,25,150,
13,7,64,11,17,72,7,12,150,10,151,128,0,1,15,0,31,0,2,8,0,23,151,13,159,27,
175,27,2,10,23,156,13,0,0,13,169,6,20,3,0,63,51,228,50,47,16,237,50,1,93,
47,237,220,94,93,93,237,237,50,43,16,237,50,43,49,48,43,43,1,53,52,62,2,55,
51,14,1,21,51,21,33,53,52,62,2,55,51,14,1,21,51,21,1,151,10,19,29,20,122,
45,49,88,253,242,10,20,30,20,121,45,50,89,3,184,146,52,86,75,66,32,65,132,
65,195,146,52,86,75,66,32,65,132,65,195,0,0,2,0,75,3,184,2,95,5,129,0,12,
0,25,0,107,185,0,16,255,224,179,11,17,72,3,184,255,224,64,13,11,17,72,22,
151,13,150,24,9,151,0,150,6,184,255,192,64,15,11,17,72,6,128,11,1,15,11,31,
11,2,8,11,19,184,255,192,64,24,11,17,72,19,63,24,1,24,159,27,175,27,2,10,
23,156,24,5,5,18,169,11,24,3,0,63,51,228,50,47,16,237,50,1,93,47,93,51,43,
220,94,93,93,50,43,253,237,16,253,237,49,48,43,43,1,20,14,2,7,35,62,1,53,
35,53,51,5,20,14,2,7,35,62,1,53,35,53,51,2,95,10,19,30,20,121,45,49,88,194,
254,181,9,20,29,20,123,45,49,88,195,4,240,53,86,75,66,32,65,132,65,195,145,
53,86,75,66,32,65,132,65,195,0,0,0,2,0,75,254,250,2,95,0,195,0,12,0,25,0,
104,185,0,16,255,224,179,11,17,72,3,184,255,224,64,13,11,17,72,22,151,13,
150,24,9,151,0,150,6,184,255,192,64,15,11,17,72,6,128,11,1,15,11,31,11,2,
8,11,19,184,255,192,64,21,11,17,72,19,24,159,27,175,27,2,5,5,18,169,24,11,
11,24,156,10,23,0,47,51,237,50,47,16,228,50,47,1,93,47,51,43,220,94,93,93,
50,43,253,237,16,253,237,49,48,43,43,37,20,14,2,7,35,62,1,53,35,53,51,5,20,
14,2,7,35,62,1,53,35,53,51,2,95,10,19,30,20,121,45,49,88,194,254,181,9,20,
29,20,123,45,49,88,195,51,53,87,75,66,32,65,132,65,195,144,53,87,75,66,32,
65,132,65,195,0,0,0,1,0,138,255,118,3,234,5,204,0,11,0,64,64,37,11,192,0,
8,9,8,0,188,3,7,7,6,4,192,47,3,111,3,175,3,3,32,3,1,3,11,193,10,194,7,4,193,
5,194,7,0,1,0,47,63,246,237,16,244,237,1,47,93,113,237,51,51,47,16,237,50,
50,47,16,237,49,48,1,3,35,3,5,53,5,3,51,3,37,21,2,137,22,115,22,254,160,1,
96,28,215,28,1,97,3,232,251,142,4,114,27,164,29,1,120,254,136,29,164,0,0,
1,0,136,255,115,3,233,5,204,0,21,0,86,64,50,12,8,189,9,15,5,6,11,14,15,5,
9,190,19,1,189,0,20,17,0,16,3,4,16,3,32,0,1,0,19,193,18,194,15,12,193,13,
194,15,8,193,7,194,4,1,193,2,194,4,0,0,63,246,237,16,244,237,47,246,237,16,
244,237,1,47,93,23,51,47,17,51,51,16,237,50,237,23,50,47,16,237,50,49,48,
1,5,53,5,3,51,3,37,21,37,3,19,37,21,37,19,35,19,5,53,5,19,1,241,254,152,1,
104,16,175,16,1,105,254,151,26,26,1,104,254,152,16,175,16,254,151,1,105,26,
3,232,27,164,29,1,120,254,136,29,164,27,254,182,254,185,27,164,29,254,136,
1,120,29,164,27,1,71,0,0,0,0,1,0,81,1,145,2,124,3,188,0,19,0,73,185,0,17,
255,232,179,9,12,72,13,184,255,232,64,39,9,12,72,7,24,9,12,72,3,24,9,12,72,
128,0,1,15,0,63,0,2,0,191,10,1,10,143,5,1,0,5,48,5,2,5,15,15,1,15,0,47,93,
205,93,93,1,47,93,205,93,93,49,48,0,43,43,43,43,1,20,14,2,35,34,46,2,53,52,
62,2,51,50,30,2,2,124,45,76,102,58,57,99,75,43,43,75,99,57,58,102,76,45,2,
170,58,102,77,44,44,77,102,58,57,100,74,43,43,74,100,0,0,0,3,1,22,0,0,6,234,
0,219,0,3,0,7,0,11,0,86,64,61,7,150,4,4,0,11,150,0,8,48,8,96,8,128,8,144,
8,160,8,208,8,240,8,8,0,8,48,8,64,8,96,8,144,8,192,8,208,8,240,8,8,8,8,3,
150,47,0,191,0,2,16,0,1,0,5,1,9,155,4,0,8,0,47,51,51,237,50,50,1,47,93,93,
237,47,94,93,113,237,18,57,47,237,49,48,33,53,51,21,33,53,51,21,33,53,51,
21,6,40,194,252,183,192,252,181,195,219,219,219,219,219,219,0,0,7,0,55,255,
245,7,200,5,141,0,3,0,23,0,43,0,63,0,83,0,103,0,123,3,217,64,12,118,0,134,
0,2,121,2,137,2,2,3,102,184,255,224,64,14,8,12,72,96,24,8,12,72,92,24,8,12,
72,86,184,255,224,179,8,12,72,62,184,255,232,64,14,8,12,72,56,24,8,12,72,
52,24,8,12,72,46,184,255,224,179,8,12,72,22,184,255,224,64,14,8,12,72,16,
24,8,12,72,12,24,8,12,72,6,184,255,224,64,13,8,12,72,74,180,59,181,49,0,1,
2,3,1,184,255,240,64,131,3,16,118,3,1,9,1,25,1,121,1,3,9,1,3,1,3,19,49,180,
102,64,1,38,64,182,64,198,64,214,64,4,64,64,19,114,180,99,181,89,180,105,
104,1,22,104,38,104,2,201,104,249,104,2,139,104,1,118,104,1,89,104,1,70,104,
1,41,104,1,27,104,1,233,104,1,150,104,198,104,2,121,104,1,107,104,1,86,104,
1,57,104,1,6,104,22,104,38,104,3,10,104,24,180,9,181,34,180,9,19,25,19,41,
19,73,19,89,19,121,19,137,19,153,19,8,34,19,64,45,49,72,19,184,255,192,64,
255,19,23,72,19,217,125,1,198,125,1,169,125,1,155,125,1,121,125,1,107,125,
1,93,125,1,73,125,1,59,125,1,45,125,1,9,125,25,125,2,251,125,1,237,125,1,
217,125,1,203,125,1,189,125,1,155,125,1,125,125,141,125,2,105,125,1,91,125,
1,77,125,1,54,125,1,41,125,1,11,125,27,125,2,204,233,125,249,125,2,214,125,
1,187,125,1,173,125,1,137,125,153,125,2,123,125,1,102,125,1,75,125,1,61,125,
1,9,125,1,219,125,251,125,2,205,125,1,153,125,169,125,2,107,125,139,125,2,
93,125,1,57,125,1,43,125,1,29,125,1,9,125,1,237,125,253,125,2,185,125,201,
125,217,125,3,123,125,171,125,2,89,125,1,11,125,59,125,75,125,3,155,249,125,
1,235,125,1,214,125,1,187,125,1,153,125,1,123,125,139,125,2,102,125,1,59,
125,75,125,2,9,125,25,125,2,246,125,1,217,125,1,205,125,1,169,125,185,125,
2,155,125,1,105,125,121,125,2,93,125,1,57,125,73,125,2,43,125,1,22,125,1,
249,125,1,237,125,1,201,125,64,249,1,187,125,1,153,125,1,123,125,1,102,125,
1,73,125,1,54,125,1,9,125,25,125,2,105,249,125,1,235,125,1,221,125,1,169,
125,1,150,125,1,121,125,1,107,125,1,73,125,1,59,125,1,25,125,1,11,125,1,253,
125,1,217,125,1,203,125,1,169,125,1,155,125,1,141,125,1,121,125,1,91,125,
107,125,2,57,125,1,27,125,43,125,2,249,125,1,235,125,1,169,125,201,125,2,
150,125,1,121,125,1,107,125,1,57,125,1,38,125,1,9,125,1,56,249,125,1,230,
125,1,201,125,1,182,125,1,153,125,1,139,125,1,89,125,1,70,125,1,41,125,1,
27,125,1,249,125,1,235,125,1,201,125,1,187,125,1,173,125,1,1,148,125,1,123,
125,1,100,125,1,75,125,1,63,125,1,27,125,1,15,125,1,228,125,1,203,125,1,176,
125,1,2,160,125,1,143,125,1,112,125,1,95,125,1,64,125,1,31,125,1,0,125,1,
8,109,182,84,183,119,182,94,19,69,182,44,183,79,182,54,19,39,182,14,183,29,
182,4,4,2,3,0,18,0,63,63,63,237,244,237,63,237,244,237,63,237,244,237,1,94,
93,93,93,93,93,93,93,95,93,93,93,113,113,113,113,113,113,113,95,113,113,113,
113,113,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,
93,113,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,
114,114,114,94,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,
113,113,113,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,113,113,
113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114,114,94,93,
93,93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,113,
113,47,43,43,94,93,237,244,237,47,94,93,93,93,93,93,93,93,113,113,113,113,
113,113,113,114,114,253,244,237,18,57,47,93,113,237,17,57,57,47,47,94,93,
93,56,56,17,51,17,51,16,244,237,49,48,0,43,43,43,43,43,43,43,43,43,43,43,
43,1,95,93,93,33,35,1,51,37,50,30,2,21,20,14,2,35,34,46,2,53,52,62,2,19,52,
46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,50,30,2,21,20,14,2,35,34,46,2,53,
52,62,2,19,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,50,30,2,21,20,14,2,
35,34,46,2,53,52,62,2,19,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,48,155,
3,154,157,252,152,60,107,80,46,46,81,108,62,63,108,80,46,46,81,110,210,19,
37,55,35,38,58,39,19,20,39,56,37,34,54,39,21,2,30,60,107,80,46,46,81,108,
62,63,108,80,46,46,81,110,210,19,37,55,35,38,58,39,19,20,39,56,37,34,54,39,
21,1,253,60,107,80,46,46,81,108,62,63,108,80,46,46,81,110,210,19,37,55,35,
38,58,39,19,20,39,56,37,34,54,39,21,5,129,12,33,83,139,106,102,140,86,38,
37,86,140,103,106,139,83,33,254,151,73,98,58,24,24,59,97,73,71,97,59,26,26,
59,97,254,239,33,83,139,106,102,140,86,38,37,86,140,103,106,139,83,33,254,
151,73,98,58,24,24,59,97,73,71,97,59,26,26,59,97,1,176,33,83,139,106,102,
140,86,38,37,86,140,103,106,139,83,33,254,151,73,98,58,24,24,59,97,73,71,
97,59,26,26,59,97,0,0,0,0,1,0,85,3,122,1,89,5,129,0,3,0,40,64,25,3,16,10,
13,72,1,16,10,13,72,1,150,31,2,47,2,2,2,48,0,1,0,0,1,3,0,63,205,1,47,93,221,
93,237,49,48,43,43,27,1,51,3,85,64,196,158,3,122,2,7,253,249,255,255,0,85,
3,122,2,175,5,129,16,38,2,14,0,0,17,7,2,14,1,86,0,0,0,9,180,1,96,4,1,4,17,
93,53,0,0,1,0,88,0,141,2,81,3,172,0,8,0,72,64,55,106,3,122,3,138,3,3,106,
0,122,0,138,0,3,7,236,6,235,5,236,31,1,79,1,95,1,127,1,143,1,5,48,1,64,1,
96,1,112,1,160,1,5,1,0,239,15,3,47,3,111,3,127,3,4,3,0,47,93,228,1,47,93,
113,237,237,237,49,48,93,93,37,1,53,1,51,21,9,1,21,1,168,254,176,1,80,167,
254,177,1,81,141,1,109,63,1,115,31,254,140,254,145,29,0,0,0,1,0,89,0,141,
2,82,3,172,0,8,0,66,64,48,101,6,117,6,133,6,3,101,0,117,0,133,0,3,4,236,1,
236,8,235,112,3,128,3,176,3,3,208,3,1,111,3,127,3,2,3,0,239,15,6,47,6,111,
6,127,6,4,6,0,47,93,228,1,47,93,93,113,253,237,237,49,48,93,93,37,35,53,9,
1,53,51,1,21,1,1,168,1,82,254,176,166,1,81,141,29,1,111,1,116,31,254,141,
63,0,0,0,255,255,0,185,0,0,3,71,5,129,16,38,0,4,0,0,17,7,0,4,1,200,0,0,0,
22,64,12,3,2,47,8,1,8,1,0,47,0,1,0,17,93,53,53,17,93,53,53,0,1,255,192,5,
223,2,235,6,84,0,3,0,13,179,1,0,2,1,0,47,205,1,47,47,49,48,1,33,53,33,2,235,
252,213,3,43,5,223,117,0,1,254,96,0,0,2,98,5,129,0,3,0,45,182,3,16,111,3,
1,3,1,184,255,240,64,18,239,1,1,1,64,13,18,72,1,64,8,11,72,1,2,3,0,18,0,63,
63,1,47,43,43,93,56,47,93,56,49,48,33,35,1,51,254,244,148,3,113,145,5,129,
0,0,1,0,101,2,7,2,131,4,157,0,33,0,111,185,0,30,255,216,64,30,9,17,72,23,
10,224,36,11,1,11,33,224,36,0,212,0,228,0,3,0,23,6,228,11,139,0,251,0,2,0,
184,255,192,64,38,10,13,72,4,0,1,0,29,17,17,75,29,91,29,2,29,64,21,25,72,
29,64,16,19,72,47,29,63,29,2,27,29,1,15,29,1,2,29,0,47,95,93,93,93,43,43,
93,51,47,16,204,93,43,93,50,237,50,1,47,93,237,47,93,237,50,49,48,0,43,1,
17,52,46,2,35,34,6,21,17,35,17,52,46,2,53,51,20,30,2,21,51,62,3,51,50,22,
21,17,2,2,13,29,47,35,72,85,128,1,1,2,119,2,2,2,2,15,38,49,64,42,110,97,2,
7,1,142,46,61,37,16,100,94,254,148,1,255,20,46,40,29,4,3,27,34,35,12,28,46,
32,17,108,121,254,79,0,0,0,1,0,4,0,0,4,46,5,129,0,17,0,106,64,69,7,3,7,3,
10,0,16,32,16,2,16,16,48,16,80,16,112,16,144,16,224,16,6,16,5,1,9,92,14,12,
10,8,12,81,5,31,13,1,0,13,1,13,4,95,15,1,31,1,63,1,79,1,4,63,1,1,15,1,1,8,
1,1,9,0,95,15,3,9,18,0,63,63,237,18,57,47,94,93,93,113,237,220,93,113,50,
237,50,1,47,51,51,237,50,50,47,93,113,18,57,57,47,47,49,48,1,17,33,21,33,
21,33,21,33,17,35,17,35,53,51,17,33,21,1,103,2,175,253,81,1,146,254,110,180,
175,175,3,123,4,230,254,36,157,213,129,254,233,1,23,129,3,233,155,0,1,0,58,
0,0,4,80,5,150,0,58,0,221,64,81,133,58,149,58,2,21,22,37,22,53,22,3,40,44,
0,48,17,13,6,30,111,29,29,0,52,110,6,43,39,48,110,18,14,10,10,0,79,6,95,6,
111,6,3,6,58,111,0,0,32,0,2,0,0,32,0,48,0,80,0,112,0,144,0,176,0,208,0,8,
0,0,16,0,48,0,192,0,224,0,5,8,0,184,255,192,64,70,14,18,72,0,42,16,81,17,
46,12,81,43,175,13,1,13,64,42,45,72,0,13,16,13,32,13,3,13,39,111,17,1,47,
17,95,17,111,17,143,17,159,17,223,17,239,17,7,17,17,52,35,115,41,30,1,30,
24,7,7,52,116,37,58,1,23,58,1,58,6,24,0,63,51,93,93,237,50,63,51,93,237,18,
57,47,93,113,51,222,93,43,93,50,237,50,16,237,50,1,47,43,94,93,113,114,237,
47,93,18,57,47,51,51,237,50,50,16,237,17,57,47,237,17,51,51,17,18,57,57,49,
48,0,93,93,1,14,3,35,33,53,62,1,61,1,35,53,51,53,35,53,51,53,52,62,2,51,50,
30,2,23,7,46,3,35,34,6,29,1,33,21,33,21,33,21,33,21,20,14,2,7,33,50,62,2,
55,4,80,9,57,89,115,67,253,70,89,86,186,186,186,186,48,99,152,103,70,123,
99,71,18,174,10,39,53,65,36,114,112,1,152,254,104,1,152,254,104,22,44,63,
40,1,227,38,67,53,37,8,1,55,80,117,77,37,154,46,160,121,25,129,140,129,130,
92,147,102,55,29,58,86,57,57,31,52,36,20,115,125,138,129,140,129,7,56,106,
92,71,21,19,42,67,48,0,0,0,0,4,0,158,255,236,8,103,5,129,0,14,0,23,0,47,0,
98,1,193,64,71,134,2,1,117,91,133,91,2,91,73,107,73,139,73,3,143,68,1,109,
68,1,91,68,1,105,82,1,105,80,1,125,22,1,91,22,107,22,2,125,17,141,17,2,91,
17,107,17,2,84,57,100,57,2,54,57,70,57,2,37,97,53,97,69,97,3,76,32,9,14,72,
49,184,255,224,64,94,9,14,72,29,32,12,17,72,13,29,29,29,45,29,3,82,73,81,
81,48,72,65,0,70,15,24,39,75,37,41,72,30,34,32,30,57,73,15,56,1,102,56,1,
56,56,89,72,75,95,15,1,63,75,95,75,239,75,3,75,64,27,39,72,239,30,1,31,30,
95,30,127,30,3,15,30,75,75,30,15,3,8,64,65,80,65,96,65,3,127,65,143,65,2,
65,184,255,192,64,16,7,12,72,65,20,7,70,0,8,16,8,32,8,3,8,100,184,255,192,
179,91,95,72,100,184,255,192,179,80,88,72,100,184,255,192,179,70,74,72,100,
184,255,192,179,59,62,72,100,184,255,192,179,48,53,72,100,184,255,192,64,
11,27,31,72,79,100,95,100,111,100,3,100,184,255,192,179,7,10,72,89,184,255,
248,64,71,19,22,72,65,8,19,22,72,89,65,78,60,80,57,51,22,44,80,27,22,6,95,
20,87,80,121,82,1,72,82,88,82,104,82,3,82,78,40,32,80,33,78,37,33,35,35,33,
127,33,143,33,2,175,20,1,20,64,9,17,72,20,33,20,33,8,19,95,9,3,8,18,0,63,
63,237,18,57,57,47,47,43,93,93,17,51,47,17,51,51,16,237,50,47,51,93,93,237,
16,237,63,237,63,51,237,18,57,57,43,43,1,43,93,43,43,43,43,43,43,47,93,237,
50,47,43,93,113,18,23,57,47,47,47,93,113,43,93,93,16,237,51,47,93,113,237,
17,51,51,16,237,50,17,57,57,16,237,16,237,50,47,237,49,48,93,43,43,43,93,
0,93,93,1,93,93,93,93,0,93,93,93,93,93,1,93,0,93,1,93,1,20,14,2,43,1,17,35,
17,33,50,30,2,7,52,38,43,1,17,51,50,54,1,14,1,35,34,38,53,17,35,53,51,55,
51,21,51,21,35,17,20,22,51,50,54,55,37,20,6,35,34,46,2,39,55,30,1,51,50,62,
2,53,52,46,2,39,46,3,53,52,54,51,50,22,23,7,46,3,35,34,21,20,30,2,23,30,3,
3,186,61,121,182,121,130,181,1,43,125,186,124,62,182,164,164,105,113,165,
155,2,123,35,74,48,105,93,104,111,53,110,157,157,41,55,23,40,26,2,232,183,
170,75,121,92,61,15,159,17,99,88,40,68,49,27,34,62,87,52,49,96,77,47,168,
161,141,165,22,161,6,31,45,54,30,155,32,57,80,48,48,100,82,52,3,217,92,159,
117,68,253,219,5,129,61,111,157,97,134,139,253,212,146,252,186,11,13,123,
122,1,197,131,242,242,131,254,98,78,73,8,6,98,120,129,24,54,88,64,26,61,58,
10,25,40,30,30,41,29,23,13,12,32,53,79,59,112,119,105,116,17,28,38,24,10,
85,25,36,28,22,11,11,31,54,87,0,1,0,16,255,236,4,86,5,150,0,61,0,232,185,
0,2,255,235,64,68,15,73,106,38,1,58,43,74,43,122,43,138,43,4,36,59,52,59,
68,59,116,59,132,59,5,46,55,55,4,57,45,51,110,20,24,15,14,26,15,3,20,37,110,
36,36,3,110,64,4,96,4,128,4,160,4,176,4,5,0,4,144,4,176,4,208,4,4,4,184,255,
192,64,94,24,27,72,4,48,24,81,25,57,15,81,54,15,16,31,16,127,16,143,16,159,
16,5,16,64,39,47,72,0,16,16,16,128,16,3,16,45,47,25,63,25,127,25,3,47,25,
63,25,175,25,207,25,4,47,25,175,25,2,25,25,0,40,115,216,37,1,124,37,140,37,
2,26,37,42,37,2,37,31,7,0,115,115,3,131,3,2,21,3,37,3,2,3,9,25,0,63,51,93,
93,237,63,51,93,93,93,237,18,57,47,93,113,114,51,220,93,43,113,50,237,50,
16,237,50,1,47,43,93,113,237,51,47,237,47,23,51,47,196,16,237,50,50,17,57,
47,196,49,48,0,93,93,93,43,37,50,54,55,23,14,3,35,34,46,2,39,35,55,51,46,
1,53,52,54,55,35,55,51,62,3,51,50,30,2,23,7,46,1,35,34,14,2,7,33,7,33,14,
1,21,20,22,23,33,7,33,30,3,2,179,100,120,14,185,13,63,103,147,97,120,177,
121,69,13,171,40,120,1,2,2,1,160,40,129,15,73,123,173,115,97,147,103,63,13,
185,14,121,106,68,106,79,50,11,1,190,40,254,99,2,1,2,2,1,196,40,254,108,9,
42,77,114,126,100,91,14,68,118,87,50,77,139,192,114,129,8,46,24,27,53,6,127,
122,189,130,67,50,87,118,68,14,91,100,39,87,137,99,127,16,47,23,22,37,19,
129,81,138,100,57,0,0,0,0,4,0,69,255,244,6,208,5,140,0,19,0,23,0,43,0,79,
0,192,64,14,118,20,134,20,2,121,22,137,22,2,133,47,1,66,184,255,232,64,9,
8,11,72,60,24,8,11,72,17,184,255,232,179,8,11,72,13,184,255,232,64,29,8,11,
72,7,24,8,11,72,3,24,8,11,72,22,23,20,21,74,180,73,73,52,180,53,178,63,23,
16,21,184,255,240,64,62,21,23,21,23,0,44,180,63,64,10,14,72,63,34,180,10,
178,0,180,0,24,16,24,32,24,80,24,96,24,208,24,224,24,240,24,8,24,38,52,1,
52,49,182,58,184,77,182,74,68,4,23,3,20,18,29,182,15,184,39,182,5,19,0,63,
237,244,237,63,63,63,51,237,244,237,51,93,1,47,93,253,244,237,47,43,237,18,
57,57,47,47,56,56,16,244,237,51,47,237,17,51,17,51,49,48,0,43,43,43,43,43,
43,1,93,93,93,1,20,14,2,35,34,46,2,53,52,62,2,51,50,30,2,1,35,1,51,19,52,
46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,20,30,2,51,50,54,55,23,14,3,35,34,
46,2,53,52,62,2,51,50,30,2,23,7,46,1,35,34,6,6,208,51,87,116,66,66,115,85,
49,48,86,117,68,66,115,85,50,251,59,155,3,154,157,149,22,43,63,40,42,64,44,
22,23,43,63,41,39,63,44,24,250,155,20,47,75,54,69,94,11,141,6,45,77,111,72,
94,132,82,38,59,97,124,65,68,106,76,48,9,143,10,83,75,108,87,1,178,125,171,
105,45,45,104,171,126,133,174,103,41,41,103,174,253,201,5,129,252,49,99,131,
78,32,33,78,131,98,95,128,79,34,34,79,128,2,124,75,124,90,50,82,87,9,54,99,
76,45,69,121,164,96,130,173,103,42,40,70,94,55,11,72,85,164,0,2,0,19,255,
236,2,126,5,149,0,39,0,55,0,185,64,9,138,32,1,53,40,14,17,72,26,184,255,232,
179,8,16,72,22,184,255,232,64,67,8,16,72,8,32,8,16,72,6,32,11,16,72,5,27,
21,27,2,5,21,21,21,2,3,4,4,29,16,40,32,40,2,96,40,112,40,128,40,192,40,4,
15,40,1,40,40,4,51,20,51,2,8,51,159,35,1,35,18,14,192,10,208,10,224,10,3,
10,184,255,192,179,34,38,72,10,184,255,192,64,26,7,11,72,10,79,57,1,18,51,
45,15,11,34,24,14,14,7,45,24,3,3,7,24,7,0,7,0,47,205,63,18,57,47,16,205,17,
57,47,18,57,57,205,17,57,57,1,93,47,43,43,93,198,51,205,93,50,0,94,93,1,51,
47,93,93,113,205,50,47,51,49,48,0,93,93,43,43,43,43,1,43,93,37,50,54,55,51,
14,1,35,34,38,61,1,14,1,7,53,62,1,55,17,52,62,2,51,50,30,2,21,20,14,2,7,21,
20,30,2,19,52,46,2,35,34,14,2,21,17,62,3,1,177,51,68,17,69,20,120,109,111,
127,32,66,34,35,66,31,25,59,98,72,52,79,53,27,44,79,110,66,19,32,42,115,14,
27,40,26,32,39,22,8,49,77,54,28,78,104,109,154,157,159,155,175,17,28,13,73,
14,29,16,2,75,59,108,83,49,42,78,111,69,99,180,152,118,38,244,57,83,54,26,
4,20,52,85,61,33,36,61,81,46,254,5,33,104,131,151,0,0,0,0,4,0,188,0,0,8,46,
5,129,0,19,0,35,0,55,0,59,0,244,64,124,141,0,1,0,24,13,16,72,61,0,1,25,0,
1,132,10,1,114,10,1,69,10,85,10,101,10,3,22,10,38,10,2,5,33,21,33,37,33,3,
4,29,20,29,2,11,24,27,24,2,11,22,27,22,2,47,61,1,58,20,73,36,19,73,16,0,16,
57,46,73,26,144,16,160,16,192,16,3,31,26,1,16,26,16,26,8,144,36,160,36,176,
36,3,47,36,1,0,36,1,36,10,1,7,73,48,8,64,8,80,8,3,0,8,16,8,32,8,144,8,4,8,
41,31,15,1,184,255,192,179,29,36,72,1,184,255,192,64,15,18,21,72,1,17,9,3,
51,23,192,57,208,57,2,57,184,255,192,64,21,35,44,72,57,56,11,64,29,36,72,
11,64,18,21,72,0,11,56,3,8,18,0,63,23,51,43,43,47,221,43,93,222,205,63,51,
51,43,43,63,205,1,47,93,113,237,50,50,47,93,93,93,18,57,57,47,47,93,93,16,
237,51,17,51,16,237,16,237,50,93,49,48,0,93,93,93,93,1,93,93,93,93,93,93,
43,93,33,1,22,23,30,1,21,17,35,17,51,1,38,39,46,1,53,17,51,17,1,20,6,35,34,
38,53,52,62,2,51,50,30,2,7,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,53,
33,21,4,38,253,48,1,2,1,2,160,202,2,216,2,2,2,2,162,3,54,176,175,168,177,
43,87,131,88,93,131,84,39,159,24,47,69,45,46,71,48,25,26,48,67,41,46,72,50,
25,254,16,2,123,4,166,44,44,38,89,39,252,88,5,129,251,82,40,46,39,98,51,3,
156,250,127,2,178,188,203,201,190,91,145,101,53,53,100,145,92,81,107,64,26,
27,64,107,80,82,108,63,26,26,63,108,253,160,146,146,0,0,0,0,2,0,188,2,122,
7,25,5,129,0,39,0,47,0,148,64,9,9,24,19,23,72,136,9,1,8,184,255,232,64,16,
19,23,72,89,8,105,8,121,8,3,37,24,13,17,72,24,184,255,240,64,73,12,17,72,
44,41,196,42,24,21,196,64,22,224,22,2,22,22,0,64,47,1,47,0,42,16,42,64,42,
80,42,4,42,39,196,37,111,0,175,0,207,0,223,0,239,0,5,0,40,44,202,0,9,22,29,
4,0,42,32,42,80,42,128,42,4,42,2,15,23,37,15,3,45,3,0,63,23,51,17,51,204,
93,23,50,237,50,1,47,93,51,237,47,93,204,93,18,57,47,93,237,50,16,253,204,
49,48,43,43,93,43,93,43,1,17,53,6,7,14,1,7,3,35,3,46,1,39,38,39,6,21,6,20,
21,17,35,17,51,19,30,1,31,1,54,55,62,3,53,19,51,17,1,17,35,17,35,53,33,21,
6,155,5,4,4,5,2,230,108,163,2,24,14,17,20,1,1,128,190,223,2,5,2,6,20,16,7,
13,11,7,168,184,251,40,134,255,2,138,2,122,1,169,194,11,11,9,18,5,253,203,
1,157,5,64,38,44,55,10,10,8,18,6,253,201,3,7,253,205,4,13,7,18,51,41,18,34,
28,18,2,1,157,252,249,2,152,253,104,2,152,111,111,0,0,0,0,1,0,108,0,0,5,184,
5,150,0,57,0,221,64,95,101,36,1,101,22,1,157,49,1,143,49,1,49,16,11,15,72,
157,9,1,143,9,1,9,16,11,15,72,116,3,132,3,2,54,3,1,54,2,118,2,2,54,56,118,
56,2,116,55,132,55,2,54,55,1,42,26,1,42,32,1,41,53,48,40,10,18,32,40,96,40,
112,40,144,40,4,47,18,111,18,127,18,159,18,4,40,18,40,18,24,34,91,16,53,1,
53,184,255,192,64,65,23,29,72,191,53,207,53,2,0,53,48,53,2,53,17,5,91,31,
24,63,24,79,24,143,24,191,24,207,24,223,24,7,111,24,127,24,159,24,239,24,
255,24,5,0,24,48,24,2,8,24,10,15,19,39,48,5,42,95,18,41,18,29,95,0,4,0,63,
237,63,51,237,23,50,1,47,94,93,93,113,253,196,47,93,93,43,114,237,17,57,57,
47,47,93,93,17,51,17,51,16,196,49,48,0,93,93,93,93,93,93,93,93,43,93,93,43,
93,93,93,93,1,50,30,2,21,20,14,2,7,54,55,62,1,59,1,21,33,53,62,3,53,52,46,
2,35,34,14,2,21,20,30,2,23,21,33,53,51,50,22,23,22,23,46,3,53,52,62,2,3,18,
151,241,168,90,59,109,157,99,42,39,33,71,23,244,253,179,96,139,89,42,61,116,
169,108,109,170,116,61,42,89,139,96,253,179,244,23,71,33,39,42,99,157,109,
59,90,168,241,5,150,86,162,234,147,106,191,167,138,54,2,3,2,4,156,224,51,
126,143,159,85,116,181,124,65,65,124,181,116,85,159,143,126,51,224,156,4,
2,3,2,54,138,167,191,106,147,234,162,86,0,0,0,2,0,88,255,222,4,124,4,72,0,
32,0,45,0,82,64,50,90,13,1,28,15,64,160,33,176,33,2,95,33,1,80,33,96,33,112,
33,3,33,47,128,32,47,1,45,208,17,1,17,5,16,45,45,22,39,10,16,22,21,27,1,6,
27,1,27,0,22,0,63,50,93,93,205,63,205,18,57,47,205,1,47,205,93,50,93,26,16,
220,93,113,113,26,205,50,49,48,93,5,34,46,2,53,52,62,2,51,50,30,2,21,33,17,
30,3,51,50,62,2,55,23,14,3,19,17,46,3,35,34,14,2,7,17,2,107,130,198,134,69,
95,152,189,95,112,194,142,81,252,197,22,64,78,88,46,75,116,93,76,35,72,36,
84,109,143,203,19,59,77,92,53,51,87,74,60,24,34,93,157,204,111,147,213,139,
66,79,146,210,130,254,156,24,45,35,20,31,60,87,56,42,57,100,76,44,2,138,1,
21,20,42,34,22,19,32,42,24,254,234,0,0,0,255,255,0,80,255,246,6,78,5,129,
16,38,0,121,0,0,16,39,2,20,2,249,0,0,17,7,2,144,3,204,253,206,0,63,64,40,
4,3,2,111,15,1,47,15,1,15,1,191,12,1,128,12,1,112,12,1,96,12,1,64,12,1,16,
12,1,12,98,64,11,11,72,4,3,2,60,24,0,63,53,53,53,1,43,17,93,93,93,93,93,93,
53,17,93,93,53,53,53,0,0,0,255,255,0,61,255,246,6,78,5,141,16,39,2,20,2,249,
0,0,16,39,2,144,3,204,253,206,17,6,0,115,34,0,0,63,64,40,1,3,2,111,49,1,47,
49,1,49,0,191,1,1,128,1,1,112,1,1,96,1,1,64,1,1,16,1,1,1,141,64,11,11,72,
1,3,2,49,24,0,63,53,53,53,1,43,17,93,93,93,93,93,93,53,17,93,93,53,53,53,
0,0,0,255,255,0,93,255,246,6,78,5,129,16,39,2,20,2,249,0,0,16,39,2,144,3,
204,253,206,17,6,2,142,40,0,0,63,64,40,1,3,2,111,49,1,47,49,1,49,0,191,1,
1,128,1,1,112,1,1,96,1,1,64,1,1,16,1,1,1,126,64,11,11,72,1,3,2,49,24,0,63,
53,53,53,1,43,17,93,93,93,93,93,93,53,17,93,93,53,53,53,0,0,0,255,255,0,145,
255,246,6,78,5,129,16,39,2,20,2,189,0,0,16,39,2,144,3,204,253,206,17,6,2,
143,102,0,0,47,64,28,1,3,2,111,49,1,47,49,1,49,0,191,1,1,128,1,1,1,102,64,
11,11,72,1,3,2,49,24,0,63,53,53,53,1,43,17,93,93,53,17,93,93,53,53,53,0,0,
0,0,1,1,162,0,100,6,94,2,68,0,17,0,24,64,9,0,15,12,3,128,16,7,17,16,0,47,
205,1,47,205,26,204,50,57,57,49,48,1,30,1,23,35,46,1,39,53,62,1,55,51,14,
1,7,33,21,2,129,29,59,31,72,58,130,82,82,130,58,72,31,59,29,3,221,1,41,34,
98,65,68,112,42,36,42,112,68,65,98,34,86,0,0,0,1,1,16,255,195,2,240,4,127,
0,17,0,26,64,10,15,64,0,0,15,12,3,17,128,7,0,47,26,205,204,50,57,57,1,47,
26,205,49,48,1,14,1,7,53,62,1,55,51,30,1,23,21,46,1,39,17,35,1,213,34,98,
65,68,112,42,36,42,112,68,65,98,34,86,3,160,29,59,31,72,58,130,82,82,130,
58,72,31,59,29,252,35,0,1,1,162,0,100,6,94,2,68,0,17,0,24,64,9,0,15,12,3,
128,7,17,16,17,0,47,205,1,47,221,26,204,50,57,57,49,48,1,46,1,39,51,30,1,
23,21,14,1,7,35,62,1,55,33,53,5,127,29,59,31,72,58,130,82,82,130,58,72,31,
59,29,252,35,1,127,34,98,65,68,112,42,36,42,112,68,65,98,34,86,0,0,0,1,1,
16,255,195,2,240,4,127,0,17,0,26,64,10,17,64,16,15,0,3,12,128,8,16,0,47,221,
26,204,50,57,57,1,47,26,205,49,48,37,62,1,55,21,14,1,7,35,46,1,39,53,30,1,
23,17,51,2,43,34,98,65,68,112,42,36,42,112,68,65,98,34,86,162,29,59,31,72,
58,130,82,82,130,58,72,31,59,29,3,221,0,0,1,1,162,0,100,6,94,2,68,0,31,0,
36,64,15,16,31,28,19,128,23,64,15,0,3,12,128,8,0,15,0,47,205,1,47,26,204,
50,57,57,26,221,26,204,50,57,57,49,48,1,30,1,23,35,46,1,39,53,62,1,55,51,
14,1,7,33,46,1,39,51,30,1,23,21,14,1,7,35,62,1,55,2,129,29,59,31,72,58,130,
82,82,130,58,72,31,59,29,2,254,29,59,31,72,58,130,82,82,130,58,72,31,59,29,
1,41,34,98,65,68,112,42,36,42,112,68,65,98,34,34,98,65,68,112,42,36,42,112,
68,65,98,34,0,0,0,1,1,16,255,195,2,240,4,127,0,31,0,38,64,16,15,64,0,31,16,
19,28,128,24,64,0,15,12,3,128,7,0,47,26,204,50,57,57,26,221,26,204,50,57,
57,1,47,26,205,49,48,1,14,1,7,53,62,1,55,51,30,1,23,21,46,1,39,17,62,1,55,
21,14,1,7,35,46,1,39,53,30,1,23,1,213,34,98,65,68,112,42,36,42,112,68,65,
98,34,34,98,65,68,112,42,36,42,112,68,65,98,34,3,160,29,59,31,72,58,130,82,
82,130,58,72,31,59,29,253,2,29,59,31,72,58,130,82,82,130,58,72,31,59,29,0,
2,1,16,255,72,2,240,4,127,0,3,0,35,0,40,64,17,1,19,0,4,35,20,23,32,28,3,0,
28,4,19,16,7,11,0,47,204,50,57,57,221,222,205,16,204,50,57,57,1,47,51,205,
50,49,48,5,33,21,33,19,14,1,7,53,62,1,55,51,30,1,23,21,46,1,39,17,62,1,55,
21,14,1,7,35,46,1,39,53,30,1,23,1,16,1,224,254,32,197,34,98,65,68,112,42,
36,42,112,68,65,98,34,34,98,65,68,112,42,36,42,112,68,65,98,34,104,80,4,88,
29,59,31,72,58,130,82,82,130,58,72,31,59,29,253,2,29,59,31,72,58,130,82,82,
130,58,72,31,59,29,0,0,2,0,56,255,229,3,186,5,197,0,47,0,69,0,222,64,93,156,
19,172,19,2,154,6,170,6,2,122,33,138,33,2,68,24,14,17,72,85,20,101,20,149,
20,165,20,4,140,7,1,74,7,90,7,122,7,3,74,56,90,56,2,67,56,11,15,72,58,67,
1,42,12,58,12,74,12,3,37,45,53,45,149,45,165,45,4,32,39,48,39,2,39,39,15,
169,48,249,48,2,40,48,1,48,28,0,70,64,96,31,1,31,184,255,192,64,64,18,21,
72,15,31,1,31,64,12,17,72,31,71,128,60,71,63,15,1,15,64,12,17,72,15,79,71,
1,39,34,80,43,53,81,27,0,22,64,22,128,22,192,22,4,7,22,22,47,43,111,43,223,
43,3,15,43,191,43,2,43,65,80,10,22,0,63,237,47,93,113,57,47,94,93,51,237,
16,237,50,1,93,47,43,93,237,26,16,220,43,93,43,113,26,237,51,51,113,113,18,
57,47,93,49,48,0,93,1,93,93,43,0,93,1,93,93,0,93,1,43,93,93,93,1,20,14,2,
7,14,3,35,34,46,2,53,52,62,4,51,50,30,2,23,51,62,1,53,52,38,35,34,14,2,7,
55,62,1,51,50,30,2,3,46,3,35,34,14,4,21,20,30,2,51,50,62,2,3,186,7,13,18,
11,31,96,130,162,97,93,127,78,35,22,47,73,102,132,83,42,77,64,50,16,4,1,3,
130,129,28,59,58,55,22,36,42,116,67,113,154,94,41,211,8,36,51,64,36,53,86,
67,49,32,15,21,42,65,44,66,108,83,56,3,170,46,104,106,106,48,128,206,144,
77,63,107,138,75,60,143,144,134,104,63,26,48,67,42,25,58,34,196,209,11,19,
28,17,147,23,39,88,149,195,254,147,42,74,55,32,51,84,110,116,116,48,53,91,
67,38,99,161,205,0,0,0,2,0,4,0,0,4,225,5,129,0,5,0,18,0,244,64,27,74,7,90,
7,106,7,3,69,17,85,17,101,17,3,3,56,8,1,55,16,1,6,24,14,17,72,18,184,255,
232,64,157,14,17,72,102,2,1,39,2,71,2,87,2,3,105,1,1,40,1,72,1,88,1,3,2,1,
12,12,0,6,59,3,1,20,3,1,244,3,1,107,3,155,3,187,3,235,3,4,52,3,84,3,2,0,3,
1,11,2,3,18,15,0,31,0,47,0,3,18,0,15,20,47,20,127,20,3,175,20,191,20,223,
20,255,20,4,32,20,112,20,144,20,3,15,20,63,20,143,20,3,58,175,20,207,20,223,
20,255,20,4,64,20,96,20,144,20,3,15,20,95,20,2,143,20,159,20,191,20,223,20,
4,0,20,32,20,80,20,112,20,4,0,3,6,3,18,95,5,18,12,32,19,22,72,153,12,1,12,
1,3,0,63,51,93,43,63,237,23,50,1,93,93,113,114,114,94,93,113,113,114,47,94,
93,51,47,95,94,93,93,93,93,113,113,51,18,57,61,47,51,51,49,48,93,93,93,93,
43,43,93,93,95,93,93,55,1,51,1,21,33,37,1,46,3,39,14,3,7,1,5,2,5,217,1,254,
251,35,4,21,254,174,16,29,22,15,1,2,14,23,28,16,254,173,141,4,244,251,12,
141,156,3,94,40,82,69,48,8,8,49,70,82,40,252,164,0,1,0,235,254,78,5,172,5,
129,0,7,0,54,64,36,3,90,79,4,175,4,191,4,207,4,4,4,7,90,32,0,1,15,0,1,0,0,
32,0,192,0,208,0,4,0,2,95,5,3,4,0,0,47,50,63,237,1,47,93,113,113,237,47,93,
237,49,48,1,17,33,17,35,17,33,17,4,244,252,182,191,4,193,254,78,6,145,249,
111,7,51,248,205,0,0,0,0,1,0,154,254,78,5,48,5,129,0,11,0,170,64,9,134,8,
150,8,2,163,9,1,9,184,255,192,64,26,13,16,72,163,7,1,2,144,7,1,114,7,130,
7,2,100,7,1,53,7,69,7,85,7,3,3,184,255,240,64,74,9,17,72,41,1,57,1,2,1,16,
12,17,72,8,143,6,159,6,175,6,3,2,72,17,73,15,2,127,2,2,2,6,2,6,0,207,10,1,
0,10,64,10,2,10,7,3,9,3,9,207,0,1,0,0,64,0,2,7,0,32,13,1,3,7,95,2,8,0,4,3,
1,9,95,0,0,47,237,57,63,18,57,57,237,57,1,93,47,94,93,93,51,51,47,47,51,47,
93,93,18,57,57,47,47,93,43,93,51,49,48,0,43,93,43,1,93,93,93,93,95,93,43,
93,93,19,53,9,1,53,33,21,33,9,1,33,21,154,2,123,253,149,4,66,252,178,2,72,
253,168,3,162,254,78,109,3,48,3,44,106,152,253,4,252,249,152,0,0,0,0,1,0,
101,2,96,4,72,2,242,0,3,0,32,64,20,0,2,32,2,80,2,112,2,4,2,16,0,32,0,2,0,
0,173,1,179,0,63,237,1,47,93,47,93,49,48,19,53,33,21,101,3,227,2,96,146,146,
0,0,0,0,1,0,51,255,242,4,98,6,84,0,8,0,185,185,0,0,255,232,64,135,14,17,72,
9,1,57,1,73,1,3,9,1,0,4,6,1,6,6,8,16,111,8,143,8,175,8,207,8,239,8,5,15,8,
47,8,79,8,111,8,143,8,5,8,95,2,1,2,2,15,3,47,3,79,3,111,3,4,11,3,175,10,1,
48,10,80,10,112,10,144,10,4,111,10,143,10,2,16,10,48,10,2,240,10,1,15,10,
47,10,79,10,3,57,239,10,1,176,10,208,10,2,143,10,175,10,207,10,239,10,4,112,
10,1,47,10,79,10,111,10,143,10,175,10,5,2,175,31,5,1,5,5,1,7,179,6,1,0,47,
51,63,18,57,47,93,237,1,93,113,113,114,114,94,93,93,113,113,114,114,47,94,
93,51,47,93,47,93,113,56,57,61,47,93,51,51,49,48,94,93,43,5,35,1,35,53,33,
19,1,51,2,110,106,254,229,182,1,14,242,1,174,129,14,3,24,117,253,78,5,135,
0,3,0,87,0,203,5,93,3,215,0,35,0,51,0,67,0,114,64,75,137,50,1,53,67,69,67,
2,10,15,1,10,3,1,5,33,1,5,21,1,39,26,8,52,4,18,0,0,47,32,47,64,47,112,47,
4,47,60,18,36,224,55,1,55,23,42,239,65,1,65,8,39,52,26,4,5,63,13,1,13,64,
18,21,72,0,13,80,13,2,13,31,15,23,1,23,0,47,93,51,220,93,43,113,50,23,57,
205,93,50,16,205,93,50,1,47,205,47,93,205,17,23,57,49,48,0,93,93,93,93,93,
1,93,1,20,14,2,35,34,38,39,14,3,35,34,46,2,53,52,62,2,51,50,22,23,62,3,51,
50,30,2,37,34,6,7,30,1,51,50,62,2,53,52,46,2,5,46,1,35,34,14,2,21,20,30,2,
51,50,54,5,93,44,82,115,70,97,168,70,32,75,84,90,46,69,115,83,46,44,82,116,
71,94,168,67,31,75,84,94,51,69,114,81,45,254,179,70,119,56,51,119,77,43,71,
51,27,29,51,71,254,93,51,119,78,43,70,49,27,25,48,71,47,70,120,2,78,78,141,
106,62,133,149,63,102,72,39,55,100,143,89,81,142,104,60,135,148,62,102,73,
40,55,101,143,168,126,130,128,128,40,70,94,54,54,92,69,39,250,128,128,40,
70,94,54,51,93,69,41,126,0,0,0,1,1,152,0,0,6,96,4,199,0,5,0,13,179,2,5,2,
5,0,47,205,1,47,205,49,48,1,51,17,33,21,33,1,152,94,4,106,251,56,4,199,251,
151,94,0,0,0,0,1,1,22,255,254,4,170,4,8,0,25,0,35,64,18,75,22,91,22,2,75,
16,91,16,2,25,0,12,13,13,0,19,6,0,47,205,47,51,1,47,205,47,205,49,48,0,93,
93,5,17,52,62,2,51,50,30,2,21,17,35,17,52,46,2,35,34,14,2,21,17,1,22,68,122,
167,98,99,169,123,70,103,53,95,130,78,78,130,94,52,2,2,0,116,192,138,76,76,
138,192,116,254,0,2,2,98,155,108,57,56,108,156,100,254,0,0,0,1,255,158,254,
78,2,148,5,227,0,35,2,3,64,30,10,34,26,34,42,34,3,5,16,21,16,37,16,3,9,3,
218,37,1,201,37,1,154,37,170,37,186,37,3,37,184,1,0,64,162,225,228,72,76,
37,1,0,47,37,63,37,2,9,37,1,220,37,64,211,217,72,37,64,205,209,72,134,37,
1,25,37,41,37,57,37,3,11,37,1,251,37,1,233,37,1,37,64,188,191,72,107,37,123,
37,139,37,3,93,37,1,75,37,1,41,37,57,37,2,27,37,1,9,37,1,249,37,1,37,128,
170,177,72,109,37,1,37,128,164,168,72,9,37,1,163,37,128,156,162,72,189,37,
1,121,37,153,37,169,37,3,75,37,91,37,107,37,3,37,192,140,147,72,155,37,171,
37,187,37,3,125,37,141,37,2,107,37,1,93,37,1,38,37,54,37,70,37,3,228,37,1,
214,37,1,180,37,196,37,2,6,37,1,112,37,184,255,192,64,110,119,122,72,37,64,
101,107,72,219,37,1,118,37,166,37,2,9,37,25,37,41,37,3,233,37,1,37,64,79,
82,72,37,128,74,78,72,25,37,41,37,2,11,37,1,251,37,1,217,37,233,37,2,171,
37,187,37,203,37,3,153,37,1,37,128,60,63,72,41,37,57,37,73,37,3,11,37,27,
37,2,55,233,37,249,37,2,187,37,203,37,219,37,3,141,37,157,37,173,37,3,123,
37,1,109,37,1,1,95,37,1,37,184,255,128,179,39,43,72,37,184,255,192,64,13,
34,38,72,144,37,160,37,2,2,16,37,1,37,184,255,192,64,46,28,31,72,223,37,1,
96,37,112,37,160,37,176,37,192,37,5,15,37,31,37,47,37,3,7,32,22,144,22,2,
22,22,31,70,12,47,4,159,4,2,4,4,32,12,1,12,184,255,192,64,15,16,19,72,12,
25,80,64,18,128,18,2,18,7,80,0,0,47,237,47,93,237,1,47,43,93,51,47,93,16,
237,50,47,93,94,93,93,93,43,113,95,113,43,43,114,95,114,114,114,114,114,94,
93,93,43,93,93,93,93,113,113,43,43,113,114,114,114,43,43,94,93,93,93,93,113,
113,113,113,113,43,114,114,114,43,94,93,43,93,43,93,113,113,113,113,113,113,
43,113,113,114,114,114,43,43,94,93,93,95,93,43,93,93,93,49,48,0,95,94,93,
93,19,34,38,39,53,30,1,51,50,62,2,53,3,52,62,2,51,50,22,23,21,46,1,35,34,
14,2,21,17,20,14,2,36,36,75,23,20,62,35,51,66,39,16,2,50,90,125,75,34,75,
22,18,61,36,51,66,39,16,50,89,124,254,78,11,8,147,8,16,37,64,84,48,4,188,
94,134,86,40,9,9,148,10,17,40,65,84,44,251,66,94,134,86,41,0,0,0,2,0,56,1,
80,4,44,3,244,0,33,0,67,1,31,64,26,36,16,12,16,72,2,16,12,16,72,65,24,11,
17,72,66,48,9,17,72,61,48,9,17,72,42,184,255,208,179,9,17,72,48,184,255,208,
64,19,9,17,72,31,24,9,17,72,32,48,9,17,72,26,48,9,17,72,13,184,255,232,179,
13,17,72,14,184,255,208,179,9,13,72,8,184,255,208,179,14,17,72,8,184,255,
208,64,41,9,12,72,63,16,28,48,28,80,28,3,0,28,16,28,64,28,96,28,128,28,160,
28,240,28,7,28,45,11,64,12,17,72,11,47,69,1,59,173,64,45,184,255,192,180,
35,60,72,45,34,184,255,192,179,23,28,72,34,184,255,192,64,27,16,20,72,34,
128,62,64,41,60,72,62,40,173,143,49,1,32,49,48,49,2,49,15,25,173,64,11,184,
255,192,180,39,60,72,11,0,184,255,192,179,23,28,72,0,184,255,192,64,29,16,
20,72,0,128,28,64,41,60,72,28,6,173,15,15,207,15,2,15,64,23,28,72,15,64,11,
19,72,15,0,47,43,43,93,237,196,43,26,221,43,43,196,43,26,237,16,220,93,93,
237,196,43,26,221,43,43,196,43,26,237,1,93,47,43,51,47,93,113,51,49,48,0,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,1,34,38,39,46,1,35,34,14,2,7,53,
62,1,51,50,30,2,23,30,3,51,50,54,55,21,14,3,3,34,38,39,46,1,35,34,14,2,7,
53,62,1,51,50,30,2,23,30,3,51,50,54,55,21,14,3,3,40,69,145,73,65,107,45,38,
65,60,56,29,50,132,81,40,80,77,75,37,21,50,51,51,23,69,123,52,32,59,61,68,
40,69,145,73,65,107,45,38,65,60,56,29,50,132,81,40,80,77,75,37,21,50,51,51,
23,69,123,52,32,59,61,68,2,246,43,26,22,23,12,22,33,21,144,37,47,13,21,27,
13,8,15,14,8,51,43,149,23,30,19,8,254,90,44,26,23,24,12,23,32,21,141,38,46,
13,20,26,13,8,15,14,8,50,42,147,23,32,19,8,0,1,0,65,0,55,4,36,5,16,0,19,0,
162,64,108,53,2,1,58,11,1,60,12,1,42,12,1,3,3,6,7,10,11,2,11,0,17,16,13,12,
1,12,12,11,1,2,4,9,19,100,14,116,14,2,80,14,1,2,48,14,1,0,14,16,14,32,14,
96,14,4,14,4,111,9,127,9,2,95,9,111,9,2,9,16,7,8,173,9,0,1,2,3,4,4,173,17,
6,31,5,47,5,95,5,111,5,223,5,5,5,10,11,12,13,4,80,9,208,9,2,15,9,1,9,0,47,
93,93,23,51,222,93,50,50,237,23,50,16,237,50,50,1,47,93,113,51,47,93,113,
95,113,113,51,18,23,57,16,135,192,192,192,192,16,135,192,192,192,192,49,48,
1,95,93,93,93,93,1,3,35,19,35,53,33,19,33,53,33,19,51,3,33,21,33,3,33,21,
1,192,152,145,151,237,1,55,190,254,11,2,61,154,143,152,1,21,254,162,191,2,
29,1,88,254,223,1,33,148,1,108,148,1,36,254,220,148,254,148,148,0,0,0,0,3,
0,100,0,244,4,71,4,80,0,3,0,7,0,11,0,49,64,27,11,7,2,8,4,0,8,173,9,9,1,5,
173,63,4,1,4,0,173,15,1,31,1,63,1,3,1,0,47,93,237,47,93,237,17,57,47,237,
1,47,51,51,47,51,51,49,48,19,53,33,21,1,53,33,21,1,53,33,21,100,3,227,252,
29,3,227,252,29,3,227,3,188,148,148,253,56,148,148,1,100,148,148,0,0,0,2,
0,63,0,0,4,36,4,207,0,6,0,10,0,123,185,0,5,255,216,64,17,18,22,72,3,40,18,
22,72,0,40,18,22,72,137,0,1,1,184,255,216,64,63,18,22,72,134,1,1,10,48,2,
80,2,2,0,2,16,2,32,2,64,2,96,2,128,2,160,2,7,2,7,7,0,64,12,15,72,0,8,173,
7,79,6,95,6,143,6,3,6,64,2,80,2,128,2,3,2,1,0,80,4,128,4,2,4,0,25,47,93,51,
51,205,93,205,93,24,47,237,1,47,43,51,47,47,93,113,51,49,48,0,93,43,93,43,
43,43,19,53,1,21,9,1,21,5,53,33,21,65,3,227,252,166,3,90,252,27,3,227,2,119,
205,1,139,154,254,168,254,168,153,236,145,145,0,0,2,0,65,0,0,4,36,4,207,0,
6,0,10,0,121,185,0,1,255,216,64,17,18,22,72,3,40,18,22,72,6,40,18,22,72,137,
6,1,5,184,255,216,64,62,18,22,72,134,5,1,9,48,6,80,6,2,0,6,16,6,32,6,64,6,
96,6,128,6,160,6,7,6,7,0,64,12,15,72,0,8,173,7,6,5,64,4,80,4,128,4,3,4,79,
0,95,0,143,0,3,0,80,2,128,2,2,2,0,25,47,93,205,93,205,93,51,51,24,47,237,
1,47,43,51,47,93,113,51,49,48,0,93,43,93,43,43,43,55,53,9,1,53,1,21,1,53,
33,21,65,3,90,252,166,3,227,252,29,3,227,236,153,1,88,1,88,154,254,117,205,
253,137,145,145,0,0,0,0,2,0,157,0,0,4,55,4,129,0,4,0,9,0,35,64,18,105,9,121,
9,2,105,7,121,7,2,6,4,5,0,2,8,5,0,0,47,205,47,205,1,47,205,221,205,49,48,
0,93,93,51,17,9,1,17,37,33,17,9,1,157,1,205,1,205,252,182,2,250,254,131,254,
131,2,123,2,6,253,250,253,133,82,2,6,1,170,254,86,0,0,0,0,1,0,100,0,180,4,
71,2,242,0,5,0,19,183,5,170,0,2,0,4,173,1,0,47,237,47,1,47,47,237,49,48,55,
17,33,21,33,17,100,3,227,252,174,180,2,62,146,254,84,0,0,0,1,2,34,253,154,
3,210,6,170,0,23,0,29,182,4,32,8,11,72,9,0,184,1,0,180,1,19,12,6,1,0,47,47,
205,205,1,47,237,204,49,48,43,1,35,17,52,55,54,51,50,22,21,20,6,35,34,39,
46,1,39,38,35,34,7,6,21,2,181,147,84,82,128,63,75,51,37,30,13,8,26,20,33,
16,36,9,6,253,154,7,86,196,123,123,63,48,40,52,10,4,24,22,39,39,35,105,0,
0,0,1,1,5,253,154,2,181,6,170,0,28,0,32,185,0,4,255,224,180,8,11,72,12,2,
184,1,0,180,28,24,17,7,0,0,47,47,205,205,1,47,253,204,49,48,43,1,51,17,20,
7,14,1,35,34,46,2,53,52,62,2,51,50,23,30,1,23,22,51,50,55,54,53,2,34,147,
90,40,103,62,30,50,37,20,14,23,31,18,33,26,5,21,15,31,16,37,8,7,6,170,248,
168,205,125,56,54,16,29,39,24,20,34,24,14,16,2,23,20,37,41,31,106,0,0,0,1,
255,246,2,37,5,181,2,182,0,3,0,22,180,3,5,0,4,0,184,1,2,177,1,252,0,63,237,
17,1,51,17,51,49,48,3,53,33,21,10,5,191,2,37,145,145,0,0,1,1,216,253,147,
2,105,7,72,0,3,0,24,187,0,2,1,0,0,3,1,6,180,4,3,254,0,250,0,63,63,1,16,246,
237,49,48,1,51,17,35,1,216,145,145,7,72,246,75,0,0,0,1,2,141,253,147,5,181,
2,182,0,5,0,34,178,2,7,3,186,1,0,0,0,1,6,179,6,5,254,3,184,1,2,177,0,252,
0,63,237,63,1,16,246,237,17,51,49,48,1,33,21,33,17,35,2,141,3,40,253,105,
145,2,182,145,251,110,0,0,0,1,255,246,253,147,3,30,2,182,0,5,0,34,187,0,2,
1,0,0,5,1,6,181,6,0,6,4,254,5,184,1,2,177,2,252,0,63,237,63,17,1,51,16,246,
237,49,48,3,53,33,17,35,17,10,3,40,145,2,37,145,250,221,4,146,0,0,0,0,1,2,
141,2,37,5,181,7,72,0,5,0,34,178,4,7,2,189,1,0,0,5,1,6,0,6,0,5,1,2,179,2,
252,0,250,0,63,63,237,1,16,246,237,17,51,49,48,1,51,17,33,21,33,2,141,145,
2,151,252,216,7,72,251,110,145,0,0,0,1,255,246,2,37,3,30,7,72,0,5,0,34,187,
0,5,1,0,0,2,1,6,181,6,0,6,3,250,5,184,1,2,177,2,252,0,63,237,63,17,1,51,16,
244,237,49,48,3,53,33,17,51,17,10,2,151,145,2,37,145,4,146,250,221,0,0,0,
0,1,2,141,253,147,5,181,7,72,0,7,0,39,179,4,9,5,1,186,1,0,0,0,1,6,179,8,7,
254,5,184,1,2,179,2,252,0,250,0,63,63,237,63,1,16,246,237,50,17,51,49,48,
1,51,17,33,21,33,17,35,2,141,145,2,151,253,105,145,7,72,251,110,145,251,110,
0,1,255,246,253,147,3,30,7,72,0,7,0,39,177,7,4,186,1,0,0,2,1,6,183,8,0,8,
6,254,3,250,7,184,1,2,177,2,252,0,63,237,63,63,17,1,51,16,244,237,51,49,48,
3,53,33,17,51,17,35,17,10,2,151,145,145,2,37,145,4,146,246,75,4,146,0,0,1,
255,246,253,147,5,181,2,182,0,7,0,40,178,3,9,4,186,1,0,0,7,1,6,182,8,0,8,
6,254,4,0,184,1,2,177,1,252,0,63,237,50,63,17,1,51,16,246,237,17,51,49,48,
3,53,33,21,33,17,35,17,10,5,191,253,105,145,2,37,145,145,251,110,4,146,0,
1,255,246,2,37,5,181,7,72,0,7,0,40,178,7,9,5,186,1,0,0,2,1,6,182,8,0,8,3,
250,5,0,184,1,2,177,1,252,0,63,237,51,63,17,1,51,16,244,237,17,51,49,48,3,
53,33,17,51,17,33,21,10,2,151,145,2,151,2,37,145,4,146,251,110,145,0,1,255,
246,253,147,5,181,7,72,0,11,0,51,179,7,13,5,8,187,1,0,0,2,0,11,1,6,64,9,12,
0,12,10,254,3,250,8,11,184,1,2,178,5,2,252,0,63,51,237,50,63,63,17,1,51,16,
246,50,237,50,17,51,49,48,3,53,33,17,51,17,33,21,33,17,35,17,10,2,151,145,
2,151,253,105,145,2,37,145,4,146,251,110,145,251,110,4,146,0,0,0,2,255,246,
1,113,5,181,3,106,0,3,0,7,0,37,183,3,7,7,9,0,4,8,4,184,1,2,178,5,253,0,184,
1,2,177,1,251,0,63,237,63,237,17,1,51,50,17,51,17,51,49,48,3,53,33,21,1,53,
33,21,10,5,191,250,65,5,191,2,217,145,145,254,152,145,145,0,2,1,217,253,147,
3,210,7,72,0,3,0,7,0,42,65,9,0,5,1,0,0,4,1,7,0,8,0,1,1,0,0,0,1,4,182,8,7,
3,254,4,0,250,0,63,50,63,51,1,16,246,237,16,244,237,49,48,1,51,17,35,1,51,
17,35,1,217,145,145,1,104,145,145,7,72,246,75,9,181,246,75,0,0,0,1,2,141,
253,147,5,181,3,106,0,9,0,49,181,2,6,6,11,7,3,186,1,0,0,0,1,6,179,10,9,254,
7,184,1,2,178,4,253,3,184,1,2,177,0,251,0,63,237,63,237,63,1,16,246,237,50,
17,51,17,51,49,48,1,33,21,33,21,33,21,33,17,35,2,141,3,40,253,105,2,151,253,
105,145,3,106,145,215,145,252,34,0,0,1,1,217,253,147,5,181,2,182,0,9,0,51,
178,1,11,6,191,1,0,0,9,1,4,0,10,0,2,1,0,0,5,1,7,178,10,2,6,184,1,2,180,9,
252,4,8,254,0,63,51,63,237,50,1,16,244,237,16,246,237,17,51,49,48,1,21,33,
17,35,17,35,17,35,17,5,181,254,29,145,215,145,2,182,145,251,110,4,146,251,
110,5,35,0,0,0,0,2,1,217,253,147,5,181,3,106,0,5,0,11,0,63,180,2,8,8,13,9,
65,11,1,0,0,6,1,7,0,12,0,3,1,0,0,0,1,4,0,12,0,9,1,2,181,6,253,11,5,254,3,
184,1,2,177,0,251,0,63,237,63,51,63,237,1,16,246,237,16,244,237,17,51,17,
51,49,48,1,33,21,33,17,35,1,33,21,33,17,35,1,217,3,220,252,181,145,1,104,
2,116,254,29,145,3,106,145,250,186,4,111,145,252,34,0,0,1,255,246,253,147,
3,30,3,106,0,9,0,49,177,9,6,186,1,0,0,3,1,6,183,10,4,0,0,10,8,254,3,184,1,
2,178,6,251,9,184,1,2,177,2,253,0,63,237,63,237,63,17,1,51,17,51,16,244,237,
51,49,48,3,53,33,53,33,53,33,17,35,17,10,2,151,253,105,3,40,145,1,113,145,
215,145,250,41,3,222,0,0,0,1,255,246,253,147,3,210,2,182,0,9,0,52,65,9,0,
6,1,0,0,9,1,4,0,10,0,2,1,0,0,5,1,7,183,10,0,10,4,8,254,6,0,184,1,2,177,1,
252,0,63,237,50,63,51,17,1,51,16,244,237,16,246,237,49,48,3,53,33,17,35,17,
35,17,35,17,10,3,220,145,215,145,2,37,145,250,221,4,146,251,110,4,146,0,0,
0,0,2,255,246,253,147,3,210,3,106,0,5,0,11,0,63,180,4,9,9,12,11,65,11,1,0,
0,8,1,4,0,12,0,0,1,0,0,3,1,7,0,12,0,9,1,2,181,10,253,2,7,254,4,184,1,2,177,
5,251,0,63,237,63,51,63,237,1,16,244,237,16,246,237,17,51,17,51,49,48,1,17,
35,17,33,53,1,35,17,33,53,33,3,210,145,252,181,2,116,145,254,29,2,116,3,106,
250,41,5,70,145,250,41,3,222,145,0,0,1,2,141,1,113,5,181,7,72,0,9,0,49,181,
4,8,8,11,2,6,189,1,0,0,9,1,6,0,10,0,9,1,2,178,6,253,5,184,1,2,179,2,251,0,
250,0,63,63,237,63,237,1,16,246,237,50,17,51,17,51,49,48,1,51,17,33,21,33,
21,33,21,33,2,141,145,2,151,253,105,2,151,252,216,7,72,252,34,145,215,145,
0,0,1,1,217,2,37,5,181,7,72,0,9,0,52,178,4,11,2,65,11,1,0,0,9,1,7,0,10,0,
8,1,0,0,5,1,4,0,10,0,5,1,2,181,2,8,252,0,6,250,0,63,51,63,51,237,1,16,246,
237,16,244,237,17,51,49,48,1,51,17,33,21,33,17,51,17,51,3,65,145,1,227,252,
36,145,215,7,72,251,110,145,5,35,251,110,0,0,0,2,1,217,1,113,5,181,7,72,0,
5,0,11,0,63,180,10,4,4,13,8,65,11,1,0,0,11,1,7,0,12,0,2,1,0,0,5,1,4,0,12,
0,11,1,2,178,8,251,5,184,1,2,180,2,253,6,0,250,0,63,50,63,237,63,237,1,16,
246,237,16,244,237,17,51,17,51,49,48,1,51,17,33,21,33,1,51,17,33,21,33,1,
217,145,3,75,252,36,1,104,145,1,227,253,140,7,72,250,186,145,5,215,252,34,
145,0,0,1,255,246,1,113,3,30,7,72,0,9,0,50,188,0,9,1,0,0,6,0,2,1,6,183,10,
4,0,0,10,7,250,3,184,1,2,178,6,251,9,184,1,2,177,2,253,0,63,237,63,237,63,
17,1,51,17,51,16,244,50,237,49,48,3,53,33,53,33,53,33,17,51,17,10,2,151,253,
105,2,151,145,1,113,145,215,145,3,222,250,41,0,0,1,255,246,2,37,3,210,7,72,
0,9,0,52,65,9,0,0,1,0,0,7,1,7,0,10,0,6,1,0,0,3,1,4,183,10,1,10,8,4,250,6,
1,184,1,2,177,2,252,0,63,237,51,63,51,17,1,51,16,244,237,16,244,237,49,48,
1,33,53,33,17,51,17,51,17,51,3,210,252,36,1,227,145,215,145,2,37,145,4,146,
251,110,4,146,0,0,0,2,255,246,1,113,3,210,7,72,0,5,0,11,0,63,65,9,0,8,1,0,
0,11,1,4,0,12,0,0,1,0,0,3,1,7,181,12,9,1,1,12,9,184,1,2,181,10,251,4,6,250,
1,184,1,2,177,2,253,0,63,237,63,51,63,237,17,1,51,17,51,16,244,237,16,244,
237,49,48,1,33,53,33,17,51,33,51,17,33,53,33,3,210,252,36,3,75,145,254,7,
145,253,140,1,227,1,113,145,5,70,251,145,145,0,0,0,0,1,2,141,253,147,5,181,
7,72,0,11,0,54,182,4,8,8,13,6,2,10,186,1,0,0,11,1,6,179,12,11,254,9,184,1,
2,178,6,253,5,184,1,2,179,2,251,0,250,0,63,63,237,63,237,63,1,16,246,237,
50,50,17,51,17,51,49,48,1,51,17,33,21,33,21,33,21,33,17,35,2,141,145,2,151,
253,105,2,151,253,105,145,7,72,252,34,145,215,145,252,34,0,0,0,0,2,1,217,
253,147,5,181,7,72,0,7,0,11,0,56,178,4,13,10,186,1,0,0,11,1,4,178,12,2,6,
186,1,0,0,7,1,7,183,12,7,11,254,0,8,250,5,184,1,2,177,2,252,0,63,237,63,51,
63,51,1,16,244,237,50,16,246,237,17,51,49,48,1,51,17,33,21,33,17,35,1,51,
17,35,3,65,145,1,227,254,29,145,254,152,145,145,7,72,251,110,145,251,110,
9,181,246,75,0,0,3,1,217,253,147,5,181,7,72,0,3,0,9,0,15,0,73,181,14,6,6,
17,12,8,65,12,1,0,0,15,0,9,1,7,0,16,0,0,1,0,0,1,1,4,0,16,0,15,1,2,178,12,
251,7,184,1,2,183,4,253,10,2,250,9,1,254,0,63,51,63,51,63,237,63,237,1,16,
246,237,16,244,50,237,50,17,51,17,51,49,48,1,35,17,51,19,33,21,33,17,35,17,
51,17,33,21,33,2,106,145,145,215,2,116,254,29,145,145,1,227,253,140,253,147,
9,181,250,186,145,252,34,9,181,252,34,145,0,1,255,246,253,147,3,30,7,72,0,
11,0,56,185,0,9,1,0,178,6,2,10,184,1,6,64,10,12,4,0,0,12,10,254,7,250,3,184,
1,2,178,6,251,11,184,1,2,177,2,253,0,63,237,63,237,63,63,17,1,51,17,51,16,
246,50,50,237,49,48,3,53,33,53,33,53,33,17,51,17,35,17,10,2,151,253,105,2,
151,145,145,1,113,145,215,145,3,222,246,75,3,222,0,0,0,2,255,246,253,147,
3,210,7,72,0,7,0,11,0,59,65,10,0,10,1,0,0,11,1,7,0,12,0,5,1,0,0,2,0,6,1,4,
64,10,12,0,12,11,6,254,8,3,250,7,184,1,2,177,2,252,0,63,237,63,51,63,51,17,
1,51,16,246,50,237,16,244,237,49,48,3,53,33,17,51,17,35,17,1,51,17,35,10,
1,227,145,145,1,104,145,145,2,37,145,4,146,246,75,4,146,5,35,246,75,0,0,0,
0,3,255,246,253,147,3,210,7,72,0,3,0,9,0,15,0,73,181,7,13,13,16,6,10,65,12,
1,0,0,9,0,11,1,4,0,16,0,2,1,0,0,3,1,7,0,16,0,12,1,2,181,15,253,3,11,254,6,
184,1,2,180,9,251,0,4,250,0,63,51,63,237,63,51,63,237,1,16,244,237,16,246,
50,237,50,17,51,17,51,49,48,1,51,17,35,1,51,17,33,53,33,19,35,17,33,53,33,
3,65,145,145,254,152,145,253,140,1,227,145,145,254,29,2,116,7,72,246,75,9,
181,251,145,145,250,41,3,222,145,0,0,0,2,255,246,253,147,5,181,3,106,0,7,
0,11,0,57,180,11,3,3,13,4,186,1,0,0,7,1,6,181,12,8,0,0,12,8,184,1,2,181,9,
251,6,254,4,0,184,1,2,177,1,253,0,63,237,50,63,63,237,17,1,51,17,51,16,246,
237,17,51,17,51,49,48,3,53,33,21,33,17,35,17,1,53,33,21,10,5,191,253,105,
145,253,105,5,191,1,113,145,145,252,34,3,222,1,104,145,145,0,0,1,255,246,
253,147,5,181,2,182,0,11,0,58,178,3,13,8,191,1,0,0,11,1,4,0,12,0,4,1,0,0,
7,1,7,64,9,12,0,12,6,10,254,8,4,0,184,1,2,177,1,252,0,63,237,50,50,63,51,
17,1,51,16,244,237,16,246,237,17,51,49,48,3,53,33,21,33,17,35,17,35,17,35,
17,10,5,191,254,29,145,215,145,2,37,145,145,251,110,4,146,251,110,4,146,0,
3,255,246,253,147,5,181,3,106,0,5,0,11,0,15,0,74,180,13,8,8,17,9,186,1,0,
0,6,1,7,181,16,14,3,3,16,5,189,1,0,0,2,1,4,0,16,0,14,1,2,179,15,251,9,3,184,
1,2,181,6,4,253,11,1,254,0,63,51,63,51,237,50,63,237,1,16,246,237,17,51,17,
51,16,244,237,17,51,17,51,49,48,1,35,17,33,53,33,51,33,21,33,17,35,1,21,33,
53,2,106,145,254,29,2,116,215,2,116,254,29,145,2,116,250,65,253,147,3,222,
145,145,252,34,5,215,145,145,0,0,0,0,2,255,246,1,113,5,181,7,72,0,7,0,11,
0,58,64,9,7,11,11,13,0,8,8,12,5,189,1,0,0,2,1,6,0,12,0,8,1,2,181,9,253,3,
250,5,0,184,1,2,177,1,251,0,63,237,51,63,63,237,1,16,244,237,17,51,17,51,
17,51,17,51,49,48,3,53,33,17,51,17,33,21,1,53,33,21,10,2,151,145,2,151,250,
65,5,191,2,217,145,3,222,252,34,145,254,152,145,145,0,1,255,246,2,37,5,181,
7,72,0,11,0,58,178,11,13,9,191,1,0,0,6,1,7,0,12,0,5,1,0,0,2,1,4,64,9,12,0,
12,7,3,250,9,5,0,184,1,2,177,1,252,0,63,237,51,51,63,51,17,1,51,16,244,237,
16,244,237,17,51,49,48,3,53,33,17,51,17,51,17,51,17,33,21,10,1,227,145,215,
145,1,227,2,37,145,4,146,251,110,4,146,251,110,145,0,3,255,246,1,113,5,181,
7,72,0,5,0,11,0,15,0,76,64,9,4,15,15,17,9,12,12,16,8,65,11,1,0,0,11,1,4,0,
16,0,2,1,0,0,5,1,7,0,16,0,12,1,2,179,13,253,5,9,184,1,2,181,2,10,251,0,6,
250,0,63,51,63,51,237,50,63,237,1,16,244,237,16,244,237,17,51,17,51,17,51,
17,51,49,48,1,51,17,33,21,33,1,51,17,33,53,33,1,53,33,21,3,65,145,1,227,253,
140,254,152,145,253,140,1,227,254,29,5,191,7,72,252,34,145,4,111,251,145,
145,254,7,145,145,0,0,0,1,255,246,253,147,5,181,7,72,0,19,0,76,182,11,15,
15,21,13,9,16,184,1,0,178,6,2,19,184,1,6,64,11,20,4,0,0,20,18,254,7,250,12,
4,184,1,2,180,9,5,251,16,0,184,1,2,178,13,1,253,0,63,51,237,50,63,51,237,
50,63,63,17,1,51,17,51,16,246,50,50,237,50,50,17,51,17,51,49,48,3,53,33,53,
33,53,33,17,51,17,33,21,33,21,33,21,33,17,35,17,10,2,151,253,105,2,151,145,
2,151,253,105,2,151,253,105,145,1,113,145,215,145,3,222,252,34,145,215,145,
252,34,3,222,0,0,1,255,246,253,147,5,181,7,72,0,19,0,77,179,4,21,18,9,187,
1,0,0,15,0,12,1,4,178,20,2,5,187,1,0,0,19,0,8,1,7,64,9,20,13,20,0,16,250,
9,5,13,184,1,2,182,18,2,14,252,7,11,254,0,63,51,63,51,51,237,50,50,63,51,
17,1,51,16,244,50,237,50,16,246,50,237,50,17,51,49,48,1,51,17,33,21,33,17,
35,17,35,17,35,17,33,53,33,17,51,17,51,3,65,145,1,227,254,29,145,215,145,
254,29,1,227,145,215,7,72,251,110,145,251,110,4,146,251,110,4,146,145,4,146,
251,110,0,0,0,0,4,255,246,253,147,5,181,7,72,0,5,0,11,0,17,0,23,0,93,181,
4,14,14,25,2,15,187,1,0,0,5,0,12,1,7,182,24,21,9,9,24,20,11,187,1,0,0,23,
0,8,1,4,178,24,5,21,184,1,2,183,2,22,251,0,18,250,15,9,184,1,2,181,12,10,
253,17,7,254,0,63,51,63,51,237,50,63,51,63,51,237,50,1,16,246,50,237,50,17,
51,17,51,16,244,50,237,50,17,51,17,51,49,48,1,51,17,33,21,33,3,35,17,33,53,
33,51,33,21,33,17,35,1,51,17,33,53,33,3,65,145,1,227,253,140,215,145,254,
29,2,116,215,2,116,254,29,145,254,152,145,253,140,1,227,7,72,252,34,145,250,
186,3,222,145,145,252,34,9,181,251,145,145,0,0,0,0,1,0,0,2,109,5,171,7,72,
0,3,0,18,182,0,5,1,4,2,250,1,0,47,63,17,1,51,17,51,49,48,1,33,17,33,5,171,
250,85,5,171,2,109,4,219,0,0,0,1,0,0,253,147,5,171,2,109,0,3,0,18,182,0,5,
1,4,2,1,254,0,63,47,17,1,51,17,51,49,48,1,33,17,33,5,171,250,85,5,171,253,
147,4,218,0,0,0,1,0,0,253,147,5,171,7,72,0,3,0,19,183,0,5,1,4,2,250,1,254,
0,63,63,17,1,51,17,51,49,48,1,33,17,33,5,171,250,85,5,171,253,147,9,181,0,
0,1,0,0,253,147,2,214,7,72,0,3,0,17,182,1,4,0,2,250,1,254,0,63,63,1,47,17,
51,49,48,1,33,17,33,2,214,253,42,2,214,253,147,9,181,0,0,0,0,1,2,213,253,
147,5,171,7,72,0,3,0,17,182,0,5,1,2,250,1,254,0,63,63,1,47,17,51,49,48,1,
33,17,33,5,171,253,42,2,214,253,147,9,181,0,0,0,0,42,0,103,253,245,5,171,
6,163,0,3,0,7,0,11,0,15,0,19,0,23,0,27,0,31,0,35,0,39,0,43,0,47,0,51,0,55,
0,59,0,63,0,67,0,71,0,75,0,79,0,83,0,87,0,91,0,95,0,99,0,103,0,107,0,111,
0,115,0,119,0,123,0,127,0,131,0,135,0,139,0,143,0,147,0,151,0,155,0,159,0,
163,0,167,2,49,181,161,157,153,149,145,165,184,1,1,182,164,109,85,69,45,13,
121,184,1,1,64,13,120,108,84,68,44,12,120,101,77,53,29,5,137,184,1,1,64,13,
136,100,76,52,28,4,136,113,89,65,41,17,125,184,1,1,64,13,124,112,88,64,40,
16,124,97,81,57,25,9,141,184,1,1,64,13,140,96,80,56,24,8,140,117,93,61,37,
21,129,184,1,1,64,33,128,116,92,60,36,20,128,120,136,124,140,128,128,140,
124,136,120,5,132,160,156,152,148,144,164,164,169,105,73,49,33,1,133,184,
1,1,64,15,104,72,48,32,0,10,132,1,8,3,132,167,143,139,135,184,1,3,180,132,
163,103,99,107,184,1,3,183,104,160,100,96,104,95,91,87,184,1,3,183,84,92,
88,84,159,83,79,75,184,1,3,183,72,156,80,76,72,67,63,71,184,1,3,183,68,64,
60,68,155,59,55,51,184,1,3,183,48,152,56,52,48,43,39,47,184,1,3,183,44,40,
36,44,151,31,27,35,184,1,3,183,32,148,28,24,32,23,19,15,184,1,3,183,12,20,
16,12,147,11,7,3,184,1,3,183,0,144,8,4,0,131,127,123,184,1,3,64,60,120,128,
124,120,22,84,1,27,72,1,25,68,1,27,48,1,27,44,1,20,32,1,104,84,72,68,48,44,
32,12,0,120,120,0,12,32,44,48,68,72,84,104,10,108,164,140,136,27,132,59,132,
2,15,132,1,2,132,119,115,111,184,1,3,178,116,112,108,0,47,51,51,237,50,50,
47,95,93,93,51,51,51,18,23,57,47,47,47,47,47,47,47,47,47,47,93,93,93,93,93,
93,17,51,51,16,237,50,50,17,51,51,51,16,237,50,50,50,17,51,51,16,237,50,50,
17,51,51,51,16,237,50,50,50,17,51,51,16,237,50,50,17,51,51,51,16,237,50,50,
50,17,51,51,16,237,50,50,17,51,51,51,16,237,50,50,50,17,51,51,16,237,50,50,
17,51,51,51,16,237,50,50,50,16,237,50,50,50,1,47,95,94,93,51,51,51,51,51,
237,50,50,50,50,50,17,51,47,51,51,51,51,51,18,23,57,47,47,47,47,47,17,51,
51,51,51,51,16,237,50,50,50,50,50,17,51,51,51,51,51,16,237,50,50,50,50,50,
17,51,51,51,51,51,16,237,50,50,50,50,50,17,51,51,51,51,51,16,237,50,50,50,
50,50,17,51,51,51,51,51,16,237,50,50,50,50,50,16,237,50,50,50,50,50,49,48,
19,51,21,35,37,51,21,35,37,51,21,35,5,51,21,35,37,51,21,35,37,51,21,35,7,
51,21,35,37,51,21,35,37,51,21,35,5,51,21,35,37,51,21,35,37,51,21,35,7,51,
21,35,37,51,21,35,37,51,21,35,23,51,21,35,37,51,21,35,37,51,21,35,7,51,21,
35,37,51,21,35,37,51,21,35,5,51,21,35,37,51,21,35,37,51,21,35,7,51,21,35,
37,51,21,35,37,51,21,35,23,51,21,35,37,51,21,35,37,51,21,35,1,51,21,35,37,
51,21,35,37,51,21,35,1,51,21,35,37,51,21,35,37,51,21,35,1,51,21,35,17,51,
21,35,17,51,21,35,17,51,21,35,17,51,21,35,17,51,21,35,103,104,104,1,158,104,
104,1,160,103,103,253,145,104,104,1,159,104,104,1,159,104,104,207,103,103,
254,96,104,104,254,98,104,104,4,13,104,104,254,97,104,104,254,97,104,104,
207,104,104,1,158,104,104,1,160,103,103,207,104,104,254,97,104,104,254,97,
104,104,207,104,104,1,158,104,104,1,160,103,103,253,145,104,104,1,159,104,
104,1,159,104,104,207,103,103,254,96,104,104,254,98,104,104,207,104,104,1,
159,104,104,1,159,104,104,252,194,104,104,1,159,104,104,1,159,104,104,251,
243,104,104,1,158,104,104,1,160,103,103,1,158,104,104,104,104,104,104,104,
104,104,104,104,104,5,34,98,98,98,98,98,97,96,96,96,96,96,96,96,96,96,96,
96,99,96,96,96,96,96,96,96,96,96,96,96,99,96,96,96,96,96,96,97,97,97,97,97,
98,94,94,94,94,94,98,97,97,97,97,97,96,96,96,96,96,96,7,237,98,98,98,98,98,
1,35,96,96,96,96,96,254,223,98,254,223,96,254,221,96,254,221,97,254,222,97,
7,238,96,0,0,0,0,84,0,0,253,245,5,171,6,163,0,3,0,7,0,11,0,15,0,19,0,23,0,
27,0,31,0,35,0,39,0,43,0,47,0,51,0,55,0,59,0,63,0,67,0,71,0,75,0,79,0,83,
0,87,0,91,0,95,0,99,0,103,0,107,0,111,0,115,0,119,0,123,0,127,0,131,0,135,
0,139,0,143,0,147,0,151,0,155,0,159,0,163,0,167,0,171,0,175,0,179,0,183,0,
187,0,191,0,195,0,199,0,203,0,207,0,211,0,215,0,219,0,223,0,227,0,231,0,235,
0,239,0,243,0,247,0,251,0,255,1,3,1,7,1,11,1,15,1,19,1,23,1,27,1,31,1,35,
1,39,1,43,1,47,1,51,1,55,1,59,1,63,1,67,1,71,1,75,1,79,0,0,19,51,21,35,55,
51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,55,51,
21,35,55,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,55,51,21,
35,55,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,55,51,21,35,
55,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,55,51,21,35,55,
51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,37,51,21,35,55,51,
21,35,55,51,21,35,55,51,21,35,37,51,21,35,5,51,21,35,39,51,21,35,39,51,21,
35,39,51,21,35,39,51,21,35,39,51,21,35,7,51,21,35,55,51,21,35,55,51,21,35,
55,51,21,35,55,51,21,35,55,51,21,35,23,51,21,35,39,51,21,35,39,51,21,35,39,
51,21,35,39,51,21,35,39,51,21,35,7,51,21,35,55,51,21,35,55,51,21,35,55,51,
21,35,55,51,21,35,55,51,21,35,1,51,21,35,55,51,21,35,55,51,21,35,55,51,21,
35,55,51,21,35,55,51,21,35,1,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,
55,51,21,35,55,51,21,35,19,51,21,35,7,51,21,35,23,51,21,35,7,51,21,35,23,
51,21,35,7,51,21,35,23,51,21,35,7,51,21,35,23,51,21,35,7,51,21,35,17,51,21,
35,19,51,21,35,103,104,104,207,104,104,207,104,104,208,104,104,208,104,104,
207,104,104,251,140,103,103,207,103,103,207,103,103,207,104,104,208,104,104,
208,103,103,252,90,104,104,207,104,104,207,104,104,208,104,104,208,104,104,
207,104,104,251,140,103,103,207,103,103,207,103,103,207,104,104,208,104,104,
208,103,103,252,90,104,104,207,104,104,207,104,104,208,104,104,208,104,104,
207,104,104,251,140,103,103,1,158,103,103,207,104,104,208,104,104,208,103,
103,252,194,103,103,3,165,104,104,207,104,104,208,104,104,208,104,104,207,
104,104,207,104,104,103,103,103,207,103,103,207,103,103,207,104,104,208,104,
104,208,103,103,103,104,104,207,104,104,208,104,104,208,104,104,207,104,104,
207,104,104,103,103,103,207,103,103,207,103,103,207,104,104,208,104,104,208,
103,103,251,243,103,103,207,103,103,207,103,103,207,104,104,208,104,104,208,
103,103,252,90,104,104,207,104,104,207,104,104,208,104,104,208,104,104,207,
104,104,207,104,104,103,103,103,103,104,104,103,103,103,103,104,104,103,103,
103,103,104,104,103,103,103,103,104,104,103,103,103,103,103,103,104,104,5,
34,98,98,98,98,98,98,98,98,98,98,98,97,96,96,96,96,96,96,96,96,96,96,96,96,
96,96,96,96,96,96,96,96,96,96,96,99,96,96,96,96,96,96,96,96,96,96,96,96,96,
96,96,96,96,96,96,96,96,96,96,99,96,96,96,96,96,96,96,96,96,96,96,96,97,97,
97,97,97,97,97,97,97,97,97,98,94,94,94,94,94,94,94,94,94,94,94,98,97,97,97,
97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96,96,96,96,7,237,98,98,98,
98,98,98,98,98,98,98,98,1,35,96,96,96,96,96,96,96,96,96,96,96,254,223,98,
97,96,96,96,99,96,96,96,99,96,96,97,98,94,98,97,96,96,7,237,98,1,35,96,0,
0,67,0,0,253,147,5,213,6,163,0,73,0,77,0,81,0,85,0,89,0,93,0,97,0,101,0,105,
0,109,0,113,0,117,0,121,0,125,0,129,0,133,0,137,0,141,0,145,0,149,0,153,0,
157,0,161,0,165,0,169,0,173,0,177,0,181,0,185,0,189,0,193,0,197,0,201,0,205,
0,209,0,213,0,217,0,221,0,225,0,229,0,233,0,237,0,241,0,245,0,249,0,253,1,
1,1,5,1,9,1,13,1,17,1,21,1,25,1,29,1,33,1,37,1,41,1,45,1,49,1,53,1,57,1,61,
1,65,1,69,1,73,1,77,1,81,0,0,1,33,17,51,53,35,17,51,53,35,17,51,53,35,17,
51,53,35,17,51,53,35,17,51,53,51,21,51,53,51,21,51,53,51,21,51,53,51,21,51,
53,51,21,51,53,51,21,51,53,51,21,35,21,51,17,35,21,51,17,35,21,51,17,35,21,
51,17,35,21,51,17,35,21,51,1,21,51,53,51,21,51,53,51,21,51,53,51,21,51,53,
23,35,21,51,39,35,21,51,39,35,21,51,39,35,21,51,7,21,51,53,51,21,51,53,51,
21,51,53,51,21,51,53,5,35,21,51,55,21,51,53,51,21,51,53,51,21,51,53,5,21,
51,53,33,21,51,53,7,53,35,21,37,21,51,53,19,53,35,21,35,53,35,21,35,53,35,
21,35,53,35,21,7,21,51,53,51,21,51,53,51,21,51,53,51,21,51,53,19,53,35,21,
35,53,35,21,35,53,35,21,35,53,35,21,7,21,51,53,51,21,51,53,51,21,51,53,51,
21,51,53,19,35,21,51,39,35,21,51,39,35,21,51,39,35,21,51,1,35,21,51,39,35,
21,51,39,35,21,51,39,35,21,51,1,21,51,53,51,21,51,53,23,35,21,51,39,35,21,
51,7,21,51,53,51,21,51,53,7,35,21,51,55,21,51,53,5,21,51,53,23,53,35,21,23,
53,35,21,35,53,35,21,7,21,51,53,51,21,51,53,19,53,35,21,35,53,35,21,7,21,
51,53,51,21,51,53,19,35,21,51,39,35,21,51,19,35,21,51,39,35,21,51,5,213,250,
43,106,106,106,106,106,106,106,106,106,106,106,107,106,107,106,107,107,107,
107,107,106,107,106,107,107,107,107,107,107,107,107,107,107,107,107,107,250,
149,107,106,107,106,107,107,107,107,107,107,214,107,107,214,106,106,213,106,
106,213,107,106,107,106,107,107,107,253,234,106,106,107,106,107,107,107,107,
252,170,107,1,63,107,213,107,1,171,107,107,107,107,107,107,106,107,106,107,
107,106,107,106,107,107,107,107,107,107,107,107,106,107,106,107,107,106,107,
106,107,107,107,107,107,107,214,107,107,214,106,106,213,106,106,2,22,107,
107,214,107,107,213,107,107,213,107,107,2,235,107,106,107,106,106,106,213,
106,106,213,107,106,107,107,106,106,107,106,254,86,107,213,107,213,106,107,
106,107,107,106,107,106,106,107,106,107,107,106,107,106,106,106,213,106,106,
107,107,107,213,107,107,253,147,1,34,97,1,34,97,1,35,96,1,33,98,1,33,98,1,
33,96,96,96,96,96,96,96,96,96,96,96,96,96,193,98,254,223,96,254,221,96,254,
221,96,254,221,94,254,221,96,6,106,96,96,96,96,96,96,96,96,192,98,98,98,98,
98,98,98,97,96,96,96,96,96,96,96,96,192,96,96,96,96,96,96,96,96,195,96,96,
96,96,96,96,96,96,96,96,254,223,97,97,97,97,97,97,97,97,98,94,94,94,94,94,
94,94,94,254,223,97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96,6,205,
98,98,98,98,98,98,98,1,34,98,98,98,98,98,98,98,254,223,96,96,96,96,192,98,
98,98,97,96,96,96,96,192,96,96,96,96,195,96,96,96,96,96,193,97,97,97,97,98,
94,94,94,94,254,223,97,97,97,97,96,96,96,96,96,6,205,98,98,98,1,34,98,98,
98,0,0,0,0,1,0,123,0,117,4,90,4,84,0,3,0,0,19,33,17,33,123,3,223,252,33,4,
84,252,33,0,0,2,0,6,0,0,4,207,4,201,0,3,0,7,0,21,183,7,1,4,0,4,0,5,3,0,47,
205,221,205,1,47,205,221,205,49,48,19,33,17,33,19,17,33,17,6,4,201,251,55,
76,4,49,4,201,251,55,4,125,251,207,4,49,0,0,1,0,109,1,127,2,105,3,123,0,3,
0,26,64,13,3,48,2,1,15,2,31,2,2,8,2,1,2,0,47,205,1,47,94,93,93,205,49,48,
1,33,17,33,2,105,254,4,1,252,1,127,1,252,0,0,0,2,0,109,1,127,2,105,3,123,
0,3,0,7,0,34,64,17,5,3,6,48,2,1,15,2,31,2,2,8,2,7,1,6,2,0,47,205,221,205,
1,47,94,93,93,205,221,205,49,48,1,33,17,33,3,17,33,17,2,105,254,4,1,252,76,
254,156,1,127,1,252,254,80,1,98,254,158,0,0,0,0,1,0,0,0,0,8,0,2,104,0,3,0,
0,17,33,17,33,8,0,248,0,2,104,253,152,0,0,0,1,1,158,0,0,6,76,4,174,0,2,0,
0,33,9,1,1,158,2,88,2,86,4,174,251,82,0,0,1,1,145,255,229,6,90,4,172,0,2,
0,0,9,2,1,145,4,201,251,55,4,172,253,158,253,155,0,1,1,158,255,229,6,76,4,
147,0,2,0,0,9,2,6,76,253,170,253,168,4,147,251,82,4,174,0,1,1,145,255,229,
6,90,4,172,0,2,0,0,1,17,1,6,90,251,55,4,172,251,57,2,101,0,0,2,0,8,0,0,3,
238,5,160,0,5,0,9,0,37,64,20,134,7,1,9,0,5,16,5,2,5,7,31,2,1,2,6,3,4,8,1,
0,47,51,63,51,1,47,93,51,47,93,51,49,48,93,33,35,9,1,51,9,4,2,35,82,254,55,
1,201,82,1,203,254,14,254,158,1,98,1,96,2,207,2,209,253,49,2,53,253,203,253,
194,2,62,0,2,0,167,0,162,4,46,4,41,0,19,0,39,0,46,64,28,68,37,84,37,2,75,
33,91,33,2,75,27,91,27,2,68,23,84,23,2,30,10,20,0,25,15,35,5,0,47,205,220,
205,1,47,205,220,205,49,48,93,93,93,93,19,52,62,2,51,50,30,2,21,20,14,2,35,
34,46,2,55,20,30,2,51,50,62,2,53,52,46,2,35,34,14,2,167,70,122,164,94,94,
165,123,71,71,123,165,94,94,164,122,70,86,57,98,133,76,76,134,99,58,58,99,
134,76,76,133,98,57,2,100,94,165,123,71,71,123,165,94,94,164,122,70,70,122,
164,94,76,132,99,57,57,99,132,76,76,134,99,58,58,99,134,0,0,0,0,1,0,178,0,
137,4,35,3,250,0,23,0,17,182,8,16,12,15,0,1,0,0,47,93,205,1,47,205,49,48,
1,50,23,30,1,23,30,1,21,20,7,6,35,34,39,38,53,52,54,55,62,1,55,54,2,106,110,
107,53,82,29,29,31,129,129,183,182,129,129,30,29,29,83,52,108,3,250,57,28,
82,52,54,110,57,183,129,129,129,129,183,58,109,54,52,82,28,57,0,0,0,2,0,41,
0,0,4,172,4,131,0,3,0,23,0,21,183,14,2,4,1,19,1,9,0,0,47,205,221,205,1,47,
205,221,205,49,48,51,17,33,17,1,20,30,2,51,50,62,2,53,52,46,2,35,34,14,2,
41,4,131,252,4,69,120,160,91,91,161,120,69,69,120,161,91,91,160,120,69,4,
131,251,125,2,65,91,160,120,69,69,120,160,91,91,161,120,69,69,120,161,0,0,
3,0,41,0,0,4,172,4,131,0,3,0,23,0,43,0,34,64,14,4,24,1,14,34,2,1,19,29,0,
9,39,1,0,0,47,221,221,206,16,221,206,1,47,221,221,206,16,221,206,49,48,51,
17,33,17,1,52,62,2,51,50,30,2,21,20,14,2,35,34,46,2,39,20,30,2,51,50,62,2,
53,52,46,2,35,34,14,2,41,4,131,252,81,58,99,133,75,75,133,99,58,58,99,133,
75,75,133,99,58,77,69,120,160,91,91,161,120,69,69,120,161,91,91,160,120,69,
4,131,251,125,2,65,75,133,99,58,58,99,133,75,75,133,99,58,58,99,133,75,91,
160,120,69,69,120,160,91,91,161,120,69,69,120,161,0,0,2,0,115,1,133,2,99,
3,117,0,18,0,34,0,21,183,19,0,27,11,31,6,23,15,0,47,205,220,205,1,47,205,
220,205,49,48,1,20,6,7,14,1,35,34,39,46,1,53,52,55,54,51,50,23,22,7,52,39,
38,35,34,7,6,21,20,23,22,51,50,55,54,2,99,37,37,37,86,51,101,75,35,37,72,
74,102,103,71,74,76,51,51,70,70,51,51,51,49,72,72,49,51,2,125,53,86,37,35,
37,72,37,86,53,102,72,74,74,71,103,70,51,51,51,51,70,69,54,49,49,54,0,0,0,
5,1,177,255,229,6,121,4,172,0,17,0,33,0,45,0,57,0,68,0,147,64,93,20,32,36,
32,116,32,3,20,28,36,28,116,28,3,27,24,43,24,123,24,3,27,20,43,20,123,20,
3,68,34,40,63,52,46,40,46,40,46,8,18,31,0,1,0,26,8,49,37,43,55,43,62,58,104,
58,1,89,58,1,71,58,1,25,58,1,58,60,65,15,43,95,43,111,43,3,8,65,64,9,14,72,
43,65,43,65,4,22,15,13,1,13,30,4,0,47,205,220,93,205,18,57,57,47,47,43,94,
93,16,205,51,93,93,93,93,17,51,17,51,16,205,50,1,47,205,220,93,205,18,57,
57,47,47,16,205,51,16,205,51,49,48,0,93,93,93,93,1,20,7,6,35,34,39,38,53,
52,54,55,54,51,50,23,30,1,7,52,39,38,35,34,7,6,21,20,23,22,51,50,55,54,1,
20,6,35,34,38,53,52,54,51,50,22,5,20,6,35,34,38,53,52,54,51,50,22,1,22,51,
50,55,23,6,35,34,38,39,6,121,180,179,253,253,179,180,90,90,178,254,254,178,
90,90,90,153,151,218,218,151,153,153,152,217,217,152,153,253,90,46,32,32,
45,45,32,32,46,1,211,44,32,32,47,47,32,32,44,253,234,76,147,145,76,62,98,
185,94,141,48,2,72,254,178,179,179,178,254,128,215,91,178,178,91,215,128,
217,153,154,154,153,217,216,153,154,154,153,1,87,32,46,46,32,32,45,45,32,
32,46,46,32,32,45,45,254,191,137,137,35,186,95,91,0,0,4,1,209,255,229,6,153,
4,172,0,17,0,29,0,41,0,52,0,96,64,55,42,18,24,47,36,30,24,30,24,30,0,8,39,
27,21,33,21,48,52,104,52,1,89,52,1,75,52,1,61,52,1,52,50,45,15,21,31,21,95,
21,111,21,4,8,79,45,95,45,2,21,45,21,45,13,4,0,47,204,57,57,47,47,93,94,93,
16,206,51,93,93,93,93,17,51,17,51,16,206,50,1,47,205,57,57,47,47,16,206,51,
16,206,51,49,48,1,20,7,6,35,34,39,38,53,52,54,55,54,51,50,23,30,1,5,52,38,
35,34,6,21,20,22,51,50,54,37,52,38,35,34,6,21,20,22,51,50,54,1,30,1,51,50,
55,39,6,35,34,39,6,153,180,179,253,253,179,180,90,90,178,254,254,178,90,90,
253,0,46,32,32,45,45,32,32,46,1,211,44,32,32,47,47,32,32,44,253,174,48,141,
94,185,98,62,76,145,147,76,2,72,254,178,179,179,178,254,128,215,91,178,178,
91,215,1,32,45,45,32,32,46,46,32,32,45,45,32,32,46,46,254,220,91,95,186,35,
137,137,0,2,1,70,255,115,6,14,4,59,0,51,0,70,0,139,185,0,47,255,240,64,13,
11,14,72,52,46,1,52,36,1,119,35,1,35,184,255,240,64,77,11,14,72,21,16,11,
14,72,59,20,1,59,9,1,8,16,11,14,72,59,47,1,52,35,1,52,21,1,59,8,1,66,143,
13,223,13,2,112,13,1,63,13,1,32,13,1,13,57,43,62,128,31,208,31,224,31,3,127,
31,1,48,31,1,47,31,1,31,52,15,51,63,51,79,51,3,8,51,0,47,94,93,205,220,93,
93,93,93,205,1,47,205,220,93,93,93,93,205,49,48,0,93,93,93,93,1,43,93,93,
43,43,93,93,93,43,1,51,21,30,3,23,55,23,7,30,1,23,51,21,35,14,1,7,23,7,39,
14,1,7,14,1,7,21,35,53,46,1,39,7,39,55,46,1,39,35,53,51,54,55,39,55,23,62,
1,55,23,34,6,7,6,21,20,23,30,1,51,50,55,54,53,52,39,46,1,3,137,66,32,57,54,
53,29,186,45,184,45,44,3,215,215,8,44,40,184,49,182,31,55,23,24,58,34,66,
63,110,48,188,43,182,40,46,8,215,215,12,80,180,40,189,57,112,54,31,69,117,
48,98,98,48,117,69,139,96,99,99,49,117,4,59,217,3,12,21,32,22,182,45,184,
59,113,57,62,60,110,51,188,43,182,23,32,11,9,12,5,217,217,9,46,35,180,45,
184,51,111,63,62,128,95,184,49,182,40,44,6,61,50,48,100,136,137,98,50,47,
97,97,138,137,99,48,50,0,0,0,2,1,218,0,80,4,38,4,129,0,28,0,47,0,98,64,62,
22,18,25,0,0,5,15,43,1,239,43,255,43,2,43,15,14,1,14,0,34,1,224,34,240,34,
2,34,5,22,25,19,0,28,16,28,80,28,3,28,0,39,1,240,39,1,39,18,0,0,128,0,2,8,
0,29,64,37,40,72,29,10,0,47,205,43,220,94,93,50,205,113,114,47,93,51,205,
50,1,47,205,113,114,220,93,205,113,114,17,57,47,51,205,50,49,48,1,46,1,39,
38,53,52,55,62,1,51,50,23,22,21,20,7,6,7,21,33,21,33,17,35,17,33,53,33,19,
34,7,14,1,21,20,22,23,22,51,50,55,54,53,52,38,39,38,2,220,55,90,35,71,83,
44,101,60,118,83,86,72,72,106,1,0,255,0,74,254,254,1,2,35,83,62,29,31,31,
29,62,83,87,59,61,30,29,62,2,66,8,46,42,80,108,122,83,43,43,86,83,122,109,
81,82,12,166,70,254,250,1,6,70,2,145,59,31,71,44,43,71,31,62,62,61,84,44,
71,31,59,0,2,1,81,0,250,4,175,4,129,0,65,0,81,0,70,64,40,49,65,59,15,78,1,
78,63,32,1,32,15,51,1,51,0,70,1,70,59,65,49,63,74,0,55,128,55,2,55,66,144,
20,1,20,15,63,1,8,63,0,47,94,93,204,93,205,220,93,205,18,57,57,1,47,205,114,
220,93,204,93,205,114,18,57,57,49,48,1,46,1,39,46,1,39,46,1,53,52,55,62,1,
51,50,22,23,30,1,51,50,54,55,54,51,50,21,20,7,14,1,21,20,22,23,30,1,21,20,
6,7,6,35,34,39,46,1,39,7,22,21,20,7,6,35,34,39,38,53,52,55,54,51,50,23,7,
34,7,6,21,20,23,22,51,50,55,54,53,52,39,38,3,255,17,54,37,28,40,14,5,3,6,
3,6,5,5,15,13,32,63,32,46,64,19,36,13,16,6,9,7,4,8,2,2,2,2,9,5,21,20,22,31,
11,237,84,86,87,118,118,87,84,84,85,122,71,83,154,90,62,61,61,64,88,89,60,
62,62,60,4,0,5,18,14,11,24,14,3,10,5,8,9,2,2,2,2,8,9,7,6,12,14,9,18,34,79,
45,31,64,34,11,16,5,5,7,3,6,39,42,82,42,238,81,109,125,86,88,84,84,117,117,
87,86,43,32,62,61,88,91,61,61,61,62,90,87,62,62,0,0,1,0,59,0,0,4,5,4,207,
0,47,0,40,64,25,38,32,10,48,10,96,10,112,10,4,10,14,34,64,8,11,72,34,23,79,
0,95,0,2,0,0,47,93,47,47,43,51,1,47,93,47,49,48,1,30,1,23,30,1,23,22,23,22,
21,20,7,6,35,34,39,22,23,30,1,31,1,33,55,50,55,62,3,39,14,1,35,34,39,38,53,
52,55,62,1,55,62,1,55,54,2,32,14,40,26,28,95,69,141,35,37,63,66,88,157,99,
3,36,38,163,137,8,252,232,6,125,86,43,66,44,20,1,45,132,83,90,66,63,30,23,
78,57,69,110,38,56,4,207,54,95,44,43,105,63,126,66,67,70,95,63,66,191,147,
87,86,99,9,37,37,49,25,69,91,119,75,96,95,66,63,91,74,59,42,85,47,59,113,
57,83,0,0,0,0,1,0,60,0,0,5,4,4,199,0,75,0,47,64,24,57,77,63,23,1,23,52,61,
67,13,47,30,4,18,31,18,1,27,18,27,18,1,41,1,0,47,47,18,57,57,47,47,93,18,
23,57,50,51,1,47,93,16,206,49,48,41,1,55,62,1,55,62,1,55,54,53,52,38,53,6,
7,14,1,35,34,38,39,38,53,52,55,54,51,50,22,23,46,1,39,46,1,53,52,55,62,1,
51,50,23,22,21,20,7,54,55,62,1,51,50,22,23,22,21,20,7,6,35,34,38,39,46,1,
39,30,1,23,30,1,23,22,23,4,70,252,182,8,84,108,27,41,64,26,52,2,58,90,43,
88,45,59,97,41,79,73,73,93,31,80,51,20,27,8,5,6,78,40,97,60,116,80,80,69,
84,16,14,30,17,51,86,36,73,80,80,112,62,132,50,17,43,26,3,23,23,22,67,46,
61,159,35,17,33,17,25,75,50,100,109,8,22,17,121,59,28,30,42,38,83,116,115,
79,80,25,26,34,52,19,17,38,20,115,78,38,40,80,78,109,86,98,40,3,5,3,37,41,
76,116,118,83,80,60,51,19,61,45,81,125,46,45,76,31,39,30,0,1,0,102,255,233,
4,90,4,121,0,39,0,38,64,23,18,2,1,4,2,1,8,29,41,16,12,64,12,80,12,112,12,
128,12,5,12,16,0,0,47,47,1,47,93,16,206,49,48,94,93,93,5,46,1,39,46,1,39,
46,1,39,46,1,53,52,55,54,51,50,23,30,1,23,62,1,51,50,22,23,22,21,20,7,14,
1,7,14,1,7,14,1,2,98,14,42,26,28,103,76,56,69,14,43,37,68,70,102,98,78,28,
47,17,34,142,88,50,85,35,70,41,20,78,60,75,108,32,31,44,23,56,101,48,50,147,
102,76,93,22,65,106,56,103,71,70,72,28,80,54,119,117,36,34,70,94,86,88,45,
119,75,96,152,55,54,110,0,0,0,0,1,0,66,255,231,3,210,4,199,0,26,0,18,183,
48,12,1,12,75,21,1,21,0,25,47,93,1,47,93,49,48,1,30,1,23,30,1,23,14,1,7,14,
1,7,46,1,39,46,1,39,46,1,39,62,1,55,62,1,2,7,45,113,69,69,116,47,39,120,83,
69,106,40,13,35,22,38,98,60,14,94,81,50,128,80,59,96,4,199,78,165,93,93,141,
53,40,150,111,93,159,72,25,58,32,57,135,80,20,119,99,59,160,107,77,148,0,
0,1,0,196,0,29,3,59,4,129,0,33,0,48,64,25,2,19,33,13,64,79,6,95,6,111,6,3,
6,128,27,33,18,10,10,47,0,1,0,31,24,0,47,205,204,93,57,47,57,1,47,205,26,
220,93,26,205,16,205,50,49,48,1,51,21,23,30,1,21,20,6,7,35,62,1,53,52,38,
39,38,39,17,20,6,7,6,35,34,38,53,52,55,54,51,50,23,1,233,76,153,51,58,48,
46,47,29,28,28,29,57,64,37,37,72,108,57,58,60,63,80,44,46,4,129,100,193,69,
163,85,78,134,59,65,124,59,60,99,40,81,9,254,6,63,98,38,75,54,46,73,60,60,
19,0,2,1,16,255,213,4,239,4,135,0,34,0,38,0,108,64,61,35,32,64,18,26,128,
36,15,64,111,0,1,0,128,15,9,1,9,9,0,26,1,26,17,35,86,35,1,67,35,1,35,16,36,
54,36,1,37,36,1,20,36,1,3,36,1,8,36,34,38,33,88,33,1,33,37,34,30,23,13,6,
0,47,205,47,205,47,51,51,93,17,51,17,51,94,93,93,93,93,17,51,51,93,93,17,
51,1,47,93,51,47,93,26,221,93,26,205,50,26,16,221,26,205,51,49,48,1,20,6,
7,14,1,35,34,38,53,52,55,54,51,50,23,17,5,17,20,6,7,6,35,34,38,53,52,55,54,
51,50,23,17,37,1,37,53,5,4,239,36,38,37,88,51,57,57,57,62,81,48,42,253,218,
37,35,74,106,57,58,59,60,84,45,45,2,186,253,144,2,38,253,218,1,68,63,101,
35,37,39,54,47,76,57,59,18,1,192,149,254,118,62,98,38,74,53,45,76,57,60,19,
2,240,178,254,103,149,117,152,0,0,0,3,0,29,0,0,3,118,5,204,0,27,0,31,0,35,
0,100,179,67,10,1,10,184,255,224,64,59,8,12,72,31,35,70,28,47,32,143,32,207,
32,3,31,32,79,32,111,32,143,32,4,32,79,16,95,16,2,16,16,1,70,144,2,1,111,
2,1,2,34,15,31,83,30,0,19,80,12,0,0,4,80,25,5,15,32,1,21,0,63,51,63,51,237,
50,63,237,63,237,63,1,47,93,93,237,50,47,93,47,93,113,51,237,50,49,48,0,43,
93,1,17,35,17,35,53,51,53,52,62,2,51,50,22,23,21,46,1,35,34,14,2,29,1,51,
21,19,53,51,21,3,17,51,17,1,105,180,152,152,22,59,102,81,32,69,26,17,45,18,
40,51,29,11,211,134,180,180,180,3,183,252,73,3,183,131,122,59,101,75,43,6,
6,137,3,5,22,41,60,39,97,131,1,105,172,172,250,224,4,58,251,198,0,0,0,0,2,
0,29,0,0,3,119,5,204,0,27,0,31,0,90,179,67,10,1,10,184,255,224,64,53,8,12,
72,31,70,47,28,143,28,207,28,3,31,28,79,28,111,28,143,28,4,28,79,16,95,16,
2,16,16,1,70,144,2,1,111,2,1,2,30,0,19,80,12,0,0,4,80,25,5,15,28,1,21,0,63,
51,63,51,237,50,63,237,63,1,47,93,93,237,50,47,93,47,93,113,237,49,48,0,43,
93,1,17,35,17,35,53,51,53,52,62,2,51,50,22,23,21,46,1,35,34,14,2,29,1,51,
21,19,17,51,17,1,105,180,152,152,22,59,102,81,32,69,26,17,45,18,40,51,29,
11,211,135,180,3,183,252,73,3,183,131,122,59,101,75,43,6,6,137,3,5,22,41,
60,39,97,131,252,73,5,204,250,52,0,0,1,0,119,254,78,1,227,255,170,0,28,0,
75,185,0,2,255,232,179,9,17,72,27,184,255,224,64,40,9,17,72,22,22,8,16,131,
15,0,1,95,0,1,0,8,19,140,63,23,79,23,2,23,11,140,0,5,16,5,32,5,80,5,96,5,
112,5,6,5,0,47,93,237,47,93,237,1,47,221,93,113,237,18,57,47,49,48,43,43,
5,20,14,2,35,34,38,39,53,22,51,50,62,2,53,52,38,35,42,1,7,55,51,50,30,2,1,
227,30,65,104,75,20,45,25,49,37,41,56,35,15,61,72,14,29,14,31,62,52,84,60,
32,253,41,67,48,25,1,3,98,6,12,21,30,18,37,40,2,96,18,41,63,0,0,0,255,255,
0,243,1,190,1,182,2,154,17,6,0,119,56,0,0,18,64,11,0,127,0,1,111,0,1,95,0,
1,0,17,93,93,93,53,0,1,0,127,254,78,1,72,255,158,0,10,0,75,185,0,5,255,192,
179,9,17,72,2,184,255,192,64,28,9,17,72,7,151,0,150,4,9,8,146,16,3,32,3,2,
0,3,96,3,160,3,176,3,192,3,5,3,184,255,192,64,10,30,33,72,3,0,9,16,9,2,9,
0,47,93,204,43,93,113,237,1,47,51,253,237,49,48,43,43,5,20,6,7,35,62,1,53,
35,53,51,1,72,44,40,117,45,49,88,195,193,87,107,47,48,86,46,156,0,0,0,0,2,
0,14,2,51,2,150,5,129,0,10,0,23,0,108,64,74,86,10,1,86,9,1,121,6,137,6,2,
17,175,5,191,5,2,5,64,29,60,72,5,64,24,27,72,5,8,1,224,18,6,16,2,1,48,2,1,
64,2,144,2,2,2,0,4,229,8,5,95,17,111,17,127,17,3,15,17,31,17,127,17,143,17,
4,17,17,1,11,6,220,1,223,0,63,63,51,18,57,47,93,113,51,51,237,50,1,47,93,
113,114,51,51,237,50,47,43,43,93,51,49,48,93,114,114,1,21,35,53,33,53,1,51,
17,51,21,3,14,3,7,3,33,17,60,2,54,2,39,131,254,106,1,130,151,111,240,7,22,
24,22,7,199,1,23,1,2,229,178,178,111,2,45,253,213,113,2,23,13,37,39,35,11,
254,225,1,33,14,38,38,34,0,0,0,0,1,0,53,2,40,2,124,5,129,0,38,0,134,64,37,
37,36,53,36,69,36,3,3,24,9,13,72,19,34,1,4,34,1,3,31,30,25,224,139,27,1,6,
27,10,192,26,208,26,224,26,3,26,184,255,192,64,53,16,19,72,26,29,0,225,32,
19,96,19,2,32,19,96,19,160,19,224,19,4,19,22,228,34,34,16,30,229,27,220,68,
11,84,11,100,11,3,53,11,1,6,11,22,11,38,11,3,11,16,228,5,221,0,63,237,50,
93,93,93,63,237,18,57,47,237,1,47,93,113,237,50,47,43,93,51,51,95,113,237,
50,50,0,95,93,93,49,48,43,93,1,20,14,2,35,34,46,2,39,55,30,3,51,50,54,53,
52,38,35,34,6,7,35,19,33,21,33,7,62,1,51,50,30,2,2,124,38,73,108,70,66,101,
74,44,9,133,5,24,39,54,36,71,86,81,75,51,77,23,129,33,1,250,254,114,19,29,
91,54,67,103,69,36,3,67,65,104,74,40,33,59,81,48,15,27,47,36,21,85,93,81,
85,37,23,1,212,113,245,26,33,39,71,102,0,0,0,1,0,43,2,52,2,120,5,129,0,14,
0,54,64,33,5,224,6,6,0,175,12,191,12,2,12,11,96,0,1,191,0,207,0,255,0,3,96,
0,1,0,0,12,229,13,220,5,223,0,63,63,237,50,1,47,93,93,113,51,47,93,17,57,
47,237,49,48,1,14,3,21,35,52,62,2,55,33,53,33,2,120,64,106,77,43,133,47,80,
107,60,254,52,2,77,5,28,97,176,176,187,108,102,188,179,175,88,113,0,3,0,45,
2,40,2,130,5,142,0,19,0,39,0,81,0,138,185,0,68,255,232,179,11,15,72,64,184,
255,232,64,82,11,15,72,47,24,9,13,72,43,24,9,13,72,5,15,21,15,2,76,55,71,
10,226,72,61,1,61,61,30,226,224,50,1,191,50,1,50,0,226,70,71,1,71,71,40,226,
32,20,96,20,2,32,20,96,20,160,20,224,20,4,20,76,56,25,228,15,15,35,26,5,1,
11,5,1,5,228,66,222,35,228,45,221,0,63,237,63,237,93,93,18,57,47,237,57,57,
1,47,93,113,237,50,47,113,237,47,93,93,237,51,47,113,237,18,57,57,0,93,49,
48,43,43,43,43,1,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,19,52,46,2,35,34,
14,2,21,20,30,2,51,50,62,2,55,20,14,2,35,34,46,2,53,52,62,2,55,53,46,3,53,
52,62,2,51,50,30,2,21,20,14,2,7,21,30,3,1,223,12,31,53,41,39,53,31,13,9,29,
54,45,48,54,27,7,21,13,35,61,49,45,59,36,15,15,36,61,46,46,61,34,14,142,35,
73,113,77,77,113,74,35,29,47,61,32,36,55,38,20,35,70,104,68,72,105,69,33,
20,38,56,36,36,63,46,26,4,169,28,48,34,19,19,34,48,28,23,47,39,25,25,39,48,
254,155,28,52,40,24,24,41,53,28,35,59,42,23,23,42,60,22,54,91,66,37,37,66,
90,54,46,72,52,32,5,3,8,37,52,64,35,45,79,59,34,35,60,79,44,35,63,52,37,7,
3,6,31,52,72,0,1,255,229,4,176,2,195,5,240,0,17,0,62,64,41,117,11,133,11,
2,117,7,133,7,2,12,73,15,13,191,13,239,13,3,13,6,73,64,5,12,5,128,9,142,15,
0,47,0,63,0,127,0,239,0,5,0,0,47,93,237,26,205,50,1,47,26,237,220,93,237,
49,48,0,93,93,1,34,46,2,39,51,30,1,51,50,54,55,51,14,3,1,84,111,141,81,32,
2,164,6,104,93,93,104,6,164,2,32,81,141,4,176,57,91,115,57,103,96,96,103,
57,115,91,57,0,1,0,124,4,28,1,69,5,129,0,10,0,36,64,21,7,151,0,150,4,9,8,
146,80,3,96,3,2,160,3,176,3,2,3,9,3,0,63,204,93,113,237,1,47,51,253,237,49,
48,1,20,6,7,35,62,1,53,35,53,51,1,69,44,40,117,45,49,88,195,5,23,87,117,47,
48,96,46,167,0,0,1,0,130,4,187,1,75,6,32,0,10,0,47,64,30,4,9,150,7,151,10,
7,146,95,3,111,3,2,175,3,191,3,2,3,80,10,1,15,10,63,10,127,10,3,10,0,47,93,
113,205,93,113,237,1,47,237,237,50,49,48,19,52,54,55,51,14,1,21,51,21,35,
130,44,40,117,45,49,88,195,5,37,87,117,47,48,96,46,167,0,0,0,0,1,0,106,5,
250,2,18,6,240,0,5,0,48,64,30,117,3,133,3,2,128,4,1,64,4,1,4,64,1,2,64,16,
20,72,2,128,95,0,1,0,64,9,12,72,0,0,47,43,93,26,205,43,1,47,26,205,93,93,
49,48,93,1,37,53,51,23,21,1,160,254,202,207,217,5,250,217,29,226,20,0,1,0,
72,5,250,1,240,6,240,0,5,0,52,64,34,122,2,138,2,2,64,3,128,3,2,3,64,79,0,
143,0,2,0,2,64,16,20,72,2,128,95,0,1,0,64,9,12,72,0,0,47,43,93,26,205,43,
1,47,93,26,205,93,49,48,93,19,53,55,51,21,5,72,217,207,254,202,5,250,20,226,
29,217,0,0,1,0,0,5,250,2,150,6,254,0,9,0,65,64,14,118,9,134,9,2,120,8,136,
8,2,128,0,1,0,184,255,192,64,25,11,15,72,0,6,4,142,64,8,64,16,19,72,8,128,
6,95,1,1,1,64,9,12,72,1,0,47,43,93,51,26,221,43,26,237,1,47,204,43,93,49,
48,93,93,1,21,35,39,35,7,35,53,55,51,2,150,105,219,2,232,104,234,204,6,14,
20,139,139,20,240,0,0,0,0,1,0,0,5,250,2,150,6,254,0,9,0,65,64,14,118,0,134,
0,2,120,1,136,1,2,128,8,1,8,184,255,192,64,25,11,15,72,8,64,2,7,3,64,16,19,
72,3,128,6,142,95,1,1,1,64,9,12,72,1,0,47,43,93,237,26,205,43,50,1,47,26,
204,43,93,49,48,93,93,1,35,39,53,51,23,51,55,51,21,1,182,204,234,104,232,
2,219,105,5,250,239,21,139,139,21,0,0,0,0,2,0,45,5,250,2,90,6,178,0,3,0,7,
0,35,64,19,3,133,0,7,133,4,1,5,145,0,95,4,1,4,64,9,12,72,4,0,47,43,93,51,
237,50,1,47,237,220,237,49,48,1,53,51,21,33,53,51,21,1,183,163,253,211,165,
5,250,184,184,184,184,0,0,1,255,233,5,250,2,182,7,6,0,27,0,68,181,89,2,105,
2,2,26,184,255,232,64,34,9,15,72,12,24,9,15,72,64,23,1,15,23,1,23,9,22,5,
143,64,14,128,19,143,8,95,0,1,0,64,9,12,72,0,0,47,43,93,50,237,26,221,26,
237,51,1,47,204,93,93,49,48,43,43,0,93,1,34,46,2,35,34,6,7,35,62,3,51,50,
30,2,51,50,54,55,51,14,3,1,236,42,84,78,71,31,55,54,9,91,5,20,45,74,59,44,
84,78,69,30,54,55,8,92,5,20,43,74,5,250,37,45,37,62,57,45,95,78,50,37,45,
37,63,56,44,95,78,51,0,0,0,0,2,0,32,5,250,3,15,6,241,0,5,0,11,0,88,64,60,
154,8,170,8,2,154,2,170,2,2,102,10,1,98,4,1,98,3,1,10,159,7,1,15,7,31,7,127,
7,223,7,4,7,7,4,64,0,64,9,31,72,0,8,2,64,16,20,72,2,128,6,95,0,1,0,64,9,12,
72,0,0,47,43,93,50,26,205,43,50,1,47,43,26,205,220,94,93,113,205,49,48,93,
93,93,93,93,19,53,55,51,21,5,51,53,55,51,21,5,32,197,207,254,202,253,197,
207,254,202,5,250,20,227,29,218,20,227,29,218,0,1,255,232,5,250,2,130,6,243,
0,17,0,55,64,32,4,11,1,4,7,1,17,15,19,1,100,13,64,5,12,5,64,16,20,72,5,128,
9,95,0,1,0,64,9,12,72,0,0,47,43,93,205,26,205,43,50,1,47,26,204,94,93,49,
48,0,94,93,93,1,34,46,2,39,51,30,1,51,50,54,55,51,14,3,1,52,74,116,84,50,
8,117,17,109,91,91,107,17,117,9,50,83,116,5,250,41,69,90,49,53,60,61,52,49,
90,69,41,0,0,0,0,0,0,1,0,0,21,86,0,1,3,140,12,0,0,9,9,72,0,3,0,36,255,143,
0,3,0,55,255,219,0,3,0,60,255,219,0,3,1,82,255,143,0,3,1,91,255,143,0,3,1,
94,255,143,0,3,1,101,255,143,0,3,1,109,255,219,0,3,1,110,255,219,0,3,1,116,
255,219,0,20,0,20,255,104,0,36,0,3,255,143,0,36,0,55,255,104,0,36,0,57,255,
104,0,36,0,58,255,180,0,36,0,60,255,104,0,36,0,89,255,219,0,36,0,90,255,219,
0,36,0,92,255,219,0,36,2,3,255,104,0,41,0,15,255,29,0,41,0,17,255,29,0,41,
0,36,255,143,0,47,0,3,255,180,0,47,0,55,255,104,0,47,0,57,255,104,0,47,0,
58,255,104,0,47,0,60,255,104,0,47,0,92,255,180,0,47,2,3,255,143,0,51,0,3,
255,219,0,51,0,15,254,248,0,51,0,17,254,248,0,51,0,36,255,104,0,53,0,55,255,
219,0,53,0,57,255,219,0,53,0,58,255,219,0,53,0,60,255,219,0,55,0,3,255,219,
0,55,0,15,255,29,0,55,0,16,255,143,0,55,0,17,255,29,0,55,0,29,255,29,0,55,
0,30,255,29,0,55,0,36,255,104,0,55,0,50,255,219,0,55,0,68,255,29,0,55,0,70,
255,29,0,55,0,72,255,29,0,55,0,76,255,180,0,55,0,82,255,29,0,55,0,85,255,
180,0,55,0,86,255,29,0,55,0,88,255,180,0,55,0,90,255,143,0,55,0,92,255,143,
0,57,0,15,255,68,0,57,0,16,255,143,0,57,0,17,255,68,0,57,0,29,255,180,0,57,
0,30,255,180,0,57,0,36,255,104,0,57,0,68,255,104,0,57,0,72,255,143,0,57,0,
76,255,219,0,57,0,82,255,143,0,57,0,85,255,180,0,57,0,88,255,180,0,57,0,92,
255,180,0,58,0,15,255,143,0,58,0,16,255,219,0,58,0,17,255,143,0,58,0,29,255,
219,0,58,0,30,255,219,0,58,0,36,255,180,0,58,0,68,255,180,0,58,0,72,255,219,
0,58,0,82,255,219,0,58,0,85,255,219,0,58,0,88,255,219,0,58,0,92,255,238,0,
60,0,3,255,219,0,60,0,15,254,248,0,60,0,16,255,68,0,60,0,17,254,248,0,60,
0,29,255,143,0,60,0,30,255,123,0,60,0,36,255,104,0,60,0,68,255,104,0,60,0,
72,255,68,0,60,0,76,255,180,0,60,0,82,255,68,0,60,0,83,255,104,0,60,0,84,
255,68,0,60,0,88,255,143,0,60,0,89,255,143,0,73,0,73,255,219,0,73,2,3,0,37,
0,85,0,15,255,143,0,85,0,17,255,143,0,85,2,3,0,76,0,89,0,15,255,104,0,89,
0,17,255,104,0,90,0,15,255,143,0,90,0,17,255,143,0,92,0,15,255,104,0,92,0,
17,255,104,1,82,1,98,255,213,1,82,1,105,255,213,1,82,1,109,255,104,1,82,1,
110,255,104,1,82,1,111,255,197,1,82,1,116,255,104,1,82,1,124,255,219,1,82,
1,134,255,219,1,82,1,144,255,219,1,87,1,110,255,190,1,88,1,90,0,170,1,88,
1,91,255,104,1,88,1,94,255,104,1,88,1,98,255,141,1,88,1,101,255,104,1,88,
1,105,255,141,1,88,1,111,255,141,1,88,1,114,255,158,1,88,1,119,255,104,1,
88,1,120,255,180,1,88,1,122,255,70,1,88,1,128,255,104,1,88,1,130,255,180,
1,88,1,131,255,104,1,88,1,133,255,104,1,88,1,136,255,70,1,88,1,140,255,70,
1,88,1,143,255,70,1,88,1,147,0,98,1,88,1,149,255,70,1,89,1,110,255,209,1,
89,1,116,255,209,1,91,0,3,255,143,1,91,1,98,255,213,1,91,1,105,255,213,1,
91,1,109,255,104,1,91,1,110,255,104,1,91,1,111,255,197,1,91,1,116,255,104,
1,91,1,124,255,219,1,91,1,134,255,219,1,91,1,144,255,219,1,91,2,3,255,104,
1,93,0,15,255,31,1,93,0,17,255,31,1,93,1,90,0,164,1,93,1,91,255,68,1,93,1,
94,255,68,1,93,1,101,255,68,1,93,1,130,255,168,1,93,1,147,0,88,1,94,0,3,255,
143,1,94,1,98,255,213,1,94,1,105,255,213,1,94,1,109,255,137,1,94,1,110,255,
104,1,94,1,116,255,104,1,98,1,91,255,219,1,98,1,94,255,219,1,98,1,101,255,
219,1,98,1,110,255,190,1,98,1,116,255,190,1,100,1,98,255,193,1,100,1,105,
255,193,1,100,1,111,255,143,1,100,1,117,255,231,1,100,1,122,255,231,1,100,
1,125,255,231,1,100,1,127,255,231,1,100,1,129,255,231,1,100,1,135,255,231,
1,100,1,136,255,231,1,100,1,140,255,231,1,100,1,143,255,231,1,100,1,146,255,
231,1,100,1,149,255,231,1,100,1,151,255,231,1,101,0,3,255,143,1,101,1,98,
255,213,1,101,1,105,255,213,1,101,1,109,255,104,1,101,1,110,255,104,1,101,
1,116,255,104,1,105,1,91,255,219,1,105,1,94,255,213,1,105,1,101,255,219,1,
105,1,110,255,190,1,105,1,116,255,190,1,107,0,3,255,219,1,107,0,15,254,250,
1,107,0,17,254,250,1,107,1,91,255,104,1,107,1,94,255,104,1,107,1,101,255,
104,1,108,1,137,255,158,1,108,1,141,255,158,1,109,0,3,255,219,1,109,0,15,
255,31,1,109,0,17,255,31,1,109,0,29,255,31,1,109,0,30,255,31,1,109,1,90,0,
188,1,109,1,91,255,104,1,109,1,94,255,104,1,109,1,98,255,219,1,109,1,101,
255,104,1,109,1,105,255,219,1,109,1,111,255,219,1,109,1,114,255,219,1,109,
1,117,255,31,1,109,1,118,255,31,1,109,1,121,255,78,1,109,1,122,255,31,1,109,
1,124,255,78,1,109,1,126,255,31,1,109,1,128,255,106,1,109,1,130,255,180,1,
109,1,133,255,106,1,109,1,134,255,143,1,109,1,136,255,31,1,109,1,140,255,
31,1,109,1,142,255,80,1,109,1,143,255,31,1,109,1,144,255,143,1,109,1,145,
255,106,1,109,1,147,0,188,1,109,1,148,255,78,1,109,1,149,255,31,1,109,1,150,
255,78,1,110,0,3,255,219,1,110,0,15,254,250,1,110,0,16,255,70,1,110,0,17,
254,250,1,110,0,29,255,143,1,110,0,30,255,143,1,110,1,90,0,188,1,110,1,91,
255,104,1,110,1,94,255,104,1,110,1,98,255,141,1,110,1,101,255,104,1,110,1,
105,255,141,1,110,1,111,255,141,1,110,1,114,255,158,1,110,1,119,255,104,1,
110,1,120,255,180,1,110,1,122,255,70,1,110,1,124,255,158,1,110,1,128,255,
104,1,110,1,130,255,180,1,110,1,131,255,104,1,110,1,133,255,104,1,110,1,136,
255,70,1,110,1,140,255,70,1,110,1,143,255,70,1,110,1,147,0,121,1,110,1,149,
255,70,1,111,1,91,255,197,1,111,1,110,255,190,1,111,1,116,255,190,1,113,1,
117,255,178,1,113,1,122,255,178,1,113,1,125,255,178,1,113,1,129,255,217,1,
113,1,136,255,178,1,113,1,140,255,178,1,113,1,143,255,178,1,113,1,146,255,
178,1,113,1,149,255,178,1,113,1,151,255,178,1,114,1,110,255,209,1,114,1,116,
255,209,1,116,0,3,255,219,1,116,1,90,0,170,1,116,1,91,255,104,1,116,1,94,
255,104,1,116,1,98,255,141,1,116,1,101,255,104,1,116,1,105,255,141,1,116,
1,111,255,141,1,116,1,114,255,158,1,116,1,119,255,104,1,116,1,120,255,180,
1,116,1,122,255,70,1,116,1,128,255,104,1,116,1,130,255,180,1,116,1,131,255,
104,1,116,1,133,255,104,1,116,1,136,255,70,1,116,1,140,255,70,1,116,1,143,
255,70,1,116,1,147,0,98,1,116,1,149,255,70,1,125,1,132,255,217,1,125,1,137,
255,227,1,125,1,141,255,227,1,125,1,144,255,201,1,127,1,117,255,119,1,127,
1,119,255,219,1,127,1,122,255,119,1,127,1,124,255,170,1,127,1,125,255,180,
1,127,1,128,255,219,1,127,1,129,255,158,1,127,1,130,255,219,1,127,1,131,255,
219,1,127,1,134,255,170,1,127,1,136,255,119,1,127,1,137,255,170,1,127,1,140,
255,119,1,127,1,141,255,170,1,127,1,143,255,119,1,127,1,146,255,119,1,127,
1,149,255,119,1,127,1,151,255,119,1,129,1,132,255,217,1,131,1,117,255,231,
1,131,1,122,255,231,1,131,1,125,255,231,1,131,1,127,255,231,1,131,1,129,255,
231,1,131,1,135,255,231,1,131,1,136,255,231,1,131,1,139,255,231,1,131,1,140,
255,231,1,131,1,143,255,231,1,131,1,146,255,231,1,131,1,149,255,231,1,131,
1,151,255,231,1,132,1,117,255,225,1,132,1,122,255,225,1,132,1,125,255,225,
1,132,1,135,255,225,1,132,1,136,255,225,1,132,1,139,255,209,1,132,1,140,255,
225,1,132,1,142,255,207,1,132,1,143,255,219,1,132,1,146,255,225,1,132,1,149,
255,225,1,132,1,150,255,207,1,132,1,151,255,225,1,135,1,117,255,201,1,135,
1,122,255,201,1,135,1,125,255,201,1,135,1,127,255,201,1,135,1,135,255,201,
1,135,1,136,255,201,1,135,1,139,255,201,1,135,1,140,255,201,1,135,1,143,255,
201,1,135,1,149,255,201,1,136,1,132,255,217,1,136,1,137,255,227,1,136,1,141,
255,227,1,136,1,144,255,201,1,137,1,117,255,227,1,137,1,122,255,227,1,137,
1,127,255,227,1,137,1,136,255,227,1,137,1,139,255,227,1,137,1,140,255,227,
1,137,1,143,255,227,1,137,1,146,255,227,1,137,1,151,255,227,1,138,1,132,255,
217,1,138,1,137,255,227,1,138,1,141,255,227,1,141,1,117,255,227,1,141,1,122,
255,227,1,141,1,125,255,227,1,141,1,127,255,227,1,141,1,136,255,227,1,141,
1,139,255,227,1,141,1,140,255,227,1,141,1,143,255,227,1,141,1,146,255,227,
1,141,1,151,255,227,1,143,1,132,255,217,1,143,1,137,255,227,1,143,1,141,255,
227,1,143,1,144,255,201,1,144,1,117,255,201,1,144,1,122,255,201,1,144,1,125,
255,201,1,144,1,127,255,201,1,144,1,136,255,201,1,144,1,139,255,201,1,144,
1,140,255,201,1,144,1,143,255,201,1,144,1,146,255,201,1,144,1,149,255,201,
1,144,1,151,255,201,1,146,1,132,255,217,1,146,1,137,255,227,1,146,1,141,255,
227,1,146,1,144,255,201,1,149,1,132,255,217,1,149,1,137,255,227,1,149,1,141,
255,227,1,149,1,144,255,201,1,151,1,132,255,217,1,151,1,137,255,227,1,151,
1,141,255,227,1,151,1,144,255,201,1,154,0,15,255,6,1,154,0,17,255,6,1,154,
0,108,255,119,1,154,0,123,255,119,1,154,1,255,255,211,1,160,2,3,255,96,1,
161,2,3,255,119,1,166,1,170,0,68,1,166,1,173,255,233,1,166,1,177,0,45,1,166,
1,180,255,211,1,166,1,181,255,233,1,166,1,183,255,211,1,166,1,184,255,96,
1,166,1,185,255,166,1,166,1,186,255,188,1,166,1,189,255,96,1,166,1,195,255,
211,1,166,1,198,0,23,1,166,1,216,255,211,1,166,1,217,255,233,1,166,1,218,
0,23,1,166,1,227,0,45,1,166,2,3,255,141,1,167,1,166,255,211,1,167,1,173,255,
233,1,167,1,180,255,233,1,167,1,183,255,233,1,167,1,184,255,164,1,167,1,185,
255,209,1,167,1,186,255,233,1,167,1,187,255,211,1,167,1,189,255,164,1,167,
1,192,255,188,1,167,1,195,255,233,1,167,1,197,255,233,1,167,1,209,255,233,
1,167,1,217,255,211,1,168,1,166,255,188,1,168,1,170,255,211,1,168,1,172,255,
211,1,168,1,173,255,188,1,168,1,177,255,233,1,168,1,180,255,188,1,168,1,183,
255,188,1,168,1,184,255,119,1,168,1,185,255,188,1,168,1,186,255,188,1,168,
1,187,255,166,1,168,1,189,255,164,1,168,1,192,255,141,1,168,1,197,255,188,
1,168,1,202,255,233,1,168,1,210,255,233,1,168,1,216,255,188,1,168,1,217,255,
233,1,168,1,219,255,233,1,168,1,221,255,188,1,168,1,229,255,233,1,169,0,15,
255,6,1,169,0,17,255,6,1,169,0,108,255,119,1,169,0,123,255,119,1,169,1,166,
255,119,1,169,1,170,255,119,1,169,1,173,255,211,1,169,1,177,255,141,1,169,
1,178,255,209,1,169,1,180,255,141,1,169,1,183,255,164,1,169,1,197,255,188,
1,169,1,198,255,141,1,169,1,200,255,141,1,169,1,202,255,119,1,169,1,203,255,
119,1,169,1,206,255,141,1,169,1,209,255,141,1,169,1,210,255,141,1,169,1,211,
255,141,1,169,1,212,255,119,1,169,1,214,255,141,1,169,1,217,255,119,1,169,
1,225,255,141,1,169,1,226,255,141,1,169,1,228,255,141,1,169,1,229,255,119,
1,169,1,255,255,211,1,170,1,185,0,23,1,170,1,186,255,211,1,170,1,189,255,
186,1,170,1,205,0,68,1,170,1,212,0,23,1,170,1,217,0,45,1,171,1,173,255,211,
1,171,1,215,255,233,1,172,1,173,255,233,1,172,1,180,255,211,1,172,1,183,255,
233,1,172,1,184,0,23,1,172,1,185,0,45,1,172,1,192,0,45,1,172,1,198,0,23,1,
172,1,203,255,231,1,172,1,212,255,233,1,172,1,217,255,233,1,173,1,177,255,
233,1,173,1,180,255,233,1,173,1,183,255,233,1,173,1,184,255,211,1,173,1,185,
255,233,1,173,1,186,255,233,1,173,1,189,255,211,1,173,1,197,255,233,1,176,
1,173,255,233,1,176,1,180,255,233,1,176,1,183,255,233,1,176,1,185,0,23,1,
176,1,186,255,186,1,177,1,186,255,233,1,177,1,199,0,23,1,177,1,217,0,23,1,
178,1,186,255,233,1,178,1,189,255,233,1,178,1,198,0,23,1,178,1,203,0,23,1,
178,1,212,0,23,1,178,1,215,0,23,1,178,1,217,0,23,1,178,1,221,255,233,1,178,
1,227,0,23,1,180,1,166,255,211,1,180,1,170,255,211,1,180,1,172,255,211,1,
180,1,177,255,233,1,180,1,185,255,211,1,180,1,187,255,164,1,180,1,189,255,
211,1,180,1,197,255,211,1,180,1,202,255,211,1,180,1,209,255,233,1,180,1,219,
255,233,1,182,0,15,254,125,1,182,0,17,254,125,1,182,0,29,255,211,1,182,0,
30,255,211,1,182,0,123,255,141,1,182,1,166,255,119,1,182,1,170,255,119,1,
182,1,172,255,233,1,182,1,173,255,211,1,182,1,177,255,141,1,182,1,178,255,
233,1,182,1,180,255,211,1,182,1,183,255,233,1,182,1,184,255,164,1,182,1,185,
255,211,1,182,1,186,255,233,1,182,1,187,255,164,1,182,1,197,255,211,1,182,
1,198,255,188,1,182,1,202,255,96,1,182,1,203,255,166,1,182,1,212,255,166,
1,182,1,227,255,211,1,182,1,229,255,188,1,183,1,166,255,211,1,183,1,170,255,
211,1,183,1,173,255,233,1,183,1,177,255,188,1,183,1,178,255,233,1,183,1,180,
255,211,1,183,1,184,255,188,1,183,1,185,255,188,1,183,1,187,255,141,1,183,
1,189,255,188,1,183,1,192,255,186,1,183,1,195,255,233,1,183,1,198,0,23,1,
183,1,204,0,45,1,183,1,221,255,233,1,184,0,15,255,29,1,184,0,17,255,29,1,
184,0,108,255,166,1,184,0,123,255,166,1,184,1,166,255,188,1,184,1,170,255,
188,1,184,1,172,0,23,1,184,1,173,255,233,1,184,1,177,255,211,1,184,1,180,
255,164,1,184,1,186,255,188,1,184,1,197,255,211,1,184,1,198,255,164,1,184,
1,200,255,166,1,184,1,203,255,141,1,184,1,206,255,166,1,184,1,208,255,166,
1,184,1,209,255,164,1,184,1,210,255,166,1,184,1,212,255,96,1,184,1,213,255,
166,1,184,1,214,255,141,1,184,1,215,255,141,1,184,1,217,255,141,1,184,1,219,
255,166,1,184,1,223,255,166,1,184,1,225,255,166,1,184,1,226,255,166,1,184,
1,228,255,166,1,184,1,229,255,141,1,184,1,255,255,211,1,185,0,15,254,240,
1,185,0,17,254,240,1,185,0,29,255,211,1,185,0,30,255,211,1,185,0,108,255,
166,1,185,0,123,255,164,1,185,1,166,255,119,1,185,1,170,255,164,1,185,1,173,
255,211,1,185,1,177,255,188,1,185,1,180,255,188,1,185,1,186,255,188,1,185,
1,195,255,211,1,185,1,197,255,211,1,185,1,199,255,211,1,185,1,200,255,141,
1,185,1,201,255,164,1,185,1,202,255,96,1,185,1,203,255,119,1,185,1,204,255,
188,1,185,1,205,255,141,1,185,1,206,255,164,1,185,1,207,255,188,1,185,1,208,
255,164,1,185,1,209,255,119,1,185,1,210,255,164,1,185,1,211,255,164,1,185,
1,212,255,119,1,185,1,213,255,164,1,185,1,214,255,164,1,185,1,215,255,119,
1,185,1,219,255,164,1,185,1,220,255,164,1,185,1,222,255,164,1,185,1,223,255,
164,1,185,1,228,255,164,1,185,1,229,255,119,1,185,1,255,255,233,1,186,1,166,
255,211,1,186,1,170,255,188,1,186,1,177,255,188,1,186,1,184,255,141,1,186,
1,185,255,164,1,186,1,189,255,211,1,186,1,197,255,186,1,186,1,209,255,188,
1,187,1,173,255,211,1,187,1,180,255,188,1,187,1,183,255,188,1,187,1,186,255,
188,1,187,1,195,255,186,1,187,1,212,255,233,1,187,1,217,255,211,1,188,1,180,
255,211,1,188,1,198,0,45,1,191,1,198,0,23,1,191,1,217,0,45,1,192,1,197,255,
188,1,192,2,3,255,119,1,194,1,166,255,211,1,194,1,170,255,211,1,194,1,172,
255,188,1,194,1,173,255,233,1,194,1,177,255,186,1,194,1,178,255,211,1,194,
1,180,255,211,1,194,1,183,255,211,1,194,1,184,255,51,1,194,1,187,255,164,
1,194,1,189,255,96,1,194,1,195,255,233,1,194,1,197,255,164,1,194,2,3,255,
96,1,195,1,170,255,188,1,195,1,172,255,231,1,195,1,173,255,233,1,195,1,177,
255,188,1,195,1,187,255,186,1,195,1,197,255,211,1,195,1,202,255,188,1,195,
1,204,0,23,1,195,1,209,255,188,1,195,1,210,255,233,1,195,1,229,255,233,1,
196,1,166,255,188,1,196,1,170,255,166,1,196,1,172,255,211,1,196,1,177,255,
164,1,196,1,180,255,233,1,196,1,183,255,233,1,196,1,184,255,141,1,196,1,187,
255,164,1,196,1,189,255,188,1,196,1,202,255,164,1,196,1,209,255,164,1,196,
1,210,255,233,1,198,1,205,255,233,1,198,1,216,255,211,1,198,1,217,255,233,
1,198,1,221,255,211,1,199,1,198,255,209,1,199,1,202,255,164,1,199,1,203,255,
233,1,199,1,204,255,233,1,199,1,205,255,211,1,199,1,209,255,164,1,199,1,210,
255,211,1,199,1,215,255,233,1,199,1,217,255,211,1,199,1,218,255,233,1,199,
1,219,255,188,1,199,1,221,255,188,1,199,1,224,255,188,1,199,1,227,255,233,
1,199,1,229,255,211,1,200,1,198,255,233,1,200,1,199,255,233,1,200,1,202,255,
233,1,200,1,203,255,233,1,200,1,204,255,233,1,200,1,205,255,233,1,200,1,209,
255,209,1,200,1,210,255,233,1,200,1,212,255,233,1,200,1,215,255,233,1,200,
1,216,255,211,1,200,1,217,255,211,1,200,1,218,255,233,1,200,1,221,255,164,
1,200,1,224,255,188,1,200,1,229,255,233,1,201,0,15,255,6,1,201,0,17,255,6,
1,201,1,198,255,211,1,201,1,202,255,164,1,201,1,203,255,211,1,201,1,205,255,
233,1,201,1,209,255,211,1,201,1,212,255,211,1,201,1,215,255,211,1,201,1,229,
255,233,1,202,1,224,255,211,1,202,1,227,0,23,1,203,1,199,255,233,1,203,1,
202,255,211,1,203,1,204,255,233,1,203,1,205,255,211,1,203,1,209,255,188,1,
203,1,216,255,188,1,203,1,217,255,233,1,203,1,219,255,211,1,203,1,221,255,
188,1,204,1,199,0,23,1,204,1,217,0,23,1,204,1,221,255,233,1,204,1,224,0,45,
1,205,1,199,255,233,1,205,1,202,255,211,1,205,1,203,255,233,1,205,1,205,255,
233,1,205,1,209,255,233,1,205,1,212,255,233,1,205,1,215,255,233,1,205,1,217,
255,233,1,205,1,218,255,233,1,205,1,221,255,188,1,205,1,224,255,211,1,208,
1,198,0,45,1,208,1,199,0,45,1,208,1,203,0,23,1,208,1,205,0,23,1,208,1,209,
0,23,1,208,1,212,0,23,1,208,1,215,0,23,1,208,1,216,0,23,1,208,1,217,0,23,
1,208,1,227,0,23,1,209,1,212,0,23,1,209,1,221,255,211,1,210,1,199,255,233,
1,210,1,205,255,233,1,210,1,217,0,23,1,212,1,202,255,211,1,212,1,204,255,
233,1,212,1,205,255,233,1,212,1,209,255,211,1,212,1,216,255,211,1,212,1,217,
255,233,1,212,1,219,255,233,1,212,1,221,255,211,1,214,1,202,255,209,1,214,
1,205,255,233,1,214,1,209,255,186,1,214,1,216,255,211,1,214,1,217,255,233,
1,214,1,219,255,233,1,214,1,221,255,211,1,214,1,229,255,233,1,215,1,204,0,
23,1,215,1,212,0,23,1,215,1,221,255,233,1,215,1,227,0,23,1,216,0,15,255,29,
1,216,0,17,255,29,1,216,1,198,255,233,1,216,1,202,255,188,1,216,1,203,255,
233,1,216,1,204,0,68,1,216,1,209,255,211,1,216,1,212,255,233,1,216,1,215,
255,233,1,216,1,217,0,23,1,217,0,15,255,51,1,217,0,17,255,51,1,217,0,123,
0,23,1,217,1,198,255,233,1,217,1,199,0,23,1,217,1,202,255,188,1,217,1,203,
255,233,1,217,1,204,0,23,1,217,1,209,255,211,1,217,1,210,255,233,1,217,1,
212,255,231,1,217,1,214,255,233,1,217,1,215,255,233,1,217,1,218,255,233,1,
217,1,227,255,233,1,217,1,229,255,233,1,218,1,199,255,233,1,218,1,202,255,
211,1,218,1,209,255,211,1,218,1,216,255,211,1,218,1,217,255,233,1,218,1,221,
255,211,1,218,1,229,255,233,1,219,1,198,255,233,1,219,1,199,255,233,1,219,
1,203,255,233,1,219,1,205,255,233,1,219,1,212,255,233,1,219,1,215,255,233,
1,219,1,216,255,233,1,219,1,218,255,233,1,219,1,221,255,211,1,220,1,203,255,
233,1,220,1,205,255,233,1,220,1,212,255,233,1,220,1,215,255,233,1,223,1,203,
255,233,1,223,1,212,255,233,1,223,1,217,0,23,1,226,1,216,255,96,1,226,1,221,
255,119,1,227,1,202,255,211,1,227,1,203,0,23,1,227,1,205,255,233,1,227,1,
209,255,211,1,227,1,212,0,23,1,227,1,216,255,211,1,227,1,219,255,233,1,227,
1,229,255,233,1,228,1,202,255,211,1,228,1,204,255,233,1,228,1,209,255,211,
1,228,1,210,255,233,1,228,1,216,255,211,1,228,1,219,255,233,1,228,1,221,255,
211,1,242,0,15,255,51,1,242,0,17,255,51,1,244,0,15,255,6,1,244,0,17,255,6,
1,244,0,29,255,211,1,244,0,30,255,211,1,244,0,108,255,96,1,244,0,123,255,
96,1,244,1,255,255,211,2,2,2,2,255,219,2,3,0,3,255,180,2,3,0,86,255,219,2,
3,2,3,255,219,2,8,1,153,255,96,2,8,1,162,255,96,2,8,1,184,255,96,2,8,1,189,
255,188,2,8,1,192,255,188,0,0,0,0,0,28,1,86,0,1,0,0,0,0,0,0,0,64,0,130,0,
1,0,0,0,0,0,1,0,15,0,227,0,1,0,0,0,0,0,2,0,7,1,3,0,1,0,0,0,0,0,3,0,26,1,65,
0,1,0,0,0,0,0,4,0,15,1,124,0,1,0,0,0,0,0,5,0,12,1,166,0,1,0,0,0,0,0,6,0,14,
1,209,0,1,0,0,0,0,0,7,0,122,2,214,0,1,0,0,0,0,0,8,0,20,3,123,0,1,0,0,0,0,
0,9,0,14,3,174,0,1,0,0,0,0,0,11,0,28,3,247,0,1,0,0,0,0,0,12,0,46,4,114,0,
1,0,0,0,0,0,13,0,127,5,161,0,1,0,0,0,0,0,14,0,43,6,121,0,3,0,1,4,9,0,0,0,
128,0,0,0,3,0,1,4,9,0,1,0,30,0,195,0,3,0,1,4,9,0,2,0,14,0,243,0,3,0,1,4,9,
0,3,0,52,1,11,0,3,0,1,4,9,0,4,0,30,1,92,0,3,0,1,4,9,0,5,0,24,1,140,0,3,0,
1,4,9,0,6,0,28,1,179,0,3,0,1,4,9,0,7,0,244,1,224,0,3,0,1,4,9,0,8,0,40,3,81,
0,3,0,1,4,9,0,9,0,28,3,144,0,3,0,1,4,9,0,11,0,56,3,189,0,3,0,1,4,9,0,12,0,
92,4,20,0,3,0,1,4,9,0,13,0,254,4,161,0,3,0,1,4,9,0,14,0,86,6,33,0,68,0,105,
0,103,0,105,0,116,0,105,0,122,0,101,0,100,0,32,0,100,0,97,0,116,0,97,0,32,
0,169,0,32,0,50,0,48,0,48,0,55,0,32,0,65,0,115,0,99,0,101,0,110,0,100,0,101,
0,114,0,32,0,67,0,111,0,114,0,112,0,111,0,114,0,97,0,116,0,105,0,111,0,110,
0,46,0,32,0,65,0,108,0,108,0,32,0,114,0,105,0,103,0,104,0,116,0,115,0,32,
0,114,0,101,0,115,0,101,0,114,0,118,0,101,0,100,0,46,0,0,68,105,103,105,116,
105,122,101,100,32,100,97,116,97,32,169,32,50,48,48,55,32,65,115,99,101,110,
100,101,114,32,67,111,114,112,111,114,97,116,105,111,110,46,32,65,108,108,
32,114,105,103,104,116,115,32,114,101,115,101,114,118,101,100,46,0,0,76,0,
105,0,98,0,101,0,114,0,97,0,116,0,105,0,111,0,110,0,32,0,83,0,97,0,110,0,
115,0,0,76,105,98,101,114,97,116,105,111,110,32,83,97,110,115,0,0,82,0,101,
0,103,0,117,0,108,0,97,0,114,0,0,82,101,103,117,108,97,114,0,0,65,0,115,0,
99,0,101,0,110,0,100,0,101,0,114,0,32,0,45,0,32,0,76,0,105,0,98,0,101,0,114,
0,97,0,116,0,105,0,111,0,110,0,32,0,83,0,97,0,110,0,115,0,0,65,115,99,101,
110,100,101,114,32,45,32,76,105,98,101,114,97,116,105,111,110,32,83,97,110,
115,0,0,76,0,105,0,98,0,101,0,114,0,97,0,116,0,105,0,111,0,110,0,32,0,83,
0,97,0,110,0,115,0,0,76,105,98,101,114,97,116,105,111,110,32,83,97,110,115,
0,0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,32,0,49,0,46,0,48,0,50,0,0,86,
101,114,115,105,111,110,32,49,46,48,50,0,0,76,0,105,0,98,0,101,0,114,0,97,
0,116,0,105,0,111,0,110,0,83,0,97,0,110,0,115,0,0,76,105,98,101,114,97,116,
105,111,110,83,97,110,115,0,0,76,0,105,0,98,0,101,0,114,0,97,0,116,0,105,
0,111,0,110,0,32,0,105,0,115,0,32,0,97,0,32,0,116,0,114,0,97,0,100,0,101,
0,109,0,97,0,114,0,107,0,32,0,111,0,102,0,32,0,82,0,101,0,100,0,32,0,72,0,
97,0,116,0,44,0,32,0,73,0,110,0,99,0,46,0,32,0,114,0,101,0,103,0,105,0,115,
0,116,0,101,0,114,0,101,0,100,0,32,0,105,0,110,0,32,0,85,0,46,0,83,0,46,0,
32,0,80,0,97,0,116,0,101,0,110,0,116,0,32,0,97,0,110,0,100,0,32,0,84,0,114,
0,97,0,100,0,101,0,109,0,97,0,114,0,107,0,32,0,79,0,102,0,102,0,105,0,99,
0,101,0,32,0,97,0,110,0,100,0,32,0,99,0,101,0,114,0,116,0,97,0,105,0,110,
0,32,0,111,0,116,0,104,0,101,0,114,0,32,0,106,0,117,0,114,0,105,0,115,0,100,
0,105,0,99,0,116,0,105,0,111,0,110,0,115,0,46,0,0,76,105,98,101,114,97,116,
105,111,110,32,105,115,32,97,32,116,114,97,100,101,109,97,114,107,32,111,
102,32,82,101,100,32,72,97,116,44,32,73,110,99,46,32,114,101,103,105,115,
116,101,114,101,100,32,105,110,32,85,46,83,46,32,80,97,116,101,110,116,32,
97,110,100,32,84,114,97,100,101,109,97,114,107,32,79,102,102,105,99,101,32,
97,110,100,32,99,101,114,116,97,105,110,32,111,116,104,101,114,32,106,117,
114,105,115,100,105,99,116,105,111,110,115,46,0,0,65,0,115,0,99,0,101,0,110,
0,100,0,101,0,114,0,32,0,67,0,111,0,114,0,112,0,111,0,114,0,97,0,116,0,105,
0,111,0,110,0,0,65,115,99,101,110,100,101,114,32,67,111,114,112,111,114,97,
116,105,111,110,0,0,83,0,116,0,101,0,118,0,101,0,32,0,77,0,97,0,116,0,116,
0,101,0,115,0,111,0,110,0,0,83,116,101,118,101,32,77,97,116,116,101,115,111,
110,0,0,104,0,116,0,116,0,112,0,58,0,47,0,47,0,119,0,119,0,119,0,46,0,97,
0,115,0,99,0,101,0,110,0,100,0,101,0,114,0,99,0,111,0,114,0,112,0,46,0,99,
0,111,0,109,0,47,0,0,104,116,116,112,58,47,47,119,119,119,46,97,115,99,101,
110,100,101,114,99,111,114,112,46,99,111,109,47,0,0,104,0,116,0,116,0,112,
0,58,0,47,0,47,0,119,0,119,0,119,0,46,0,97,0,115,0,99,0,101,0,110,0,100,0,
101,0,114,0,99,0,111,0,114,0,112,0,46,0,99,0,111,0,109,0,47,0,116,0,121,0,
112,0,101,0,100,0,101,0,115,0,105,0,103,0,110,0,101,0,114,0,115,0,46,0,104,
0,116,0,109,0,108,0,0,104,116,116,112,58,47,47,119,119,119,46,97,115,99,101,
110,100,101,114,99,111,114,112,46,99,111,109,47,116,121,112,101,100,101,115,
105,103,110,101,114,115,46,104,116,109,108,0,0,85,0,115,0,101,0,32,0,111,
0,102,0,32,0,116,0,104,0,105,0,115,0,32,0,76,0,105,0,98,0,101,0,114,0,97,
0,116,0,105,0,111,0,110,0,32,0,102,0,111,0,110,0,116,0,32,0,115,0,111,0,102,
0,116,0,119,0,97,0,114,0,101,0,32,0,105,0,115,0,32,0,115,0,117,0,98,0,106,
0,101,0,99,0,116,0,32,0,116,0,111,0,32,0,116,0,104,0,101,0,32,0,108,0,105,
0,99,0,101,0,110,0,115,0,101,0,32,0,97,0,103,0,114,0,101,0,101,0,109,0,101,
0,110,0,116,0,32,0,117,0,110,0,100,0,101,0,114,0,32,0,119,0,104,0,105,0,99,
0,104,0,32,0,121,0,111,0,117,0,32,0,97,0,99,0,99,0,101,0,112,0,116,0,101,
0,100,0,32,0,116,0,104,0,101,0,32,0,76,0,105,0,98,0,101,0,114,0,97,0,116,
0,105,0,111,0,110,0,32,0,102,0,111,0,110,0,116,0,32,0,115,0,111,0,102,0,116,
0,119,0,97,0,114,0,101,0,46,0,0,85,115,101,32,111,102,32,116,104,105,115,
32,76,105,98,101,114,97,116,105,111,110,32,102,111,110,116,32,115,111,102,
116,119,97,114,101,32,105,115,32,115,117,98,106,101,99,116,32,116,111,32,
116,104,101,32,108,105,99,101,110,115,101,32,97,103,114,101,101,109,101,110,
116,32,117,110,100,101,114,32,119,104,105,99,104,32,121,111,117,32,97,99,
99,101,112,116,101,100,32,116,104,101,32,76,105,98,101,114,97,116,105,111,
110,32,102,111,110,116,32,115,111,102,116,119,97,114,101,46,0,0,104,0,116,
0,116,0,112,0,58,0,47,0,47,0,119,0,119,0,119,0,46,0,97,0,115,0,99,0,101,0,
110,0,100,0,101,0,114,0,99,0,111,0,114,0,112,0,46,0,99,0,111,0,109,0,47,0,
108,0,105,0,98,0,101,0,114,0,97,0,116,0,105,0,111,0,110,0,46,0,104,0,116,
0,109,0,108,0,0,104,116,116,112,58,47,47,119,119,119,46,97,115,99,101,110,
100,101,114,99,111,114,112,46,99,111,109,47,108,105,98,101,114,97,116,105,
111,110,46,104,116,109,108,0,0,0,2,0,0,0,0,0,0,255,39,0,150,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,2,156,0,0,0,1,0,2,1,2,0,4,0,5,0,6,0,7,0,8,0,9,0,
10,0,11,0,12,0,13,0,14,0,15,1,3,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,
25,0,26,0,27,0,28,0,29,1,4,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,
40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,
0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,
0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,
0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,163,0,
132,0,133,0,189,0,150,0,232,0,134,0,142,0,139,0,157,0,169,0,164,0,138,0,218,
0,131,0,147,1,5,1,6,0,141,1,7,0,136,1,8,0,222,1,9,0,158,0,170,0,245,0,244,
0,246,0,162,0,173,0,201,0,199,0,174,0,98,0,99,0,144,0,100,0,203,0,101,0,200,
0,202,0,207,0,204,0,205,0,206,0,233,0,102,0,211,0,208,0,209,0,175,0,103,0,
240,0,145,0,214,0,212,0,213,0,104,0,235,0,237,0,137,0,106,0,105,0,107,0,109,
0,108,0,110,0,160,0,111,0,113,0,112,0,114,0,115,0,117,0,116,0,118,0,119,0,
234,0,120,0,122,0,121,0,123,0,125,0,124,0,184,0,161,0,127,0,126,0,128,0,129,
0,236,0,238,0,186,1,10,1,11,1,12,1,13,1,14,1,15,0,253,0,254,1,16,1,17,1,18,
1,19,0,255,1,0,1,20,1,21,1,22,1,1,1,23,1,24,1,25,1,26,1,27,1,28,1,29,1,30,
1,31,1,32,1,33,1,34,0,248,0,249,1,35,1,36,1,37,1,38,1,39,1,40,1,41,1,42,1,
43,1,44,1,45,1,46,1,47,1,48,1,49,1,50,0,250,0,215,1,51,1,52,1,53,1,54,1,55,
1,56,1,57,1,58,1,59,1,60,1,61,1,62,1,63,1,64,1,65,0,226,0,227,1,66,1,67,1,
68,1,69,1,70,1,71,1,72,1,73,1,74,1,75,1,76,1,77,1,78,1,79,1,80,0,176,0,177,
1,81,1,82,1,83,1,84,1,85,1,86,1,87,1,88,1,89,1,90,0,251,0,252,0,228,0,229,
1,91,1,92,1,93,1,94,1,95,1,96,1,97,1,98,1,99,1,100,1,101,1,102,1,103,1,104,
1,105,1,106,1,107,1,108,1,109,1,110,1,111,1,112,0,187,1,113,1,114,1,115,1,
116,0,230,0,231,1,117,0,166,1,118,1,119,1,120,1,121,1,122,1,123,0,216,0,225,
1,124,0,219,0,220,0,221,0,224,0,217,0,223,1,125,1,126,1,127,1,128,1,129,1,
130,1,131,1,132,1,133,1,134,1,135,1,136,1,137,1,138,0,168,1,139,1,140,1,141,
1,142,1,143,1,144,1,145,1,146,1,147,1,148,1,149,1,150,1,151,1,152,1,153,1,
154,1,155,1,156,1,157,0,159,1,158,1,159,1,160,1,161,1,162,1,163,1,164,1,165,
1,166,1,167,1,168,1,169,1,170,1,171,1,172,1,173,1,174,1,175,0,151,1,176,1,
177,1,178,0,155,1,179,1,180,1,181,1,182,1,183,1,184,1,185,1,186,1,187,1,188,
1,189,1,190,1,191,1,192,1,193,1,194,1,195,1,196,1,197,1,198,1,199,1,200,1,
201,1,202,1,203,1,204,1,205,1,206,1,207,1,208,1,209,1,210,1,211,1,212,1,213,
1,214,1,215,1,216,1,217,1,218,1,219,1,220,1,221,1,222,1,223,1,224,1,225,1,
226,1,227,1,228,1,229,1,230,1,231,1,232,1,233,1,234,1,235,1,236,1,237,1,238,
1,239,1,240,1,241,1,242,1,243,1,244,1,245,1,246,1,247,1,248,1,249,1,250,1,
251,1,252,1,253,1,254,1,255,2,0,2,1,2,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10,
2,11,2,12,2,13,2,14,2,15,2,16,2,17,2,18,2,19,2,20,2,21,2,22,2,23,2,24,2,25,
2,26,2,27,2,28,2,29,2,30,2,31,2,32,2,33,2,34,2,35,2,36,2,37,2,38,0,178,0,
179,2,39,2,40,0,182,0,183,0,196,2,41,0,180,0,181,0,197,0,130,0,194,0,135,
0,171,0,198,2,42,2,43,0,190,0,191,2,44,2,45,2,46,2,47,0,247,2,48,2,49,2,50,
2,51,2,52,2,53,0,140,2,54,2,55,2,56,2,57,2,58,2,59,2,60,2,61,2,62,2,63,2,
64,2,65,2,66,0,152,2,67,0,154,0,153,0,239,0,165,0,146,2,68,2,69,0,156,0,167,
0,143,2,70,0,148,0,149,2,71,2,72,2,73,2,74,2,75,2,76,2,77,2,78,2,79,2,80,
2,81,2,82,2,83,2,84,2,85,2,86,2,87,2,88,2,89,2,90,2,91,2,92,2,93,2,94,2,95,
2,96,2,97,2,98,2,99,2,100,2,101,2,102,2,103,2,104,2,105,2,106,2,107,2,108,
2,109,2,110,2,111,2,112,2,113,2,114,2,115,2,116,2,117,2,118,2,119,2,120,2,
121,2,122,2,123,2,124,2,125,2,126,2,127,2,128,2,129,2,130,2,131,0,185,2,132,
2,133,2,134,2,135,2,136,2,137,2,138,2,139,2,140,2,141,2,142,2,143,2,144,2,
145,2,146,2,147,2,148,2,149,2,150,2,151,2,152,2,153,2,154,2,155,2,156,2,157,
2,158,2,159,2,160,2,161,2,162,2,163,2,164,2,165,2,166,2,167,7,117,110,105,
48,48,65,48,7,117,110,105,48,48,65,68,7,117,110,105,48,51,55,69,7,117,110,
105,48,48,66,50,7,117,110,105,48,48,66,51,7,117,110,105,48,48,66,53,7,117,
110,105,50,50,49,57,7,117,110,105,48,48,66,57,7,65,109,97,99,114,111,110,
7,97,109,97,99,114,111,110,6,65,98,114,101,118,101,6,97,98,114,101,118,101,
7,65,111,103,111,110,101,107,7,97,111,103,111,110,101,107,11,67,99,105,114,
99,117,109,102,108,101,120,11,99,99,105,114,99,117,109,102,108,101,120,10,
67,100,111,116,97,99,99,101,110,116,10,99,100,111,116,97,99,99,101,110,116,
6,68,99,97,114,111,110,6,100,99,97,114,111,110,6,68,99,114,111,97,116,7,69,
109,97,99,114,111,110,7,101,109,97,99,114,111,110,6,69,98,114,101,118,101,
6,101,98,114,101,118,101,10,69,100,111,116,97,99,99,101,110,116,10,101,100,
111,116,97,99,99,101,110,116,7,69,111,103,111,110,101,107,7,101,111,103,111,
110,101,107,6,69,99,97,114,111,110,6,101,99,97,114,111,110,11,71,99,105,114,
99,117,109,102,108,101,120,11,103,99,105,114,99,117,109,102,108,101,120,10,
71,100,111,116,97,99,99,101,110,116,10,103,100,111,116,97,99,99,101,110,116,
12,71,99,111,109,109,97,97,99,99,101,110,116,12,103,99,111,109,109,97,97,
99,99,101,110,116,11,72,99,105,114,99,117,109,102,108,101,120,11,104,99,105,
114,99,117,109,102,108,101,120,4,72,98,97,114,4,104,98,97,114,6,73,116,105,
108,100,101,6,105,116,105,108,100,101,7,73,109,97,99,114,111,110,7,105,109,
97,99,114,111,110,6,73,98,114,101,118,101,6,105,98,114,101,118,101,7,73,111,
103,111,110,101,107,7,105,111,103,111,110,101,107,2,73,74,2,105,106,11,74,
99,105,114,99,117,109,102,108,101,120,11,106,99,105,114,99,117,109,102,108,
101,120,12,75,99,111,109,109,97,97,99,99,101,110,116,12,107,99,111,109,109,
97,97,99,99,101,110,116,12,107,103,114,101,101,110,108,97,110,100,105,99,
6,76,97,99,117,116,101,6,108,97,99,117,116,101,12,76,99,111,109,109,97,97,
99,99,101,110,116,12,108,99,111,109,109,97,97,99,99,101,110,116,6,76,99,97,
114,111,110,6,108,99,97,114,111,110,4,76,100,111,116,4,108,100,111,116,6,
78,97,99,117,116,101,6,110,97,99,117,116,101,12,78,99,111,109,109,97,97,99,
99,101,110,116,12,110,99,111,109,109,97,97,99,99,101,110,116,6,78,99,97,114,
111,110,6,110,99,97,114,111,110,11,110,97,112,111,115,116,114,111,112,104,
101,3,69,110,103,3,101,110,103,7,79,109,97,99,114,111,110,7,111,109,97,99,
114,111,110,6,79,98,114,101,118,101,6,111,98,114,101,118,101,13,79,104,117,
110,103,97,114,117,109,108,97,117,116,13,111,104,117,110,103,97,114,117,109,
108,97,117,116,6,82,97,99,117,116,101,6,114,97,99,117,116,101,12,82,99,111,
109,109,97,97,99,99,101,110,116,12,114,99,111,109,109,97,97,99,99,101,110,
116,6,82,99,97,114,111,110,6,114,99,97,114,111,110,6,83,97,99,117,116,101,
6,115,97,99,117,116,101,11,83,99,105,114,99,117,109,102,108,101,120,11,115,
99,105,114,99,117,109,102,108,101,120,12,84,99,111,109,109,97,97,99,99,101,
110,116,12,116,99,111,109,109,97,97,99,99,101,110,116,6,84,99,97,114,111,
110,6,116,99,97,114,111,110,4,84,98,97,114,4,116,98,97,114,6,85,116,105,108,
100,101,6,117,116,105,108,100,101,7,85,109,97,99,114,111,110,7,117,109,97,
99,114,111,110,6,85,98,114,101,118,101,6,117,98,114,101,118,101,5,85,114,
105,110,103,5,117,114,105,110,103,13,85,104,117,110,103,97,114,117,109,108,
97,117,116,13,117,104,117,110,103,97,114,117,109,108,97,117,116,7,85,111,
103,111,110,101,107,7,117,111,103,111,110,101,107,11,87,99,105,114,99,117,
109,102,108,101,120,11,119,99,105,114,99,117,109,102,108,101,120,11,89,99,
105,114,99,117,109,102,108,101,120,11,121,99,105,114,99,117,109,102,108,101,
120,6,90,97,99,117,116,101,6,122,97,99,117,116,101,10,90,100,111,116,97,99,
99,101,110,116,10,122,100,111,116,97,99,99,101,110,116,5,108,111,110,103,
115,10,65,114,105,110,103,97,99,117,116,101,10,97,114,105,110,103,97,99,117,
116,101,7,65,69,97,99,117,116,101,7,97,101,97,99,117,116,101,11,79,115,108,
97,115,104,97,99,117,116,101,11,111,115,108,97,115,104,97,99,117,116,101,
7,117,110,105,48,50,67,57,5,116,111,110,111,115,13,100,105,101,114,101,115,
105,115,116,111,110,111,115,10,65,108,112,104,97,116,111,110,111,115,9,97,
110,111,116,101,108,101,105,97,12,69,112,115,105,108,111,110,116,111,110,
111,115,8,69,116,97,116,111,110,111,115,9,73,111,116,97,116,111,110,111,115,
12,79,109,105,99,114,111,110,116,111,110,111,115,12,85,112,115,105,108,111,
110,116,111,110,111,115,10,79,109,101,103,97,116,111,110,111,115,17,105,111,
116,97,100,105,101,114,101,115,105,115,116,111,110,111,115,5,65,108,112,104,
97,4,66,101,116,97,5,71,97,109,109,97,7,69,112,115,105,108,111,110,4,90,101,
116,97,3,69,116,97,5,84,104,101,116,97,4,73,111,116,97,5,75,97,112,112,97,
6,76,97,109,98,100,97,2,77,117,2,78,117,2,88,105,7,79,109,105,99,114,111,
110,2,80,105,3,82,104,111,5,83,105,103,109,97,3,84,97,117,7,85,112,115,105,
108,111,110,3,80,104,105,3,67,104,105,3,80,115,105,12,73,111,116,97,100,105,
101,114,101,115,105,115,15,85,112,115,105,108,111,110,100,105,101,114,101,
115,105,115,10,97,108,112,104,97,116,111,110,111,115,12,101,112,115,105,108,
111,110,116,111,110,111,115,8,101,116,97,116,111,110,111,115,9,105,111,116,
97,116,111,110,111,115,20,117,112,115,105,108,111,110,100,105,101,114,101,
115,105,115,116,111,110,111,115,5,97,108,112,104,97,4,98,101,116,97,5,103,
97,109,109,97,5,100,101,108,116,97,7,101,112,115,105,108,111,110,4,122,101,
116,97,3,101,116,97,5,116,104,101,116,97,4,105,111,116,97,5,107,97,112,112,
97,6,108,97,109,98,100,97,2,110,117,2,120,105,7,111,109,105,99,114,111,110,
3,114,104,111,6,115,105,103,109,97,49,5,115,105,103,109,97,3,116,97,117,7,
117,112,115,105,108,111,110,3,112,104,105,3,99,104,105,3,112,115,105,5,111,
109,101,103,97,12,105,111,116,97,100,105,101,114,101,115,105,115,15,117,112,
115,105,108,111,110,100,105,101,114,101,115,105,115,12,111,109,105,99,114,
111,110,116,111,110,111,115,12,117,112,115,105,108,111,110,116,111,110,111,
115,10,111,109,101,103,97,116,111,110,111,115,9,97,102,105,105,49,48,48,50,
51,9,97,102,105,105,49,48,48,53,49,9,97,102,105,105,49,48,48,53,50,9,97,102,
105,105,49,48,48,53,51,9,97,102,105,105,49,48,48,53,52,9,97,102,105,105,49,
48,48,53,53,9,97,102,105,105,49,48,48,53,54,9,97,102,105,105,49,48,48,53,
55,9,97,102,105,105,49,48,48,53,56,9,97,102,105,105,49,48,48,53,57,9,97,102,
105,105,49,48,48,54,48,9,97,102,105,105,49,48,48,54,49,9,97,102,105,105,49,
48,48,54,50,9,97,102,105,105,49,48,49,52,53,9,97,102,105,105,49,48,48,49,
55,9,97,102,105,105,49,48,48,49,56,9,97,102,105,105,49,48,48,49,57,9,97,102,
105,105,49,48,48,50,48,9,97,102,105,105,49,48,48,50,49,9,97,102,105,105,49,
48,48,50,50,9,97,102,105,105,49,48,48,50,52,9,97,102,105,105,49,48,48,50,
53,9,97,102,105,105,49,48,48,50,54,9,97,102,105,105,49,48,48,50,55,9,97,102,
105,105,49,48,48,50,56,9,97,102,105,105,49,48,48,50,57,9,97,102,105,105,49,
48,48,51,48,9,97,102,105,105,49,48,48,51,49,9,97,102,105,105,49,48,48,51,
50,9,97,102,105,105,49,48,48,51,51,9,97,102,105,105,49,48,48,51,52,9,97,102,
105,105,49,48,48,51,53,9,97,102,105,105,49,48,48,51,54,9,97,102,105,105,49,
48,48,51,55,9,97,102,105,105,49,48,48,51,56,9,97,102,105,105,49,48,48,51,
57,9,97,102,105,105,49,48,48,52,48,9,97,102,105,105,49,48,48,52,49,9,97,102,
105,105,49,48,48,52,50,9,97,102,105,105,49,48,48,52,51,9,97,102,105,105,49,
48,48,52,52,9,97,102,105,105,49,48,48,52,53,9,97,102,105,105,49,48,48,52,
54,9,97,102,105,105,49,48,48,52,55,9,97,102,105,105,49,48,48,52,56,9,97,102,
105,105,49,48,48,52,57,9,97,102,105,105,49,48,48,54,53,9,97,102,105,105,49,
48,48,54,54,9,97,102,105,105,49,48,48,54,55,9,97,102,105,105,49,48,48,54,
56,9,97,102,105,105,49,48,48,54,57,9,97,102,105,105,49,48,48,55,48,9,97,102,
105,105,49,48,48,55,50,9,97,102,105,105,49,48,48,55,51,9,97,102,105,105,49,
48,48,55,52,9,97,102,105,105,49,48,48,55,53,9,97,102,105,105,49,48,48,55,
54,9,97,102,105,105,49,48,48,55,55,9,97,102,105,105,49,48,48,55,56,9,97,102,
105,105,49,48,48,55,57,9,97,102,105,105,49,48,48,56,48,9,97,102,105,105,49,
48,48,56,49,9,97,102,105,105,49,48,48,56,50,9,97,102,105,105,49,48,48,56,
51,9,97,102,105,105,49,48,48,56,52,9,97,102,105,105,49,48,48,56,53,9,97,102,
105,105,49,48,48,56,54,9,97,102,105,105,49,48,48,56,55,9,97,102,105,105,49,
48,48,56,56,9,97,102,105,105,49,48,48,56,57,9,97,102,105,105,49,48,48,57,
48,9,97,102,105,105,49,48,48,57,49,9,97,102,105,105,49,48,48,57,50,9,97,102,
105,105,49,48,48,57,51,9,97,102,105,105,49,48,48,57,52,9,97,102,105,105,49,
48,48,57,53,9,97,102,105,105,49,48,48,57,54,9,97,102,105,105,49,48,48,57,
55,9,97,102,105,105,49,48,48,55,49,9,97,102,105,105,49,48,48,57,57,9,97,102,
105,105,49,48,49,48,48,9,97,102,105,105,49,48,49,48,49,9,97,102,105,105,49,
48,49,48,50,9,97,102,105,105,49,48,49,48,51,9,97,102,105,105,49,48,49,48,
52,9,97,102,105,105,49,48,49,48,53,9,97,102,105,105,49,48,49,48,54,9,97,102,
105,105,49,48,49,48,55,9,97,102,105,105,49,48,49,48,56,9,97,102,105,105,49,
48,49,48,57,9,97,102,105,105,49,48,49,49,48,9,97,102,105,105,49,48,49,57,
51,9,97,102,105,105,49,48,48,53,48,9,97,102,105,105,49,48,48,57,56,6,87,103,
114,97,118,101,6,119,103,114,97,118,101,6,87,97,99,117,116,101,6,119,97,99,
117,116,101,9,87,100,105,101,114,101,115,105,115,9,119,100,105,101,114,101,
115,105,115,6,89,103,114,97,118,101,6,121,103,114,97,118,101,9,97,102,105,
105,48,48,50,48,56,13,117,110,100,101,114,115,99,111,114,101,100,98,108,13,
113,117,111,116,101,114,101,118,101,114,115,101,100,6,109,105,110,117,116,
101,6,115,101,99,111,110,100,9,101,120,99,108,97,109,100,98,108,7,117,110,
105,50,48,51,69,7,117,110,105,50,50,49,53,7,117,110,105,50,48,55,70,4,108,
105,114,97,6,112,101,115,101,116,97,4,69,117,114,111,9,97,102,105,105,54,
49,50,52,56,9,97,102,105,105,54,49,50,56,57,9,97,102,105,105,54,49,51,53,
50,7,117,110,105,50,49,50,54,9,101,115,116,105,109,97,116,101,100,9,111,110,
101,101,105,103,104,116,104,12,116,104,114,101,101,101,105,103,104,116,104,
115,11,102,105,118,101,101,105,103,104,116,104,115,12,115,101,118,101,110,
101,105,103,104,116,104,115,9,97,114,114,111,119,108,101,102,116,7,97,114,
114,111,119,117,112,10,97,114,114,111,119,114,105,103,104,116,9,97,114,114,
111,119,100,111,119,110,9,97,114,114,111,119,98,111,116,104,9,97,114,114,
111,119,117,112,100,110,12,97,114,114,111,119,117,112,100,110,98,115,101,
7,117,110,105,50,50,48,54,10,111,114,116,104,111,103,111,110,97,108,12,105,
110,116,101,114,115,101,99,116,105,111,110,11,101,113,117,105,118,97,108,
101,110,99,101,5,104,111,117,115,101,13,114,101,118,108,111,103,105,99,97,
108,110,111,116,10,105,110,116,101,103,114,97,108,116,112,10,105,110,116,
101,103,114,97,108,98,116,8,83,70,49,48,48,48,48,48,8,83,70,49,49,48,48,48,
48,8,83,70,48,49,48,48,48,48,8,83,70,48,51,48,48,48,48,8,83,70,48,50,48,48,
48,48,8,83,70,48,52,48,48,48,48,8,83,70,48,56,48,48,48,48,8,83,70,48,57,48,
48,48,48,8,83,70,48,54,48,48,48,48,8,83,70,48,55,48,48,48,48,8,83,70,48,53,
48,48,48,48,8,83,70,52,51,48,48,48,48,8,83,70,50,52,48,48,48,48,8,83,70,53,
49,48,48,48,48,8,83,70,53,50,48,48,48,48,8,83,70,51,57,48,48,48,48,8,83,70,
50,50,48,48,48,48,8,83,70,50,49,48,48,48,48,8,83,70,50,53,48,48,48,48,8,83,
70,53,48,48,48,48,48,8,83,70,52,57,48,48,48,48,8,83,70,51,56,48,48,48,48,
8,83,70,50,56,48,48,48,48,8,83,70,50,55,48,48,48,48,8,83,70,50,54,48,48,48,
48,8,83,70,51,54,48,48,48,48,8,83,70,51,55,48,48,48,48,8,83,70,52,50,48,48,
48,48,8,83,70,49,57,48,48,48,48,8,83,70,50,48,48,48,48,48,8,83,70,50,51,48,
48,48,48,8,83,70,52,55,48,48,48,48,8,83,70,52,56,48,48,48,48,8,83,70,52,49,
48,48,48,48,8,83,70,52,53,48,48,48,48,8,83,70,52,54,48,48,48,48,8,83,70,52,
48,48,48,48,48,8,83,70,53,52,48,48,48,48,8,83,70,53,51,48,48,48,48,8,83,70,
52,52,48,48,48,48,7,117,112,98,108,111,99,107,7,100,110,98,108,111,99,107,
5,98,108,111,99,107,7,108,102,98,108,111,99,107,7,114,116,98,108,111,99,107,
7,108,116,115,104,97,100,101,5,115,104,97,100,101,7,100,107,115,104,97,100,
101,9,102,105,108,108,101,100,98,111,120,6,72,50,50,48,55,51,6,72,49,56,53,
52,51,6,72,49,56,53,53,49,10,102,105,108,108,101,100,114,101,99,116,7,116,
114,105,97,103,117,112,7,116,114,105,97,103,114,116,7,116,114,105,97,103,
100,110,7,116,114,105,97,103,108,102,6,99,105,114,99,108,101,6,72,49,56,53,
51,51,9,105,110,118,98,117,108,108,101,116,9,105,110,118,99,105,114,99,108,
101,10,111,112,101,110,98,117,108,108,101,116,9,115,109,105,108,101,102,97,
99,101,12,105,110,118,115,109,105,108,101,102,97,99,101,3,115,117,110,6,102,
101,109,97,108,101,4,109,97,108,101,5,115,112,97,100,101,4,99,108,117,98,
5,104,101,97,114,116,7,100,105,97,109,111,110,100,11,109,117,115,105,99,97,
108,110,111,116,101,14,109,117,115,105,99,97,108,110,111,116,101,100,98,108,
7,117,110,105,70,66,48,49,7,117,110,105,70,66,48,50,7,117,110,105,70,48,48,
53,6,109,105,100,100,111,116,7,117,110,105,70,48,48,52,7,117,110,105,50,48,
55,52,7,117,110,105,50,48,55,53,7,117,110,105,50,48,55,55,7,117,110,105,50,
48,55,56,8,103,108,121,112,104,53,55,49,8,103,108,121,112,104,53,55,50,8,
103,108,121,112,104,53,55,51,8,103,108,121,112,104,53,55,52,8,103,108,121,
112,104,53,55,53,8,103,108,121,112,104,53,55,54,8,103,108,121,112,104,53,
55,55,8,103,108,121,112,104,53,55,56,8,103,108,121,112,104,53,55,57,8,103,
108,121,112,104,53,56,48,8,103,108,121,112,104,53,56,49,0,0,0,0,0,0,3,0,8,
0,2,0,17,0,1,255,255,0,3,0,1,0,0,0,14,0,0,0,24,0,0,0,0,0,2,0,1,0,1,2,155,
0,1,0,4,0,0,0,2,0,0,0,1,0,0,0,10,0,76,0,78,0,4,68,70,76,84,0,26,99,121,114,
108,0,36,103,114,101,107,0,46,108,97,116,110,0,56,0,4,0,0,0,0,255,255,0,0,
0,4,0,0,0,0,255,255,0,0,0,4,0,0,0,0,255,255,0,0,0,4,0,0,0,0,255,255,0,0,0,
0,0,0,0,1,0,0,0,10,0,84,0,98,0,4,68,70,76,84,0,26,99,121,114,108,0,38,103,
114,101,107,0,50,108,97,116,110,0,62,0,4,0,0,0,0,255,255,0,1,0,0,0,4,0,0,
0,0,255,255,0,1,0,0,0,4,0,0,0,0,255,255,0,1,0,0,0,4,0,0,0,0,255,255,0,1,0,
0,0,1,107,101,114,110,0,8,0,0,0,1,0,0,0,1,0,4,0,2,0,0,0,1,0,8,0,1,15,112,
0,4,0,0,0,105,0,220,1,6,1,12,1,50,1,64,1,94,1,112,1,130,1,204,2,2,2,52,2,
114,2,124,2,138,2,148,2,138,2,158,2,196,2,202,3,28,3,38,3,84,3,118,3,144,
3,166,3,228,3,254,4,20,4,46,4,56,4,190,5,44,5,58,3,28,5,100,5,186,5,204,6,
22,6,28,6,82,6,136,5,186,6,178,6,216,6,230,5,186,7,16,5,186,5,186,5,186,7,
62,7,84,7,90,7,96,7,166,7,224,8,54,8,168,8,194,8,204,8,246,9,24,9,46,9,60,
9,98,9,144,9,242,10,48,10,174,11,72,11,106,11,136,11,146,11,156,11,166,11,
224,12,14,12,64,12,82,12,144,12,210,12,252,13,6,13,44,13,62,13,108,13,150,
13,160,13,174,13,208,13,242,14,4,14,46,14,112,14,142,14,180,14,198,14,212,
14,222,15,0,15,30,15,40,15,70,15,76,15,90,0,10,0,36,255,143,0,55,255,219,
0,60,255,219,1,82,255,143,1,91,255,143,1,94,255,143,1,101,255,143,1,109,255,
219,1,110,255,219,1,116,255,219,0,1,0,20,255,104,0,9,0,3,255,143,0,55,255,
104,0,57,255,104,0,58,255,180,0,60,255,104,0,89,255,219,0,90,255,219,0,92,
255,219,2,3,255,104,0,3,0,15,255,29,0,17,255,29,0,36,255,143,0,7,0,3,255,
180,0,55,255,104,0,57,255,104,0,58,255,104,0,60,255,104,0,92,255,180,2,3,
255,143,0,4,0,3,255,219,0,15,254,248,0,17,254,248,0,36,255,104,0,4,0,55,255,
219,0,57,255,219,0,58,255,219,0,60,255,219,0,18,0,3,255,219,0,15,255,29,0,
16,255,143,0,17,255,29,0,29,255,29,0,30,255,29,0,36,255,104,0,50,255,219,
0,68,255,29,0,70,255,29,0,72,255,29,0,76,255,180,0,82,255,29,0,85,255,180,
0,86,255,29,0,88,255,180,0,90,255,143,0,92,255,143,0,13,0,15,255,68,0,16,
255,143,0,17,255,68,0,29,255,180,0,30,255,180,0,36,255,104,0,68,255,104,0,
72,255,143,0,76,255,219,0,82,255,143,0,85,255,180,0,88,255,180,0,92,255,180,
0,12,0,15,255,143,0,16,255,219,0,17,255,143,0,29,255,219,0,30,255,219,0,36,
255,180,0,68,255,180,0,72,255,219,0,82,255,219,0,85,255,219,0,88,255,219,
0,92,255,238,0,15,0,3,255,219,0,15,254,248,0,16,255,68,0,17,254,248,0,29,
255,143,0,30,255,123,0,36,255,104,0,68,255,104,0,72,255,68,0,76,255,180,0,
82,255,68,0,83,255,104,0,84,255,68,0,88,255,143,0,89,255,143,0,2,0,73,255,
219,2,3,0,37,0,3,0,15,255,143,0,17,255,143,2,3,0,76,0,2,0,15,255,104,0,17,
255,104,0,2,0,15,255,143,0,17,255,143,0,9,1,98,255,213,1,105,255,213,1,109,
255,104,1,110,255,104,1,111,255,197,1,116,255,104,1,124,255,219,1,134,255,
219,1,144,255,219,0,1,1,110,255,190,0,20,1,90,0,170,1,91,255,104,1,94,255,
104,1,98,255,141,1,101,255,104,1,105,255,141,1,111,255,141,1,114,255,158,
1,119,255,104,1,120,255,180,1,122,255,70,1,128,255,104,1,130,255,180,1,131,
255,104,1,133,255,104,1,136,255,70,1,140,255,70,1,143,255,70,1,147,0,98,1,
149,255,70,0,2,1,110,255,209,1,116,255,209,0,11,0,3,255,143,1,98,255,213,
1,105,255,213,1,109,255,104,1,110,255,104,1,111,255,197,1,116,255,104,1,124,
255,219,1,134,255,219,1,144,255,219,2,3,255,104,0,8,0,15,255,31,0,17,255,
31,1,90,0,164,1,91,255,68,1,94,255,68,1,101,255,68,1,130,255,168,1,147,0,
88,0,6,0,3,255,143,1,98,255,213,1,105,255,213,1,109,255,137,1,110,255,104,
1,116,255,104,0,5,1,91,255,219,1,94,255,219,1,101,255,219,1,110,255,190,1,
116,255,190,0,15,1,98,255,193,1,105,255,193,1,111,255,143,1,117,255,231,1,
122,255,231,1,125,255,231,1,127,255,231,1,129,255,231,1,135,255,231,1,136,
255,231,1,140,255,231,1,143,255,231,1,146,255,231,1,149,255,231,1,151,255,
231,0,6,0,3,255,143,1,98,255,213,1,105,255,213,1,109,255,104,1,110,255,104,
1,116,255,104,0,5,1,91,255,219,1,94,255,213,1,101,255,219,1,110,255,190,1,
116,255,190,0,6,0,3,255,219,0,15,254,250,0,17,254,250,1,91,255,104,1,94,255,
104,1,101,255,104,0,2,1,137,255,158,1,141,255,158,0,33,0,3,255,219,0,15,255,
31,0,17,255,31,0,29,255,31,0,30,255,31,1,90,0,188,1,91,255,104,1,94,255,104,
1,98,255,219,1,101,255,104,1,105,255,219,1,111,255,219,1,114,255,219,1,117,
255,31,1,118,255,31,1,121,255,78,1,122,255,31,1,124,255,78,1,126,255,31,1,
128,255,106,1,130,255,180,1,133,255,106,1,134,255,143,1,136,255,31,1,140,
255,31,1,142,255,80,1,143,255,31,1,144,255,143,1,145,255,106,1,147,0,188,
1,148,255,78,1,149,255,31,1,150,255,78,0,27,0,3,255,219,0,15,254,250,0,16,
255,70,0,17,254,250,0,29,255,143,0,30,255,143,1,90,0,188,1,91,255,104,1,94,
255,104,1,98,255,141,1,101,255,104,1,105,255,141,1,111,255,141,1,114,255,
158,1,119,255,104,1,120,255,180,1,122,255,70,1,124,255,158,1,128,255,104,
1,130,255,180,1,131,255,104,1,133,255,104,1,136,255,70,1,140,255,70,1,143,
255,70,1,147,0,121,1,149,255,70,0,3,1,91,255,197,1,110,255,190,1,116,255,
190,0,10,1,117,255,178,1,122,255,178,1,125,255,178,1,129,255,217,1,136,255,
178,1,140,255,178,1,143,255,178,1,146,255,178,1,149,255,178,1,151,255,178,
0,21,0,3,255,219,1,90,0,170,1,91,255,104,1,94,255,104,1,98,255,141,1,101,
255,104,1,105,255,141,1,111,255,141,1,114,255,158,1,119,255,104,1,120,255,
180,1,122,255,70,1,128,255,104,1,130,255,180,1,131,255,104,1,133,255,104,
1,136,255,70,1,140,255,70,1,143,255,70,1,147,0,98,1,149,255,70,0,4,1,132,
255,217,1,137,255,227,1,141,255,227,1,144,255,201,0,18,1,117,255,119,1,119,
255,219,1,122,255,119,1,124,255,170,1,125,255,180,1,128,255,219,1,129,255,
158,1,130,255,219,1,131,255,219,1,134,255,170,1,136,255,119,1,137,255,170,
1,140,255,119,1,141,255,170,1,143,255,119,1,146,255,119,1,149,255,119,1,151,
255,119,0,1,1,132,255,217,0,13,1,117,255,231,1,122,255,231,1,125,255,231,
1,127,255,231,1,129,255,231,1,135,255,231,1,136,255,231,1,139,255,231,1,140,
255,231,1,143,255,231,1,146,255,231,1,149,255,231,1,151,255,231,0,13,1,117,
255,225,1,122,255,225,1,125,255,225,1,135,255,225,1,136,255,225,1,139,255,
209,1,140,255,225,1,142,255,207,1,143,255,219,1,146,255,225,1,149,255,225,
1,150,255,207,1,151,255,225,0,10,1,117,255,201,1,122,255,201,1,125,255,201,
1,127,255,201,1,135,255,201,1,136,255,201,1,139,255,201,1,140,255,201,1,143,
255,201,1,149,255,201,0,9,1,117,255,227,1,122,255,227,1,127,255,227,1,136,
255,227,1,139,255,227,1,140,255,227,1,143,255,227,1,146,255,227,1,151,255,
227,0,3,1,132,255,217,1,137,255,227,1,141,255,227,0,10,1,117,255,227,1,122,
255,227,1,125,255,227,1,127,255,227,1,136,255,227,1,139,255,227,1,140,255,
227,1,143,255,227,1,146,255,227,1,151,255,227,0,11,1,117,255,201,1,122,255,
201,1,125,255,201,1,127,255,201,1,136,255,201,1,139,255,201,1,140,255,201,
1,143,255,201,1,146,255,201,1,149,255,201,1,151,255,201,0,5,0,15,255,6,0,
17,255,6,0,108,255,119,0,123,255,119,1,255,255,211,0,1,2,3,255,96,0,1,2,3,
255,119,0,17,1,170,0,68,1,173,255,233,1,177,0,45,1,180,255,211,1,181,255,
233,1,183,255,211,1,184,255,96,1,185,255,166,1,186,255,188,1,189,255,96,1,
195,255,211,1,198,0,23,1,216,255,211,1,217,255,233,1,218,0,23,1,227,0,45,
2,3,255,141,0,14,1,166,255,211,1,173,255,233,1,180,255,233,1,183,255,233,
1,184,255,164,1,185,255,209,1,186,255,233,1,187,255,211,1,189,255,164,1,192,
255,188,1,195,255,233,1,197,255,233,1,209,255,233,1,217,255,211,0,21,1,166,
255,188,1,170,255,211,1,172,255,211,1,173,255,188,1,177,255,233,1,180,255,
188,1,183,255,188,1,184,255,119,1,185,255,188,1,186,255,188,1,187,255,166,
1,189,255,164,1,192,255,141,1,197,255,188,1,202,255,233,1,210,255,233,1,216,
255,188,1,217,255,233,1,219,255,233,1,221,255,188,1,229,255,233,0,28,0,15,
255,6,0,17,255,6,0,108,255,119,0,123,255,119,1,166,255,119,1,170,255,119,
1,173,255,211,1,177,255,141,1,178,255,209,1,180,255,141,1,183,255,164,1,197,
255,188,1,198,255,141,1,200,255,141,1,202,255,119,1,203,255,119,1,206,255,
141,1,209,255,141,1,210,255,141,1,211,255,141,1,212,255,119,1,214,255,141,
1,217,255,119,1,225,255,141,1,226,255,141,1,228,255,141,1,229,255,119,1,255,
255,211,0,6,1,185,0,23,1,186,255,211,1,189,255,186,1,205,0,68,1,212,0,23,
1,217,0,45,0,2,1,173,255,211,1,215,255,233,0,10,1,173,255,233,1,180,255,211,
1,183,255,233,1,184,0,23,1,185,0,45,1,192,0,45,1,198,0,23,1,203,255,231,1,
212,255,233,1,217,255,233,0,8,1,177,255,233,1,180,255,233,1,183,255,233,1,
184,255,211,1,185,255,233,1,186,255,233,1,189,255,211,1,197,255,233,0,5,1,
173,255,233,1,180,255,233,1,183,255,233,1,185,0,23,1,186,255,186,0,3,1,186,
255,233,1,199,0,23,1,217,0,23,0,9,1,186,255,233,1,189,255,233,1,198,0,23,
1,203,0,23,1,212,0,23,1,215,0,23,1,217,0,23,1,221,255,233,1,227,0,23,0,11,
1,166,255,211,1,170,255,211,1,172,255,211,1,177,255,233,1,185,255,211,1,187,
255,164,1,189,255,211,1,197,255,211,1,202,255,211,1,209,255,233,1,219,255,
233,0,24,0,15,254,125,0,17,254,125,0,29,255,211,0,30,255,211,0,123,255,141,
1,166,255,119,1,170,255,119,1,172,255,233,1,173,255,211,1,177,255,141,1,178,
255,233,1,180,255,211,1,183,255,233,1,184,255,164,1,185,255,211,1,186,255,
233,1,187,255,164,1,197,255,211,1,198,255,188,1,202,255,96,1,203,255,166,
1,212,255,166,1,227,255,211,1,229,255,188,0,15,1,166,255,211,1,170,255,211,
1,173,255,233,1,177,255,188,1,178,255,233,1,180,255,211,1,184,255,188,1,185,
255,188,1,187,255,141,1,189,255,188,1,192,255,186,1,195,255,233,1,198,0,23,
1,204,0,45,1,221,255,233,0,31,0,15,255,29,0,17,255,29,0,108,255,166,0,123,
255,166,1,166,255,188,1,170,255,188,1,172,0,23,1,173,255,233,1,177,255,211,
1,180,255,164,1,186,255,188,1,197,255,211,1,198,255,164,1,200,255,166,1,203,
255,141,1,206,255,166,1,208,255,166,1,209,255,164,1,210,255,166,1,212,255,
96,1,213,255,166,1,214,255,141,1,215,255,141,1,217,255,141,1,219,255,166,
1,223,255,166,1,225,255,166,1,226,255,166,1,228,255,166,1,229,255,141,1,255,
255,211,0,38,0,15,254,240,0,17,254,240,0,29,255,211,0,30,255,211,0,108,255,
166,0,123,255,164,1,166,255,119,1,170,255,164,1,173,255,211,1,177,255,188,
1,180,255,188,1,186,255,188,1,195,255,211,1,197,255,211,1,199,255,211,1,200,
255,141,1,201,255,164,1,202,255,96,1,203,255,119,1,204,255,188,1,205,255,
141,1,206,255,164,1,207,255,188,1,208,255,164,1,209,255,119,1,210,255,164,
1,211,255,164,1,212,255,119,1,213,255,164,1,214,255,164,1,215,255,119,1,219,
255,164,1,220,255,164,1,222,255,164,1,223,255,164,1,228,255,164,1,229,255,
119,1,255,255,233,0,8,1,166,255,211,1,170,255,188,1,177,255,188,1,184,255,
141,1,185,255,164,1,189,255,211,1,197,255,186,1,209,255,188,0,7,1,173,255,
211,1,180,255,188,1,183,255,188,1,186,255,188,1,195,255,186,1,212,255,233,
1,217,255,211,0,2,1,180,255,211,1,198,0,45,0,2,1,198,0,23,1,217,0,45,0,2,
1,197,255,188,2,3,255,119,0,14,1,166,255,211,1,170,255,211,1,172,255,188,
1,173,255,233,1,177,255,186,1,178,255,211,1,180,255,211,1,183,255,211,1,184,
255,51,1,187,255,164,1,189,255,96,1,195,255,233,1,197,255,164,2,3,255,96,
0,11,1,170,255,188,1,172,255,231,1,173,255,233,1,177,255,188,1,187,255,186,
1,197,255,211,1,202,255,188,1,204,0,23,1,209,255,188,1,210,255,233,1,229,
255,233,0,12,1,166,255,188,1,170,255,166,1,172,255,211,1,177,255,164,1,180,
255,233,1,183,255,233,1,184,255,141,1,187,255,164,1,189,255,188,1,202,255,
164,1,209,255,164,1,210,255,233,0,4,1,205,255,233,1,216,255,211,1,217,255,
233,1,221,255,211,0,15,1,198,255,209,1,202,255,164,1,203,255,233,1,204,255,
233,1,205,255,211,1,209,255,164,1,210,255,211,1,215,255,233,1,217,255,211,
1,218,255,233,1,219,255,188,1,221,255,188,1,224,255,188,1,227,255,233,1,229,
255,211,0,16,1,198,255,233,1,199,255,233,1,202,255,233,1,203,255,233,1,204,
255,233,1,205,255,233,1,209,255,209,1,210,255,233,1,212,255,233,1,215,255,
233,1,216,255,211,1,217,255,211,1,218,255,233,1,221,255,164,1,224,255,188,
1,229,255,233,0,10,0,15,255,6,0,17,255,6,1,198,255,211,1,202,255,164,1,203,
255,211,1,205,255,233,1,209,255,211,1,212,255,211,1,215,255,211,1,229,255,
233,0,2,1,224,255,211,1,227,0,23,0,9,1,199,255,233,1,202,255,211,1,204,255,
233,1,205,255,211,1,209,255,188,1,216,255,188,1,217,255,233,1,219,255,211,
1,221,255,188,0,4,1,199,0,23,1,217,0,23,1,221,255,233,1,224,0,45,0,11,1,199,
255,233,1,202,255,211,1,203,255,233,1,205,255,233,1,209,255,233,1,212,255,
233,1,215,255,233,1,217,255,233,1,218,255,233,1,221,255,188,1,224,255,211,
0,10,1,198,0,45,1,199,0,45,1,203,0,23,1,205,0,23,1,209,0,23,1,212,0,23,1,
215,0,23,1,216,0,23,1,217,0,23,1,227,0,23,0,2,1,212,0,23,1,221,255,211,0,
3,1,199,255,233,1,205,255,233,1,217,0,23,0,8,1,202,255,211,1,204,255,233,
1,205,255,233,1,209,255,211,1,216,255,211,1,217,255,233,1,219,255,233,1,221,
255,211,0,8,1,202,255,209,1,205,255,233,1,209,255,186,1,216,255,211,1,217,
255,233,1,219,255,233,1,221,255,211,1,229,255,233,0,4,1,204,0,23,1,212,0,
23,1,221,255,233,1,227,0,23,0,10,0,15,255,29,0,17,255,29,1,198,255,233,1,
202,255,188,1,203,255,233,1,204,0,68,1,209,255,211,1,212,255,233,1,215,255,
233,1,217,0,23,0,16,0,15,255,51,0,17,255,51,0,123,0,23,1,198,255,233,1,199,
0,23,1,202,255,188,1,203,255,233,1,204,0,23,1,209,255,211,1,210,255,233,1,
212,255,231,1,214,255,233,1,215,255,233,1,218,255,233,1,227,255,233,1,229,
255,233,0,7,1,199,255,233,1,202,255,211,1,209,255,211,1,216,255,211,1,217,
255,233,1,221,255,211,1,229,255,233,0,9,1,198,255,233,1,199,255,233,1,203,
255,233,1,205,255,233,1,212,255,233,1,215,255,233,1,216,255,233,1,218,255,
233,1,221,255,211,0,4,1,203,255,233,1,205,255,233,1,212,255,233,1,215,255,
233,0,3,1,203,255,233,1,212,255,233,1,217,0,23,0,2,1,216,255,96,1,221,255,
119,0,8,1,202,255,211,1,203,0,23,1,205,255,233,1,209,255,211,1,212,0,23,1,
216,255,211,1,219,255,233,1,229,255,233,0,7,1,202,255,211,1,204,255,233,1,
209,255,211,1,210,255,233,1,216,255,211,1,219,255,233,1,221,255,211,0,2,0,
15,255,51,0,17,255,51,0,7,0,15,255,6,0,17,255,6,0,29,255,211,0,30,255,211,
0,108,255,96,0,123,255,96,1,255,255,211,0,1,2,2,255,219,0,3,0,3,255,180,0,
86,255,219,2,3,255,219,0,5,1,153,255,96,1,162,255,96,1,184,255,96,1,189,255,
188,1,192,255,188,0,1,0,105,0,3,0,20,0,36,0,41,0,47,0,51,0,53,0,55,0,57,0,
58,0,60,0,73,0,85,0,89,0,90,0,92,1,82,1,87,1,88,1,89,1,91,1,93,1,94,1,98,
1,100,1,101,1,105,1,107,1,108,1,109,1,110,1,111,1,113,1,114,1,116,1,125,1,
127,1,129,1,131,1,132,1,135,1,136,1,137,1,138,1,141,1,143,1,144,1,146,1,149,
1,151,1,154,1,160,1,161,1,166,1,167,1,168,1,169,1,170,1,171,1,172,1,173,1,
176,1,177,1,178,1,180,1,182,1,183,1,184,1,185,1,186,1,187,1,188,1,191,1,192,
1,194,1,195,1,196,1,198,1,199,1,200,1,201,1,202,1,203,1,204,1,205,1,208,1,
209,1,210,1,212,1,214,1,215,1,216,1,217,1,218,1,219,1,220,1,223,1,226,1,227,
1,228,1,242,1,244,2,2,2,3,2,8,0,0,0,1,0,0,0,0,199,254,176,223,0,0,0,0,191,
26,255,128,0,0,0,0,196,4,48,20,};
#endif
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/include/j2k.h
0,0 → 1,446
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* Copyright (c) 2006-2007, Parvatha Elangovan
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __J2K_H
#define __J2K_H
/**
@file j2k.h
@brief The JPEG-2000 Codestream Reader/Writer (J2K)
 
The functions in J2K.C have for goal to read/write the several parts of the codestream: markers and data.
*/
 
/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */
/*@{*/
 
#define J2K_CP_CSTY_PRT 0x01
#define J2K_CP_CSTY_SOP 0x02
#define J2K_CP_CSTY_EPH 0x04
#define J2K_CCP_CSTY_PRT 0x01
#define J2K_CCP_CBLKSTY_LAZY 0x01 /**< Selective arithmetic coding bypass */
#define J2K_CCP_CBLKSTY_RESET 0x02 /**< Reset context probabilities on coding pass boundaries */
#define J2K_CCP_CBLKSTY_TERMALL 0x04 /**< Termination on each coding pass */
#define J2K_CCP_CBLKSTY_VSC 0x08 /**< Vertically stripe causal context */
#define J2K_CCP_CBLKSTY_PTERM 0x10 /**< Predictable termination */
#define J2K_CCP_CBLKSTY_SEGSYM 0x20 /**< Segmentation symbols are used */
#define J2K_CCP_QNTSTY_NOQNT 0
#define J2K_CCP_QNTSTY_SIQNT 1
#define J2K_CCP_QNTSTY_SEQNT 2
 
/* ----------------------------------------------------------------------- */
 
#define J2K_MS_SOC 0xff4f /**< SOC marker value */
#define J2K_MS_SOT 0xff90 /**< SOT marker value */
#define J2K_MS_SOD 0xff93 /**< SOD marker value */
#define J2K_MS_EOC 0xffd9 /**< EOC marker value */
#define J2K_MS_SIZ 0xff51 /**< SIZ marker value */
#define J2K_MS_COD 0xff52 /**< COD marker value */
#define J2K_MS_COC 0xff53 /**< COC marker value */
#define J2K_MS_RGN 0xff5e /**< RGN marker value */
#define J2K_MS_QCD 0xff5c /**< QCD marker value */
#define J2K_MS_QCC 0xff5d /**< QCC marker value */
#define J2K_MS_POC 0xff5f /**< POC marker value */
#define J2K_MS_TLM 0xff55 /**< TLM marker value */
#define J2K_MS_PLM 0xff57 /**< PLM marker value */
#define J2K_MS_PLT 0xff58 /**< PLT marker value */
#define J2K_MS_PPM 0xff60 /**< PPM marker value */
#define J2K_MS_PPT 0xff61 /**< PPT marker value */
#define J2K_MS_SOP 0xff91 /**< SOP marker value */
#define J2K_MS_EPH 0xff92 /**< EPH marker value */
#define J2K_MS_CRG 0xff63 /**< CRG marker value */
#define J2K_MS_COM 0xff64 /**< COM marker value */
/* UniPG>> */
#ifdef USE_JPWL
#define J2K_MS_EPC 0xff68 /**< EPC marker value (Part 11: JPEG 2000 for Wireless) */
#define J2K_MS_EPB 0xff66 /**< EPB marker value (Part 11: JPEG 2000 for Wireless) */
#define J2K_MS_ESD 0xff67 /**< ESD marker value (Part 11: JPEG 2000 for Wireless) */
#define J2K_MS_RED 0xff69 /**< RED marker value (Part 11: JPEG 2000 for Wireless) */
#endif /* USE_JPWL */
#ifdef USE_JPSEC
#define J2K_MS_SEC 0xff65 /**< SEC marker value (Part 8: Secure JPEG 2000) */
#define J2K_MS_INSEC 0xff94 /**< INSEC marker value (Part 8: Secure JPEG 2000) */
#endif /* USE_JPSEC */
/* <<UniPG */
 
 
/* ----------------------------------------------------------------------- */
 
/**
Values that specify the status of the decoding process when decoding the main header.
These values may be combined with a | operator.
*/
typedef enum J2K_STATUS {
J2K_STATE_MHSOC = 0x0001, /**< a SOC marker is expected */
J2K_STATE_MHSIZ = 0x0002, /**< a SIZ marker is expected */
J2K_STATE_MH = 0x0004, /**< the decoding process is in the main header */
J2K_STATE_TPHSOT = 0x0008, /**< the decoding process is in a tile part header and expects a SOT marker */
J2K_STATE_TPH = 0x0010, /**< the decoding process is in a tile part header */
J2K_STATE_MT = 0x0020, /**< the EOC marker has just been read */
J2K_STATE_NEOC = 0x0040, /**< the decoding process must not expect a EOC marker because the codestream is truncated */
J2K_STATE_ERR = 0x0080 /**< the decoding process has encountered an error */
} J2K_STATUS;
 
/* ----------------------------------------------------------------------- */
 
/**
T2 encoding mode
*/
typedef enum T2_MODE {
THRESH_CALC = 0, /** Function called in Rate allocation process*/
FINAL_PASS = 1 /** Function called in Tier 2 process*/
}J2K_T2_MODE;
 
/**
Quantization stepsize
*/
typedef struct opj_stepsize {
/** exponent */
int expn;
/** mantissa */
int mant;
} opj_stepsize_t;
 
/**
Tile-component coding parameters
*/
typedef struct opj_tccp {
/** coding style */
int csty;
/** number of resolutions */
int numresolutions;
/** code-blocks width */
int cblkw;
/** code-blocks height */
int cblkh;
/** code-block coding style */
int cblksty;
/** discrete wavelet transform identifier */
int qmfbid;
/** quantisation style */
int qntsty;
/** stepsizes used for quantization */
opj_stepsize_t stepsizes[J2K_MAXBANDS];
/** number of guard bits */
int numgbits;
/** Region Of Interest shift */
int roishift;
/** precinct width */
int prcw[J2K_MAXRLVLS];
/** precinct height */
int prch[J2K_MAXRLVLS];
} opj_tccp_t;
 
/**
Tile coding parameters :
this structure is used to store coding/decoding parameters common to all
tiles (information like COD, COC in main header)
*/
typedef struct opj_tcp {
/** 1 : first part-tile of a tile */
int first;
/** coding style */
int csty;
/** progression order */
OPJ_PROG_ORDER prg;
/** number of layers */
int numlayers;
/** multi-component transform identifier */
int mct;
/** rates of layers */
float rates[100];
/** number of progression order changes */
int numpocs;
/** indicates if a POC marker has been used O:NO, 1:YES */
int POC;
/** progression order changes */
opj_poc_t pocs[32];
/** packet header store there for futur use in t2_decode_packet */
unsigned char *ppt_data;
/** pointer remaining on the first byte of the first header if ppt is used */
unsigned char *ppt_data_first;
/** If ppt == 1 --> there was a PPT marker for the present tile */
int ppt;
/** used in case of multiple marker PPT (number of info already stored) */
int ppt_store;
/** ppmbug1 */
int ppt_len;
/** add fixed_quality */
float distoratio[100];
/** tile-component coding parameters */
opj_tccp_t *tccps;
} opj_tcp_t;
 
/**
Coding parameters
*/
typedef struct opj_cp {
/** Digital cinema profile*/
OPJ_CINEMA_MODE cinema;
/** Maximum rate for each component. If == 0, component size limitation is not considered */
int max_comp_size;
/** Size of the image in bits*/
int img_size;
/** Rsiz*/
OPJ_RSIZ_CAPABILITIES rsiz;
/** Enabling Tile part generation*/
char tp_on;
/** Flag determining tile part generation*/
char tp_flag;
/** Position of tile part flag in progression order*/
int tp_pos;
/** allocation by rate/distortion */
int disto_alloc;
/** allocation by fixed layer */
int fixed_alloc;
/** add fixed_quality */
int fixed_quality;
/** if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */
int reduce;
/** if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */
int layer;
/** if == NO_LIMITATION, decode entire codestream; if == LIMIT_TO_MAIN_HEADER then only decode the main header */
OPJ_LIMIT_DECODING limit_decoding;
/** XTOsiz */
int tx0;
/** YTOsiz */
int ty0;
/** XTsiz */
int tdx;
/** YTsiz */
int tdy;
/** comment for coding */
char *comment;
/** number of tiles in width */
int tw;
/** number of tiles in heigth */
int th;
/** ID number of the tiles present in the codestream */
int *tileno;
/** size of the vector tileno */
int tileno_size;
/** packet header store there for futur use in t2_decode_packet */
unsigned char *ppm_data;
/** pointer remaining on the first byte of the first header if ppm is used */
unsigned char *ppm_data_first;
/** if ppm == 1 --> there was a PPM marker for the present tile */
int ppm;
/** use in case of multiple marker PPM (number of info already store) */
int ppm_store;
/** use in case of multiple marker PPM (case on non-finished previous info) */
int ppm_previous;
/** ppmbug1 */
int ppm_len;
/** tile coding parameters */
opj_tcp_t *tcps;
/** fixed layer */
int *matrice;
/* UniPG>> */
#ifdef USE_JPWL
/** enables writing of EPC in MH, thus activating JPWL */
bool epc_on;
/** enables writing of EPB, in case of activated JPWL */
bool epb_on;
/** enables writing of ESD, in case of activated JPWL */
bool esd_on;
/** enables writing of informative techniques of ESD, in case of activated JPWL */
bool info_on;
/** enables writing of RED, in case of activated JPWL */
bool red_on;
/** error protection method for MH (0,1,16,32,37-128) */
int hprot_MH;
/** tile number of header protection specification (>=0) */
int hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS];
/** error protection methods for TPHs (0,1,16,32,37-128) */
int hprot_TPH[JPWL_MAX_NO_TILESPECS];
/** tile number of packet protection specification (>=0) */
int pprot_tileno[JPWL_MAX_NO_PACKSPECS];
/** packet number of packet protection specification (>=0) */
int pprot_packno[JPWL_MAX_NO_PACKSPECS];
/** error protection methods for packets (0,1,16,32,37-128) */
int pprot[JPWL_MAX_NO_PACKSPECS];
/** enables writing of ESD, (0/2/4 bytes) */
int sens_size;
/** sensitivity addressing size (0=auto/2/4 bytes) */
int sens_addr;
/** sensitivity range (0-3) */
int sens_range;
/** sensitivity method for MH (-1,0-7) */
int sens_MH;
/** tile number of sensitivity specification (>=0) */
int sens_TPH_tileno[JPWL_MAX_NO_TILESPECS];
/** sensitivity methods for TPHs (-1,0-7) */
int sens_TPH[JPWL_MAX_NO_TILESPECS];
/** enables JPWL correction at the decoder */
bool correct;
/** expected number of components at the decoder */
int exp_comps;
/** maximum number of tiles at the decoder */
int max_tiles;
#endif /* USE_JPWL */
/* <<UniPG */
} opj_cp_t;
 
/**
JPEG-2000 codestream reader/writer
*/
typedef struct opj_j2k {
/** codec context */
opj_common_ptr cinfo;
 
/** locate in which part of the codestream the decoder is (main header, tile header, end) */
int state;
/** number of the tile curently concern by coding/decoding */
int curtileno;
/** Tile part number*/
int tp_num;
/** Tilepart number currently coding*/
int cur_tp_num;
/** Total number of tileparts of the current tile*/
int *cur_totnum_tp;
/**
locate the start position of the TLM marker
after encoding the tilepart, a jump (in j2k_write_sod) is done to the TLM marker to store the value of its length.
*/
int tlm_start;
/** Total num of tile parts in whole image = num tiles* num tileparts in each tile*/
/** used in TLMmarker*/
int totnum_tp;
/**
locate the position of the end of the tile in the codestream,
used to detect a truncated codestream (in j2k_read_sod)
*/
unsigned char *eot;
/**
locate the start position of the SOT marker of the current coded tile:
after encoding the tile, a jump (in j2k_write_sod) is done to the SOT marker to store the value of its length.
*/
int sot_start;
int sod_start;
/**
as the J2K-file is written in several parts during encoding,
it enables to make the right correction in position return by cio_tell
*/
int pos_correction;
/** array used to store the data of each tile */
unsigned char **tile_data;
/** array used to store the length of each tile */
int *tile_len;
/**
decompression only :
store decoding parameters common to all tiles (information like COD, COC in main header)
*/
opj_tcp_t *default_tcp;
/** pointer to the encoded / decoded image */
opj_image_t *image;
/** pointer to the coding parameters */
opj_cp_t *cp;
/** helper used to write the index file */
opj_codestream_info_t *cstr_info;
/** pointer to the byte i/o stream */
opj_cio_t *cio;
} opj_j2k_t;
 
/** @name Exported functions */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Creates a J2K decompression structure
@param cinfo Codec context info
@return Returns a handle to a J2K decompressor if successful, returns NULL otherwise
*/
opj_j2k_t* j2k_create_decompress(opj_common_ptr cinfo);
/**
Destroy a J2K decompressor handle
@param j2k J2K decompressor handle to destroy
*/
void j2k_destroy_decompress(opj_j2k_t *j2k);
/**
Setup the decoder decoding parameters using user parameters.
Decoding parameters are returned in j2k->cp.
@param j2k J2K decompressor handle
@param parameters decompression parameters
*/
void j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters);
/**
Decode an image from a JPEG-2000 codestream
@param j2k J2K decompressor handle
@param cio Input buffer stream
@param cstr_info Codestream information structure if required, NULL otherwise
@return Returns a decoded image if successful, returns NULL otherwise
*/
opj_image_t* j2k_decode(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info);
/**
Decode an image form a JPT-stream (JPEG 2000, JPIP)
@param j2k J2K decompressor handle
@param cio Input buffer stream
@param cstr_info Codestream information structure if required, NULL otherwise
@return Returns a decoded image if successful, returns NULL otherwise
*/
opj_image_t* j2k_decode_jpt_stream(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info);
/**
Creates a J2K compression structure
@param cinfo Codec context info
@return Returns a handle to a J2K compressor if successful, returns NULL otherwise
*/
opj_j2k_t* j2k_create_compress(opj_common_ptr cinfo);
/**
Destroy a J2K compressor handle
@param j2k J2K compressor handle to destroy
*/
void j2k_destroy_compress(opj_j2k_t *j2k);
/**
Setup the encoder parameters using the current image and using user parameters.
Coding parameters are returned in j2k->cp.
@param j2k J2K compressor handle
@param parameters compression parameters
@param image input filled image
*/
void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, opj_image_t *image);
/**
Converts an enum type progression order to string type
*/
char *j2k_convert_progression_order(OPJ_PROG_ORDER prg_order);
/**
Encode an image into a JPEG-2000 codestream
@param j2k J2K compressor handle
@param cio Output buffer stream
@param image Image to encode
@param cstr_info Codestream information structure if required, NULL otherwise
@return Returns true if successful, returns false otherwise
*/
bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info);
 
/* ----------------------------------------------------------------------- */
/*@}*/
 
/*@}*/
 
#endif /* __J2K_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/include/j2k_lib.h
0,0 → 1,54
/*
* Copyright (c) 2005, Hervé Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __J2K_LIB_H
#define __J2K_LIB_H
/**
@file j2k_lib.h
@brief Internal functions
 
The functions in J2K_LIB.C are internal utilities mainly used for timing.
*/
 
/** @defgroup MISC MISC - Miscellaneous internal functions */
/*@{*/
 
/** @name Exported functions */
/*@{*/
/* ----------------------------------------------------------------------- */
 
/**
Difference in successive opj_clock() calls tells you the elapsed time
@return Returns time in seconds
*/
double opj_clock(void);
 
/* ----------------------------------------------------------------------- */
/*@}*/
 
/*@}*/
 
#endif /* __J2K_LIB_H */
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/include/jbig2.h
0,0 → 1,135
/*
jbig2dec
 
Copyright (C) 2002-2005 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
#ifdef __cplusplus
extern "C" {
#endif
 
#ifndef _JBIG2_H
#define _JBIG2_H
 
/* warning levels */
typedef enum {
JBIG2_SEVERITY_DEBUG,
JBIG2_SEVERITY_INFO,
JBIG2_SEVERITY_WARNING,
JBIG2_SEVERITY_FATAL
} Jbig2Severity;
 
typedef enum {
JBIG2_OPTIONS_EMBEDDED = 1
} Jbig2Options;
 
/* forward public structure declarations */
typedef struct _Jbig2Allocator Jbig2Allocator;
typedef struct _Jbig2Ctx Jbig2Ctx;
typedef struct _Jbig2GlobalCtx Jbig2GlobalCtx;
typedef struct _Jbig2Segment Jbig2Segment;
typedef struct _Jbig2Image Jbig2Image;
 
/* private structures */
typedef struct _Jbig2Page Jbig2Page;
typedef struct _Jbig2SymbolDictionary Jbig2SymbolDictionary;
 
/*
this is the general image structure used by the jbig2dec library
images are 1 bpp, packed into rows a byte at a time. stride gives
the byte offset to the next row, while width and height define
the size of the image area in pixels.
*/
 
struct _Jbig2Image {
int width, height, stride;
uint8_t *data;
int refcount;
};
 
Jbig2Image* jbig2_image_new(Jbig2Ctx *ctx, int width, int height);
Jbig2Image* jbig2_image_clone(Jbig2Ctx *ctx, Jbig2Image *image);
void jbig2_image_release(Jbig2Ctx *ctx, Jbig2Image *image);
void jbig2_image_free(Jbig2Ctx *ctx, Jbig2Image *image);
void jbig2_image_clear(Jbig2Ctx *ctx, Jbig2Image *image, int value);
Jbig2Image *jbig2_image_resize(Jbig2Ctx *ctx, Jbig2Image *image,
int width, int height);
 
/* errors are returned from the library via a callback. If no callback
is provided (a NULL argument is passed ot jbig2_ctx_new) a default
handler is used which prints fatal errors to the stderr stream. */
 
/* error callback */
typedef int (*Jbig2ErrorCallback) (void *data,
const char *msg, Jbig2Severity severity,
int32_t seg_idx);
 
/* memory allocation is likewise done via a set of callbacks so that
clients can better control memory usage. If a NULL is passed for
this argumennt of jbig2_ctx_new, a default allocator based on malloc()
is used. */
 
/* dynamic memory callbacks */
struct _Jbig2Allocator {
void *(*alloc) (Jbig2Allocator *allocator, size_t size);
void (*free) (Jbig2Allocator *allocator, void *p);
void *(*realloc) (Jbig2Allocator *allocator, void *p, size_t size);
};
 
/* decoder context */
Jbig2Ctx *jbig2_ctx_new (Jbig2Allocator *allocator,
Jbig2Options options,
Jbig2GlobalCtx *global_ctx,
Jbig2ErrorCallback error_callback,
void *error_callback_data);
void jbig2_ctx_free (Jbig2Ctx *ctx);
 
/* global context for embedded streams */
Jbig2GlobalCtx *jbig2_make_global_ctx (Jbig2Ctx *ctx);
void jbig2_global_ctx_free (Jbig2GlobalCtx *global_ctx);
 
/* submit data to the decoder */
int jbig2_data_in (Jbig2Ctx *ctx, const unsigned char *data, size_t size);
 
/* get the next available decoded page image. NULL means there isn't one. */
Jbig2Image *jbig2_page_out (Jbig2Ctx *ctx);
/* mark a returned page image as no longer needed. */
int jbig2_release_page (Jbig2Ctx *ctx, Jbig2Image *image);
/* mark the current page as complete, simulating an end-of-page segment (for broken streams) */
int jbig2_complete_page (Jbig2Ctx *ctx);
 
 
/* segment header routines */
 
struct _Jbig2Segment {
uint32_t number;
uint8_t flags;
uint32_t page_association;
size_t data_length;
int referred_to_segment_count;
uint32_t *referred_to_segments;
void *result;
};
 
Jbig2Segment *jbig2_parse_segment_header (Jbig2Ctx *ctx, uint8_t *buf, size_t buf_size,
size_t *p_header_size);
int jbig2_parse_segment (Jbig2Ctx *ctx, Jbig2Segment *segment,
const uint8_t *segment_data);
void jbig2_free_segment (Jbig2Ctx *ctx, Jbig2Segment *segment);
 
Jbig2Segment *jbig2_find_segment(Jbig2Ctx *ctx, uint32_t number);
 
#endif /* _JBIG2_H */
 
#ifdef __cplusplus
}
#endif
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/include/jbig2_arith.h
0,0 → 1,31
/*
jbig2dec
 
Copyright (C) 2001 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
typedef struct _Jbig2ArithState Jbig2ArithState;
 
/* An arithmetic coding context is stored as a single byte, with the
index in the low order 7 bits (actually only 6 are used), and the
MPS in the top bit. */
typedef unsigned char Jbig2ArithCx;
 
/* allocate and initialize a new arithmetic coding state */
Jbig2ArithState *
jbig2_arith_new (Jbig2Ctx *ctx, Jbig2WordStream *ws);
 
/* decode a bit */
bool
jbig2_arith_decode (Jbig2ArithState *as, Jbig2ArithCx *pcx);
 
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/include/jbig2_arith_iaid.h
0,0 → 1,26
/*
jbig2dec
 
Copyright (C) 2001 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
typedef struct _Jbig2ArithIaidCtx Jbig2ArithIaidCtx;
 
Jbig2ArithIaidCtx *
jbig2_arith_iaid_ctx_new(Jbig2Ctx *ctx, int SBSYMCODELEN);
 
int
jbig2_arith_iaid_decode(Jbig2ArithIaidCtx *ctx, Jbig2ArithState *as,
int32_t *p_result);
 
void
jbig2_arith_iaid_ctx_free(Jbig2Ctx *ctx, Jbig2ArithIaidCtx *iax);
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/include/jbig2_arith_int.h
0,0 → 1,26
/*
jbig2dec
 
Copyright (C) 2001 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
typedef struct _Jbig2ArithIntCtx Jbig2ArithIntCtx;
 
Jbig2ArithIntCtx *
jbig2_arith_int_ctx_new(Jbig2Ctx *ctx);
 
int
jbig2_arith_int_decode(Jbig2ArithIntCtx *ctx, Jbig2ArithState *as,
int32_t *p_result);
 
void
jbig2_arith_int_ctx_free(Jbig2Ctx *ctx, Jbig2ArithIntCtx *iax);
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/include/jbig2_generic.h
0,0 → 1,62
/*
jbig2dec
 
Copyright (C) 2002-2004 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
/**
* Headers for Generic and Generic Refinement region handling
**/
 
/* 6.4 Table 2 */
typedef struct {
bool MMR;
/* GBW */
/* GBH */
int GBTEMPLATE;
bool TPGDON;
bool USESKIP;
/* SKIP */
int8_t gbat[8];
} Jbig2GenericRegionParams;
 
/* return the appropriate context size for the given template */
int
jbig2_generic_stats_size(Jbig2Ctx *ctx, int template);
 
int
jbig2_decode_generic_region(Jbig2Ctx *ctx,
Jbig2Segment *segment,
const Jbig2GenericRegionParams *params,
Jbig2ArithState *as,
Jbig2Image *image,
Jbig2ArithCx *GB_stats);
 
 
/* 6.3 Table 6 */
typedef struct {
/* GRW */
/* GRH */
bool GRTEMPLATE;
Jbig2Image *reference;
int32_t DX, DY;
bool TPGRON;
int8_t grat[4];
} Jbig2RefinementRegionParams;
 
int
jbig2_decode_refinement_region(Jbig2Ctx *ctx,
Jbig2Segment *segment,
const Jbig2RefinementRegionParams *params,
Jbig2ArithState *as,
Jbig2Image *image,
Jbig2ArithCx *GB_stats);
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/include/jbig2_huffman.h
0,0 → 1,105
/*
jbig2dec
 
Copyright (C) 2001-2005 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
#ifndef JBIG2_HUFFMAN_H
#define JBIG2_HUFFMAN_H
 
/* Huffman coder interface */
 
typedef struct _Jbig2HuffmanEntry Jbig2HuffmanEntry;
typedef struct _Jbig2HuffmanState Jbig2HuffmanState;
typedef struct _Jbig2HuffmanTable Jbig2HuffmanTable;
typedef struct _Jbig2HuffmanParams Jbig2HuffmanParams;
 
struct _Jbig2HuffmanEntry {
union {
int32_t RANGELOW;
Jbig2HuffmanTable *ext_table;
} u;
byte PREFLEN;
byte RANGELEN;
byte flags;
};
 
struct _Jbig2HuffmanTable {
int log_table_size;
Jbig2HuffmanEntry *entries;
};
 
typedef struct _Jbig2HuffmanLine Jbig2HuffmanLine;
 
struct _Jbig2HuffmanLine {
int PREFLEN;
int RANGELEN;
int RANGELOW;
};
 
struct _Jbig2HuffmanParams {
bool HTOOB;
int n_lines;
const Jbig2HuffmanLine *lines;
};
 
Jbig2HuffmanState *
jbig2_huffman_new (Jbig2Ctx *ctx, Jbig2WordStream *ws);
 
void
jbig2_huffman_free (Jbig2Ctx *ctx, Jbig2HuffmanState *hs);
 
void
jbig2_huffman_skip(Jbig2HuffmanState *hs);
 
void jbig2_huffman_advance(Jbig2HuffmanState *hs, int offset);
 
int
jbig2_huffman_offset(Jbig2HuffmanState *hs);
 
int32_t
jbig2_huffman_get (Jbig2HuffmanState *hs,
const Jbig2HuffmanTable *table, bool *oob);
 
int32_t
jbig2_huffman_get_bits (Jbig2HuffmanState *hs, const int bits);
 
#ifdef JBIG2_DEBUG
void jbig2_dump_huffman_state(Jbig2HuffmanState *hs);
void jbig2_dump_huffman_binary(Jbig2HuffmanState *hs);
#endif
 
Jbig2HuffmanTable *
jbig2_build_huffman_table (Jbig2Ctx *ctx, const Jbig2HuffmanParams *params);
 
void
jbig2_release_huffman_table (Jbig2Ctx *ctx, Jbig2HuffmanTable *table);
 
/* standard Huffman templates defined by the specification */
extern const Jbig2HuffmanParams jbig2_huffman_params_A; /* Table B.1 */
extern const Jbig2HuffmanParams jbig2_huffman_params_B; /* Table B.2 */
extern const Jbig2HuffmanParams jbig2_huffman_params_C; /* Table B.3 */
extern const Jbig2HuffmanParams jbig2_huffman_params_D; /* Table B.4 */
extern const Jbig2HuffmanParams jbig2_huffman_params_E; /* Table B.5 */
extern const Jbig2HuffmanParams jbig2_huffman_params_F; /* Table B.6 */
extern const Jbig2HuffmanParams jbig2_huffman_params_G; /* Table B.7 */
extern const Jbig2HuffmanParams jbig2_huffman_params_H; /* Table B.8 */
extern const Jbig2HuffmanParams jbig2_huffman_params_I; /* Table B.9 */
extern const Jbig2HuffmanParams jbig2_huffman_params_J; /* Table B.10 */
extern const Jbig2HuffmanParams jbig2_huffman_params_K; /* Table B.11 */
extern const Jbig2HuffmanParams jbig2_huffman_params_L; /* Table B.12 */
extern const Jbig2HuffmanParams jbig2_huffman_params_M; /* Table B.13 */
extern const Jbig2HuffmanParams jbig2_huffman_params_N; /* Table B.14 */
extern const Jbig2HuffmanParams jbig2_huffman_params_O; /* Table B.15 */
 
 
#endif /* JBIG2_HUFFMAN_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/include/jbig2_hufftab.h
0,0 → 1,335
/*
jbig2dec
 
Copyright (C) 2001-2005 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
/* predefined Huffman table definitions
-- See Annex B of the JBIG2 specification */
 
#ifndef JBIG2_HUFFTAB_H
#define JBIG2_HUFFTAB_H
 
/* types are in jbig2_huffman.h, you must include that first */
 
 
/* Table B.1 */
const Jbig2HuffmanLine
jbig2_huffman_lines_A[] = {
{ 1, 4, 0 },
{ 2, 8, 16 },
{ 3, 16, 272 },
{ 0, 32, -1 }, /* low */
{ 3, 32, 65808 } /* high */
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_A = { FALSE, 5, jbig2_huffman_lines_A };
 
/* Table B.2 */
const Jbig2HuffmanLine
jbig2_huffman_lines_B[] = {
{ 1, 0, 0 },
{ 2, 0, 1 },
{ 3, 0, 2 },
{ 4, 3, 3 },
{ 5, 6, 11 },
{ 0, 32, -1 }, /* low */
{ 6, 32, 75 }, /* high */
{ 6, 0, 0 }
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_B = { TRUE, 8, jbig2_huffman_lines_B };
 
/* Table B.3 */
const Jbig2HuffmanLine
jbig2_huffman_lines_C[] = {
{ 8, 8, -256 },
{ 1, 0, 0 },
{ 2, 0, 1 },
{ 3, 0, 2 },
{ 4, 3, 3 },
{ 5, 6, 11 },
{ 8, 32, -257 }, /* low */
{ 7, 32, 75 }, /* high */
{ 6, 0, 0 } /* OOB */
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_C = { TRUE, 9, jbig2_huffman_lines_C };
 
/* Table B.4 */
const Jbig2HuffmanLine
jbig2_huffman_lines_D[] = {
{ 1, 0, 1 },
{ 2, 0, 2 },
{ 3, 0, 3 },
{ 4, 3, 4 },
{ 5, 6, 12 },
{ 0, 32, -1 }, /* low */
{ 5, 32, 76 }, /* high */
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_D = { FALSE, 7, jbig2_huffman_lines_D };
 
/* Table B.5 */
const Jbig2HuffmanLine
jbig2_huffman_lines_E[] = {
{7, 8, -255},
{1, 0, 1},
{2, 0, 2},
{3, 0, 3},
{4, 3, 4},
{5, 6, 12},
{7, 32, -256}, /* low */
{6, 32, 76} /* high */
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_E = { FALSE, 8, jbig2_huffman_lines_E };
 
/* Table B.6 */
const Jbig2HuffmanLine
jbig2_huffman_lines_F[] = {
{5, 10, -2048},
{4, 9, -1024},
{4, 8, -512},
{4, 7, -256},
{5, 6, -128},
{5, 5, -64},
{4, 5, -32},
{2, 7, 0},
{3, 7, 128},
{3, 8, 256},
{4, 9, 512},
{4, 10, 1024},
{6, 32, -2049}, /* low */
{6, 32, 2048} /* high */
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_F = { FALSE, 14, jbig2_huffman_lines_F };
 
/* Table B.7 */
const Jbig2HuffmanLine
jbig2_huffman_lines_G[] = {
{4, 9, -1024},
{3, 8, -512},
{4, 7, -256},
{5, 6, -128},
{5, 5, -64},
{4, 5, -32},
{4, 5, 0},
{5, 5, 32},
{5, 6, 64},
{4, 7, 128},
{3, 8, 256},
{3, 9, 512},
{3, 10, 1024},
{5, 32, -1025}, /* low */
{5, 32, 2048} /* high */
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_G = { FALSE, 15, jbig2_huffman_lines_G };
 
/* Table B.8 */
const Jbig2HuffmanLine
jbig2_huffman_lines_H[] = {
{8, 3, -15},
{9, 1, -7},
{8, 1, -5},
{9, 0, -3},
{7, 0, -2},
{4, 0, -1},
{2, 1, 0},
{5, 0, 2},
{6, 0, 3},
{3, 4, 4},
{6, 1, 20},
{4, 4, 22},
{4, 5, 38},
{5, 6, 70},
{5, 7, 134},
{6, 7, 262},
{7, 8, 390},
{6, 10, 646},
{9, 32, -16}, /* low */
{9, 32, 1670}, /* high */
{2, 0, 0} /* OOB */
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_H = { TRUE, 21, jbig2_huffman_lines_H };
 
/* Table B.9 */
const Jbig2HuffmanLine
jbig2_huffman_lines_I[] = {
{8, 4, -31},
{9, 2, -15},
{8, 2, -11},
{9, 1, -7},
{7, 1, -5},
{4, 1, -3},
{3, 1, -1},
{3, 1, 1},
{5, 1, 3},
{6, 1, 5},
{3, 5, 7},
{6, 2, 39},
{4, 5, 43},
{4, 6, 75},
{5, 7, 139},
{5, 8, 267},
{6, 8, 523},
{7, 9, 779},
{6, 11, 1291},
{9, 32, -32}, /* low */
{9, 32, 3339}, /* high */
{2, 0, 0} /* OOB */
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_I = { TRUE, 22, jbig2_huffman_lines_I };
 
/* Table B.10 */
const Jbig2HuffmanLine
jbig2_huffman_lines_J[] = {
{7, 4, -21},
{8, 0, -5},
{7, 0, -4},
{5, 0, -3},
{2, 2, -2},
{5, 0, 2},
{6, 0, 3},
{7, 0, 4},
{8, 0, 5},
{2, 6, 6},
{5, 5, 70},
{6, 5, 102},
{6, 6, 134},
{6, 7, 198},
{6, 8, 326},
{6, 9, 582},
{6, 10, 1094},
{7, 11, 2118},
{8, 32, -22}, /* low */
{8, 32, 4166}, /* high */
{2, 0, 0} /* OOB */
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_J = { TRUE, 21, jbig2_huffman_lines_J };
 
/* Table B.11 */
const Jbig2HuffmanLine
jbig2_huffman_lines_K[] = {
{1, 0, 1},
{2, 1, 2},
{4, 0, 3},
{4, 1, 5},
{5, 1, 7},
{5, 2, 9},
{6, 2, 13},
{7, 2, 17},
{7, 3, 21},
{7, 4, 29},
{7, 5, 45},
{7, 6, 77},
{7, 32, 141} /* high */
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_K = { FALSE, 13, jbig2_huffman_lines_K };
 
/* Table B.12 */
const Jbig2HuffmanLine
jbig2_huffman_lines_L[] = {
{1, 0, 1},
{2, 0, 2},
{3, 1, 3},
{5, 0, 5},
{5, 1, 6},
{6, 1, 8},
{7, 0, 10},
{7, 1, 11},
{7, 2, 13},
{7, 3, 17},
{7, 4, 25},
{8, 5, 41},
{8, 32, 73}
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_L = { FALSE, 13, jbig2_huffman_lines_L };
 
 
/* Table B.13 */
const Jbig2HuffmanLine
jbig2_huffman_lines_M[] = {
{1, 0, 1},
{3, 0, 2},
{4, 0, 3},
{5, 0, 4},
{4, 1, 5},
{3, 3, 7},
{6, 1, 15},
{6, 2, 17},
{6, 3, 21},
{6, 4, 29},
{6, 5, 45},
{7, 6, 77},
{7, 32, 141} /* high */
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_M = { FALSE, 13, jbig2_huffman_lines_M };
 
/* Table B.14 */
const Jbig2HuffmanLine
jbig2_huffman_lines_N[] = {
{ 3, 0, -2 },
{ 3, 0, -1 },
{ 1, 0, 0 },
{ 3, 3, 1 },
{ 3, 6, 2 },
{ 0, 32, -1 }, /* low */
{ 0, 32, 3 }, /* high */
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_N = { FALSE, 7, jbig2_huffman_lines_N };
 
/* Table B.15 */
const Jbig2HuffmanLine
jbig2_huffman_lines_O[] = {
{7, 4, -24},
{6, 2, -8},
{5, 1, -4},
{4, 0, -2},
{3, 0, -1},
{1, 0, 0},
{3, 0, 1},
{4, 0, 2},
{5, 1, 3},
{6, 2, 5},
{7, 4, 9},
{7, 32, -25}, /* low */
{7, 32, 25} /* high */
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_O = { FALSE, 13, jbig2_huffman_lines_O };
 
#endif /* JBIG2_HUFFTAB_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/include/jbig2_image.h
0,0 → 1,38
/*
jbig2dec
 
Copyright (C) 2001-2002 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
 
#ifndef _JBIG2_IMAGE_H
#define _JBIG2_IMAGE_H
 
int jbig2_image_get_pixel(Jbig2Image *image, int x, int y);
int jbig2_image_set_pixel(Jbig2Image *image, int x, int y, int value);
 
/* routines for dumping the image data in various formats */
/* FIXME: should these be in the client instead? */
 
#include <stdio.h>
 
int jbig2_image_write_pbm_file(Jbig2Image *image, char *filename);
int jbig2_image_write_pbm(Jbig2Image *image, FILE *out);
Jbig2Image *jbig2_image_read_pbm_file(Jbig2Ctx *ctx, char *filename);
Jbig2Image *jbig2_image_read_pbm(Jbig2Ctx *ctx, FILE *in);
 
#ifdef HAVE_LIBPNG
int jbig2_image_write_png_file(Jbig2Image *image, char *filename);
int jbig2_image_write_png(Jbig2Image *image, FILE *out);
#endif
 
#endif /* _JBIG2_IMAGE_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/include/jbig2_metadata.h
0,0 → 1,48
/*
jbig2dec
 
Copyright (C) 2003 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
 
#ifndef _JBIG2_METADATA_H
#define _JBIG2_METADATA_H
 
/* metadata from extension segments */
 
/* these bits should be moved to jbig2.h for public access */
typedef enum {
JBIG2_ENCODING_ASCII,
JBIG2_ENCODING_UCS16
} Jbig2Encoding;
 
typedef struct _Jbig2Metadata Jbig2Metadata;
 
Jbig2Metadata *jbig2_metadata_new(Jbig2Ctx *ctx, Jbig2Encoding encoding);
void jbig2_metadata_free(Jbig2Ctx *ctx, Jbig2Metadata *md);
int jbig2_metadata_add(Jbig2Ctx *ctx, Jbig2Metadata *md,
const char *key, const int key_length,
const char *value, const int value_length);
 
struct _Jbig2Metadata {
Jbig2Encoding encoding;
char **keys, **values;
int entries, max_entries;
};
 
/* these bits can go to jbig2_priv.h */
int jbig2_comment_ascii(Jbig2Ctx *ctx, Jbig2Segment *segment,
const uint8_t *segment_data);
int jbig2_comment_unicode(Jbig2Ctx *ctx, Jbig2Segment *segment,
const uint8_t *segment_data);
 
#endif /* _JBIG2_METADATA_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/include/jbig2_mmr.h
0,0 → 1,22
/*
jbig2dec
 
Copyright (C) 2001 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
int
jbig2_decode_generic_mmr(Jbig2Ctx *ctx,
Jbig2Segment *segment,
const Jbig2GenericRegionParams *params,
const byte *data, size_t size,
Jbig2Image *image);
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/include/jbig2_priv.h
0,0 → 1,177
/*
jbig2dec
 
Copyright (C) 2002 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
/* library internals */
 
typedef uint8_t byte;
typedef int bool;
 
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
 
#ifndef NULL
#define NULL ((void*)0)
#endif
 
typedef enum {
JBIG2_FILE_HEADER,
JBIG2_FILE_SEQUENTIAL_HEADER,
JBIG2_FILE_SEQUENTIAL_BODY,
JBIG2_FILE_RANDOM_HEADERS,
JBIG2_FILE_RANDOM_BODIES,
JBIG2_FILE_EOF
} Jbig2FileState;
 
struct _Jbig2Ctx {
Jbig2Allocator *allocator;
Jbig2Options options;
const Jbig2Ctx *global_ctx;
Jbig2ErrorCallback error_callback;
void *error_callback_data;
 
byte *buf;
size_t buf_size;
unsigned int buf_rd_ix;
unsigned int buf_wr_ix;
 
Jbig2FileState state;
 
uint8_t file_header_flags;
int32_t n_pages;
 
int n_segments_max;
Jbig2Segment **segments;
int n_segments; /* index of last segment header parsed */
int segment_index; /* index of last segment body parsed */
 
/* list of decoded pages, including the one in progress,
currently stored as a contiguous, 0-indexed array. */
int current_page;
int max_page_index;
Jbig2Page *pages;
};
 
int32_t
jbig2_get_int32 (const byte *buf);
 
int16_t
jbig2_get_int16 (const byte *buf);
 
/* dynamic memory management */
void *
jbig2_alloc (Jbig2Allocator *allocator, size_t size);
 
void
jbig2_free (Jbig2Allocator *allocator, void *p);
 
void *
jbig2_realloc (Jbig2Allocator *allocator, void *p, size_t size);
 
#define jbig2_new(ctx, t, size) ((t *)jbig2_alloc(ctx->allocator, (size) * sizeof(t)))
 
#define jbig2_renew(ctx, p, t, size) ((t *)jbig2_realloc(ctx->allocator, (p), (size) * sizeof(t)))
 
int
jbig2_error (Jbig2Ctx *ctx, Jbig2Severity severity, int32_t seg_idx,
const char *fmt, ...);
 
/* the page structure handles decoded page
results. it's allocated by a 'page info'
segement and marked complete by an 'end of page'
segment.
*/
typedef enum {
JBIG2_PAGE_FREE,
JBIG2_PAGE_NEW,
JBIG2_PAGE_COMPLETE,
JBIG2_PAGE_RETURNED,
JBIG2_PAGE_RELEASED
} Jbig2PageState;
 
struct _Jbig2Page {
Jbig2PageState state;
uint32_t number;
uint32_t height, width; /* in pixels */
uint32_t x_resolution,
y_resolution; /* in pixels per meter */
uint16_t stripe_size;
bool striped;
int end_row;
uint8_t flags;
Jbig2Image *image;
};
 
int jbig2_page_info (Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data);
int jbig2_end_of_stripe(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data);
int jbig2_end_of_page(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data);
int jbig2_extension_segment(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data);
 
typedef enum {
JBIG2_COMPOSE_OR = 0,
JBIG2_COMPOSE_AND = 1,
JBIG2_COMPOSE_XOR = 2,
JBIG2_COMPOSE_XNOR = 3,
JBIG2_COMPOSE_REPLACE = 4
} Jbig2ComposeOp;
 
int jbig2_image_compose(Jbig2Ctx *ctx, Jbig2Image *dst, Jbig2Image *src, int x, int y, Jbig2ComposeOp op);
int jbig2_page_add_result(Jbig2Ctx *ctx, Jbig2Page *page, Jbig2Image *src, int x, int y, Jbig2ComposeOp op);
 
/* region segment info */
 
typedef struct {
int32_t width;
int32_t height;
int32_t x;
int32_t y;
Jbig2ComposeOp op;
uint8_t flags;
} Jbig2RegionSegmentInfo;
 
void jbig2_get_region_segment_info(Jbig2RegionSegmentInfo *info, const uint8_t *segment_data);
int jbig2_text_region(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data);
 
/* 7.4 */
int jbig2_immediate_generic_region(Jbig2Ctx *ctx, Jbig2Segment *segment,
const uint8_t *segment_data);
int jbig2_refinement_region(Jbig2Ctx *ctx, Jbig2Segment *segment,
const byte *segment_data);
 
int jbig2_pattern_dictionary(Jbig2Ctx *ctx, Jbig2Segment *segment,
const byte *segment_data);
int jbig2_halftone_region(Jbig2Ctx *ctx, Jbig2Segment *segment,
const byte *segment_data);
 
 
/* The word stream design is a compromise between simplicity and
trying to amortize the number of method calls. Each ::get_next_word
invocation pulls 4 bytes from the stream, packed big-endian into a
32 bit word. The offset argument is provided as a convenience. It
begins at 0 and increments by 4 for each successive invocation. */
typedef struct _Jbig2WordStream Jbig2WordStream;
 
struct _Jbig2WordStream {
uint32_t (*get_next_word) (Jbig2WordStream *self, int offset);
};
 
Jbig2WordStream *
jbig2_word_stream_buf_new(Jbig2Ctx *ctx, const byte *data, size_t size);
 
void
jbig2_word_stream_buf_free(Jbig2Ctx *ctx, Jbig2WordStream *ws);
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/include/jbig2_symbol_dict.h
0,0 → 1,56
/*
jbig2dec
 
Copyright (C) 2001-2002 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
/* symbol dictionary header */
 
/* the results of decoding a symbol dictionary */
typedef struct {
int n_symbols;
Jbig2Image **glyphs;
} Jbig2SymbolDict;
 
/* decode a symbol dictionary segment and store the results */
int
jbig2_symbol_dictionary(Jbig2Ctx *ctx, Jbig2Segment *segment,
const byte *segment_data);
 
/* get a particular glyph by index */
Jbig2Image *
jbig2_sd_glyph(Jbig2SymbolDict *dict, unsigned int id);
 
/* return a new empty symbol dict */
Jbig2SymbolDict *
jbig2_sd_new(Jbig2Ctx *ctx, int n_symbols);
 
/* release the memory associated with a symbol dict */
void
jbig2_sd_release(Jbig2Ctx *ctx, Jbig2SymbolDict *dict);
 
/* generate a new symbol dictionary by concatenating a list of
existing dictionaries */
Jbig2SymbolDict *
jbig2_sd_cat(Jbig2Ctx *ctx, int n_dicts,
Jbig2SymbolDict **dicts);
 
/* count the number of dictionary segments referred
to by the given segment */
int
jbig2_sd_count_referred(Jbig2Ctx *ctx, Jbig2Segment *segment);
 
/* return an array of pointers to symbol dictionaries referred
to by a segment */
Jbig2SymbolDict **
jbig2_sd_list_referred(Jbig2Ctx *ctx, Jbig2Segment *segment);
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/include/jbig2_text.h
0,0 → 1,73
/*
jbig2dec
 
Copyright (C) 2002-2004 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
/**
* Headers for Text region handling
**/
 
typedef enum {
JBIG2_CORNER_BOTTOMLEFT = 0,
JBIG2_CORNER_TOPLEFT = 1,
JBIG2_CORNER_BOTTOMRIGHT = 2,
JBIG2_CORNER_TOPRIGHT = 3
} Jbig2RefCorner;
 
typedef struct {
bool SBHUFF;
bool SBREFINE;
bool SBDEFPIXEL;
Jbig2ComposeOp SBCOMBOP;
bool TRANSPOSED;
Jbig2RefCorner REFCORNER;
int SBDSOFFSET;
/* int SBW; */
/* int SBH; */
uint32_t SBNUMINSTANCES;
int LOGSBSTRIPS;
int SBSTRIPS;
/* int SBNUMSYMS; */
/* SBSYMCODES */
/* SBSYMCODELEN */
/* SBSYMS */
Jbig2HuffmanTable *SBHUFFFS;
Jbig2HuffmanTable *SBHUFFDS;
Jbig2HuffmanTable *SBHUFFDT;
Jbig2HuffmanTable *SBHUFFRDW;
Jbig2HuffmanTable *SBHUFFRDH;
Jbig2HuffmanTable *SBHUFFRDX;
Jbig2HuffmanTable *SBHUFFRDY;
Jbig2HuffmanTable *SBHUFFRSIZE;
Jbig2ArithIntCtx *IADT;
Jbig2ArithIntCtx *IAFS;
Jbig2ArithIntCtx *IADS;
Jbig2ArithIntCtx *IAIT;
Jbig2ArithIaidCtx *IAID;
Jbig2ArithIntCtx *IARI;
Jbig2ArithIntCtx *IARDW;
Jbig2ArithIntCtx *IARDH;
Jbig2ArithIntCtx *IARDX;
Jbig2ArithIntCtx *IARDY;
bool SBRTEMPLATE;
int8_t sbrat[4];
} Jbig2TextRegionParams;
 
int
jbig2_decode_text_region(Jbig2Ctx *ctx, Jbig2Segment *segment,
const Jbig2TextRegionParams *params,
const Jbig2SymbolDict * const *dicts, const int n_dicts,
Jbig2Image *image,
const byte *data, const size_t size,
Jbig2ArithCx *GR_stats,
Jbig2ArithState *as, Jbig2WordStream *ws);
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/include/jconfig.h
0,0 → 1,38
/* jconfig.dj --- jconfig.h for DJGPP (Delorie's GNU C port) on MS-DOS. */
/* see jconfig.doc for explanations */
 
#define HAVE_PROTOTYPES
#define HAVE_UNSIGNED_CHAR
#define HAVE_UNSIGNED_SHORT
/* #define void char */
/* #define const */
#undef CHAR_IS_UNSIGNED
#define HAVE_STDDEF_H
#define HAVE_STDLIB_H
#undef NEED_BSD_STRINGS
#undef NEED_SYS_TYPES_H
#undef NEED_FAR_POINTERS /* DJGPP uses flat 32-bit addressing */
#undef NEED_SHORT_EXTERNAL_NAMES
#undef INCOMPLETE_TYPES_BROKEN
 
#ifdef JPEG_INTERNALS
 
#undef RIGHT_SHIFT_IS_UNSIGNED
 
#endif /* JPEG_INTERNALS */
 
#ifdef JPEG_CJPEG_DJPEG
 
#define BMP_SUPPORTED /* BMP image file format */
#define GIF_SUPPORTED /* GIF image file format */
#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */
#undef RLE_SUPPORTED /* Utah RLE image file format */
#define TARGA_SUPPORTED /* Targa image file format */
 
#undef TWO_FILE_COMMANDLINE /* optional */
#define USE_SETMODE /* Needed to make one-file style work in DJGPP */
#undef NEED_SIGNAL_CATCHER /* Define this if you use jmemname.c */
#undef DONT_USE_B_MODE
#undef PROGRESS_REPORT /* optional */
 
#endif /* JPEG_CJPEG_DJPEG */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/include/jmorecfg.h
0,0 → 1,363
/*
* jmorecfg.h
*
* Copyright (C) 1991-1997, Thomas G. Lane.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
* This file contains additional configuration options that customize the
* JPEG software for special applications or support machine-dependent
* optimizations. Most users will not need to touch this file.
*/
 
 
/*
* Define BITS_IN_JSAMPLE as either
* 8 for 8-bit sample values (the usual setting)
* 12 for 12-bit sample values
* Only 8 and 12 are legal data precisions for lossy JPEG according to the
* JPEG standard, and the IJG code does not support anything else!
* We do not support run-time selection of data precision, sorry.
*/
 
#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */
 
 
/*
* Maximum number of components (color channels) allowed in JPEG image.
* To meet the letter of the JPEG spec, set this to 255. However, darn
* few applications need more than 4 channels (maybe 5 for CMYK + alpha
* mask). We recommend 10 as a reasonable compromise; use 4 if you are
* really short on memory. (Each allowed component costs a hundred or so
* bytes of storage, whether actually used in an image or not.)
*/
 
#define MAX_COMPONENTS 10 /* maximum number of image components */
 
 
/*
* Basic data types.
* You may need to change these if you have a machine with unusual data
* type sizes; for example, "char" not 8 bits, "short" not 16 bits,
* or "long" not 32 bits. We don't care whether "int" is 16 or 32 bits,
* but it had better be at least 16.
*/
 
/* Representation of a single sample (pixel element value).
* We frequently allocate large arrays of these, so it's important to keep
* them small. But if you have memory to burn and access to char or short
* arrays is very slow on your hardware, you might want to change these.
*/
 
#if BITS_IN_JSAMPLE == 8
/* JSAMPLE should be the smallest type that will hold the values 0..255.
* You can use a signed char by having GETJSAMPLE mask it with 0xFF.
*/
 
#ifdef HAVE_UNSIGNED_CHAR
 
typedef unsigned char JSAMPLE;
#define GETJSAMPLE(value) ((int) (value))
 
#else /* not HAVE_UNSIGNED_CHAR */
 
typedef char JSAMPLE;
#ifdef CHAR_IS_UNSIGNED
#define GETJSAMPLE(value) ((int) (value))
#else
#define GETJSAMPLE(value) ((int) (value) & 0xFF)
#endif /* CHAR_IS_UNSIGNED */
 
#endif /* HAVE_UNSIGNED_CHAR */
 
#define MAXJSAMPLE 255
#define CENTERJSAMPLE 128
 
#endif /* BITS_IN_JSAMPLE == 8 */
 
 
#if BITS_IN_JSAMPLE == 12
/* JSAMPLE should be the smallest type that will hold the values 0..4095.
* On nearly all machines "short" will do nicely.
*/
 
typedef short JSAMPLE;
#define GETJSAMPLE(value) ((int) (value))
 
#define MAXJSAMPLE 4095
#define CENTERJSAMPLE 2048
 
#endif /* BITS_IN_JSAMPLE == 12 */
 
 
/* Representation of a DCT frequency coefficient.
* This should be a signed value of at least 16 bits; "short" is usually OK.
* Again, we allocate large arrays of these, but you can change to int
* if you have memory to burn and "short" is really slow.
*/
 
typedef short JCOEF;
 
 
/* Compressed datastreams are represented as arrays of JOCTET.
* These must be EXACTLY 8 bits wide, at least once they are written to
* external storage. Note that when using the stdio data source/destination
* managers, this is also the data type passed to fread/fwrite.
*/
 
#ifdef HAVE_UNSIGNED_CHAR
 
typedef unsigned char JOCTET;
#define GETJOCTET(value) (value)
 
#else /* not HAVE_UNSIGNED_CHAR */
 
typedef char JOCTET;
#ifdef CHAR_IS_UNSIGNED
#define GETJOCTET(value) (value)
#else
#define GETJOCTET(value) ((value) & 0xFF)
#endif /* CHAR_IS_UNSIGNED */
 
#endif /* HAVE_UNSIGNED_CHAR */
 
 
/* These typedefs are used for various table entries and so forth.
* They must be at least as wide as specified; but making them too big
* won't cost a huge amount of memory, so we don't provide special
* extraction code like we did for JSAMPLE. (In other words, these
* typedefs live at a different point on the speed/space tradeoff curve.)
*/
 
/* UINT8 must hold at least the values 0..255. */
 
#ifdef HAVE_UNSIGNED_CHAR
typedef unsigned char UINT8;
#else /* not HAVE_UNSIGNED_CHAR */
#ifdef CHAR_IS_UNSIGNED
typedef char UINT8;
#else /* not CHAR_IS_UNSIGNED */
typedef short UINT8;
#endif /* CHAR_IS_UNSIGNED */
#endif /* HAVE_UNSIGNED_CHAR */
 
/* UINT16 must hold at least the values 0..65535. */
 
#ifdef HAVE_UNSIGNED_SHORT
typedef unsigned short UINT16;
#else /* not HAVE_UNSIGNED_SHORT */
typedef unsigned int UINT16;
#endif /* HAVE_UNSIGNED_SHORT */
 
/* INT16 must hold at least the values -32768..32767. */
 
#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */
typedef short INT16;
#endif
 
/* INT32 must hold at least signed 32-bit values. */
 
#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */
typedef long INT32;
#endif
 
/* Datatype used for image dimensions. The JPEG standard only supports
* images up to 64K*64K due to 16-bit fields in SOF markers. Therefore
* "unsigned int" is sufficient on all machines. However, if you need to
* handle larger images and you don't mind deviating from the spec, you
* can change this datatype.
*/
 
typedef unsigned int JDIMENSION;
 
#define JPEG_MAX_DIMENSION 65500L /* a tad under 64K to prevent overflows */
 
 
/* These macros are used in all function definitions and extern declarations.
* You could modify them if you need to change function linkage conventions;
* in particular, you'll need to do that to make the library a Windows DLL.
* Another application is to make all functions global for use with debuggers
* or code profilers that require it.
*/
 
/* a function called through method pointers: */
#define METHODDEF(type) static type
/* a function used only in its module: */
#define LOCAL(type) static type
/* a function referenced thru EXTERNs: */
#define GLOBAL(type) type
/* a reference to a GLOBAL function: */
#define EXTERN(type) extern type
 
 
/* This macro is used to declare a "method", that is, a function pointer.
* We want to supply prototype parameters if the compiler can cope.
* Note that the arglist parameter must be parenthesized!
* Again, you can customize this if you need special linkage keywords.
*/
 
#ifdef HAVE_PROTOTYPES
#define JMETHOD(type,methodname,arglist) type (*methodname) arglist
#else
#define JMETHOD(type,methodname,arglist) type (*methodname) ()
#endif
 
 
/* Here is the pseudo-keyword for declaring pointers that must be "far"
* on 80x86 machines. Most of the specialized coding for 80x86 is handled
* by just saying "FAR *" where such a pointer is needed. In a few places
* explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol.
*/
 
#ifdef NEED_FAR_POINTERS
#define FAR far
#else
#define FAR
#endif
 
 
/*
* On a few systems, type boolean and/or its values FALSE, TRUE may appear
* in standard header files. Or you may have conflicts with application-
* specific header files that you want to include together with these files.
* Defining HAVE_BOOLEAN before including jpeglib.h should make it work.
*/
 
#ifndef HAVE_BOOLEAN
typedef int boolean;
#endif
#ifndef FALSE /* in case these macros already exist */
#define FALSE 0 /* values of boolean */
#endif
#ifndef TRUE
#define TRUE 1
#endif
 
 
/*
* The remaining options affect code selection within the JPEG library,
* but they don't need to be visible to most applications using the library.
* To minimize application namespace pollution, the symbols won't be
* defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined.
*/
 
#ifdef JPEG_INTERNALS
#define JPEG_INTERNAL_OPTIONS
#endif
 
#ifdef JPEG_INTERNAL_OPTIONS
 
 
/*
* These defines indicate whether to include various optional functions.
* Undefining some of these symbols will produce a smaller but less capable
* library. Note that you can leave certain source files out of the
* compilation/linking process if you've #undef'd the corresponding symbols.
* (You may HAVE to do that if your compiler doesn't like null source files.)
*/
 
/* Arithmetic coding is unsupported for legal reasons. Complaints to IBM. */
 
/* Capability options common to encoder and decoder: */
 
#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */
#define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */
#define DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */
 
/* Encoder capability options: */
 
#undef C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */
#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/
#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */
/* Note: if you selected 12-bit data precision, it is dangerous to turn off
* ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit
* precision, so jchuff.c normally uses entropy optimization to compute
* usable tables for higher precision. If you don't want to do optimization,
* you'll have to supply different default Huffman tables.
* The exact same statements apply for progressive JPEG: the default tables
* don't work for progressive mode. (This may get fixed, however.)
*/
#define INPUT_SMOOTHING_SUPPORTED /* Input image smoothing option? */
 
/* Decoder capability options: */
 
#undef D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */
#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/
#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */
#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */
#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */
#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */
#define UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */
#define QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */
#define QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */
 
/* more capability options later, no doubt */
 
 
/*
* Ordering of RGB data in scanlines passed to or from the application.
* If your application wants to deal with data in the order B,G,R, just
* change these macros. You can also deal with formats such as R,G,B,X
* (one extra byte per pixel) by changing RGB_PIXELSIZE. Note that changing
* the offsets will also change the order in which colormap data is organized.
* RESTRICTIONS:
* 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats.
* 2. These macros only affect RGB<=>YCbCr color conversion, so they are not
* useful if you are using JPEG color spaces other than YCbCr or grayscale.
* 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE
* is not 3 (they don't understand about dummy color components!). So you
* can't use color quantization if you change that value.
*/
 
#define RGB_RED 0 /* Offset of Red in an RGB scanline element */
#define RGB_GREEN 1 /* Offset of Green */
#define RGB_BLUE 2 /* Offset of Blue */
#define RGB_PIXELSIZE 3 /* JSAMPLEs per RGB scanline element */
 
 
/* Definitions for speed-related optimizations. */
 
 
/* If your compiler supports inline functions, define INLINE
* as the inline keyword; otherwise define it as empty.
*/
 
#ifndef INLINE
#ifdef __GNUC__ /* for instance, GNU C knows about inline */
#define INLINE __inline__
#endif
#ifndef INLINE
#define INLINE /* default is to define it as empty */
#endif
#endif
 
 
/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying
* two 16-bit shorts is faster than multiplying two ints. Define MULTIPLIER
* as short on such a machine. MULTIPLIER must be at least 16 bits wide.
*/
 
#ifndef MULTIPLIER
#define MULTIPLIER int /* type for fastest integer multiply */
#endif
 
 
/* FAST_FLOAT should be either float or double, whichever is done faster
* by your compiler. (Note that this type is only used in the floating point
* DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.)
* Typically, float is faster in ANSI C compilers, while double is faster in
* pre-ANSI compilers (because they insist on converting to double anyway).
* The code below therefore chooses float if we have ANSI-style prototypes.
*/
 
#ifndef FAST_FLOAT
#ifdef HAVE_PROTOTYPES
#define FAST_FLOAT float
#else
#define FAST_FLOAT double
#endif
#endif
 
#endif /* JPEG_INTERNAL_OPTIONS */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/include/jp2.h
0,0 → 1,231
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __JP2_H
#define __JP2_H
/**
@file jp2.h
@brief The JPEG-2000 file format Reader/Writer (JP2)
 
*/
 
/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */
/*@{*/
 
#define JPIP_JPIP 0x6a706970
 
#define JP2_JP 0x6a502020 /**< JPEG 2000 signature box */
#define JP2_FTYP 0x66747970 /**< File type box */
#define JP2_JP2H 0x6a703268 /**< JP2 header box */
#define JP2_IHDR 0x69686472 /**< Image header box */
#define JP2_COLR 0x636f6c72 /**< Colour specification box */
#define JP2_JP2C 0x6a703263 /**< Contiguous codestream box */
#define JP2_URL 0x75726c20 /**< URL box */
#define JP2_DTBL 0x6474626c /**< Data Reference box */
#define JP2_BPCC 0x62706363 /**< Bits per component box */
#define JP2_JP2 0x6a703220 /**< File type fields */
#define JP2_PCLR 0x70636c72 /**< Palette box */
#define JP2_CMAP 0x636d6170 /**< Component Mapping box */
#define JP2_CDEF 0x63646566 /**< Channel Definition box */
 
/* ----------------------------------------------------------------------- */
/**
Channel description: channel index, type, assocation
*/
typedef struct opj_jp2_cdef_info
{
unsigned short cn, typ, asoc;
} opj_jp2_cdef_info_t;
 
/**
Channel descriptions and number of descriptions
*/
typedef struct opj_jp2_cdef
{
opj_jp2_cdef_info_t *info;
unsigned short n;
} opj_jp2_cdef_t;
 
/**
Component mappings: channel index, mapping type, palette index
*/
typedef struct opj_jp2_cmap_comp
{
unsigned short cmp;
unsigned char mtyp, pcol;
} opj_jp2_cmap_comp_t;
 
/**
Palette data: table entries, palette columns
*/
typedef struct opj_jp2_pclr
{
unsigned int *entries;
unsigned char *channel_sign;
unsigned char *channel_size;
opj_jp2_cmap_comp_t *cmap;
unsigned short nr_entries, nr_channels;
} opj_jp2_pclr_t;
 
/**
Collector for ICC profile, palette, component mapping, channel description
*/
typedef struct opj_jp2_color
{
unsigned char *icc_profile_buf;
int icc_profile_len;
 
opj_jp2_cdef_t *jp2_cdef;
opj_jp2_pclr_t *jp2_pclr;
unsigned char jp2_has_colr;
} opj_jp2_color_t;
 
/**
JP2 component
*/
typedef struct opj_jp2_comps {
int depth;
int sgnd;
int bpcc;
} opj_jp2_comps_t;
 
/**
JPEG-2000 file format reader/writer
*/
typedef struct opj_jp2 {
/** codec context */
opj_common_ptr cinfo;
/** handle to the J2K codec */
opj_j2k_t *j2k;
unsigned int w;
unsigned int h;
unsigned int numcomps;
unsigned int bpc;
unsigned int C;
unsigned int UnkC;
unsigned int IPR;
unsigned int meth;
unsigned int approx;
unsigned int enumcs;
unsigned int precedence;
unsigned int brand;
unsigned int minversion;
unsigned int numcl;
unsigned int *cl;
opj_jp2_comps_t *comps;
unsigned int j2k_codestream_offset;
unsigned int j2k_codestream_length;
} opj_jp2_t;
 
/**
JP2 Box
*/
typedef struct opj_jp2_box {
int length;
int type;
int init_pos;
} opj_jp2_box_t;
 
/** @name Exported functions */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Write the JP2H box - JP2 Header box (used in MJ2)
@param jp2 JP2 handle
@param cio Output buffer stream
*/
void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio);
/**
Read the JP2H box - JP2 Header box (used in MJ2)
@param jp2 JP2 handle
@param cio Input buffer stream
@param ext Collector for profile, cdef and pclr data
@return Returns true if successful, returns false otherwise
*/
bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_color_t *color);
/**
Creates a JP2 decompression structure
@param cinfo Codec context info
@return Returns a handle to a JP2 decompressor if successful, returns NULL otherwise
*/
opj_jp2_t* jp2_create_decompress(opj_common_ptr cinfo);
/**
Destroy a JP2 decompressor handle
@param jp2 JP2 decompressor handle to destroy
*/
void jp2_destroy_decompress(opj_jp2_t *jp2);
/**
Setup the decoder decoding parameters using user parameters.
Decoding parameters are returned in jp2->j2k->cp.
@param jp2 JP2 decompressor handle
@param parameters decompression parameters
*/
void jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters);
/**
Decode an image from a JPEG-2000 file stream
@param jp2 JP2 decompressor handle
@param cio Input buffer stream
@param cstr_info Codestream information structure if required, NULL otherwise
@return Returns a decoded image if successful, returns NULL otherwise
*/
opj_image_t* jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio, opj_codestream_info_t *cstr_info);
/**
Creates a JP2 compression structure
@param cinfo Codec context info
@return Returns a handle to a JP2 compressor if successful, returns NULL otherwise
*/
opj_jp2_t* jp2_create_compress(opj_common_ptr cinfo);
/**
Destroy a JP2 compressor handle
@param jp2 JP2 compressor handle to destroy
*/
void jp2_destroy_compress(opj_jp2_t *jp2);
/**
Setup the encoder parameters using the current image and using user parameters.
Coding parameters are returned in jp2->j2k->cp.
@param jp2 JP2 compressor handle
@param parameters compression parameters
@param image input filled image
*/
void jp2_setup_encoder(opj_jp2_t *jp2, opj_cparameters_t *parameters, opj_image_t *image);
/**
Encode an image into a JPEG-2000 file stream
@param jp2 JP2 compressor handle
@param cio Output buffer stream
@param image Image to encode
@param cstr_info Codestream information structure if required, NULL otherwise
@return Returns true if successful, returns false otherwise
*/
bool jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info);
/* ----------------------------------------------------------------------- */
/*@}*/
 
/*@}*/
 
#endif /* __JP2_H */
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/include/jpeglib.h
0,0 → 1,1096
/*
* jpeglib.h
*
* Copyright (C) 1991-1998, Thomas G. Lane.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
* This file defines the application interface for the JPEG library.
* Most applications using the library need only include this file,
* and perhaps jerror.h if they want to know the exact error codes.
*/
 
#ifndef JPEGLIB_H
#define JPEGLIB_H
 
/*
* First we include the configuration files that record how this
* installation of the JPEG library is set up. jconfig.h can be
* generated automatically for many systems. jmorecfg.h contains
* manual configuration options that most people need not worry about.
*/
 
#ifndef JCONFIG_INCLUDED /* in case jinclude.h already did */
#include "jconfig.h" /* widely used configuration options */
#endif
#include "jmorecfg.h" /* seldom changed options */
 
 
/* Version ID for the JPEG library.
* Might be useful for tests like "#if JPEG_LIB_VERSION >= 60".
*/
 
#define JPEG_LIB_VERSION 62 /* Version 6b */
 
 
/* Various constants determining the sizes of things.
* All of these are specified by the JPEG standard, so don't change them
* if you want to be compatible.
*/
 
#define DCTSIZE 8 /* The basic DCT block is 8x8 samples */
#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */
#define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */
#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */
#define NUM_ARITH_TBLS 16 /* Arith-coding tables are numbered 0..15 */
#define MAX_COMPS_IN_SCAN 4 /* JPEG limit on # of components in one scan */
#define MAX_SAMP_FACTOR 4 /* JPEG limit on sampling factors */
/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard;
* the PostScript DCT filter can emit files with many more than 10 blocks/MCU.
* If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU
* to handle it. We even let you do this from the jconfig.h file. However,
* we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe
* sometimes emits noncompliant files doesn't mean you should too.
*/
#define C_MAX_BLOCKS_IN_MCU 10 /* compressor's limit on blocks per MCU */
#ifndef D_MAX_BLOCKS_IN_MCU
#define D_MAX_BLOCKS_IN_MCU 10 /* decompressor's limit on blocks per MCU */
#endif
 
 
/* Data structures for images (arrays of samples and of DCT coefficients).
* On 80x86 machines, the image arrays are too big for near pointers,
* but the pointer arrays can fit in near memory.
*/
 
typedef JSAMPLE FAR *JSAMPROW; /* ptr to one image row of pixel samples. */
typedef JSAMPROW *JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */
typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */
 
typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */
typedef JBLOCK FAR *JBLOCKROW; /* pointer to one row of coefficient blocks */
typedef JBLOCKROW *JBLOCKARRAY; /* a 2-D array of coefficient blocks */
typedef JBLOCKARRAY *JBLOCKIMAGE; /* a 3-D array of coefficient blocks */
 
typedef JCOEF FAR *JCOEFPTR; /* useful in a couple of places */
 
 
/* Types for JPEG compression parameters and working tables. */
 
 
/* DCT coefficient quantization tables. */
 
typedef struct {
/* This array gives the coefficient quantizers in natural array order
* (not the zigzag order in which they are stored in a JPEG DQT marker).
* CAUTION: IJG versions prior to v6a kept this array in zigzag order.
*/
UINT16 quantval[DCTSIZE2]; /* quantization step for each coefficient */
/* This field is used only during compression. It's initialized FALSE when
* the table is created, and set TRUE when it's been output to the file.
* You could suppress output of a table by setting this to TRUE.
* (See jpeg_suppress_tables for an example.)
*/
boolean sent_table; /* TRUE when table has been output */
} JQUANT_TBL;
 
 
/* Huffman coding tables. */
 
typedef struct {
/* These two fields directly represent the contents of a JPEG DHT marker */
UINT8 bits[17]; /* bits[k] = # of symbols with codes of */
/* length k bits; bits[0] is unused */
UINT8 huffval[256]; /* The symbols, in order of incr code length */
/* This field is used only during compression. It's initialized FALSE when
* the table is created, and set TRUE when it's been output to the file.
* You could suppress output of a table by setting this to TRUE.
* (See jpeg_suppress_tables for an example.)
*/
boolean sent_table; /* TRUE when table has been output */
} JHUFF_TBL;
 
 
/* Basic info about one component (color channel). */
 
typedef struct {
/* These values are fixed over the whole image. */
/* For compression, they must be supplied by parameter setup; */
/* for decompression, they are read from the SOF marker. */
int component_id; /* identifier for this component (0..255) */
int component_index; /* its index in SOF or cinfo->comp_info[] */
int h_samp_factor; /* horizontal sampling factor (1..4) */
int v_samp_factor; /* vertical sampling factor (1..4) */
int quant_tbl_no; /* quantization table selector (0..3) */
/* These values may vary between scans. */
/* For compression, they must be supplied by parameter setup; */
/* for decompression, they are read from the SOS marker. */
/* The decompressor output side may not use these variables. */
int dc_tbl_no; /* DC entropy table selector (0..3) */
int ac_tbl_no; /* AC entropy table selector (0..3) */
/* Remaining fields should be treated as private by applications. */
/* These values are computed during compression or decompression startup: */
/* Component's size in DCT blocks.
* Any dummy blocks added to complete an MCU are not counted; therefore
* these values do not depend on whether a scan is interleaved or not.
*/
JDIMENSION width_in_blocks;
JDIMENSION height_in_blocks;
/* Size of a DCT block in samples. Always DCTSIZE for compression.
* For decompression this is the size of the output from one DCT block,
* reflecting any scaling we choose to apply during the IDCT step.
* Values of 1,2,4,8 are likely to be supported. Note that different
* components may receive different IDCT scalings.
*/
int DCT_scaled_size;
/* The downsampled dimensions are the component's actual, unpadded number
* of samples at the main buffer (preprocessing/compression interface), thus
* downsampled_width = ceil(image_width * Hi/Hmax)
* and similarly for height. For decompression, IDCT scaling is included, so
* downsampled_width = ceil(image_width * Hi/Hmax * DCT_scaled_size/DCTSIZE)
*/
JDIMENSION downsampled_width; /* actual width in samples */
JDIMENSION downsampled_height; /* actual height in samples */
/* This flag is used only for decompression. In cases where some of the
* components will be ignored (eg grayscale output from YCbCr image),
* we can skip most computations for the unused components.
*/
boolean component_needed; /* do we need the value of this component? */
 
/* These values are computed before starting a scan of the component. */
/* The decompressor output side may not use these variables. */
int MCU_width; /* number of blocks per MCU, horizontally */
int MCU_height; /* number of blocks per MCU, vertically */
int MCU_blocks; /* MCU_width * MCU_height */
int MCU_sample_width; /* MCU width in samples, MCU_width*DCT_scaled_size */
int last_col_width; /* # of non-dummy blocks across in last MCU */
int last_row_height; /* # of non-dummy blocks down in last MCU */
 
/* Saved quantization table for component; NULL if none yet saved.
* See jdinput.c comments about the need for this information.
* This field is currently used only for decompression.
*/
JQUANT_TBL * quant_table;
 
/* Private per-component storage for DCT or IDCT subsystem. */
void * dct_table;
} jpeg_component_info;
 
 
/* The script for encoding a multiple-scan file is an array of these: */
 
typedef struct {
int comps_in_scan; /* number of components encoded in this scan */
int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */
int Ss, Se; /* progressive JPEG spectral selection parms */
int Ah, Al; /* progressive JPEG successive approx. parms */
} jpeg_scan_info;
 
/* The decompressor can save APPn and COM markers in a list of these: */
 
typedef struct jpeg_marker_struct FAR * jpeg_saved_marker_ptr;
 
struct jpeg_marker_struct {
jpeg_saved_marker_ptr next; /* next in list, or NULL */
UINT8 marker; /* marker code: JPEG_COM, or JPEG_APP0+n */
unsigned int original_length; /* # bytes of data in the file */
unsigned int data_length; /* # bytes of data saved at data[] */
JOCTET FAR * data; /* the data contained in the marker */
/* the marker length word is not counted in data_length or original_length */
};
 
/* Known color spaces. */
 
typedef enum {
JCS_UNKNOWN, /* error/unspecified */
JCS_GRAYSCALE, /* monochrome */
JCS_RGB, /* red/green/blue */
JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */
JCS_CMYK, /* C/M/Y/K */
JCS_YCCK /* Y/Cb/Cr/K */
} J_COLOR_SPACE;
 
/* DCT/IDCT algorithm options. */
 
typedef enum {
JDCT_ISLOW, /* slow but accurate integer algorithm */
JDCT_IFAST, /* faster, less accurate integer method */
JDCT_FLOAT /* floating-point: accurate, fast on fast HW */
} J_DCT_METHOD;
 
#ifndef JDCT_DEFAULT /* may be overridden in jconfig.h */
#define JDCT_DEFAULT JDCT_ISLOW
#endif
#ifndef JDCT_FASTEST /* may be overridden in jconfig.h */
#define JDCT_FASTEST JDCT_IFAST
#endif
 
/* Dithering options for decompression. */
 
typedef enum {
JDITHER_NONE, /* no dithering */
JDITHER_ORDERED, /* simple ordered dither */
JDITHER_FS /* Floyd-Steinberg error diffusion dither */
} J_DITHER_MODE;
 
 
/* Common fields between JPEG compression and decompression master structs. */
 
#define jpeg_common_fields \
struct jpeg_error_mgr * err; /* Error handler module */\
struct jpeg_memory_mgr * mem; /* Memory manager module */\
struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\
void * client_data; /* Available for use by application */\
boolean is_decompressor; /* So common code can tell which is which */\
int global_state /* For checking call sequence validity */
 
/* Routines that are to be used by both halves of the library are declared
* to receive a pointer to this structure. There are no actual instances of
* jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct.
*/
struct jpeg_common_struct {
jpeg_common_fields; /* Fields common to both master struct types */
/* Additional fields follow in an actual jpeg_compress_struct or
* jpeg_decompress_struct. All three structs must agree on these
* initial fields! (This would be a lot cleaner in C++.)
*/
};
 
typedef struct jpeg_common_struct * j_common_ptr;
typedef struct jpeg_compress_struct * j_compress_ptr;
typedef struct jpeg_decompress_struct * j_decompress_ptr;
 
 
/* Master record for a compression instance */
 
struct jpeg_compress_struct {
jpeg_common_fields; /* Fields shared with jpeg_decompress_struct */
 
/* Destination for compressed data */
struct jpeg_destination_mgr * dest;
 
/* Description of source image --- these fields must be filled in by
* outer application before starting compression. in_color_space must
* be correct before you can even call jpeg_set_defaults().
*/
 
JDIMENSION image_width; /* input image width */
JDIMENSION image_height; /* input image height */
int input_components; /* # of color components in input image */
J_COLOR_SPACE in_color_space; /* colorspace of input image */
 
double input_gamma; /* image gamma of input image */
 
/* Compression parameters --- these fields must be set before calling
* jpeg_start_compress(). We recommend calling jpeg_set_defaults() to
* initialize everything to reasonable defaults, then changing anything
* the application specifically wants to change. That way you won't get
* burnt when new parameters are added. Also note that there are several
* helper routines to simplify changing parameters.
*/
 
int data_precision; /* bits of precision in image data */
 
int num_components; /* # of color components in JPEG image */
J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */
 
jpeg_component_info * comp_info;
/* comp_info[i] describes component that appears i'th in SOF */
JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS];
/* ptrs to coefficient quantization tables, or NULL if not defined */
JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS];
JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS];
/* ptrs to Huffman coding tables, or NULL if not defined */
UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */
UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */
UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */
 
int num_scans; /* # of entries in scan_info array */
const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */
/* The default value of scan_info is NULL, which causes a single-scan
* sequential JPEG file to be emitted. To create a multi-scan file,
* set num_scans and scan_info to point to an array of scan definitions.
*/
 
boolean raw_data_in; /* TRUE=caller supplies downsampled data */
boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */
boolean optimize_coding; /* TRUE=optimize entropy encoding parms */
boolean CCIR601_sampling; /* TRUE=first samples are cosited */
int smoothing_factor; /* 1..100, or 0 for no input smoothing */
J_DCT_METHOD dct_method; /* DCT algorithm selector */
 
/* The restart interval can be specified in absolute MCUs by setting
* restart_interval, or in MCU rows by setting restart_in_rows
* (in which case the correct restart_interval will be figured
* for each scan).
*/
unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */
int restart_in_rows; /* if > 0, MCU rows per restart interval */
 
/* Parameters controlling emission of special markers. */
 
boolean write_JFIF_header; /* should a JFIF marker be written? */
UINT8 JFIF_major_version; /* What to write for the JFIF version number */
UINT8 JFIF_minor_version;
/* These three values are not used by the JPEG code, merely copied */
/* into the JFIF APP0 marker. density_unit can be 0 for unknown, */
/* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */
/* ratio is defined by X_density/Y_density even when density_unit=0. */
UINT8 density_unit; /* JFIF code for pixel size units */
UINT16 X_density; /* Horizontal pixel density */
UINT16 Y_density; /* Vertical pixel density */
boolean write_Adobe_marker; /* should an Adobe marker be written? */
/* State variable: index of next scanline to be written to
* jpeg_write_scanlines(). Application may use this to control its
* processing loop, e.g., "while (next_scanline < image_height)".
*/
 
JDIMENSION next_scanline; /* 0 .. image_height-1 */
 
/* Remaining fields are known throughout compressor, but generally
* should not be touched by a surrounding application.
*/
 
/*
* These fields are computed during compression startup
*/
boolean progressive_mode; /* TRUE if scan script uses progressive mode */
int max_h_samp_factor; /* largest h_samp_factor */
int max_v_samp_factor; /* largest v_samp_factor */
 
JDIMENSION total_iMCU_rows; /* # of iMCU rows to be input to coef ctlr */
/* The coefficient controller receives data in units of MCU rows as defined
* for fully interleaved scans (whether the JPEG file is interleaved or not).
* There are v_samp_factor * DCTSIZE sample rows of each component in an
* "iMCU" (interleaved MCU) row.
*/
/*
* These fields are valid during any one scan.
* They describe the components and MCUs actually appearing in the scan.
*/
int comps_in_scan; /* # of JPEG components in this scan */
jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN];
/* *cur_comp_info[i] describes component that appears i'th in SOS */
JDIMENSION MCUs_per_row; /* # of MCUs across the image */
JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */
int blocks_in_MCU; /* # of DCT blocks per MCU */
int MCU_membership[C_MAX_BLOCKS_IN_MCU];
/* MCU_membership[i] is index in cur_comp_info of component owning */
/* i'th block in an MCU */
 
int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */
 
/*
* Links to compression subobjects (methods and private variables of modules)
*/
struct jpeg_comp_master * master;
struct jpeg_c_main_controller * main;
struct jpeg_c_prep_controller * prep;
struct jpeg_c_coef_controller * coef;
struct jpeg_marker_writer * marker;
struct jpeg_color_converter * cconvert;
struct jpeg_downsampler * downsample;
struct jpeg_forward_dct * fdct;
struct jpeg_entropy_encoder * entropy;
jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */
int script_space_size;
};
 
 
/* Master record for a decompression instance */
 
struct jpeg_decompress_struct {
jpeg_common_fields; /* Fields shared with jpeg_compress_struct */
 
/* Source of compressed data */
struct jpeg_source_mgr * src;
 
/* Basic description of image --- filled in by jpeg_read_header(). */
/* Application may inspect these values to decide how to process image. */
 
JDIMENSION image_width; /* nominal image width (from SOF marker) */
JDIMENSION image_height; /* nominal image height */
int num_components; /* # of color components in JPEG image */
J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */
 
/* Decompression processing parameters --- these fields must be set before
* calling jpeg_start_decompress(). Note that jpeg_read_header() initializes
* them to default values.
*/
 
J_COLOR_SPACE out_color_space; /* colorspace for output */
 
unsigned int scale_num, scale_denom; /* fraction by which to scale image */
 
double output_gamma; /* image gamma wanted in output */
 
boolean buffered_image; /* TRUE=multiple output passes */
boolean raw_data_out; /* TRUE=downsampled data wanted */
 
J_DCT_METHOD dct_method; /* IDCT algorithm selector */
boolean do_fancy_upsampling; /* TRUE=apply fancy upsampling */
boolean do_block_smoothing; /* TRUE=apply interblock smoothing */
 
boolean quantize_colors; /* TRUE=colormapped output wanted */
/* the following are ignored if not quantize_colors: */
J_DITHER_MODE dither_mode; /* type of color dithering to use */
boolean two_pass_quantize; /* TRUE=use two-pass color quantization */
int desired_number_of_colors; /* max # colors to use in created colormap */
/* these are significant only in buffered-image mode: */
boolean enable_1pass_quant; /* enable future use of 1-pass quantizer */
boolean enable_external_quant;/* enable future use of external colormap */
boolean enable_2pass_quant; /* enable future use of 2-pass quantizer */
 
/* Description of actual output image that will be returned to application.
* These fields are computed by jpeg_start_decompress().
* You can also use jpeg_calc_output_dimensions() to determine these values
* in advance of calling jpeg_start_decompress().
*/
 
JDIMENSION output_width; /* scaled image width */
JDIMENSION output_height; /* scaled image height */
int out_color_components; /* # of color components in out_color_space */
int output_components; /* # of color components returned */
/* output_components is 1 (a colormap index) when quantizing colors;
* otherwise it equals out_color_components.
*/
int rec_outbuf_height; /* min recommended height of scanline buffer */
/* If the buffer passed to jpeg_read_scanlines() is less than this many rows
* high, space and time will be wasted due to unnecessary data copying.
* Usually rec_outbuf_height will be 1 or 2, at most 4.
*/
 
/* When quantizing colors, the output colormap is described by these fields.
* The application can supply a colormap by setting colormap non-NULL before
* calling jpeg_start_decompress; otherwise a colormap is created during
* jpeg_start_decompress or jpeg_start_output.
* The map has out_color_components rows and actual_number_of_colors columns.
*/
int actual_number_of_colors; /* number of entries in use */
JSAMPARRAY colormap; /* The color map as a 2-D pixel array */
 
/* State variables: these variables indicate the progress of decompression.
* The application may examine these but must not modify them.
*/
 
/* Row index of next scanline to be read from jpeg_read_scanlines().
* Application may use this to control its processing loop, e.g.,
* "while (output_scanline < output_height)".
*/
JDIMENSION output_scanline; /* 0 .. output_height-1 */
 
/* Current input scan number and number of iMCU rows completed in scan.
* These indicate the progress of the decompressor input side.
*/
int input_scan_number; /* Number of SOS markers seen so far */
JDIMENSION input_iMCU_row; /* Number of iMCU rows completed */
 
/* The "output scan number" is the notional scan being displayed by the
* output side. The decompressor will not allow output scan/row number
* to get ahead of input scan/row, but it can fall arbitrarily far behind.
*/
int output_scan_number; /* Nominal scan number being displayed */
JDIMENSION output_iMCU_row; /* Number of iMCU rows read */
 
/* Current progression status. coef_bits[c][i] indicates the precision
* with which component c's DCT coefficient i (in zigzag order) is known.
* It is -1 when no data has yet been received, otherwise it is the point
* transform (shift) value for the most recent scan of the coefficient
* (thus, 0 at completion of the progression).
* This pointer is NULL when reading a non-progressive file.
*/
int (*coef_bits)[DCTSIZE2]; /* -1 or current Al value for each coef */
 
/* Internal JPEG parameters --- the application usually need not look at
* these fields. Note that the decompressor output side may not use
* any parameters that can change between scans.
*/
 
/* Quantization and Huffman tables are carried forward across input
* datastreams when processing abbreviated JPEG datastreams.
*/
 
JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS];
/* ptrs to coefficient quantization tables, or NULL if not defined */
 
JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS];
JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS];
/* ptrs to Huffman coding tables, or NULL if not defined */
 
/* These parameters are never carried across datastreams, since they
* are given in SOF/SOS markers or defined to be reset by SOI.
*/
 
int data_precision; /* bits of precision in image data */
 
jpeg_component_info * comp_info;
/* comp_info[i] describes component that appears i'th in SOF */
 
boolean progressive_mode; /* TRUE if SOFn specifies progressive mode */
boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */
 
UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */
UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */
UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */
 
unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */
 
/* These fields record data obtained from optional markers recognized by
* the JPEG library.
*/
boolean saw_JFIF_marker; /* TRUE iff a JFIF APP0 marker was found */
/* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */
UINT8 JFIF_major_version; /* JFIF version number */
UINT8 JFIF_minor_version;
UINT8 density_unit; /* JFIF code for pixel size units */
UINT16 X_density; /* Horizontal pixel density */
UINT16 Y_density; /* Vertical pixel density */
boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */
UINT8 Adobe_transform; /* Color transform code from Adobe marker */
 
boolean CCIR601_sampling; /* TRUE=first samples are cosited */
 
/* Aside from the specific data retained from APPn markers known to the
* library, the uninterpreted contents of any or all APPn and COM markers
* can be saved in a list for examination by the application.
*/
jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */
 
/* Remaining fields are known throughout decompressor, but generally
* should not be touched by a surrounding application.
*/
 
/*
* These fields are computed during decompression startup
*/
int max_h_samp_factor; /* largest h_samp_factor */
int max_v_samp_factor; /* largest v_samp_factor */
 
int min_DCT_scaled_size; /* smallest DCT_scaled_size of any component */
 
JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */
/* The coefficient controller's input and output progress is measured in
* units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows
* in fully interleaved JPEG scans, but are used whether the scan is
* interleaved or not. We define an iMCU row as v_samp_factor DCT block
* rows of each component. Therefore, the IDCT output contains
* v_samp_factor*DCT_scaled_size sample rows of a component per iMCU row.
*/
 
JSAMPLE * sample_range_limit; /* table for fast range-limiting */
 
/*
* These fields are valid during any one scan.
* They describe the components and MCUs actually appearing in the scan.
* Note that the decompressor output side must not use these fields.
*/
int comps_in_scan; /* # of JPEG components in this scan */
jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN];
/* *cur_comp_info[i] describes component that appears i'th in SOS */
 
JDIMENSION MCUs_per_row; /* # of MCUs across the image */
JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */
 
int blocks_in_MCU; /* # of DCT blocks per MCU */
int MCU_membership[D_MAX_BLOCKS_IN_MCU];
/* MCU_membership[i] is index in cur_comp_info of component owning */
/* i'th block in an MCU */
 
int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */
 
/* This field is shared between entropy decoder and marker parser.
* It is either zero or the code of a JPEG marker that has been
* read from the data source, but has not yet been processed.
*/
int unread_marker;
 
/*
* Links to decompression subobjects (methods, private variables of modules)
*/
struct jpeg_decomp_master * master;
struct jpeg_d_main_controller * main;
struct jpeg_d_coef_controller * coef;
struct jpeg_d_post_controller * post;
struct jpeg_input_controller * inputctl;
struct jpeg_marker_reader * marker;
struct jpeg_entropy_decoder * entropy;
struct jpeg_inverse_dct * idct;
struct jpeg_upsampler * upsample;
struct jpeg_color_deconverter * cconvert;
struct jpeg_color_quantizer * cquantize;
};
 
 
/* "Object" declarations for JPEG modules that may be supplied or called
* directly by the surrounding application.
* As with all objects in the JPEG library, these structs only define the
* publicly visible methods and state variables of a module. Additional
* private fields may exist after the public ones.
*/
 
 
/* Error handler object */
 
struct jpeg_error_mgr {
/* Error exit handler: does not return to caller */
JMETHOD(void, error_exit, (j_common_ptr cinfo));
/* Conditionally emit a trace or warning message */
JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level));
/* Routine that actually outputs a trace or error message */
JMETHOD(void, output_message, (j_common_ptr cinfo));
/* Format a message string for the most recent JPEG error or message */
JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer));
#define JMSG_LENGTH_MAX 200 /* recommended size of format_message buffer */
/* Reset error state variables at start of a new image */
JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo));
/* The message ID code and any parameters are saved here.
* A message can have one string parameter or up to 8 int parameters.
*/
int msg_code;
#define JMSG_STR_PARM_MAX 80
union {
int i[8];
char s[JMSG_STR_PARM_MAX];
} msg_parm;
/* Standard state variables for error facility */
int trace_level; /* max msg_level that will be displayed */
/* For recoverable corrupt-data errors, we emit a warning message,
* but keep going unless emit_message chooses to abort. emit_message
* should count warnings in num_warnings. The surrounding application
* can check for bad data by seeing if num_warnings is nonzero at the
* end of processing.
*/
long num_warnings; /* number of corrupt-data warnings */
 
/* These fields point to the table(s) of error message strings.
* An application can change the table pointer to switch to a different
* message list (typically, to change the language in which errors are
* reported). Some applications may wish to add additional error codes
* that will be handled by the JPEG library error mechanism; the second
* table pointer is used for this purpose.
*
* First table includes all errors generated by JPEG library itself.
* Error code 0 is reserved for a "no such error string" message.
*/
const char * const * jpeg_message_table; /* Library errors */
int last_jpeg_message; /* Table contains strings 0..last_jpeg_message */
/* Second table can be added by application (see cjpeg/djpeg for example).
* It contains strings numbered first_addon_message..last_addon_message.
*/
const char * const * addon_message_table; /* Non-library errors */
int first_addon_message; /* code for first string in addon table */
int last_addon_message; /* code for last string in addon table */
};
 
 
/* Progress monitor object */
 
struct jpeg_progress_mgr {
JMETHOD(void, progress_monitor, (j_common_ptr cinfo));
 
long pass_counter; /* work units completed in this pass */
long pass_limit; /* total number of work units in this pass */
int completed_passes; /* passes completed so far */
int total_passes; /* total number of passes expected */
};
 
 
/* Data destination object for compression */
 
struct jpeg_destination_mgr {
JOCTET * next_output_byte; /* => next byte to write in buffer */
size_t free_in_buffer; /* # of byte spaces remaining in buffer */
 
JMETHOD(void, init_destination, (j_compress_ptr cinfo));
JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo));
JMETHOD(void, term_destination, (j_compress_ptr cinfo));
};
 
 
/* Data source object for decompression */
 
struct jpeg_source_mgr {
const JOCTET * next_input_byte; /* => next byte to read from buffer */
size_t bytes_in_buffer; /* # of bytes remaining in buffer */
 
JMETHOD(void, init_source, (j_decompress_ptr cinfo));
JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo));
JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes));
JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired));
JMETHOD(void, term_source, (j_decompress_ptr cinfo));
};
 
 
/* Memory manager object.
* Allocates "small" objects (a few K total), "large" objects (tens of K),
* and "really big" objects (virtual arrays with backing store if needed).
* The memory manager does not allow individual objects to be freed; rather,
* each created object is assigned to a pool, and whole pools can be freed
* at once. This is faster and more convenient than remembering exactly what
* to free, especially where malloc()/free() are not too speedy.
* NB: alloc routines never return NULL. They exit to error_exit if not
* successful.
*/
 
#define JPOOL_PERMANENT 0 /* lasts until master record is destroyed */
#define JPOOL_IMAGE 1 /* lasts until done with image/datastream */
#define JPOOL_NUMPOOLS 2
 
typedef struct jvirt_sarray_control * jvirt_sarray_ptr;
typedef struct jvirt_barray_control * jvirt_barray_ptr;
 
 
struct jpeg_memory_mgr {
/* Method pointers */
JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id,
size_t sizeofobject));
JMETHOD(void FAR *, alloc_large, (j_common_ptr cinfo, int pool_id,
size_t sizeofobject));
JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id,
JDIMENSION samplesperrow,
JDIMENSION numrows));
JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id,
JDIMENSION blocksperrow,
JDIMENSION numrows));
JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo,
int pool_id,
boolean pre_zero,
JDIMENSION samplesperrow,
JDIMENSION numrows,
JDIMENSION maxaccess));
JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo,
int pool_id,
boolean pre_zero,
JDIMENSION blocksperrow,
JDIMENSION numrows,
JDIMENSION maxaccess));
JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo));
JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo,
jvirt_sarray_ptr ptr,
JDIMENSION start_row,
JDIMENSION num_rows,
boolean writable));
JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo,
jvirt_barray_ptr ptr,
JDIMENSION start_row,
JDIMENSION num_rows,
boolean writable));
JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id));
JMETHOD(void, self_destruct, (j_common_ptr cinfo));
 
/* Limit on memory allocation for this JPEG object. (Note that this is
* merely advisory, not a guaranteed maximum; it only affects the space
* used for virtual-array buffers.) May be changed by outer application
* after creating the JPEG object.
*/
long max_memory_to_use;
 
/* Maximum allocation request accepted by alloc_large. */
long max_alloc_chunk;
};
 
 
/* Routine signature for application-supplied marker processing methods.
* Need not pass marker code since it is stored in cinfo->unread_marker.
*/
typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo));
 
 
/* Declarations for routines called by application.
* The JPP macro hides prototype parameters from compilers that can't cope.
* Note JPP requires double parentheses.
*/
 
#ifdef HAVE_PROTOTYPES
#define JPP(arglist) arglist
#else
#define JPP(arglist) ()
#endif
 
 
/* Short forms of external names for systems with brain-damaged linkers.
* We shorten external names to be unique in the first six letters, which
* is good enough for all known systems.
* (If your compiler itself needs names to be unique in less than 15
* characters, you are out of luck. Get a better compiler.)
*/
 
#ifdef NEED_SHORT_EXTERNAL_NAMES
#define jpeg_std_error jStdError
#define jpeg_CreateCompress jCreaCompress
#define jpeg_CreateDecompress jCreaDecompress
#define jpeg_destroy_compress jDestCompress
#define jpeg_destroy_decompress jDestDecompress
#define jpeg_stdio_dest jStdDest
#define jpeg_stdio_src jStdSrc
#define jpeg_set_defaults jSetDefaults
#define jpeg_set_colorspace jSetColorspace
#define jpeg_default_colorspace jDefColorspace
#define jpeg_set_quality jSetQuality
#define jpeg_set_linear_quality jSetLQuality
#define jpeg_add_quant_table jAddQuantTable
#define jpeg_quality_scaling jQualityScaling
#define jpeg_simple_progression jSimProgress
#define jpeg_suppress_tables jSuppressTables
#define jpeg_alloc_quant_table jAlcQTable
#define jpeg_alloc_huff_table jAlcHTable
#define jpeg_start_compress jStrtCompress
#define jpeg_write_scanlines jWrtScanlines
#define jpeg_finish_compress jFinCompress
#define jpeg_write_raw_data jWrtRawData
#define jpeg_write_marker jWrtMarker
#define jpeg_write_m_header jWrtMHeader
#define jpeg_write_m_byte jWrtMByte
#define jpeg_write_tables jWrtTables
#define jpeg_read_header jReadHeader
#define jpeg_start_decompress jStrtDecompress
#define jpeg_read_scanlines jReadScanlines
#define jpeg_finish_decompress jFinDecompress
#define jpeg_read_raw_data jReadRawData
#define jpeg_has_multiple_scans jHasMultScn
#define jpeg_start_output jStrtOutput
#define jpeg_finish_output jFinOutput
#define jpeg_input_complete jInComplete
#define jpeg_new_colormap jNewCMap
#define jpeg_consume_input jConsumeInput
#define jpeg_calc_output_dimensions jCalcDimensions
#define jpeg_save_markers jSaveMarkers
#define jpeg_set_marker_processor jSetMarker
#define jpeg_read_coefficients jReadCoefs
#define jpeg_write_coefficients jWrtCoefs
#define jpeg_copy_critical_parameters jCopyCrit
#define jpeg_abort_compress jAbrtCompress
#define jpeg_abort_decompress jAbrtDecompress
#define jpeg_abort jAbort
#define jpeg_destroy jDestroy
#define jpeg_resync_to_restart jResyncRestart
#endif /* NEED_SHORT_EXTERNAL_NAMES */
 
 
/* Default error-management setup */
EXTERN(struct jpeg_error_mgr *) jpeg_std_error
JPP((struct jpeg_error_mgr * err));
 
/* Initialization of JPEG compression objects.
* jpeg_create_compress() and jpeg_create_decompress() are the exported
* names that applications should call. These expand to calls on
* jpeg_CreateCompress and jpeg_CreateDecompress with additional information
* passed for version mismatch checking.
* NB: you must set up the error-manager BEFORE calling jpeg_create_xxx.
*/
#define jpeg_create_compress(cinfo) \
jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \
(size_t) sizeof(struct jpeg_compress_struct))
#define jpeg_create_decompress(cinfo) \
jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \
(size_t) sizeof(struct jpeg_decompress_struct))
EXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo,
int version, size_t structsize));
EXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo,
int version, size_t structsize));
/* Destruction of JPEG compression objects */
EXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo));
EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo));
 
/* Standard data source and destination managers: stdio streams. */
/* Caller is responsible for opening the file before and closing after. */
EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile));
EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile));
 
/* Default parameter setup for compression */
EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo));
/* Compression parameter setup aids */
EXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo,
J_COLOR_SPACE colorspace));
EXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo));
EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality,
boolean force_baseline));
EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo,
int scale_factor,
boolean force_baseline));
EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl,
const unsigned int *basic_table,
int scale_factor,
boolean force_baseline));
EXTERN(int) jpeg_quality_scaling JPP((int quality));
EXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo));
EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo,
boolean suppress));
EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo));
EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo));
 
/* Main entry points for compression */
EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo,
boolean write_all_tables));
EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo,
JSAMPARRAY scanlines,
JDIMENSION num_lines));
EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo));
 
/* Replaces jpeg_write_scanlines when writing raw downsampled data. */
EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo,
JSAMPIMAGE data,
JDIMENSION num_lines));
 
/* Write a special marker. See libjpeg.doc concerning safe usage. */
EXTERN(void) jpeg_write_marker
JPP((j_compress_ptr cinfo, int marker,
const JOCTET * dataptr, unsigned int datalen));
/* Same, but piecemeal. */
EXTERN(void) jpeg_write_m_header
JPP((j_compress_ptr cinfo, int marker, unsigned int datalen));
EXTERN(void) jpeg_write_m_byte
JPP((j_compress_ptr cinfo, int val));
 
/* Alternate compression function: just write an abbreviated table file */
EXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo));
 
/* Decompression startup: read start of JPEG datastream to see what's there */
EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo,
boolean require_image));
/* Return value is one of: */
#define JPEG_SUSPENDED 0 /* Suspended due to lack of input data */
#define JPEG_HEADER_OK 1 /* Found valid image datastream */
#define JPEG_HEADER_TABLES_ONLY 2 /* Found valid table-specs-only datastream */
/* If you pass require_image = TRUE (normal case), you need not check for
* a TABLES_ONLY return code; an abbreviated file will cause an error exit.
* JPEG_SUSPENDED is only possible if you use a data source module that can
* give a suspension return (the stdio source module doesn't).
*/
 
/* Main entry points for decompression */
EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo));
EXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo,
JSAMPARRAY scanlines,
JDIMENSION max_lines));
EXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo));
 
/* Replaces jpeg_read_scanlines when reading raw downsampled data. */
EXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo,
JSAMPIMAGE data,
JDIMENSION max_lines));
 
/* Additional entry points for buffered-image mode. */
EXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo));
EXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo,
int scan_number));
EXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo));
EXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo));
EXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo));
EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo));
/* Return value is one of: */
/* #define JPEG_SUSPENDED 0 Suspended due to lack of input data */
#define JPEG_REACHED_SOS 1 /* Reached start of new scan */
#define JPEG_REACHED_EOI 2 /* Reached end of image */
#define JPEG_ROW_COMPLETED 3 /* Completed one iMCU row */
#define JPEG_SCAN_COMPLETED 4 /* Completed last iMCU row of a scan */
 
/* Precalculate output dimensions for current decompression parameters. */
EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo));
 
/* Control saving of COM and APPn markers into marker_list. */
EXTERN(void) jpeg_save_markers
JPP((j_decompress_ptr cinfo, int marker_code,
unsigned int length_limit));
 
/* Install a special processing method for COM or APPn markers. */
EXTERN(void) jpeg_set_marker_processor
JPP((j_decompress_ptr cinfo, int marker_code,
jpeg_marker_parser_method routine));
 
/* Read or write raw DCT coefficients --- useful for lossless transcoding. */
EXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo));
EXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo,
jvirt_barray_ptr * coef_arrays));
EXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo,
j_compress_ptr dstinfo));
 
/* If you choose to abort compression or decompression before completing
* jpeg_finish_(de)compress, then you need to clean up to release memory,
* temporary files, etc. You can just call jpeg_destroy_(de)compress
* if you're done with the JPEG object, but if you want to clean it up and
* reuse it, call this:
*/
EXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo));
EXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo));
 
/* Generic versions of jpeg_abort and jpeg_destroy that work on either
* flavor of JPEG object. These may be more convenient in some places.
*/
EXTERN(void) jpeg_abort JPP((j_common_ptr cinfo));
EXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo));
 
/* Default restart-marker-resync procedure for use by data source modules */
EXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo,
int desired));
 
 
/* These marker codes are exported since applications and data source modules
* are likely to want to use them.
*/
 
#define JPEG_RST0 0xD0 /* RST0 marker code */
#define JPEG_EOI 0xD9 /* EOI marker code */
#define JPEG_APP0 0xE0 /* APP0 marker code */
#define JPEG_COM 0xFE /* COM marker code */
 
 
/* If we have a brain-damaged compiler that emits warnings (or worse, errors)
* for structure definitions that are never filled in, keep it quiet by
* supplying dummy definitions for the various substructures.
*/
 
#ifdef INCOMPLETE_TYPES_BROKEN
#ifndef JPEG_INTERNALS /* will be defined in jpegint.h */
struct jvirt_sarray_control { long dummy; };
struct jvirt_barray_control { long dummy; };
struct jpeg_comp_master { long dummy; };
struct jpeg_c_main_controller { long dummy; };
struct jpeg_c_prep_controller { long dummy; };
struct jpeg_c_coef_controller { long dummy; };
struct jpeg_marker_writer { long dummy; };
struct jpeg_color_converter { long dummy; };
struct jpeg_downsampler { long dummy; };
struct jpeg_forward_dct { long dummy; };
struct jpeg_entropy_encoder { long dummy; };
struct jpeg_decomp_master { long dummy; };
struct jpeg_d_main_controller { long dummy; };
struct jpeg_d_coef_controller { long dummy; };
struct jpeg_d_post_controller { long dummy; };
struct jpeg_input_controller { long dummy; };
struct jpeg_marker_reader { long dummy; };
struct jpeg_entropy_decoder { long dummy; };
struct jpeg_inverse_dct { long dummy; };
struct jpeg_upsampler { long dummy; };
struct jpeg_color_deconverter { long dummy; };
struct jpeg_color_quantizer { long dummy; };
#endif /* JPEG_INTERNALS */
#endif /* INCOMPLETE_TYPES_BROKEN */
 
 
/*
* The JPEG library modules define JPEG_INTERNALS before including this file.
* The internal structure declarations are read only when that is true.
* Applications using the library should not include jpegint.h, but may wish
* to include jerror.h.
*/
 
#ifdef JPEG_INTERNALS
#include "jpegint.h" /* fetch private declarations */
#include "jerror.h" /* fetch error codes too */
#endif
 
#endif /* JPEGLIB_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/include/jpt.h
0,0 → 1,75
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#ifndef __JPT_H
#define __JPT_H
/**
@file jpt.h
@brief JPT-stream reader (JPEG 2000, JPIP)
 
JPT-stream functions are implemented in J2K.C.
*/
 
/**
Message Header JPT stream structure
*/
typedef struct opj_jpt_msg_header {
/** In-class Identifier */
unsigned int Id;
/** Last byte information */
unsigned int last_byte;
/** Class Identifier */
unsigned int Class_Id;
/** CSn : index identifier */
unsigned int CSn_Id;
/** Message offset */
unsigned int Msg_offset;
/** Message length */
unsigned int Msg_length;
/** Auxiliary for JPP case */
unsigned int Layer_nb;
} opj_jpt_msg_header_t;
 
/* ----------------------------------------------------------------------- */
 
/**
Initialize the value of the message header structure
@param header Message header structure
*/
void jpt_init_msg_header(opj_jpt_msg_header_t * header);
 
/**
Read the message header for a JPP/JPT - stream
@param cinfo Codec context info
@param cio CIO handle
@param header Message header structure
*/
void jpt_read_msg_header(opj_common_ptr cinfo, opj_cio_t *cio, opj_jpt_msg_header_t *header);
 
#endif
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/include/openjpeg.h
0,0 → 1,915
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* Copyright (c) 2006-2007, Parvatha Elangovan
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef OPENJPEG_H
#define OPENJPEG_H
 
 
/*
==========================================================
Compiler directives
==========================================================
*/
 
#if defined(OPJ_STATIC) || !defined(_WIN32)
#define OPJ_API
#define OPJ_CALLCONV
#else
#define OPJ_CALLCONV __stdcall
/*
The following ifdef block is the standard way of creating macros which make exporting
from a DLL simpler. All files within this DLL are compiled with the OPJ_EXPORTS
symbol defined on the command line. this symbol should not be defined on any project
that uses this DLL. This way any other project whose source files include this file see
OPJ_API functions as being imported from a DLL, wheras this DLL sees symbols
defined with this macro as being exported.
*/
#if defined(OPJ_EXPORTS) || defined(DLL_EXPORT)
#define OPJ_API __declspec(dllexport)
#else
#define OPJ_API __declspec(dllimport)
#endif /* OPJ_EXPORTS */
#endif /* !OPJ_STATIC || !_WIN32 */
 
#ifndef __cplusplus
#if defined(HAVE_STDBOOL_H)
/*
The C language implementation does correctly provide the standard header
file "stdbool.h".
*/
#include <stdbool.h>
#else
/*
The C language implementation does not provide the standard header file
"stdbool.h" as required by ISO/IEC 9899:1999. Try to compensate for this
braindamage below.
*/
#if !defined(bool)
#define bool int
#endif
#if !defined(true)
#define true 1
#endif
#if !defined(false)
#define false 0
#endif
#endif
#endif /* __cplusplus */
 
/*
==========================================================
Useful constant definitions
==========================================================
*/
 
#define OPJ_PATH_LEN 4096 /**< Maximum allowed size for filenames */
 
#define J2K_MAXRLVLS 33 /**< Number of maximum resolution level authorized */
#define J2K_MAXBANDS (3*J2K_MAXRLVLS-2) /**< Number of maximum sub-band linked to number of resolution level */
 
/* UniPG>> */
#define JPWL_MAX_NO_TILESPECS 16 /**< Maximum number of tile parts expected by JPWL: increase at your will */
#define JPWL_MAX_NO_PACKSPECS 16 /**< Maximum number of packet parts expected by JPWL: increase at your will */
#define JPWL_MAX_NO_MARKERS 512 /**< Maximum number of JPWL markers: increase at your will */
#define JPWL_PRIVATEINDEX_NAME "jpwl_index_privatefilename" /**< index file name used when JPWL is on */
#define JPWL_EXPECTED_COMPONENTS 3 /**< Expect this number of components, so you'll find better the first EPB */
#define JPWL_MAXIMUM_TILES 8192 /**< Expect this maximum number of tiles, to avoid some crashes */
#define JPWL_MAXIMUM_HAMMING 2 /**< Expect this maximum number of bit errors in marker id's */
#define JPWL_MAXIMUM_EPB_ROOM 65450 /**< Expect this maximum number of bytes for composition of EPBs */
/* <<UniPG */
 
/*
==========================================================
enum definitions
==========================================================
*/
/**
Rsiz Capabilities
*/
typedef enum RSIZ_CAPABILITIES {
STD_RSIZ = 0, /** Standard JPEG2000 profile*/
CINEMA2K = 3, /** Profile name for a 2K image*/
CINEMA4K = 4 /** Profile name for a 4K image*/
} OPJ_RSIZ_CAPABILITIES;
 
/**
Digital cinema operation mode
*/
typedef enum CINEMA_MODE {
OFF = 0, /** Not Digital Cinema*/
CINEMA2K_24 = 1, /** 2K Digital Cinema at 24 fps*/
CINEMA2K_48 = 2, /** 2K Digital Cinema at 48 fps*/
CINEMA4K_24 = 3 /** 4K Digital Cinema at 24 fps*/
}OPJ_CINEMA_MODE;
 
/**
Progression order
*/
typedef enum PROG_ORDER {
PROG_UNKNOWN = -1, /**< place-holder */
LRCP = 0, /**< layer-resolution-component-precinct order */
RLCP = 1, /**< resolution-layer-component-precinct order */
RPCL = 2, /**< resolution-precinct-component-layer order */
PCRL = 3, /**< precinct-component-resolution-layer order */
CPRL = 4 /**< component-precinct-resolution-layer order */
} OPJ_PROG_ORDER;
 
/**
Supported image color spaces
*/
typedef enum COLOR_SPACE {
CLRSPC_UNKNOWN = -1, /**< not supported by the library */
CLRSPC_UNSPECIFIED = 0, /**< not specified in the codestream */
CLRSPC_SRGB = 1, /**< sRGB */
CLRSPC_GRAY = 2, /**< grayscale */
CLRSPC_SYCC = 3 /**< YUV */
} OPJ_COLOR_SPACE;
 
/**
Supported codec
*/
typedef enum CODEC_FORMAT {
CODEC_UNKNOWN = -1, /**< place-holder */
CODEC_J2K = 0, /**< JPEG-2000 codestream : read/write */
CODEC_JPT = 1, /**< JPT-stream (JPEG 2000, JPIP) : read only */
CODEC_JP2 = 2 /**< JPEG-2000 file format : read/write */
} OPJ_CODEC_FORMAT;
 
/**
Limit decoding to certain portions of the codestream.
*/
typedef enum LIMIT_DECODING {
NO_LIMITATION = 0, /**< No limitation for the decoding. The entire codestream will de decoded */
LIMIT_TO_MAIN_HEADER = 1, /**< The decoding is limited to the Main Header */
DECODE_ALL_BUT_PACKETS = 2 /**< Decode everything except the JPEG 2000 packets */
} OPJ_LIMIT_DECODING;
 
/*
==========================================================
event manager typedef definitions
==========================================================
*/
 
/**
Callback function prototype for events
@param msg Event message
@param client_data
*/
typedef void (*opj_msg_callback) (const char *msg, void *client_data);
 
/**
Message handler object
used for
<ul>
<li>Error messages
<li>Warning messages
<li>Debugging messages
</ul>
*/
typedef struct opj_event_mgr {
/** Error message callback if available, NULL otherwise */
opj_msg_callback error_handler;
/** Warning message callback if available, NULL otherwise */
opj_msg_callback warning_handler;
/** Debug message callback if available, NULL otherwise */
opj_msg_callback info_handler;
} opj_event_mgr_t;
 
 
/*
==========================================================
codec typedef definitions
==========================================================
*/
 
/**
Progression order changes
*/
typedef struct opj_poc {
/** Resolution num start, Component num start, given by POC */
int resno0, compno0;
/** Layer num end,Resolution num end, Component num end, given by POC */
int layno1, resno1, compno1;
/** Layer num start,Precinct num start, Precinct num end */
int layno0, precno0, precno1;
/** Progression order enum*/
OPJ_PROG_ORDER prg1,prg;
/** Progression order string*/
char progorder[5];
/** Tile number */
int tile;
/** Start and end values for Tile width and height*/
int tx0,tx1,ty0,ty1;
/** Start value, initialised in pi_initialise_encode*/
int layS, resS, compS, prcS;
/** End value, initialised in pi_initialise_encode */
int layE, resE, compE, prcE;
/** Start and end values of Tile width and height, initialised in pi_initialise_encode*/
int txS,txE,tyS,tyE,dx,dy;
/** Temporary values for Tile parts, initialised in pi_create_encode */
int lay_t, res_t, comp_t, prc_t,tx0_t,ty0_t;
} opj_poc_t;
 
/**
Compression parameters
*/
typedef struct opj_cparameters {
/** size of tile: tile_size_on = false (not in argument) or = true (in argument) */
bool tile_size_on;
/** XTOsiz */
int cp_tx0;
/** YTOsiz */
int cp_ty0;
/** XTsiz */
int cp_tdx;
/** YTsiz */
int cp_tdy;
/** allocation by rate/distortion */
int cp_disto_alloc;
/** allocation by fixed layer */
int cp_fixed_alloc;
/** add fixed_quality */
int cp_fixed_quality;
/** fixed layer */
int *cp_matrice;
/** comment for coding */
char *cp_comment;
/** csty : coding style */
int csty;
/** progression order (default LRCP) */
OPJ_PROG_ORDER prog_order;
/** progression order changes */
opj_poc_t POC[32];
/** number of progression order changes (POC), default to 0 */
int numpocs;
/** number of layers */
int tcp_numlayers;
/** rates of layers */
float tcp_rates[100];
/** different psnr for successive layers */
float tcp_distoratio[100];
/** number of resolutions */
int numresolution;
/** initial code block width, default to 64 */
int cblockw_init;
/** initial code block height, default to 64 */
int cblockh_init;
/** mode switch (cblk_style) */
int mode;
/** 1 : use the irreversible DWT 9-7, 0 : use lossless compression (default) */
int irreversible;
/** region of interest: affected component in [0..3], -1 means no ROI */
int roi_compno;
/** region of interest: upshift value */
int roi_shift;
/* number of precinct size specifications */
int res_spec;
/** initial precinct width */
int prcw_init[J2K_MAXRLVLS];
/** initial precinct height */
int prch_init[J2K_MAXRLVLS];
 
/**@name command line encoder parameters (not used inside the library) */
/*@{*/
/** input file name */
char infile[OPJ_PATH_LEN];
/** output file name */
char outfile[OPJ_PATH_LEN];
/** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */
int index_on;
/** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */
char index[OPJ_PATH_LEN];
/** subimage encoding: origin image offset in x direction */
int image_offset_x0;
/** subimage encoding: origin image offset in y direction */
int image_offset_y0;
/** subsampling value for dx */
int subsampling_dx;
/** subsampling value for dy */
int subsampling_dy;
/** input file format 0: PGX, 1: PxM, 2: BMP 3:TIF*/
int decod_format;
/** output file format 0: J2K, 1: JP2, 2: JPT */
int cod_format;
/*@}*/
 
/* UniPG>> */
/**@name JPWL encoding parameters */
/*@{*/
/** enables writing of EPC in MH, thus activating JPWL */
bool jpwl_epc_on;
/** error protection method for MH (0,1,16,32,37-128) */
int jpwl_hprot_MH;
/** tile number of header protection specification (>=0) */
int jpwl_hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS];
/** error protection methods for TPHs (0,1,16,32,37-128) */
int jpwl_hprot_TPH[JPWL_MAX_NO_TILESPECS];
/** tile number of packet protection specification (>=0) */
int jpwl_pprot_tileno[JPWL_MAX_NO_PACKSPECS];
/** packet number of packet protection specification (>=0) */
int jpwl_pprot_packno[JPWL_MAX_NO_PACKSPECS];
/** error protection methods for packets (0,1,16,32,37-128) */
int jpwl_pprot[JPWL_MAX_NO_PACKSPECS];
/** enables writing of ESD, (0=no/1/2 bytes) */
int jpwl_sens_size;
/** sensitivity addressing size (0=auto/2/4 bytes) */
int jpwl_sens_addr;
/** sensitivity range (0-3) */
int jpwl_sens_range;
/** sensitivity method for MH (-1=no,0-7) */
int jpwl_sens_MH;
/** tile number of sensitivity specification (>=0) */
int jpwl_sens_TPH_tileno[JPWL_MAX_NO_TILESPECS];
/** sensitivity methods for TPHs (-1=no,0-7) */
int jpwl_sens_TPH[JPWL_MAX_NO_TILESPECS];
/*@}*/
/* <<UniPG */
 
/** Digital Cinema compliance 0-not compliant, 1-compliant*/
OPJ_CINEMA_MODE cp_cinema;
/** Maximum rate for each component. If == 0, component size limitation is not considered */
int max_comp_size;
/** Profile name*/
OPJ_RSIZ_CAPABILITIES cp_rsiz;
/** Tile part generation*/
char tp_on;
/** Flag for Tile part generation*/
char tp_flag;
/** MCT (multiple component transform) */
char tcp_mct;
} opj_cparameters_t;
 
/**
Decompression parameters
*/
typedef struct opj_dparameters {
/**
Set the number of highest resolution levels to be discarded.
The image resolution is effectively divided by 2 to the power of the number of discarded levels.
The reduce factor is limited by the smallest total number of decomposition levels among tiles.
if != 0, then original dimension divided by 2^(reduce);
if == 0 or not used, image is decoded to the full resolution
*/
int cp_reduce;
/**
Set the maximum number of quality layers to decode.
If there are less quality layers than the specified number, all the quality layers are decoded.
if != 0, then only the first "layer" layers are decoded;
if == 0 or not used, all the quality layers are decoded
*/
int cp_layer;
 
/**@name command line encoder parameters (not used inside the library) */
/*@{*/
/** input file name */
char infile[OPJ_PATH_LEN];
/** output file name */
char outfile[OPJ_PATH_LEN];
/** input file format 0: J2K, 1: JP2, 2: JPT */
int decod_format;
/** output file format 0: PGX, 1: PxM, 2: BMP */
int cod_format;
/*@}*/
 
/* UniPG>> */
/**@name JPWL decoding parameters */
/*@{*/
/** activates the JPWL correction capabilities */
bool jpwl_correct;
/** expected number of components */
int jpwl_exp_comps;
/** maximum number of tiles */
int jpwl_max_tiles;
/*@}*/
/* <<UniPG */
 
/**
Specify whether the decoding should be done on the entire codestream, or be limited to the main header
Limiting the decoding to the main header makes it possible to extract the characteristics of the codestream
if == NO_LIMITATION, the entire codestream is decoded;
if == LIMIT_TO_MAIN_HEADER, only the main header is decoded;
*/
OPJ_LIMIT_DECODING cp_limit_decoding;
 
} opj_dparameters_t;
 
/** Common fields between JPEG-2000 compression and decompression master structs. */
 
#define opj_common_fields \
opj_event_mgr_t *event_mgr; /**< pointer to the event manager */\
void * client_data; /**< Available for use by application */\
bool is_decompressor; /**< So common code can tell which is which */\
OPJ_CODEC_FORMAT codec_format; /**< selected codec */\
void *j2k_handle; /**< pointer to the J2K codec */\
void *jp2_handle; /**< pointer to the JP2 codec */\
void *mj2_handle /**< pointer to the MJ2 codec */
/* Routines that are to be used by both halves of the library are declared
* to receive a pointer to this structure. There are no actual instances of
* opj_common_struct_t, only of opj_cinfo_t and opj_dinfo_t.
*/
typedef struct opj_common_struct {
opj_common_fields; /* Fields common to both master struct types */
/* Additional fields follow in an actual opj_cinfo_t or
* opj_dinfo_t. All three structs must agree on these
* initial fields! (This would be a lot cleaner in C++.)
*/
} opj_common_struct_t;
 
typedef opj_common_struct_t * opj_common_ptr;
 
/**
Compression context info
*/
typedef struct opj_cinfo {
/** Fields shared with opj_dinfo_t */
opj_common_fields;
/* other specific fields go here */
} opj_cinfo_t;
 
/**
Decompression context info
*/
typedef struct opj_dinfo {
/** Fields shared with opj_cinfo_t */
opj_common_fields;
/* other specific fields go here */
} opj_dinfo_t;
 
/*
==========================================================
I/O stream typedef definitions
==========================================================
*/
 
/*
* Stream open flags.
*/
/** The stream was opened for reading. */
#define OPJ_STREAM_READ 0x0001
/** The stream was opened for writing. */
#define OPJ_STREAM_WRITE 0x0002
 
/**
Byte input-output stream (CIO)
*/
typedef struct opj_cio {
/** codec context */
opj_common_ptr cinfo;
 
/** open mode (read/write) either OPJ_STREAM_READ or OPJ_STREAM_WRITE */
int openmode;
/** pointer to the start of the buffer */
unsigned char *buffer;
/** buffer size in bytes */
int length;
 
/** pointer to the start of the stream */
unsigned char *start;
/** pointer to the end of the stream */
unsigned char *end;
/** pointer to the current position */
unsigned char *bp;
} opj_cio_t;
 
/*
==========================================================
image typedef definitions
==========================================================
*/
 
/**
Defines a single image component
*/
typedef struct opj_image_comp {
/** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */
int dx;
/** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */
int dy;
/** data width */
int w;
/** data height */
int h;
/** x component offset compared to the whole image */
int x0;
/** y component offset compared to the whole image */
int y0;
/** precision */
int prec;
/** image depth in bits */
int bpp;
/** signed (1) / unsigned (0) */
int sgnd;
/** number of decoded resolution */
int resno_decoded;
/** number of division by 2 of the out image compared to the original size of image */
int factor;
/** image component data */
int *data;
} opj_image_comp_t;
 
/**
Defines image data and characteristics
*/
typedef struct opj_image {
/** XOsiz: horizontal offset from the origin of the reference grid to the left side of the image area */
int x0;
/** YOsiz: vertical offset from the origin of the reference grid to the top side of the image area */
int y0;
/** Xsiz: width of the reference grid */
int x1;
/** Ysiz: height of the reference grid */
int y1;
/** number of components in the image */
int numcomps;
/** color space: sRGB, Greyscale or YUV */
OPJ_COLOR_SPACE color_space;
/** image components */
opj_image_comp_t *comps;
/** 'restricted' ICC profile */
unsigned char *icc_profile_buf;
/** size of ICC profile */
int icc_profile_len;
} opj_image_t;
 
/**
Component parameters structure used by the opj_image_create function
*/
typedef struct opj_image_comptparm {
/** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */
int dx;
/** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */
int dy;
/** data width */
int w;
/** data height */
int h;
/** x component offset compared to the whole image */
int x0;
/** y component offset compared to the whole image */
int y0;
/** precision */
int prec;
/** image depth in bits */
int bpp;
/** signed (1) / unsigned (0) */
int sgnd;
} opj_image_cmptparm_t;
 
/*
==========================================================
Information on the JPEG 2000 codestream
==========================================================
*/
 
/**
Index structure : Information concerning a packet inside tile
*/
typedef struct opj_packet_info {
/** packet start position (including SOP marker if it exists) */
int start_pos;
/** end of packet header position (including EPH marker if it exists)*/
int end_ph_pos;
/** packet end position */
int end_pos;
/** packet distorsion */
double disto;
} opj_packet_info_t;
 
/**
Index structure : Information concerning tile-parts
*/
typedef struct opj_tp_info {
/** start position of tile part */
int tp_start_pos;
/** end position of tile part header */
int tp_end_header;
/** end position of tile part */
int tp_end_pos;
/** start packet of tile part */
int tp_start_pack;
/** number of packets of tile part */
int tp_numpacks;
} opj_tp_info_t;
 
/**
Index structure : information regarding tiles
*/
typedef struct opj_tile_info {
/** value of thresh for each layer by tile cfr. Marcela */
double *thresh;
/** number of tile */
int tileno;
/** start position */
int start_pos;
/** end position of the header */
int end_header;
/** end position */
int end_pos;
/** precinct number for each resolution level (width) */
int pw[33];
/** precinct number for each resolution level (height) */
int ph[33];
/** precinct size (in power of 2), in X for each resolution level */
int pdx[33];
/** precinct size (in power of 2), in Y for each resolution level */
int pdy[33];
/** information concerning packets inside tile */
opj_packet_info_t *packet;
/** add fixed_quality */
int numpix;
/** add fixed_quality */
double distotile;
/** number of tile parts */
int num_tps;
/** information concerning tile parts */
opj_tp_info_t *tp;
} opj_tile_info_t;
 
/* UniPG>> */
/**
Marker structure
*/
typedef struct opj_marker_info_t {
/** marker type */
unsigned short int type;
/** position in codestream */
int pos;
/** length, marker val included */
int len;
} opj_marker_info_t;
/* <<UniPG */
 
/**
Index structure of the codestream
*/
typedef struct opj_codestream_info {
/** maximum distortion reduction on the whole image (add for Marcela) */
double D_max;
/** packet number */
int packno;
/** writing the packet in the index with t2_encode_packets */
int index_write;
/** image width */
int image_w;
/** image height */
int image_h;
/** progression order */
OPJ_PROG_ORDER prog;
/** tile size in x */
int tile_x;
/** tile size in y */
int tile_y;
/** */
int tile_Ox;
/** */
int tile_Oy;
/** number of tiles in X */
int tw;
/** number of tiles in Y */
int th;
/** component numbers */
int numcomps;
/** number of layer */
int numlayers;
/** number of decomposition for each component */
int *numdecompos;
/* UniPG>> */
/** number of markers */
int marknum;
/** list of markers */
opj_marker_info_t *marker;
/** actual size of markers array */
int maxmarknum;
/* <<UniPG */
/** main header position */
int main_head_start;
/** main header position */
int main_head_end;
/** codestream's size */
int codestream_size;
/** information regarding tiles inside image */
opj_tile_info_t *tile;
} opj_codestream_info_t;
 
#ifdef __cplusplus
extern "C" {
#endif
 
 
/*
==========================================================
openjpeg version
==========================================================
*/
 
OPJ_API const char * OPJ_CALLCONV opj_version(void);
 
/*
==========================================================
image functions definitions
==========================================================
*/
 
/**
Create an image
@param numcmpts number of components
@param cmptparms components parameters
@param clrspc image color space
@return returns a new image structure if successful, returns NULL otherwise
*/
OPJ_API opj_image_t* OPJ_CALLCONV opj_image_create(int numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc);
 
/**
Deallocate any resources associated with an image
@param image image to be destroyed
*/
OPJ_API void OPJ_CALLCONV opj_image_destroy(opj_image_t *image);
 
/*
==========================================================
stream functions definitions
==========================================================
*/
 
/**
Open and allocate a memory stream for read / write.
On reading, the user must provide a buffer containing encoded data. The buffer will be
wrapped by the returned CIO handle.
On writing, buffer parameters must be set to 0: a buffer will be allocated by the library
to contain encoded data.
@param cinfo Codec context info
@param buffer Reading: buffer address. Writing: NULL
@param length Reading: buffer length. Writing: 0
@return Returns a CIO handle if successful, returns NULL otherwise
*/
OPJ_API opj_cio_t* OPJ_CALLCONV opj_cio_open(opj_common_ptr cinfo, unsigned char *buffer, int length);
 
/**
Close and free a CIO handle
@param cio CIO handle to free
*/
OPJ_API void OPJ_CALLCONV opj_cio_close(opj_cio_t *cio);
 
/**
Get position in byte stream
@param cio CIO handle
@return Returns the position in bytes
*/
OPJ_API int OPJ_CALLCONV cio_tell(opj_cio_t *cio);
/**
Set position in byte stream
@param cio CIO handle
@param pos Position, in number of bytes, from the beginning of the stream
*/
OPJ_API void OPJ_CALLCONV cio_seek(opj_cio_t *cio, int pos);
 
/*
==========================================================
event manager functions definitions
==========================================================
*/
 
OPJ_API opj_event_mgr_t* OPJ_CALLCONV opj_set_event_mgr(opj_common_ptr cinfo, opj_event_mgr_t *event_mgr, void *context);
 
/*
==========================================================
codec functions definitions
==========================================================
*/
/**
Creates a J2K/JPT/JP2 decompression structure
@param format Decoder to select
@return Returns a handle to a decompressor if successful, returns NULL otherwise
*/
OPJ_API opj_dinfo_t* OPJ_CALLCONV opj_create_decompress(OPJ_CODEC_FORMAT format);
/**
Destroy a decompressor handle
@param dinfo decompressor handle to destroy
*/
OPJ_API void OPJ_CALLCONV opj_destroy_decompress(opj_dinfo_t *dinfo);
/**
Set decoding parameters to default values
@param parameters Decompression parameters
*/
OPJ_API void OPJ_CALLCONV opj_set_default_decoder_parameters(opj_dparameters_t *parameters);
/**
Setup the decoder decoding parameters using user parameters.
Decoding parameters are returned in j2k->cp.
@param dinfo decompressor handle
@param parameters decompression parameters
*/
OPJ_API void OPJ_CALLCONV opj_setup_decoder(opj_dinfo_t *dinfo, opj_dparameters_t *parameters);
/**
Decode an image from a JPEG-2000 codestream
@param dinfo decompressor handle
@param cio Input buffer stream
@return Returns a decoded image if successful, returns NULL otherwise
*/
OPJ_API opj_image_t* OPJ_CALLCONV opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio);
 
/**
Decode an image from a JPEG-2000 codestream and extract the codestream information
@param dinfo decompressor handle
@param cio Input buffer stream
@param cstr_info Codestream information structure if needed afterwards, NULL otherwise
@return Returns a decoded image if successful, returns NULL otherwise
*/
OPJ_API opj_image_t* OPJ_CALLCONV opj_decode_with_info(opj_dinfo_t *dinfo, opj_cio_t *cio, opj_codestream_info_t *cstr_info);
/**
Creates a J2K/JP2 compression structure
@param format Coder to select
@return Returns a handle to a compressor if successful, returns NULL otherwise
*/
OPJ_API opj_cinfo_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format);
/**
Destroy a compressor handle
@param cinfo compressor handle to destroy
*/
OPJ_API void OPJ_CALLCONV opj_destroy_compress(opj_cinfo_t *cinfo);
/**
Set encoding parameters to default values, that means :
<ul>
<li>Lossless
<li>1 tile
<li>Size of precinct : 2^15 x 2^15 (means 1 precinct)
<li>Size of code-block : 64 x 64
<li>Number of resolutions: 6
<li>No SOP marker in the codestream
<li>No EPH marker in the codestream
<li>No sub-sampling in x or y direction
<li>No mode switch activated
<li>Progression order: LRCP
<li>No index file
<li>No ROI upshifted
<li>No offset of the origin of the image
<li>No offset of the origin of the tiles
<li>Reversible DWT 5-3
</ul>
@param parameters Compression parameters
*/
OPJ_API void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t *parameters);
/**
Setup the encoder parameters using the current image and using user parameters.
@param cinfo Compressor handle
@param parameters Compression parameters
@param image Input filled image
*/
OPJ_API void OPJ_CALLCONV opj_setup_encoder(opj_cinfo_t *cinfo, opj_cparameters_t *parameters, opj_image_t *image);
/**
Encode an image into a JPEG-2000 codestream
@param cinfo compressor handle
@param cio Output buffer stream
@param image Image to encode
@param index Depreacted -> Set to NULL. To extract index, used opj_encode_wci()
@return Returns true if successful, returns false otherwise
*/
OPJ_API bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index);
/**
Encode an image into a JPEG-2000 codestream and extract the codestream information
@param cinfo compressor handle
@param cio Output buffer stream
@param image Image to encode
@param cstr_info Codestream information structure if needed afterwards, NULL otherwise
@return Returns true if successful, returns false otherwise
*/
OPJ_API bool OPJ_CALLCONV opj_encode_with_info(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info);
/**
Destroy Codestream information after compression or decompression
@param cstr_info Codestream information structure
*/
OPJ_API void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_t *cstr_info);
 
#ifdef __cplusplus
}
#endif
 
#endif /* OPENJPEG_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/Makefile
0,0 → 1,18
CC = kos32-gcc
LD = kos32-ld
 
SDK_DIR = /media/maxim/E22406D62406AE1B/SVNKOS/contrib/sdk
CFLAGS = -c -fno-ident -O2 -fomit-frame-pointer -fno-ident -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32
 
INCLUDES = -I $(SDK_DIR)/sources/newlib/libc/include -I $(SDK_DIR)/sources/freetype/include -I $(SDK_DIR)/sources/libpng -I $(SDK_DIR)/sources/zlib -I .
 
SRC := $(notdir $(wildcard *.c))
OBJECTS = $(patsubst %.c, %.o, $(SRC))
 
default: $(patsubst %.c,%.o,$(SRC))
ar rcs libjbig2dec.a *.o
rm *.o
mv libjbig2dec.a ../lib
 
%.o : %.c Makefile $(SRC)
$(CC) $(CFLAGS) -DHAVE_CONFIG_H $(INCLUDES) -o $@ $<
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/config.h
0,0 → 1,120
/* config.h. Generated from config.h.in by configure. */
/* config.h.in. Generated from configure.ac by autoheader. */
 
/* Define if building universal (internal helper macro) */
/* #undef AC_APPLE_UNIVERSAL_BUILD */
 
/* Define to 1 if you have the <dlfcn.h> header file. */
#define HAVE_DLFCN_H 1
 
/* Define if the local libc includes getopt_long() */
#define HAVE_GETOPT_LONG /**/
 
/* Define to 1 if you have the <inttypes.h> header file. */
#define HAVE_INTTYPES_H 1
 
/* Define to 1 if you have the <libintl.h> header file. */
#define HAVE_LIBINTL_H 1
 
/* Define if libpng is available (-lpng) */
#define HAVE_LIBPNG 1
 
/* Define to 1 if you have the <memory.h> header file. */
#define HAVE_MEMORY_H 1
 
/* Define to 1 if you have the `memset' function. */
#define HAVE_MEMSET 1
 
/* Define to 1 if you have the `snprintf' function. */
#define HAVE_SNPRINTF 1
 
/* Define to 1 if you have the <stddef.h> header file. */
#define HAVE_STDDEF_H 1
 
/* Define to 1 if you have the <stdint.h> header file. */
#define HAVE_STDINT_H 1
 
/* Define to 1 if you have the <stdlib.h> header file. */
#define HAVE_STDLIB_H 1
 
/* Define to 1 if you have the `strdup' function. */
#define HAVE_STRDUP 1
 
/* Define to 1 if you have the <strings.h> header file. */
#define HAVE_STRINGS_H 1
 
/* Define to 1 if you have the <string.h> header file. */
#define HAVE_STRING_H 1
 
/* Define to 1 if you have the <sys/stat.h> header file. */
#define HAVE_SYS_STAT_H 1
 
/* Define to 1 if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1
 
/* Define to 1 if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
 
/* set by configure if an alternate header with the stdint.h types is found */
/* #undef JBIG2_REPLACE_STDINT_H */
 
/* Define to the sub-directory in which libtool stores uninstalled libraries.
*/
#define LT_OBJDIR ".libs/"
 
/* Define to 1 if your C compiler doesn't accept -c and -o together. */
/* #undef NO_MINUS_C_MINUS_O */
 
/* Name of package */
#define PACKAGE "jbig2dec"
 
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT "jbig2-dev@ghostscript.com"
 
/* Define to the full name of this package. */
#define PACKAGE_NAME "jbig2dec"
 
/* Define to the full name and version of this package. */
#define PACKAGE_STRING "jbig2dec 0.11"
 
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "jbig2dec"
 
/* Define to the version of this package. */
#define PACKAGE_VERSION "0.11"
 
/* The size of `char', as computed by sizeof. */
#define SIZEOF_CHAR 1
 
/* The size of `int', as computed by sizeof. */
#define SIZEOF_INT 4
 
/* The size of `long', as computed by sizeof. */
#define SIZEOF_LONG 4
 
/* The size of `short', as computed by sizeof. */
#define SIZEOF_SHORT 2
 
/* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1
 
/* Version number of package */
#define VERSION "0.11"
 
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
significant byte first (like Motorola and SPARC, unlike Intel). */
#if defined AC_APPLE_UNIVERSAL_BUILD
# if defined __BIG_ENDIAN__
# define WORDS_BIGENDIAN 1
# endif
#else
# ifndef WORDS_BIGENDIAN
/* # undef WORDS_BIGENDIAN */
# endif
#endif
 
/* Define to empty if `const' does not conform to ANSI C. */
/* #undef const */
 
/* Define to `unsigned int' if <sys/types.h> does not define. */
/* #undef size_t */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/config_types.h
0,0 → 1,19
/*
generated header with missing types for the
jbig2dec program and library. include this
after config.h, within the HAVE_CONFIG_H
ifdef
*/
 
#ifndef HAVE_STDINT_H
# ifdef JBIG2_REPLACE_STDINT_H
# include <no_replacement_found>
# else
typedef unsigned int uint32_t;
typedef unsigned short uint16_t;
typedef unsigned char uint8_t;
typedef signed int int32_t;
typedef signed short int16_t;
typedef signed char int8_t;
# endif /* JBIG2_REPLACE_STDINT */
#endif /* HAVE_STDINT_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/config_win32.h
0,0 → 1,41
/*
jbig2dec
 
Copyright (C) 2002-2003 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
/* configuration header file for compiling under Microsoft Windows */
 
/* update package version here */
#define PACKAGE "jbig2dec"
#define VERSION "0.3"
 
#if defined(_MSC_VER) || (defined(__BORLANDC__) && defined(__WIN32__))
/* Microsoft Visual C++ or Borland C++ */
typedef signed char int8_t;
typedef short int int16_t;
typedef int int32_t;
typedef __int64 int64_t;
 
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
/* no uint64_t */
 
# if defined(_MSC_VER)
# if _MSC_VER < 1500 /* VS 2008 has vsnprintf */
# define vsnprintf _vsnprintf
# endif
# endif
# define snprintf _snprintf
 
#endif /* _MSC_VER */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/getopt.h
0,0 → 1,180
/* Declarations for getopt.
Copyright (C) 1989-1994, 1996-1999, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
 
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
 
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
 
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
 
#ifndef _GETOPT_H
 
#ifndef __need_getopt
# define _GETOPT_H 1
#endif
 
/* If __GNU_LIBRARY__ is not already defined, either we are being used
standalone, or this is the first header included in the source file.
If we are being used with glibc, we need to include <features.h>, but
that does not exist if we are standalone. So: if __GNU_LIBRARY__ is
not defined, include <ctype.h>, which will pull in <features.h> for us
if it's from glibc. (Why ctype.h? It's guaranteed to exist and it
doesn't flood the namespace with stuff the way some other headers do.) */
#if !defined __GNU_LIBRARY__
# include <ctype.h>
#endif
 
#ifdef __cplusplus
extern "C" {
#endif
 
/* For communication from `getopt' to the caller.
When `getopt' finds an option that takes an argument,
the argument value is returned here.
Also, when `ordering' is RETURN_IN_ORDER,
each non-option ARGV-element is returned here. */
 
extern char *optarg;
 
/* Index in ARGV of the next element to be scanned.
This is used for communication to and from the caller
and for communication between successive calls to `getopt'.
 
On entry to `getopt', zero means this is the first call; initialize.
 
When `getopt' returns -1, this is the index of the first of the
non-option elements that the caller should itself scan.
 
Otherwise, `optind' communicates from one call to the next
how much of ARGV has been scanned so far. */
 
extern int optind;
 
/* Callers store zero here to inhibit the error message `getopt' prints
for unrecognized options. */
 
extern int opterr;
 
/* Set to an option character which was unrecognized. */
 
extern int optopt;
 
#ifndef __need_getopt
/* Describe the long-named options requested by the application.
The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
of `struct option' terminated by an element containing a name which is
zero.
 
The field `has_arg' is:
no_argument (or 0) if the option does not take an argument,
required_argument (or 1) if the option requires an argument,
optional_argument (or 2) if the option takes an optional argument.
 
If the field `flag' is not NULL, it points to a variable that is set
to the value given in the field `val' when the option is found, but
left unchanged if the option is not found.
 
To have a long-named option do something other than set an `int' to
a compiled-in constant, such as set a value from `optarg', set the
option's `flag' field to zero and its `val' field to a nonzero
value (the equivalent single-letter option character, if there is
one). For long options that have a zero `flag' field, `getopt'
returns the contents of the `val' field. */
 
struct option
{
# if (defined __STDC__ && __STDC__) || defined __cplusplus
const char *name;
# else
char *name;
# endif
/* has_arg can't be an enum because some compilers complain about
type mismatches in all the code that assumes it is an int. */
int has_arg;
int *flag;
int val;
};
 
/* Names for the values of the `has_arg' field of `struct option'. */
 
# define no_argument 0
# define required_argument 1
# define optional_argument 2
#endif /* need getopt */
 
 
/* Get definitions and prototypes for functions to process the
arguments in ARGV (ARGC of them, minus the program name) for
options given in OPTS.
 
Return the option character from OPTS just read. Return -1 when
there are no more options. For unrecognized options, or options
missing arguments, `optopt' is set to the option letter, and '?' is
returned.
 
The OPTS string is a list of characters which are recognized option
letters, optionally followed by colons, specifying that that letter
takes an argument, to be placed in `optarg'.
 
If a letter in OPTS is followed by two colons, its argument is
optional. This behavior is specific to the GNU `getopt'.
 
The argument `--' causes premature termination of argument
scanning, explicitly telling `getopt' that there are no more
options.
 
If OPTS begins with `--', then non-option arguments are treated as
arguments to the option '\0'. This behavior is specific to the GNU
`getopt'. */
 
#if (defined __STDC__ && __STDC__) || defined __cplusplus
# ifdef __GNU_LIBRARY__
/* Many other libraries have conflicting prototypes for getopt, with
differences in the consts, in stdlib.h. To avoid compilation
errors, only prototype getopt for the GNU C library. */
extern int getopt (int __argc, char *const *__argv, const char *__shortopts);
# else /* not __GNU_LIBRARY__ */
extern int getopt ();
# endif /* __GNU_LIBRARY__ */
 
# ifndef __need_getopt
extern int getopt_long (int __argc, char *const *__argv, const char *__shortopts,
const struct option *__longopts, int *__longind);
extern int getopt_long_only (int __argc, char *const *__argv,
const char *__shortopts,
const struct option *__longopts, int *__longind);
 
/* Internal only. Users should not call this directly. */
extern int _getopt_internal (int __argc, char *const *__argv,
const char *__shortopts,
const struct option *__longopts, int *__longind,
int __long_only);
# endif
#else /* not __STDC__ */
extern int getopt ();
# ifndef __need_getopt
extern int getopt_long ();
extern int getopt_long_only ();
 
extern int _getopt_internal ();
# endif
#endif /* __STDC__ */
 
#ifdef __cplusplus
}
#endif
 
/* Make sure we later can get all the definitions and declarations. */
#undef __need_getopt
 
#endif /* getopt.h */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2.c
0,0 → 1,428
/*
jbig2dec
 
Copyright (C) 2002-2005 Artifex Software, Inc.
 
This software is provided AS-IS with no warranty,
either express or implied.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "os_types.h"
 
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
 
#include "jbig2.h"
#include "jbig2_priv.h"
 
static void *
jbig2_default_alloc (Jbig2Allocator *allocator, size_t size)
{
return malloc (size);
}
 
static void
jbig2_default_free (Jbig2Allocator *allocator, void *p)
{
free (p);
}
 
static void *
jbig2_default_realloc (Jbig2Allocator *allocator, void *p, size_t size)
{
return realloc (p, size);
}
 
static Jbig2Allocator jbig2_default_allocator =
{
jbig2_default_alloc,
jbig2_default_free,
jbig2_default_realloc
};
 
void *
jbig2_alloc (Jbig2Allocator *allocator, size_t size)
{
return allocator->alloc (allocator, size);
}
 
void
jbig2_free (Jbig2Allocator *allocator, void *p)
{
allocator->free (allocator, p);
}
 
void *
jbig2_realloc (Jbig2Allocator *allocator, void *p, size_t size)
{
return allocator->realloc (allocator, p, size);
}
 
static int
jbig2_default_error(void *data, const char *msg,
Jbig2Severity severity, int32_t seg_idx)
{
/* report only fatal errors by default */
if (severity == JBIG2_SEVERITY_FATAL) {
fprintf(stderr, "jbig2 decoder FATAL ERROR: %s", msg);
if (seg_idx != -1) fprintf(stderr, " (segment 0x%02x)", seg_idx);
fprintf(stderr, "\n");
fflush(stderr);
}
 
return 0;
}
 
int
jbig2_error(Jbig2Ctx *ctx, Jbig2Severity severity, int32_t segment_number,
const char *fmt, ...)
{
char buf[1024];
va_list ap;
int n;
int code;
 
va_start (ap, fmt);
n = vsnprintf (buf, sizeof(buf), fmt, ap);
va_end (ap);
if (n < 0 || n == sizeof(buf))
strncpy (buf, "jbig2_error: error in generating error string", sizeof(buf));
code = ctx->error_callback (ctx->error_callback_data, buf, severity, segment_number);
if (severity == JBIG2_SEVERITY_FATAL)
code = -1;
return code;
}
 
Jbig2Ctx *
jbig2_ctx_new (Jbig2Allocator *allocator,
Jbig2Options options,
Jbig2GlobalCtx *global_ctx,
Jbig2ErrorCallback error_callback,
void *error_callback_data)
{
Jbig2Ctx *result;
 
if (allocator == NULL)
allocator = &jbig2_default_allocator;
if (error_callback == NULL)
error_callback = &jbig2_default_error;
 
result = (Jbig2Ctx *)jbig2_alloc(allocator, sizeof(Jbig2Ctx));
if (result == NULL) {
error_callback(error_callback_data, "initial context allocation failed!",
JBIG2_SEVERITY_FATAL, -1);
return result;
}
 
result->allocator = allocator;
result->options = options;
result->global_ctx = (const Jbig2Ctx *)global_ctx;
result->error_callback = error_callback;
result->error_callback_data = error_callback_data;
 
result->state = (options & JBIG2_OPTIONS_EMBEDDED) ?
JBIG2_FILE_SEQUENTIAL_HEADER :
JBIG2_FILE_HEADER;
 
result->buf = NULL;
 
result->n_segments = 0;
result->n_segments_max = 16;
result->segments = (Jbig2Segment **)jbig2_alloc(allocator, result->n_segments_max * sizeof(Jbig2Segment *));
result->segment_index = 0;
 
result->current_page = 0;
result->max_page_index = 4;
result->pages = (Jbig2Page *)jbig2_alloc(allocator, result->max_page_index * sizeof(Jbig2Page));
{
int index;
for (index = 0; index < result->max_page_index; index++) {
result->pages[index].state = JBIG2_PAGE_FREE;
result->pages[index].number = 0;
result->pages[index].image = NULL;
}
}
 
return result;
}
 
int32_t
jbig2_get_int32 (const byte *buf)
{
return (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
}
 
int16_t
jbig2_get_int16 (const byte *buf)
{
return (buf[0] << 8) | buf[1];
}
 
 
/**
* jbig2_data_in: submit data for decoding
* @ctx: The jbig2dec decoder context
* @data: a pointer to the data buffer
* @size: the size of the data buffer in bytes
*
* Copies the specified data into internal storage and attempts
* to (continue to) parse it as part of a jbig2 data stream.
*
* Return code: 0 on success
* -1 if there is a parsing error, or whatever
* the error handling callback returns
**/
int
jbig2_data_in (Jbig2Ctx *ctx, const unsigned char *data, size_t size)
{
const size_t initial_buf_size = 1024;
 
if (ctx->buf == NULL)
{
size_t buf_size = initial_buf_size;
 
do
buf_size <<= 1;
while (buf_size < size);
ctx->buf = (byte *)jbig2_alloc(ctx->allocator, buf_size);
ctx->buf_size = buf_size;
ctx->buf_rd_ix = 0;
ctx->buf_wr_ix = 0;
}
else if (ctx->buf_wr_ix + size > ctx->buf_size)
{
if (ctx->buf_rd_ix <= (ctx->buf_size >> 1) &&
ctx->buf_wr_ix - ctx->buf_rd_ix + size <= ctx->buf_size)
{
memmove(ctx->buf, ctx->buf + ctx->buf_rd_ix,
ctx->buf_wr_ix - ctx->buf_rd_ix);
}
else
{
byte *buf;
size_t buf_size = initial_buf_size;
 
do
buf_size <<= 1;
while (buf_size < ctx->buf_wr_ix - ctx->buf_rd_ix + size);
buf = (byte *)jbig2_alloc(ctx->allocator, buf_size);
memcpy(buf, ctx->buf + ctx->buf_rd_ix,
ctx->buf_wr_ix - ctx->buf_rd_ix);
jbig2_free(ctx->allocator, ctx->buf);
ctx->buf = buf;
ctx->buf_size = buf_size;
}
ctx->buf_wr_ix -= ctx->buf_rd_ix;
ctx->buf_rd_ix = 0;
}
memcpy(ctx->buf + ctx->buf_wr_ix, data, size);
ctx->buf_wr_ix += size;
 
/* data has now been added to buffer */
 
for (;;)
{
const byte jbig2_id_string[8] = { 0x97, 0x4a, 0x42, 0x32, 0x0d, 0x0a, 0x1a, 0x0a };
Jbig2Segment *segment;
size_t header_size;
int code;
 
switch (ctx->state)
{
case JBIG2_FILE_HEADER:
/* D.4.1 */
if (ctx->buf_wr_ix - ctx->buf_rd_ix < 9)
return 0;
if (memcmp(ctx->buf + ctx->buf_rd_ix, jbig2_id_string, 8))
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, -1,
"Not a JBIG2 file header");
/* D.4.2 */
ctx->file_header_flags = ctx->buf[ctx->buf_rd_ix + 8];
if (ctx->file_header_flags & 0xFC) {
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, -1,
"reserved bits (2-7) of file header flags are not zero (0x%02x)", ctx->file_header_flags);
}
/* D.4.3 */
if (!(ctx->file_header_flags & 2)) /* number of pages is known */
{
if (ctx->buf_wr_ix - ctx->buf_rd_ix < 13)
return 0;
ctx->n_pages = jbig2_get_int32(ctx->buf + ctx->buf_rd_ix + 9);
ctx->buf_rd_ix += 13;
if (ctx->n_pages == 1)
jbig2_error(ctx, JBIG2_SEVERITY_INFO, -1, "file header indicates a single page document");
else
jbig2_error(ctx, JBIG2_SEVERITY_INFO, -1, "file header indicates a %d page document", ctx->n_pages);
}
else /* number of pages not known */
{
ctx->n_pages=0;
ctx->buf_rd_ix += 9;
}
/* determine the file organization based on the flags - D.4.2 again */
if (ctx->file_header_flags & 1)
{
ctx->state = JBIG2_FILE_SEQUENTIAL_HEADER;
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, -1, "file header indicates sequential organization");
}
else
{
ctx->state = JBIG2_FILE_RANDOM_HEADERS;
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, -1, "file header indicates random-access organization");
 
}
break;
case JBIG2_FILE_SEQUENTIAL_HEADER:
case JBIG2_FILE_RANDOM_HEADERS:
segment = jbig2_parse_segment_header(ctx, ctx->buf + ctx->buf_rd_ix,
ctx->buf_wr_ix - ctx->buf_rd_ix,
&header_size);
if (segment == NULL)
return 0; /* need more data */
ctx->buf_rd_ix += header_size;
 
if (ctx->n_segments == ctx->n_segments_max)
ctx->segments = (Jbig2Segment **)jbig2_realloc(ctx->allocator,
ctx->segments, (ctx->n_segments_max <<= 2) * sizeof(Jbig2Segment *));
 
ctx->segments[ctx->n_segments++] = segment;
if (ctx->state == JBIG2_FILE_RANDOM_HEADERS)
{
if ((segment->flags & 63) == 51) /* end of file */
ctx->state = JBIG2_FILE_RANDOM_BODIES;
}
else /* JBIG2_FILE_SEQUENTIAL_HEADER */
ctx->state = JBIG2_FILE_SEQUENTIAL_BODY;
break;
case JBIG2_FILE_SEQUENTIAL_BODY:
case JBIG2_FILE_RANDOM_BODIES:
segment = ctx->segments[ctx->segment_index];
if (segment->data_length > ctx->buf_wr_ix - ctx->buf_rd_ix)
return 0; /* need more data */
code = jbig2_parse_segment(ctx, segment, ctx->buf + ctx->buf_rd_ix);
ctx->buf_rd_ix += segment->data_length;
ctx->segment_index++;
if (ctx->state == JBIG2_FILE_RANDOM_BODIES)
{
if (ctx->segment_index == ctx->n_segments)
ctx->state = JBIG2_FILE_EOF;
}
else /* JBIG2_FILE_SEQUENCIAL_BODY */
{
ctx->state = JBIG2_FILE_SEQUENTIAL_HEADER;
}
if (code < 0)
{
ctx->state = JBIG2_FILE_EOF;
return code;
}
break;
case JBIG2_FILE_EOF:
if (ctx->buf_rd_ix == ctx->buf_wr_ix)
return 0;
return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, -1,
"Garbage beyond end of file");
}
}
return 0;
}
 
void
jbig2_ctx_free (Jbig2Ctx *ctx)
{
Jbig2Allocator *ca = ctx->allocator;
int i;
 
jbig2_free(ca, ctx->buf);
if (ctx->segments != NULL) {
for (i = 0; i < ctx->n_segments; i++)
jbig2_free_segment(ctx, ctx->segments[i]);
jbig2_free(ca, ctx->segments);
}
 
if (ctx->pages != NULL) {
for (i = 0; i <= ctx->current_page; i++)
if (ctx->pages[i].image != NULL)
jbig2_image_release(ctx, ctx->pages[i].image);
jbig2_free(ca, ctx->pages);
}
 
jbig2_free(ca, ctx);
}
 
Jbig2GlobalCtx *jbig2_make_global_ctx (Jbig2Ctx *ctx)
{
return (Jbig2GlobalCtx *)ctx;
}
 
void jbig2_global_ctx_free(Jbig2GlobalCtx *global_ctx)
{
jbig2_ctx_free((Jbig2Ctx *)global_ctx);
}
 
 
/* I'm not committed to keeping the word stream interface. It's handy
when you think you may be streaming your input, but if you're not
(as is currently the case), it just adds complexity.
*/
 
typedef struct {
Jbig2WordStream super;
const byte *data;
size_t size;
} Jbig2WordStreamBuf;
 
static uint32_t
jbig2_word_stream_buf_get_next_word(Jbig2WordStream *self, int offset)
{
Jbig2WordStreamBuf *z = (Jbig2WordStreamBuf *)self;
const byte *data = z->data;
uint32_t result;
 
if (offset + 4 < z->size)
result = (data[offset] << 24) | (data[offset + 1] << 16) |
(data[offset + 2] << 8) | data[offset + 3];
else if (offset >= z->size)
return 0;
else
{
int i;
 
result = 0;
for (i = 0; i < z->size - offset; i++)
result |= data[offset + i] << ((3 - i) << 3);
}
return result;
}
 
Jbig2WordStream *
jbig2_word_stream_buf_new(Jbig2Ctx *ctx, const byte *data, size_t size)
{
Jbig2WordStreamBuf *result = (Jbig2WordStreamBuf *)jbig2_alloc(ctx->allocator, sizeof(Jbig2WordStreamBuf));
 
result->super.get_next_word = jbig2_word_stream_buf_get_next_word;
result->data = data;
result->size = size;
 
return &result->super;
}
 
void
jbig2_word_stream_buf_free(Jbig2Ctx *ctx, Jbig2WordStream *ws)
{
jbig2_free(ctx->allocator, ws);
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2.h
0,0 → 1,135
/*
jbig2dec
 
Copyright (C) 2002-2005 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
#ifdef __cplusplus
extern "C" {
#endif
 
#ifndef _JBIG2_H
#define _JBIG2_H
 
/* warning levels */
typedef enum {
JBIG2_SEVERITY_DEBUG,
JBIG2_SEVERITY_INFO,
JBIG2_SEVERITY_WARNING,
JBIG2_SEVERITY_FATAL
} Jbig2Severity;
 
typedef enum {
JBIG2_OPTIONS_EMBEDDED = 1
} Jbig2Options;
 
/* forward public structure declarations */
typedef struct _Jbig2Allocator Jbig2Allocator;
typedef struct _Jbig2Ctx Jbig2Ctx;
typedef struct _Jbig2GlobalCtx Jbig2GlobalCtx;
typedef struct _Jbig2Segment Jbig2Segment;
typedef struct _Jbig2Image Jbig2Image;
 
/* private structures */
typedef struct _Jbig2Page Jbig2Page;
typedef struct _Jbig2SymbolDictionary Jbig2SymbolDictionary;
 
/*
this is the general image structure used by the jbig2dec library
images are 1 bpp, packed into rows a byte at a time. stride gives
the byte offset to the next row, while width and height define
the size of the image area in pixels.
*/
 
struct _Jbig2Image {
int width, height, stride;
uint8_t *data;
int refcount;
};
 
Jbig2Image* jbig2_image_new(Jbig2Ctx *ctx, int width, int height);
Jbig2Image* jbig2_image_clone(Jbig2Ctx *ctx, Jbig2Image *image);
void jbig2_image_release(Jbig2Ctx *ctx, Jbig2Image *image);
void jbig2_image_free(Jbig2Ctx *ctx, Jbig2Image *image);
void jbig2_image_clear(Jbig2Ctx *ctx, Jbig2Image *image, int value);
Jbig2Image *jbig2_image_resize(Jbig2Ctx *ctx, Jbig2Image *image,
int width, int height);
 
/* errors are returned from the library via a callback. If no callback
is provided (a NULL argument is passed ot jbig2_ctx_new) a default
handler is used which prints fatal errors to the stderr stream. */
 
/* error callback */
typedef int (*Jbig2ErrorCallback) (void *data,
const char *msg, Jbig2Severity severity,
int32_t seg_idx);
 
/* memory allocation is likewise done via a set of callbacks so that
clients can better control memory usage. If a NULL is passed for
this argumennt of jbig2_ctx_new, a default allocator based on malloc()
is used. */
 
/* dynamic memory callbacks */
struct _Jbig2Allocator {
void *(*alloc) (Jbig2Allocator *allocator, size_t size);
void (*free) (Jbig2Allocator *allocator, void *p);
void *(*realloc) (Jbig2Allocator *allocator, void *p, size_t size);
};
 
/* decoder context */
Jbig2Ctx *jbig2_ctx_new (Jbig2Allocator *allocator,
Jbig2Options options,
Jbig2GlobalCtx *global_ctx,
Jbig2ErrorCallback error_callback,
void *error_callback_data);
void jbig2_ctx_free (Jbig2Ctx *ctx);
 
/* global context for embedded streams */
Jbig2GlobalCtx *jbig2_make_global_ctx (Jbig2Ctx *ctx);
void jbig2_global_ctx_free (Jbig2GlobalCtx *global_ctx);
 
/* submit data to the decoder */
int jbig2_data_in (Jbig2Ctx *ctx, const unsigned char *data, size_t size);
 
/* get the next available decoded page image. NULL means there isn't one. */
Jbig2Image *jbig2_page_out (Jbig2Ctx *ctx);
/* mark a returned page image as no longer needed. */
int jbig2_release_page (Jbig2Ctx *ctx, Jbig2Image *image);
/* mark the current page as complete, simulating an end-of-page segment (for broken streams) */
int jbig2_complete_page (Jbig2Ctx *ctx);
 
 
/* segment header routines */
 
struct _Jbig2Segment {
uint32_t number;
uint8_t flags;
uint32_t page_association;
size_t data_length;
int referred_to_segment_count;
uint32_t *referred_to_segments;
void *result;
};
 
Jbig2Segment *jbig2_parse_segment_header (Jbig2Ctx *ctx, uint8_t *buf, size_t buf_size,
size_t *p_header_size);
int jbig2_parse_segment (Jbig2Ctx *ctx, Jbig2Segment *segment,
const uint8_t *segment_data);
void jbig2_free_segment (Jbig2Ctx *ctx, Jbig2Segment *segment);
 
Jbig2Segment *jbig2_find_segment(Jbig2Ctx *ctx, uint32_t number);
 
#endif /* _JBIG2_H */
 
#ifdef __cplusplus
}
#endif
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2_arith.c
0,0 → 1,394
/*
jbig2dec
 
Copyright (C) 2001-2005 Artifex Software, Inc.
 
This software is provided AS-IS with no warranty,
either express or implied.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "os_types.h"
 
#include <stdio.h>
#include <stdlib.h>
 
#include "jbig2.h"
#include "jbig2_priv.h"
#include "jbig2_arith.h"
 
#ifdef JBIG2_DEBUG
#include <stdio.h>
#endif
 
struct _Jbig2ArithState {
uint32_t C;
int A;
 
int CT;
 
uint32_t next_word;
int next_word_bytes;
 
Jbig2WordStream *ws;
int offset;
};
 
#undef SOFTWARE_CONVENTION
 
/*
A note on the "software conventions".
 
Previously, I had misinterpreted the spec, and had thought that the
spec's description of the "software convention" was wrong. Now I
believe that this code is both correct and matches the spec, with
SOFTWARE_CONVENTION defined or not. Thanks to William Rucklidge for
the clarification.
 
In any case, my benchmarking indicates no speed difference at all.
Therefore, for now we will just use the normative version.
 
*/
 
static void
jbig2_arith_bytein (Jbig2ArithState *as)
{
byte B;
 
/* invariant: as->next_word_bytes > 0 */
 
/* Figure G.3 */
B = (byte)((as->next_word >> 24) & 0xFF);
if (B == 0xFF)
{
byte B1;
if (as->next_word_bytes == 1)
{
Jbig2WordStream *ws = as->ws;
as->next_word = ws->get_next_word (ws, as->offset);
as->offset += 4;
B1 = (byte)((as->next_word >> 24) & 0xFF);
if (B1 > 0x8F)
{
#ifdef JBIG2_DEBUG_ARITH
fprintf(stderr, "read %02x (aa)\n", B);
#endif
#ifndef SOFTWARE_CONVENTION
as->C += 0xFF00;
#endif
as->CT = 8;
as->next_word = (0xFF00 | B1) << 16;
as->next_word_bytes = 2;
}
else
{
#ifdef JBIG2_DEBUG_ARITH
fprintf(stderr, "read %02x (a)\n", B);
#endif
#ifdef SOFTWARE_CONVENTION
as->C += 0xFE00 - (B1 << 9);
#else
as->C += B1 << 9;
#endif
as->CT = 7;
as->next_word_bytes = 4;
}
}
else
{
B1 = (byte)((as->next_word >> 16) & 0xFF);
if (B1 > 0x8F)
{
#ifdef JBIG2_DEBUG_ARITH
fprintf(stderr, "read %02x (ba)\n", B);
#endif
#ifndef SOFTWARE_CONVENTION
as->C += 0xFF00;
#endif
as->CT = 8;
}
else
{
as->next_word_bytes--;
as->next_word <<= 8;
#ifdef JBIG2_DEBUG_ARITH
fprintf(stderr, "read %02x (b)\n", B);
#endif
 
#ifdef SOFTWARE_CONVENTION
as->C += 0xFE00 - (B1 << 9);
#else
as->C += (B1 << 9);
#endif
as->CT = 7;
}
}
}
else
{
#ifdef JBIG2_DEBUG_ARITH
fprintf(stderr, "read %02x\n", B);
#endif
as->CT = 8;
as->next_word <<= 8;
as->next_word_bytes--;
if (as->next_word_bytes == 0)
{
Jbig2WordStream *ws = as->ws;
 
as->next_word = ws->get_next_word (ws, as->offset);
as->offset += 4;
as->next_word_bytes = 4;
}
B = (byte)((as->next_word >> 24) & 0xFF);
#ifdef SOFTWARE_CONVENTION
as->C += 0xFF00 - (B << 8);
#else
as->C += (B << 8);
#endif
}
}
 
#if defined(JBIG2_DEBUG) || defined(JBIG2_DEBUG_ARITH)
#include <stdio.h>
 
static void
jbig2_arith_trace (Jbig2ArithState *as, Jbig2ArithCx cx)
{
fprintf(stderr, "I = %2d, MPS = %d, A = %04x, CT = %2d, C = %08x\n",
cx & 0x7f, cx >> 7, as->A, as->CT, as->C);
}
#endif
 
/** Allocate and initialize a new arithmetic coding state
* the returned pointer can simply be freed; this does
* not affect the associated Jbig2WordStream.
*/
Jbig2ArithState *
jbig2_arith_new (Jbig2Ctx *ctx, Jbig2WordStream *ws)
{
Jbig2ArithState *result;
 
result = (Jbig2ArithState *)jbig2_alloc(ctx->allocator,
sizeof(Jbig2ArithState));
 
result->ws = ws;
 
result->next_word = ws->get_next_word (ws, 0);
result->next_word_bytes = 4;
result->offset = 4;
 
/* Figure G.1 */
#ifdef SOFTWARE_CONVENTION
result->C = (~(result->next_word >> 8)) & 0xFF0000;
#else
result->C = (result->next_word >> 8) & 0xFF0000;
#endif
 
jbig2_arith_bytein (result);
result->C <<= 7;
result->CT -= 7;
result->A = 0x8000;
 
return result;
}
 
/* could put bit fields in to minimize memory usage */
typedef struct {
unsigned short Qe;
byte mps_xor; /* mps_xor = index ^ NMPS */
byte lps_xor; /* lps_xor = index ^ NLPS ^ (SWITCH << 7) */
} Jbig2ArithQe;
 
const Jbig2ArithQe jbig2_arith_Qe[] = {
{ 0x5601, 1 ^ 0, 1 ^ 0 ^ 0x80 },
{ 0x3401, 2 ^ 1, 6 ^ 1 },
{ 0x1801, 3 ^ 2, 9 ^ 2 },
{ 0x0AC1, 4 ^ 3, 12 ^ 3 },
{ 0x0521, 5 ^ 4, 29 ^ 4 },
{ 0x0221, 38 ^ 5, 33 ^ 5 },
{ 0x5601, 7 ^ 6, 6 ^ 6 ^ 0x80 },
{ 0x5401, 8 ^ 7, 14 ^ 7 },
{ 0x4801, 9 ^ 8, 14 ^ 8 },
{ 0x3801, 10 ^ 9, 14 ^ 9 },
{ 0x3001, 11 ^ 10, 17 ^ 10 },
{ 0x2401, 12 ^ 11, 18 ^ 11 },
{ 0x1C01, 13 ^ 12, 20 ^ 12 },
{ 0x1601, 29 ^ 13, 21 ^ 13 },
{ 0x5601, 15 ^ 14, 14 ^ 14 ^ 0x80 },
{ 0x5401, 16 ^ 15, 14 ^ 15 },
{ 0x5101, 17 ^ 16, 15 ^ 16 },
{ 0x4801, 18 ^ 17, 16 ^ 17 },
{ 0x3801, 19 ^ 18, 17 ^ 18 },
{ 0x3401, 20 ^ 19, 18 ^ 19 },
{ 0x3001, 21 ^ 20, 19 ^ 20 },
{ 0x2801, 22 ^ 21, 19 ^ 21 },
{ 0x2401, 23 ^ 22, 20 ^ 22 },
{ 0x2201, 24 ^ 23, 21 ^ 23 },
{ 0x1C01, 25 ^ 24, 22 ^ 24 },
{ 0x1801, 26 ^ 25, 23 ^ 25 },
{ 0x1601, 27 ^ 26, 24 ^ 26 },
{ 0x1401, 28 ^ 27, 25 ^ 27 },
{ 0x1201, 29 ^ 28, 26 ^ 28 },
{ 0x1101, 30 ^ 29, 27 ^ 29 },
{ 0x0AC1, 31 ^ 30, 28 ^ 30 },
{ 0x09C1, 32 ^ 31, 29 ^ 31 },
{ 0x08A1, 33 ^ 32, 30 ^ 32 },
{ 0x0521, 34 ^ 33, 31 ^ 33 },
{ 0x0441, 35 ^ 34, 32 ^ 34 },
{ 0x02A1, 36 ^ 35, 33 ^ 35 },
{ 0x0221, 37 ^ 36, 34 ^ 36 },
{ 0x0141, 38 ^ 37, 35 ^ 37 },
{ 0x0111, 39 ^ 38, 36 ^ 38 },
{ 0x0085, 40 ^ 39, 37 ^ 39 },
{ 0x0049, 41 ^ 40, 38 ^ 40 },
{ 0x0025, 42 ^ 41, 39 ^ 41 },
{ 0x0015, 43 ^ 42, 40 ^ 42 },
{ 0x0009, 44 ^ 43, 41 ^ 43 },
{ 0x0005, 45 ^ 44, 42 ^ 44 },
{ 0x0001, 45 ^ 45, 43 ^ 45 },
{ 0x5601, 46 ^ 46, 46 ^ 46 }
};
 
static void
jbig2_arith_renormd (Jbig2ArithState *as)
{
/* Figure E.18 */
do
{
if (as->CT == 0)
jbig2_arith_bytein (as);
as->A <<= 1;
as->C <<= 1;
as->CT--;
}
while ((as->A & 0x8000) == 0);
}
 
bool
jbig2_arith_decode (Jbig2ArithState *as, Jbig2ArithCx *pcx)
{
Jbig2ArithCx cx = *pcx;
const Jbig2ArithQe *pqe = &jbig2_arith_Qe[cx & 0x7f];
bool D;
 
/* Figure G.2 */
as->A -= pqe->Qe;
if (
#ifdef SOFTWARE_CONVENTION
/* Note: I do not think this is correct. See above. */
(as->C >> 16) < as->A
#else
!((as->C >> 16) < pqe->Qe)
#endif
)
{
#ifndef SOFTWARE_CONVENTION
as->C -= pqe->Qe << 16;
#endif
if ((as->A & 0x8000) == 0)
{
/* MPS_EXCHANGE, Figure E.16 */
if (as->A < pqe->Qe)
{
D = 1 - (cx >> 7);
*pcx ^= pqe->lps_xor;
}
else
{
D = cx >> 7;
*pcx ^= pqe->mps_xor;
}
jbig2_arith_renormd (as);
return D;
}
else
return cx >> 7;
}
else
{
#ifdef SOFTWARE_CONVENTION
as->C -= (as->A) << 16;
#endif
/* LPS_EXCHANGE, Figure E.17 */
if (as->A < pqe->Qe)
{
as->A = pqe->Qe;
D = cx >> 7;
*pcx ^= pqe->mps_xor;
}
else
{
as->A = pqe->Qe;
D = 1 - (cx >> 7);
*pcx ^= pqe->lps_xor;
}
jbig2_arith_renormd (as);
return D;
}
}
 
#ifdef TEST
 
static uint32_t
test_get_word (Jbig2WordStream *self, int offset)
{
byte stream[] = {
0x84, 0xC7, 0x3B, 0xFC, 0xE1, 0xA1, 0x43, 0x04, 0x02, 0x20, 0x00, 0x00,
0x41, 0x0D, 0xBB, 0x86, 0xF4, 0x31, 0x7F, 0xFF, 0x88, 0xFF, 0x37, 0x47,
0x1A, 0xDB, 0x6A, 0xDF, 0xFF, 0xAC,
0x00, 0x00
};
if (offset >= sizeof(stream))
return 0;
else
return (stream[offset] << 24) | (stream[offset + 1] << 16) |
(stream[offset + 2] << 8) | stream[offset + 3];
}
 
int
main (int argc, char **argv)
{
Jbig2Ctx *ctx;
Jbig2WordStream ws;
Jbig2ArithState *as;
int i;
Jbig2ArithCx cx = 0;
 
ctx = jbig2_ctx_new(NULL, 0, NULL, NULL, NULL);
 
ws.get_next_word = test_get_word;
as = jbig2_arith_new (ctx, &ws);
#ifdef JBIG2_DEBUG_ARITH
jbig2_arith_trace (as, cx);
#endif
 
for (i = 0; i < 256; i++)
{
bool D;
 
D = jbig2_arith_decode (as, &cx);
#ifdef JBIG2_DEBUG_ARITH
fprintf(stderr, "%3d: D = %d, ", i, D);
jbig2_arith_trace (as, cx);
#endif
}
 
jbig2_free(ctx->allocator, as);
 
jbig2_ctx_free(ctx);
 
return 0;
}
#endif
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2_arith.h
0,0 → 1,31
/*
jbig2dec
 
Copyright (C) 2001 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
typedef struct _Jbig2ArithState Jbig2ArithState;
 
/* An arithmetic coding context is stored as a single byte, with the
index in the low order 7 bits (actually only 6 are used), and the
MPS in the top bit. */
typedef unsigned char Jbig2ArithCx;
 
/* allocate and initialize a new arithmetic coding state */
Jbig2ArithState *
jbig2_arith_new (Jbig2Ctx *ctx, Jbig2WordStream *ws);
 
/* decode a bit */
bool
jbig2_arith_decode (Jbig2ArithState *as, Jbig2ArithCx *pcx);
 
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2_arith_iaid.c
0,0 → 1,91
/*
jbig2dec
 
Copyright (C) 2001 Artifex Software, Inc.
 
This software is provided AS-IS with no warranty,
either express or implied.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
/* Annex A.3 */
 
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "os_types.h"
 
#include <stddef.h>
#include <string.h> /* memset() */
 
#ifdef VERBOSE
#include <stdio.h> /* for debug printing only */
#endif
 
#include "jbig2.h"
#include "jbig2_priv.h"
#include "jbig2_arith.h"
#include "jbig2_arith_iaid.h"
 
struct _Jbig2ArithIaidCtx {
int SBSYMCODELEN;
Jbig2ArithCx *IAIDx;
};
 
Jbig2ArithIaidCtx *
jbig2_arith_iaid_ctx_new(Jbig2Ctx *ctx, int SBSYMCODELEN)
{
Jbig2ArithIaidCtx *result = jbig2_new(ctx, Jbig2ArithIaidCtx, 1);
int ctx_size = 1 << SBSYMCODELEN;
 
result->SBSYMCODELEN = SBSYMCODELEN;
result->IAIDx = jbig2_alloc(ctx->allocator, ctx_size);
memset(result->IAIDx, 0, ctx_size);
 
return result;
}
 
/* A.3 */
/* Return value: -1 on error, 0 on normal value */
int
jbig2_arith_iaid_decode(Jbig2ArithIaidCtx *ctx, Jbig2ArithState *as,
int32_t *p_result)
{
Jbig2ArithCx *IAIDx = ctx->IAIDx;
int SBSYMCODELEN = ctx->SBSYMCODELEN;
int PREV = 1;
int D;
int i;
 
/* A.3 (2) */
for (i = 0; i < SBSYMCODELEN; i++)
{
D = jbig2_arith_decode(as, &IAIDx[PREV]);
#ifdef VERBOSE
fprintf(stderr, "IAID%x: D = %d\n", PREV, D);
#endif
PREV = (PREV << 1) | D;
}
/* A.3 (3) */
PREV -= 1 << SBSYMCODELEN;
#ifdef VERBOSE
fprintf(stderr, "IAID result: %d\n", PREV);
#endif
*p_result = PREV;
return 0;
}
 
void
jbig2_arith_iaid_ctx_free(Jbig2Ctx *ctx, Jbig2ArithIaidCtx *iax)
{
jbig2_free(ctx->allocator, iax->IAIDx);
jbig2_free(ctx->allocator, iax);
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2_arith_iaid.h
0,0 → 1,26
/*
jbig2dec
 
Copyright (C) 2001 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
typedef struct _Jbig2ArithIaidCtx Jbig2ArithIaidCtx;
 
Jbig2ArithIaidCtx *
jbig2_arith_iaid_ctx_new(Jbig2Ctx *ctx, int SBSYMCODELEN);
 
int
jbig2_arith_iaid_decode(Jbig2ArithIaidCtx *ctx, Jbig2ArithState *as,
int32_t *p_result);
 
void
jbig2_arith_iaid_ctx_free(Jbig2Ctx *ctx, Jbig2ArithIaidCtx *iax);
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2_arith_int.c
0,0 → 1,139
/*
jbig2dec
 
Copyright (C) 2001 Artifex Software, Inc.
 
This software is provided AS-IS with no warranty,
either express or implied.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
/* Annex A */
 
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "os_types.h"
 
#include <stddef.h>
#include <string.h> /* memset() */
 
#include "jbig2.h"
#include "jbig2_priv.h"
#include "jbig2_arith.h"
#include "jbig2_arith_int.h"
 
struct _Jbig2ArithIntCtx {
Jbig2ArithCx IAx[512];
};
 
Jbig2ArithIntCtx *
jbig2_arith_int_ctx_new(Jbig2Ctx *ctx)
{
Jbig2ArithIntCtx *result = jbig2_new(ctx, Jbig2ArithIntCtx, 1);
 
memset(result->IAx, 0, sizeof(result->IAx));
 
return result;
}
 
/* A.2 */
/* Return value: -1 on error, 0 on normal value, 1 on OOB return. */
int
jbig2_arith_int_decode(Jbig2ArithIntCtx *ctx, Jbig2ArithState *as,
int32_t *p_result)
{
Jbig2ArithCx *IAx = ctx->IAx;
int PREV = 1;
int S, V;
int bit;
int n_tail, offset;
int i;
 
S = jbig2_arith_decode(as, &IAx[PREV]);
PREV = (PREV << 1) | S;
 
bit = jbig2_arith_decode(as, &IAx[PREV]);
PREV = (PREV << 1) | bit;
if (bit)
{
bit = jbig2_arith_decode(as, &IAx[PREV]);
PREV = (PREV << 1) | bit;
 
if (bit)
{
bit = jbig2_arith_decode(as, &IAx[PREV]);
PREV = (PREV << 1) | bit;
 
if (bit)
{
bit = jbig2_arith_decode(as, &IAx[PREV]);
PREV = (PREV << 1) | bit;
 
if (bit)
{
bit = jbig2_arith_decode(as, &IAx[PREV]);
PREV = (PREV << 1) | bit;
 
if (bit)
{
n_tail = 32;
offset = 4436;
}
else
{
n_tail = 12;
offset = 340;
}
}
else
{
n_tail = 8;
offset = 84;
}
}
else
{
n_tail = 6;
offset = 20;
}
}
else
{
n_tail = 4;
offset = 4;
}
}
else
{
n_tail = 2;
offset = 0;
}
 
V = 0;
for (i = 0; i < n_tail; i++)
{
bit = jbig2_arith_decode(as, &IAx[PREV]);
PREV = ((PREV << 1) & 511) | (PREV & 256) | bit;
V = (V << 1) | bit;
}
 
V += offset;
V = S ? -V : V;
*p_result = V;
return S && V == 0 ? 1 : 0;
}
 
void
jbig2_arith_int_ctx_free(Jbig2Ctx *ctx, Jbig2ArithIntCtx *iax)
{
jbig2_free(ctx->allocator, iax);
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2_arith_int.h
0,0 → 1,26
/*
jbig2dec
 
Copyright (C) 2001 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
typedef struct _Jbig2ArithIntCtx Jbig2ArithIntCtx;
 
Jbig2ArithIntCtx *
jbig2_arith_int_ctx_new(Jbig2Ctx *ctx);
 
int
jbig2_arith_int_decode(Jbig2ArithIntCtx *ctx, Jbig2ArithState *as,
int32_t *p_result);
 
void
jbig2_arith_int_ctx_free(Jbig2Ctx *ctx, Jbig2ArithIntCtx *iax);
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2_generic.c
0,0 → 1,854
/*
jbig2dec
 
Copyright (C) 2002-2005 Artifex Software, Inc.
 
This software is provided AS-IS with no warranty,
either express or implied.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
/**
* Generic region handlers.
**/
 
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "os_types.h"
 
#include <stddef.h>
#include <string.h> /* memcpy(), memset() */
 
#ifdef OUTPUT_PBM
#include <stdio.h>
#endif
 
#include "jbig2.h"
#include "jbig2_priv.h"
#include "jbig2_image.h"
#include "jbig2_arith.h"
#include "jbig2_generic.h"
#include "jbig2_mmr.h"
 
/* return the appropriate context size for the given template */
int
jbig2_generic_stats_size(Jbig2Ctx *ctx, int template)
{
int stats_size = template == 0 ? 1 << 16 :
template == 1 ? 1 << 1 << 13 : 1 << 10;
return stats_size;
}
 
 
static int
jbig2_decode_generic_template0(Jbig2Ctx *ctx,
Jbig2Segment *segment,
const Jbig2GenericRegionParams *params,
Jbig2ArithState *as,
Jbig2Image *image,
Jbig2ArithCx *GB_stats)
{
const int GBW = image->width;
const int GBH = image->height;
const int rowstride = image->stride;
int x, y;
byte *gbreg_line = (byte *)image->data;
 
/* todo: currently we only handle the nominal gbat location */
 
#ifdef OUTPUT_PBM
printf("P4\n%d %d\n", GBW, GBH);
#endif
 
for (y = 0; y < GBH; y++)
{
uint32_t CONTEXT;
uint32_t line_m1;
uint32_t line_m2;
int padded_width = (GBW + 7) & -8;
 
line_m1 = (y >= 1) ? gbreg_line[-rowstride] : 0;
line_m2 = (y >= 2) ? gbreg_line[-(rowstride << 1)] << 6 : 0;
CONTEXT = (line_m1 & 0x7f0) | (line_m2 & 0xf800);
 
/* 6.2.5.7 3d */
for (x = 0; x < padded_width; x += 8)
{
byte result = 0;
int x_minor;
int minor_width = GBW - x > 8 ? 8 : GBW - x;
 
if (y >= 1)
line_m1 = (line_m1 << 8) |
(x + 8 < GBW ? gbreg_line[-rowstride + (x >> 3) + 1] : 0);
 
if (y >= 2)
line_m2 = (line_m2 << 8) |
(x + 8 < GBW ? gbreg_line[-(rowstride << 1) + (x >> 3) + 1] << 6: 0);
 
/* This is the speed-critical inner loop. */
for (x_minor = 0; x_minor < minor_width; x_minor++)
{
bool bit;
 
bit = jbig2_arith_decode(as, &GB_stats[CONTEXT]);
result |= bit << (7 - x_minor);
CONTEXT = ((CONTEXT & 0x7bf7) << 1) | bit |
((line_m1 >> (7 - x_minor)) & 0x10) |
((line_m2 >> (7 - x_minor)) & 0x800);
}
gbreg_line[x >> 3] = result;
}
#ifdef OUTPUT_PBM
fwrite(gbreg_line, 1, rowstride, stdout);
#endif
gbreg_line += rowstride;
}
 
return 0;
}
 
static int
jbig2_decode_generic_template0_unopt(Jbig2Ctx *ctx,
Jbig2Segment *segment,
const Jbig2GenericRegionParams *params,
Jbig2ArithState *as,
Jbig2Image *image,
Jbig2ArithCx *GB_stats)
{
const int GBW = image->width;
const int GBH = image->height;
uint32_t CONTEXT;
int x,y;
bool bit;
 
/* this version is generic and easy to understand, but very slow */
 
for (y = 0; y < GBH; y++) {
for (x = 0; x < GBW; x++) {
CONTEXT = 0;
CONTEXT |= jbig2_image_get_pixel(image, x - 1, y) << 0;
CONTEXT |= jbig2_image_get_pixel(image, x - 2, y) << 1;
CONTEXT |= jbig2_image_get_pixel(image, x - 3, y) << 2;
CONTEXT |= jbig2_image_get_pixel(image, x - 4, y) << 3;
CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0],
y + params->gbat[1]) << 4;
CONTEXT |= jbig2_image_get_pixel(image, x + 2, y - 1) << 5;
CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 1) << 6;
CONTEXT |= jbig2_image_get_pixel(image, x + 0, y - 1) << 7;
CONTEXT |= jbig2_image_get_pixel(image, x - 1, y - 1) << 8;
CONTEXT |= jbig2_image_get_pixel(image, x - 2, y - 1) << 9;
CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[2],
y + params->gbat[3]) << 10;
CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[4],
y + params->gbat[5]) << 11;
CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 2) << 12;
CONTEXT |= jbig2_image_get_pixel(image, x + 0, y - 2) << 13;
CONTEXT |= jbig2_image_get_pixel(image, x - 1, y - 2) << 14;
CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[6],
y + params->gbat[7]) << 15;
bit = jbig2_arith_decode(as, &GB_stats[CONTEXT]);
jbig2_image_set_pixel(image, x, y, bit);
}
}
return 0;
}
 
static int
jbig2_decode_generic_template1(Jbig2Ctx *ctx,
Jbig2Segment *segment,
const Jbig2GenericRegionParams *params,
Jbig2ArithState *as,
Jbig2Image *image,
Jbig2ArithCx *GB_stats)
{
const int GBW = image->width;
const int GBH = image->height;
const int rowstride = image->stride;
int x, y;
byte *gbreg_line = (byte *)image->data;
 
/* todo: currently we only handle the nominal gbat location */
 
#ifdef OUTPUT_PBM
printf("P4\n%d %d\n", GBW, GBH);
#endif
 
for (y = 0; y < GBH; y++)
{
uint32_t CONTEXT;
uint32_t line_m1;
uint32_t line_m2;
int padded_width = (GBW + 7) & -8;
 
line_m1 = (y >= 1) ? gbreg_line[-rowstride] : 0;
line_m2 = (y >= 2) ? gbreg_line[-(rowstride << 1)] << 5 : 0;
CONTEXT = ((line_m1 >> 1) & 0x1f8) | ((line_m2 >> 1) & 0x1e00);
 
/* 6.2.5.7 3d */
for (x = 0; x < padded_width; x += 8)
{
byte result = 0;
int x_minor;
int minor_width = GBW - x > 8 ? 8 : GBW - x;
 
if (y >= 1)
line_m1 = (line_m1 << 8) |
(x + 8 < GBW ? gbreg_line[-rowstride + (x >> 3) + 1] : 0);
 
if (y >= 2)
line_m2 = (line_m2 << 8) |
(x + 8 < GBW ? gbreg_line[-(rowstride << 1) + (x >> 3) + 1] << 5: 0);
 
/* This is the speed-critical inner loop. */
for (x_minor = 0; x_minor < minor_width; x_minor++)
{
bool bit;
 
bit = jbig2_arith_decode(as, &GB_stats[CONTEXT]);
result |= bit << (7 - x_minor);
CONTEXT = ((CONTEXT & 0xefb) << 1) | bit |
((line_m1 >> (8 - x_minor)) & 0x8) |
((line_m2 >> (8 - x_minor)) & 0x200);
}
gbreg_line[x >> 3] = result;
}
#ifdef OUTPUT_PBM
fwrite(gbreg_line, 1, rowstride, stdout);
#endif
gbreg_line += rowstride;
}
 
return 0;
}
 
static int
jbig2_decode_generic_template2(Jbig2Ctx *ctx,
Jbig2Segment *segment,
const Jbig2GenericRegionParams *params,
Jbig2ArithState *as,
Jbig2Image *image,
Jbig2ArithCx *GB_stats)
{
const int GBW = image->width;
const int GBH = image->height;
const int rowstride = image->stride;
int x, y;
byte *gbreg_line = (byte *)image->data;
 
/* todo: currently we only handle the nominal gbat location */
 
#ifdef OUTPUT_PBM
printf("P4\n%d %d\n", GBW, GBH);
#endif
 
for (y = 0; y < GBH; y++)
{
uint32_t CONTEXT;
uint32_t line_m1;
uint32_t line_m2;
int padded_width = (GBW + 7) & -8;
 
line_m1 = (y >= 1) ? gbreg_line[-rowstride] : 0;
line_m2 = (y >= 2) ? gbreg_line[-(rowstride << 1)] << 4 : 0;
CONTEXT = ((line_m1 >> 3) & 0x7c) | ((line_m2 >> 3) & 0x380);
 
/* 6.2.5.7 3d */
for (x = 0; x < padded_width; x += 8)
{
byte result = 0;
int x_minor;
int minor_width = GBW - x > 8 ? 8 : GBW - x;
 
if (y >= 1)
line_m1 = (line_m1 << 8) |
(x + 8 < GBW ? gbreg_line[-rowstride + (x >> 3) + 1] : 0);
 
if (y >= 2)
line_m2 = (line_m2 << 8) |
(x + 8 < GBW ? gbreg_line[-(rowstride << 1) + (x >> 3) + 1] << 4: 0);
 
/* This is the speed-critical inner loop. */
for (x_minor = 0; x_minor < minor_width; x_minor++)
{
bool bit;
 
bit = jbig2_arith_decode(as, &GB_stats[CONTEXT]);
result |= bit << (7 - x_minor);
CONTEXT = ((CONTEXT & 0x1bd) << 1) | bit |
((line_m1 >> (10 - x_minor)) & 0x4) |
((line_m2 >> (10 - x_minor)) & 0x80);
}
gbreg_line[x >> 3] = result;
}
#ifdef OUTPUT_PBM
fwrite(gbreg_line, 1, rowstride, stdout);
#endif
gbreg_line += rowstride;
}
 
return 0;
}
 
static int
jbig2_decode_generic_template2a(Jbig2Ctx *ctx,
Jbig2Segment *segment,
const Jbig2GenericRegionParams *params,
Jbig2ArithState *as,
Jbig2Image *image,
Jbig2ArithCx *GB_stats)
{
const int GBW = image->width;
const int GBH = image->height;
const int rowstride = image->stride;
int x, y;
byte *gbreg_line = (byte *)image->data;
 
/* This is a special case for GBATX1 = 3, GBATY1 = -1 */
 
#ifdef OUTPUT_PBM
printf("P4\n%d %d\n", GBW, GBH);
#endif
 
for (y = 0; y < GBH; y++)
{
uint32_t CONTEXT;
uint32_t line_m1;
uint32_t line_m2;
int padded_width = (GBW + 7) & -8;
 
line_m1 = (y >= 1) ? gbreg_line[-rowstride] : 0;
line_m2 = (y >= 2) ? gbreg_line[-(rowstride << 1)] << 4 : 0;
CONTEXT = ((line_m1 >> 3) & 0x78) | ((line_m1 >> 2) & 0x4) | ((line_m2 >> 3) & 0x380);
 
/* 6.2.5.7 3d */
for (x = 0; x < padded_width; x += 8)
{
byte result = 0;
int x_minor;
int minor_width = GBW - x > 8 ? 8 : GBW - x;
 
if (y >= 1)
line_m1 = (line_m1 << 8) |
(x + 8 < GBW ? gbreg_line[-rowstride + (x >> 3) + 1] : 0);
 
if (y >= 2)
line_m2 = (line_m2 << 8) |
(x + 8 < GBW ? gbreg_line[-(rowstride << 1) + (x >> 3) + 1] << 4: 0);
 
/* This is the speed-critical inner loop. */
for (x_minor = 0; x_minor < minor_width; x_minor++)
{
bool bit;
 
bit = jbig2_arith_decode(as, &GB_stats[CONTEXT]);
result |= bit << (7 - x_minor);
CONTEXT = ((CONTEXT & 0x1b9) << 1) | bit |
((line_m1 >> (10 - x_minor)) & 0x8) |
((line_m1 >> (9 - x_minor)) & 0x4) |
((line_m2 >> (10 - x_minor)) & 0x80);
}
gbreg_line[x >> 3] = result;
}
#ifdef OUTPUT_PBM
fwrite(gbreg_line, 1, rowstride, stdout);
#endif
gbreg_line += rowstride;
}
 
return 0;
}
 
static int
jbig2_decode_generic_template3(Jbig2Ctx *ctx,
Jbig2Segment *segment,
const Jbig2GenericRegionParams *params,
Jbig2ArithState *as,
Jbig2Image *image,
Jbig2ArithCx *GB_stats)
{
const int GBW = image->width;
const int GBH = image->height;
const int rowstride = image->stride;
byte *gbreg_line = (byte *)image->data;
int x, y;
 
/* this routine only handles the nominal AT location */
 
#ifdef OUTPUT_PBM
printf("P4\n%d %d\n", GBW, GBH);
#endif
 
for (y = 0; y < GBH; y++)
{
uint32_t CONTEXT;
uint32_t line_m1;
int padded_width = (GBW + 7) & -8;
 
line_m1 = (y >= 1) ? gbreg_line[-rowstride] : 0;
CONTEXT = (line_m1 >> 1) & 0x3f0;
 
/* 6.2.5.7 3d */
for (x = 0; x < padded_width; x += 8)
{
byte result = 0;
int x_minor;
int minor_width = GBW - x > 8 ? 8 : GBW - x;
 
if (y >= 1)
line_m1 = (line_m1 << 8) |
(x + 8 < GBW ? gbreg_line[-rowstride + (x >> 3) + 1] : 0);
 
/* This is the speed-critical inner loop. */
for (x_minor = 0; x_minor < minor_width; x_minor++)
{
bool bit;
 
bit = jbig2_arith_decode(as, &GB_stats[CONTEXT]);
result |= bit << (7 - x_minor);
CONTEXT = ((CONTEXT & 0x1f7) << 1) | bit |
((line_m1 >> (10 - x_minor)) & 0x010);
}
gbreg_line[x >> 3] = result;
}
#ifdef OUTPUT_PBM
fwrite(gbreg_line, 1, rowstride, stdout);
#endif
gbreg_line += rowstride;
}
 
return 0;
}
 
static int
jbig2_decode_generic_template3_unopt(Jbig2Ctx *ctx,
Jbig2Segment *segment,
const Jbig2GenericRegionParams *params,
Jbig2ArithState *as,
Jbig2Image *image,
Jbig2ArithCx *GB_stats)
{
const int GBW = image->width;
const int GBH = image->height;
uint32_t CONTEXT;
int x,y;
bool bit;
 
/* this version is generic and easy to understand, but very slow */
 
for (y = 0; y < GBH; y++) {
for (x = 0; x < GBW; x++) {
CONTEXT = 0;
CONTEXT |= jbig2_image_get_pixel(image, x - 1, y) << 0;
CONTEXT |= jbig2_image_get_pixel(image, x - 2, y) << 1;
CONTEXT |= jbig2_image_get_pixel(image, x - 3, y) << 2;
CONTEXT |= jbig2_image_get_pixel(image, x - 4, y) << 3;
CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0],
y + params->gbat[1]) << 4;
CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 1) << 5;
CONTEXT |= jbig2_image_get_pixel(image, x + 0, y - 1) << 6;
CONTEXT |= jbig2_image_get_pixel(image, x - 1, y - 1) << 7;
CONTEXT |= jbig2_image_get_pixel(image, x - 2, y - 1) << 8;
CONTEXT |= jbig2_image_get_pixel(image, x - 3, y - 1) << 9;
bit = jbig2_arith_decode(as, &GB_stats[CONTEXT]);
jbig2_image_set_pixel(image, x, y, bit);
}
}
return 0;
}
 
static void
copy_prev_row(Jbig2Image *image, int row)
{
if (!row) {
/* no previous row */
memset( image->data, 0, image->stride );
} else {
/* duplicate data from the previous row */
uint8_t *src = image->data + (row - 1) * image->stride;
memcpy( src + image->stride, src, image->stride );
}
}
 
static int
jbig2_decode_generic_template0_TPGDON(Jbig2Ctx *ctx,
Jbig2Segment *segment,
const Jbig2GenericRegionParams *params,
Jbig2ArithState *as,
Jbig2Image *image,
Jbig2ArithCx *GB_stats)
{
const int GBW = image->width;
const int GBH = image->height;
uint32_t CONTEXT;
int x, y;
bool bit;
int LTP = 0;
 
for (y = 0; y < GBH; y++)
{
LTP ^= jbig2_arith_decode(as, &GB_stats[0x9B25]);
if (!LTP) {
for (x = 0; x < GBW; x++) {
CONTEXT = jbig2_image_get_pixel(image, x - 1, y);
CONTEXT |= jbig2_image_get_pixel(image, x - 2, y) << 1;
CONTEXT |= jbig2_image_get_pixel(image, x - 3, y) << 2;
CONTEXT |= jbig2_image_get_pixel(image, x - 4, y) << 3;
CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0],
y + params->gbat[1]) << 4;
CONTEXT |= jbig2_image_get_pixel(image, x + 2, y - 1) << 5;
CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 1) << 6;
CONTEXT |= jbig2_image_get_pixel(image, x , y - 1) << 7;
CONTEXT |= jbig2_image_get_pixel(image, x - 1, y - 1) << 8;
CONTEXT |= jbig2_image_get_pixel(image, x - 2, y - 1) << 9;
CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[2],
y + params->gbat[3]) << 10;
CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[4],
y + params->gbat[5]) << 11;
CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 2) << 12;
CONTEXT |= jbig2_image_get_pixel(image, x , y - 2) << 13;
CONTEXT |= jbig2_image_get_pixel(image, x - 1, y - 2) << 14;
CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[6],
y + params->gbat[7]) << 15;
bit = jbig2_arith_decode(as, &GB_stats[CONTEXT]);
jbig2_image_set_pixel(image, x, y, bit);
}
} else {
copy_prev_row(image, y);
}
}
 
return 0;
}
 
static int
jbig2_decode_generic_template1_TPGDON(Jbig2Ctx *ctx,
Jbig2Segment *segment,
const Jbig2GenericRegionParams *params,
Jbig2ArithState *as,
Jbig2Image *image,
Jbig2ArithCx *GB_stats)
{
const int GBW = image->width;
const int GBH = image->height;
uint32_t CONTEXT;
int x, y;
bool bit;
int LTP = 0;
 
for (y = 0; y < GBH; y++) {
LTP ^= jbig2_arith_decode(as, &GB_stats[0x0795]);
if (!LTP) {
for (x = 0; x < GBW; x++) {
CONTEXT = jbig2_image_get_pixel(image, x - 1, y);
CONTEXT |= jbig2_image_get_pixel(image, x - 2, y) << 1;
CONTEXT |= jbig2_image_get_pixel(image, x - 3, y) << 2;
CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0],
y + params->gbat[1]) << 3;
CONTEXT |= jbig2_image_get_pixel(image, x + 2, y - 1) << 4;
CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 1) << 5;
CONTEXT |= jbig2_image_get_pixel(image, x , y - 1) << 6;
CONTEXT |= jbig2_image_get_pixel(image, x - 1, y - 1) << 7;
CONTEXT |= jbig2_image_get_pixel(image, x - 2, y - 1) << 8;
CONTEXT |= jbig2_image_get_pixel(image, x + 2, y - 2) << 9;
CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 2) << 10;
CONTEXT |= jbig2_image_get_pixel(image, x , y - 2) << 11;
CONTEXT |= jbig2_image_get_pixel(image, x - 1, y - 2) << 12;
bit = jbig2_arith_decode(as, &GB_stats[CONTEXT]);
jbig2_image_set_pixel(image, x, y, bit);
}
} else {
copy_prev_row(image, y);
}
}
 
return 0;
}
 
static int
jbig2_decode_generic_template2_TPGDON(Jbig2Ctx *ctx,
Jbig2Segment *segment,
const Jbig2GenericRegionParams *params,
Jbig2ArithState *as,
Jbig2Image *image,
Jbig2ArithCx *GB_stats)
{
const int GBW = image->width;
const int GBH = image->height;
uint32_t CONTEXT;
int x, y;
bool bit;
int LTP = 0;
 
for (y = 0; y < GBH; y++) {
LTP ^= jbig2_arith_decode(as, &GB_stats[0xE5]);
if (!LTP) {
for (x = 0; x < GBW; x++) {
CONTEXT = jbig2_image_get_pixel(image, x - 1, y);
CONTEXT |= jbig2_image_get_pixel(image, x - 2, y) << 1;
CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0],
y + params->gbat[1]) << 2;
CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 1) << 3;
CONTEXT |= jbig2_image_get_pixel(image, x , y - 1) << 4;
CONTEXT |= jbig2_image_get_pixel(image, x - 1, y - 1) << 5;
CONTEXT |= jbig2_image_get_pixel(image, x - 2, y - 1) << 6;
CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 2) << 7;
CONTEXT |= jbig2_image_get_pixel(image, x , y - 2) << 8;
CONTEXT |= jbig2_image_get_pixel(image, x - 1, y - 2) << 9;
bit = jbig2_arith_decode(as, &GB_stats[CONTEXT]);
jbig2_image_set_pixel(image, x, y, bit);
}
} else {
copy_prev_row(image, y);
}
}
 
return 0;
}
 
static int
jbig2_decode_generic_template3_TPGDON(Jbig2Ctx *ctx,
Jbig2Segment *segment,
const Jbig2GenericRegionParams *params,
Jbig2ArithState *as,
Jbig2Image *image,
Jbig2ArithCx *GB_stats)
{
const int GBW = image->width;
const int GBH = image->height;
uint32_t CONTEXT;
int x, y;
bool bit;
int LTP = 0;
 
for (y = 0; y < GBH; y++) {
LTP ^= jbig2_arith_decode(as, &GB_stats[0x0195]);
if (!LTP) {
for (x = 0; x < GBW; x++) {
CONTEXT = jbig2_image_get_pixel(image, x - 1, y);
CONTEXT |= jbig2_image_get_pixel(image, x - 2, y) << 1;
CONTEXT |= jbig2_image_get_pixel(image, x - 3, y) << 2;
CONTEXT |= jbig2_image_get_pixel(image, x - 4, y) << 3;
CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0],
y + params->gbat[1]) << 4;
CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 1) << 5;
CONTEXT |= jbig2_image_get_pixel(image, x , y - 1) << 6;
CONTEXT |= jbig2_image_get_pixel(image, x - 1, y - 1) << 7;
CONTEXT |= jbig2_image_get_pixel(image, x - 2, y - 1) << 8;
CONTEXT |= jbig2_image_get_pixel(image, x - 3, y - 1) << 9;
bit = jbig2_arith_decode(as, &GB_stats[CONTEXT]);
jbig2_image_set_pixel(image, x, y, bit);
}
} else {
copy_prev_row(image, y);
}
}
 
return 0;
}
 
static int
jbig2_decode_generic_region_TPGDON(Jbig2Ctx *ctx,
Jbig2Segment *segment,
const Jbig2GenericRegionParams *params,
Jbig2ArithState *as,
Jbig2Image *image,
Jbig2ArithCx *GB_stats)
{
switch (params->GBTEMPLATE) {
case 0:
return jbig2_decode_generic_template0_TPGDON(ctx, segment,
params, as, image, GB_stats);
case 1:
return jbig2_decode_generic_template1_TPGDON(ctx, segment,
params, as, image, GB_stats);
case 2:
return jbig2_decode_generic_template2_TPGDON(ctx, segment,
params, as, image, GB_stats);
case 3:
return jbig2_decode_generic_template3_TPGDON(ctx, segment,
params, as, image, GB_stats);
}
 
return -1;
}
 
/**
* jbig2_decode_generic_region: Decode a generic region.
* @ctx: The context for allocation and error reporting.
* @segment: A segment reference for error reporting.
* @params: Decoding parameter set.
* @as: Arithmetic decoder state.
* @image: Where to store the decoded data.
* @GB_stats: Arithmetic stats.
*
* Decodes a generic region, according to section 6.2. The caller should
* pass an already allocated Jbig2Image object for @image
*
* Because this API is based on an arithmetic decoding state, it is
* not suitable for MMR decoding.
*
* Return code: 0 on success.
**/
int
jbig2_decode_generic_region(Jbig2Ctx *ctx,
Jbig2Segment *segment,
const Jbig2GenericRegionParams *params,
Jbig2ArithState *as,
Jbig2Image *image,
Jbig2ArithCx *GB_stats)
{
const int8_t *gbat = params->gbat;
 
if (!params->MMR && params->TPGDON)
return jbig2_decode_generic_region_TPGDON(ctx, segment, params,
as, image, GB_stats);
 
if (!params->MMR && params->GBTEMPLATE == 0) {
if (gbat[0] == +3 && gbat[1] == -1 &&
gbat[2] == -3 && gbat[3] == -1 &&
gbat[4] == +2 && gbat[5] == -2 &&
gbat[6] == -2 && gbat[7] == -2)
return jbig2_decode_generic_template0(ctx, segment, params,
as, image, GB_stats);
else
return jbig2_decode_generic_template0_unopt(ctx, segment, params,
as, image, GB_stats);
} else if (!params->MMR && params->GBTEMPLATE == 1)
return jbig2_decode_generic_template1(ctx, segment, params,
as, image, GB_stats);
else if (!params->MMR && params->GBTEMPLATE == 2)
{
if (gbat[0] == 3 && gbat[1] == -1)
return jbig2_decode_generic_template2a(ctx, segment, params,
as, image, GB_stats);
else
return jbig2_decode_generic_template2(ctx, segment, params,
as, image, GB_stats);
}
else if (!params->MMR && params->GBTEMPLATE == 3) {
if (gbat[0] == 2 && gbat[1] == -1)
return jbig2_decode_generic_template3_unopt(ctx, segment, params,
as, image, GB_stats);
else
return jbig2_decode_generic_template3_unopt(ctx, segment, params,
as, image, GB_stats);
}
 
{
int i;
for (i = 0; i < 8; i++)
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
"gbat[%d] = %d", i, params->gbat[i]);
}
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"decode_generic_region: MMR=%d, GBTEMPLATE=%d NYI",
params->MMR, params->GBTEMPLATE);
return -1;
}
 
/**
* Handler for immediate generic region segments
*/
int
jbig2_immediate_generic_region(Jbig2Ctx *ctx, Jbig2Segment *segment,
const byte *segment_data)
{
Jbig2RegionSegmentInfo rsi;
byte seg_flags;
int8_t gbat[8];
int offset;
int gbat_bytes = 0;
Jbig2GenericRegionParams params;
int code;
Jbig2Image *image;
Jbig2WordStream *ws;
Jbig2ArithState *as;
Jbig2ArithCx *GB_stats = NULL;
 
/* 7.4.6 */
if (segment->data_length < 18)
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"Segment too short");
 
jbig2_get_region_segment_info(&rsi, segment_data);
jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,
"generic region: %d x %d @ (%d, %d), flags = %02x",
rsi.width, rsi.height, rsi.x, rsi.y, rsi.flags);
 
/* 7.4.6.2 */
seg_flags = segment_data[17];
jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,
"segment flags = %02x", seg_flags);
if ((seg_flags & 1) && (seg_flags & 6))
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"MMR is 1, but GBTEMPLATE is not 0");
 
/* 7.4.6.3 */
if (!(seg_flags & 1))
{
gbat_bytes = (seg_flags & 6) ? 2 : 8;
if (18 + gbat_bytes > segment->data_length)
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"Segment too short");
memcpy(gbat, segment_data + 18, gbat_bytes);
jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,
"gbat: %d, %d", gbat[0], gbat[1]);
}
 
offset = 18 + gbat_bytes;
 
/* Table 34 */
params.MMR = seg_flags & 1;
params.GBTEMPLATE = (seg_flags & 6) >> 1;
params.TPGDON = (seg_flags & 8) >> 3;
params.USESKIP = 0;
memcpy (params.gbat, gbat, gbat_bytes);
 
image = jbig2_image_new(ctx, rsi.width, rsi.height);
if (image == NULL)
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"unable to allocate generic image");
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
"allocated %d x %d image buffer for region decode results",
rsi.width, rsi.height);
 
if (params.MMR)
{
code = jbig2_decode_generic_mmr(ctx, segment, &params,
segment_data + offset, segment->data_length - offset,
image);
}
else
{
int stats_size = jbig2_generic_stats_size(ctx, params.GBTEMPLATE);
GB_stats = jbig2_alloc(ctx->allocator, stats_size);
memset(GB_stats, 0, stats_size);
 
ws = jbig2_word_stream_buf_new(ctx,
segment_data + offset,
segment->data_length - offset);
as = jbig2_arith_new(ctx, ws);
code = jbig2_decode_generic_region(ctx, segment, &params,
as, image, GB_stats);
jbig2_free(ctx->allocator, as);
jbig2_word_stream_buf_free(ctx, ws);
 
jbig2_free(ctx->allocator, GB_stats);
}
 
jbig2_page_add_result(ctx, &ctx->pages[ctx->current_page],
image, rsi.x, rsi.y, JBIG2_COMPOSE_OR);
jbig2_image_release(ctx, image);
 
return code;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2_generic.h
0,0 → 1,62
/*
jbig2dec
 
Copyright (C) 2002-2004 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
/**
* Headers for Generic and Generic Refinement region handling
**/
 
/* 6.4 Table 2 */
typedef struct {
bool MMR;
/* GBW */
/* GBH */
int GBTEMPLATE;
bool TPGDON;
bool USESKIP;
/* SKIP */
int8_t gbat[8];
} Jbig2GenericRegionParams;
 
/* return the appropriate context size for the given template */
int
jbig2_generic_stats_size(Jbig2Ctx *ctx, int template);
 
int
jbig2_decode_generic_region(Jbig2Ctx *ctx,
Jbig2Segment *segment,
const Jbig2GenericRegionParams *params,
Jbig2ArithState *as,
Jbig2Image *image,
Jbig2ArithCx *GB_stats);
 
 
/* 6.3 Table 6 */
typedef struct {
/* GRW */
/* GRH */
bool GRTEMPLATE;
Jbig2Image *reference;
int32_t DX, DY;
bool TPGRON;
int8_t grat[4];
} Jbig2RefinementRegionParams;
 
int
jbig2_decode_refinement_region(Jbig2Ctx *ctx,
Jbig2Segment *segment,
const Jbig2RefinementRegionParams *params,
Jbig2ArithState *as,
Jbig2Image *image,
Jbig2ArithCx *GB_stats);
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2_halftone.c
0,0 → 1,372
/*
jbig2dec
 
Copyright (C) 2005 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
/* JBIG2 Pattern Dictionary and Halftone Region decoding */
 
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "os_types.h"
 
#include <string.h> /* memset() */
 
#include "jbig2.h"
#include "jbig2_priv.h"
#include "jbig2_arith.h"
#include "jbig2_generic.h"
#include "jbig2_mmr.h"
 
typedef struct {
int n_patterns;
Jbig2Image **patterns;
int HPW, HPH;
} Jbig2PatternDict;
 
/* Table 24 */
typedef struct {
bool HDMMR;
uint32_t HDPW;
uint32_t HDPH;
uint32_t GRAYMAX;
int HDTEMPLATE;
} Jbig2PatternDictParams;
 
/* Table 33 */
typedef struct {
byte flags;
uint32_t HGW;
uint32_t HGH;
int32_t HGX;
int32_t HGY;
uint16_t HRX;
uint16_t HRY;
bool HMMR;
int HTEMPLATE;
bool HENABLESKIP;
Jbig2ComposeOp op;
bool HDEFPIXEL;
} Jbig2HalftoneRegionParams;
 
 
/**
* jbig2_hd_new: create a new dictionary from a collective bitmap
*/
Jbig2PatternDict *
jbig2_hd_new(Jbig2Ctx *ctx,
const Jbig2PatternDictParams *params,
Jbig2Image *image)
{
Jbig2PatternDict *new;
const int N = params->GRAYMAX + 1;
const int HPW = params->HDPW;
const int HPH = params->HDPH;
int i;
 
/* allocate a new struct */
new = (Jbig2PatternDict *)jbig2_alloc(ctx->allocator,
sizeof(Jbig2PatternDict));
if (new != NULL) {
new->patterns = (Jbig2Image **)jbig2_alloc(ctx->allocator,
N*sizeof(Jbig2Image*));
if (new->patterns == NULL) {
jbig2_free(ctx->allocator, new);
return NULL;
}
new->n_patterns = N;
new->HPW = HPW;
new->HPH = HPH;
 
/* 6.7.5(4) - copy out the individual pattern images */
for (i = 0; i < N; i++) {
new->patterns[i] = jbig2_image_new(ctx, HPW, HPH);
if (new->patterns[i] == NULL) {
int j;
jbig2_error(ctx, JBIG2_SEVERITY_FATAL, -1,
"failed to allocate pattern element image");
for (j = 0; j < i; j++)
jbig2_free(ctx->allocator, new->patterns[j]);
jbig2_free(ctx->allocator, new);
return NULL;
}
/* compose with the REPLACE operator; the source
will be clipped to the destintion, selecting the
proper sub image */
jbig2_image_compose(ctx, new->patterns[i], image,
-i * HPW, 0, JBIG2_COMPOSE_REPLACE);
}
}
 
return new;
}
 
/**
* jbig2_hd_release: release a pattern dictionary
*/
void
jbig2_hd_release(Jbig2Ctx *ctx, Jbig2PatternDict *dict)
{
int i;
 
if (dict == NULL) return;
for (i = 0; i < dict->n_patterns; i++)
if (dict->patterns[i]) jbig2_image_release(ctx, dict->patterns[i]);
jbig2_free(ctx->allocator, dict->patterns);
jbig2_free(ctx->allocator, dict);
}
 
/**
* jbig2_decode_pattern_dict: decode pattern dictionary data
*
* @ctx: jbig2 decoder context
* @segment: jbig2 segment (header) structure
* @params: parameters from the pattern dictionary header
* @data: pointer to text region data to be decoded
* @size: length of text region data
* @GB_stats: artimetic coding context to use
*
* Implements the patten dictionary decoding proceedure
* described in section 6.7 of the JBIG2 spec.
*
* returns: a pointer to the resulting dictionary on success
* returns: 0 on failure
**/
static Jbig2PatternDict *
jbig2_decode_pattern_dict(Jbig2Ctx *ctx, Jbig2Segment *segment,
const Jbig2PatternDictParams *params,
const byte *data, const size_t size,
Jbig2ArithCx *GB_stats)
{
Jbig2PatternDict *hd = NULL;
Jbig2Image *image;
Jbig2GenericRegionParams rparams;
int code;
 
/* allocate the collective image */
image = jbig2_image_new(ctx,
params->HDPW * (params->GRAYMAX + 1), params->HDPH);
if (image == NULL) {
jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"failed to allocate collective bitmap for halftone dict!");
return NULL;
}
 
/* fill out the generic region decoder parameters */
rparams.MMR = params->HDMMR;
rparams.GBTEMPLATE = params->HDTEMPLATE;
rparams.TPGDON = 0; /* not used if HDMMR = 1 */
rparams.USESKIP = 0;
rparams.gbat[0] = -params->HDPW;
rparams.gbat[1] = 0;
rparams.gbat[2] = -3;
rparams.gbat[3] = -1;
rparams.gbat[4] = 2;
rparams.gbat[5] = -2;
rparams.gbat[6] = -2;
rparams.gbat[7] = -2;
 
if (params->HDMMR) {
code = jbig2_decode_generic_mmr(ctx, segment, &rparams,
data, size, image);
} else {
Jbig2WordStream *ws = jbig2_word_stream_buf_new(ctx, data, size);
Jbig2ArithState *as = jbig2_arith_new(ctx, ws);
 
code = jbig2_decode_generic_region(ctx, segment, &rparams,
as, image, GB_stats);
 
jbig2_free(ctx->allocator, as);
jbig2_word_stream_buf_free(ctx, ws);
}
if (code != 0) {
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"error decoding collective pattern dictionary bitmap!");
}
 
hd = jbig2_hd_new(ctx, params, image);
jbig2_image_release(ctx, image);
 
return hd;
}
 
/* 7.4.4 */
int
jbig2_pattern_dictionary(Jbig2Ctx *ctx, Jbig2Segment *segment,
const byte *segment_data)
{
Jbig2PatternDictParams params;
Jbig2ArithCx *GB_stats = NULL;
byte flags;
int offset = 0;
 
/* 7.4.4.1 - Data header */
if (segment->data_length < 7) {
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"Segment too short");
}
flags = segment_data[0];
params.HDMMR = flags & 1;
params.HDTEMPLATE = (flags & 6) >> 1;
params.HDPW = segment_data[1];
params.HDPH = segment_data[2];
params.GRAYMAX = jbig2_get_int32(segment_data + 3);
offset += 7;
 
jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,
"pattern dictionary, flags=%02x, %d grays (%dx%d cell)",
flags, params.GRAYMAX + 1, params.HDPW, params.HDPH);
 
if (params.HDMMR && params.HDTEMPLATE) {
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"HDTEMPLATE is %d when HDMMR is %d, contrary to spec",
params.HDTEMPLATE, params.HDMMR);
}
if (flags & 0xf8) {
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"Reserved flag bits non-zero");
}
 
/* 7.4.4.2 */
if (!params.HDMMR) {
/* allocate and zero arithmetic coding stats */
int stats_size = jbig2_generic_stats_size(ctx, params.HDTEMPLATE);
GB_stats = jbig2_alloc(ctx->allocator, stats_size);
memset(GB_stats, 0, stats_size);
}
 
segment->result = jbig2_decode_pattern_dict(ctx, segment, &params,
segment_data + offset,
segment->data_length - offset, GB_stats);
 
/* todo: retain GB_stats? */
if (!params.HDMMR) {
jbig2_free(ctx->allocator, GB_stats);
}
 
return (segment->result != NULL) ? 0 : 1;
}
 
 
 
/**
* jbig2_decode_halftone_region: decode a halftone region
**/
int
jbig2_decode_halftone_region(Jbig2Ctx *ctx, Jbig2Segment *segment,
Jbig2HalftoneRegionParams *params,
const byte *data, const size_t size,
Jbig2Image *image,
Jbig2ArithCx *GB_stats)
{
int code = 0;
 
/* todo: implement */
return code;
}
 
/**
* jbig2_halftone_region: read a halftone region segment header
**/
int
jbig2_halftone_region(Jbig2Ctx *ctx, Jbig2Segment *segment, const byte *segment_data)
{
int offset = 0;
Jbig2RegionSegmentInfo region_info;
Jbig2HalftoneRegionParams params;
Jbig2Image *image;
Jbig2ArithCx *GB_stats;
int code;
 
/* 7.4.5.1 */
if (segment->data_length < 17) goto too_short;
jbig2_get_region_segment_info(&region_info, segment_data);
offset += 17;
 
if (segment->data_length < 18) goto too_short;
 
/* 7.4.5.1.1 */
params.flags = segment_data[offset];
params.HMMR = params.flags & 1;
params.HTEMPLATE = (params.flags & 6) >> 1;
params.HENABLESKIP = (params.flags & 8) >> 3;
params.op = (params.flags & 0x70) >> 4;
params.HDEFPIXEL = (params.flags &0x80) >> 7;
offset += 1;
 
jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,
"halftone region: %d x %d @ (%x,%d) flags=%02x",
region_info.width, region_info.height,
region_info.x, region_info.y, params.flags);
 
if (params.HMMR && params.HTEMPLATE) {
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"HTEMPLATE is %d when HMMR is %d, contrary to spec",
params.HTEMPLATE, params.HMMR);
}
if (params.HMMR && params.HENABLESKIP) {
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"HENABLESKIP is %d when HMMR is %d, contrary to spec",
params.HENABLESKIP, params.HMMR);
}
 
/* Figure 43 */
if (segment->data_length - offset < 16) goto too_short;
params.HGW = jbig2_get_int32(segment_data + offset);
params.HGH = jbig2_get_int32(segment_data + offset + 4);
params.HGX = jbig2_get_int32(segment_data + offset + 8);
params.HGY = jbig2_get_int32(segment_data + offset + 12);
offset += 16;
 
/* Figure 44 */
if (segment->data_length - offset < 4) goto too_short;
params.HRX = jbig2_get_int16(segment_data + offset);
params.HRY = jbig2_get_int16(segment_data + offset + 2);
offset += 4;
 
jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,
" grid %d x %d @ (%d.%d,%d.%d) vector (%d.%d,%d.%d)",
params.HGW, params.HGH,
params.HGX >> 8, params.HGX & 0xff,
params.HGY >> 8, params.HGY & 0xff,
params.HRX >> 8, params.HRX & 0xff,
params.HRY >> 8, params.HRY & 0xff);
 
/* 7.4.5.2.2 */
if (!params.HMMR) {
/* allocate and zero arithmetic coding stats */
int stats_size = jbig2_generic_stats_size(ctx, params.HTEMPLATE);
GB_stats = jbig2_alloc(ctx->allocator, stats_size);
memset(GB_stats, 0, stats_size);
}
 
image = jbig2_image_new(ctx, region_info.width, region_info.height);
if (image == NULL)
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"unable to allocate halftone image");
 
code = jbig2_decode_halftone_region(ctx, segment, &params,
segment_data + offset, segment->data_length - offset,
image, GB_stats);
 
/* todo: retain GB_stats? */
if (!params.HMMR) {
jbig2_free(ctx->allocator, GB_stats);
}
 
return code;
 
too_short:
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"Segment too short");
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2_huffman.c
0,0 → 1,480
/*
jbig2dec
 
Copyright (C) 2001-2005 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
/* Huffman table decoding procedures
-- See Annex B of the JBIG2 specification */
 
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "os_types.h"
 
#include <stdlib.h>
#include <string.h>
 
#ifdef JBIG2_DEBUG
#include <stdio.h>
#endif
 
#include "jbig2.h"
#include "jbig2_priv.h"
#include "jbig2_huffman.h"
#include "jbig2_hufftab.h"
 
#define JBIG2_HUFFMAN_FLAGS_ISOOB 1
#define JBIG2_HUFFMAN_FLAGS_ISLOW 2
#define JBIG2_HUFFMAN_FLAGS_ISEXT 4
 
 
 
struct _Jbig2HuffmanState {
/* The current bit offset is equal to (offset * 8) + offset_bits.
The MSB of this_word is the current bit offset. The MSB of next_word
is (offset + 4) * 8. */
uint32_t this_word;
uint32_t next_word;
int offset_bits;
int offset;
 
Jbig2WordStream *ws;
};
 
 
/** Allocate and initialize a new huffman coding state
* the returned pointer can simply be freed; this does
* not affect the associated Jbig2WordStream.
*/
Jbig2HuffmanState *
jbig2_huffman_new (Jbig2Ctx *ctx, Jbig2WordStream *ws)
{
Jbig2HuffmanState *result;
 
result = (Jbig2HuffmanState *)jbig2_alloc(ctx->allocator,
sizeof(Jbig2HuffmanState));
 
if (result != NULL) {
result->offset = 0;
result->offset_bits = 0;
result->this_word = ws->get_next_word (ws, 0);
result->next_word = ws->get_next_word (ws, 4);
 
result->ws = ws;
}
 
return result;
}
 
/** Free an allocated huffman coding state.
* This just calls jbig2_free() if the pointer is not NULL
*/
void
jbig2_huffman_free (Jbig2Ctx *ctx, Jbig2HuffmanState *hs)
{
if (hs != NULL) free(hs);
return;
}
 
/** debug routines **/
#ifdef JBIG2_DEBUG
 
/** print current huffman state */
void jbig2_dump_huffman_state(Jbig2HuffmanState *hs) {
fprintf(stderr, "huffman state %08x %08x offset %d.%d\n",
hs->this_word, hs->next_word, hs->offset, hs->offset_bits);
}
 
/** print the binary string we're reading from */
void jbig2_dump_huffman_binary(Jbig2HuffmanState *hs)
{
const uint32_t word = hs->this_word;
int i;
 
fprintf(stderr, "huffman binary ");
for (i = 31; i >= 0; i--)
fprintf(stderr, ((word >> i) & 1) ? "1" : "0");
fprintf(stderr, "\n");
}
 
#endif /* JBIG2_DEBUG */
 
/** Skip bits up to the next byte boundary
*/
void
jbig2_huffman_skip(Jbig2HuffmanState *hs)
{
int bits = hs->offset_bits & 7;
 
if (bits) {
bits = 8 - bits;
hs->offset_bits += bits;
hs->this_word = (hs->this_word << bits) |
(hs->next_word >> (32 - hs->offset_bits));
}
 
if (hs->offset_bits >= 32) {
Jbig2WordStream *ws = hs->ws;
hs->this_word = hs->next_word;
hs->offset += 4;
hs->next_word = ws->get_next_word (ws, hs->offset + 4);
hs->offset_bits -= 32;
if (hs->offset_bits) {
hs->this_word = (hs->this_word << hs->offset_bits) |
(hs->next_word >> (32 - hs->offset_bits));
}
}
}
 
/* skip ahead a specified number of bytes in the word stream
*/
void jbig2_huffman_advance(Jbig2HuffmanState *hs, int offset)
{
Jbig2WordStream *ws = hs->ws;
 
hs->offset += offset & ~3;
hs->offset_bits += (offset & 3) << 3;
if (hs->offset_bits >= 32) {
hs->offset += 4;
hs->offset_bits -= 32;
}
hs->this_word = ws->get_next_word (ws, hs->offset);
hs->next_word = ws->get_next_word (ws, hs->offset + 4);
if (hs->offset_bits > 0)
hs->this_word = (hs->this_word << hs->offset_bits) |
(hs->next_word >> (32 - hs->offset_bits));
}
 
/* return the offset of the huffman decode pointer (in bytes)
* from the beginning of the WordStream
*/
int
jbig2_huffman_offset(Jbig2HuffmanState *hs)
{
return hs->offset + (hs->offset_bits >> 3);
}
 
/* read a number of bits directly from the huffman state
* without decoding against a table
*/
int32_t
jbig2_huffman_get_bits (Jbig2HuffmanState *hs, const int bits)
{
uint32_t this_word = hs->this_word;
int32_t result;
 
result = this_word >> (32 - bits);
hs->offset_bits += bits;
if (hs->offset_bits >= 32) {
hs->offset += 4;
hs->offset_bits -= 32;
hs->this_word = hs->next_word;
hs->next_word = hs->ws->get_next_word(hs->ws, hs->offset + 4);
if (hs->offset_bits) {
hs->this_word = (hs->this_word << hs->offset_bits) |
(hs->next_word >> (32 - hs->offset_bits));
} else {
hs->this_word = (hs->this_word << hs->offset_bits);
}
} else {
hs->this_word = (this_word << bits) |
(hs->next_word >> (32 - hs->offset_bits));
}
 
return result;
}
 
int32_t
jbig2_huffman_get (Jbig2HuffmanState *hs,
const Jbig2HuffmanTable *table, bool *oob)
{
Jbig2HuffmanEntry *entry;
byte flags;
int offset_bits = hs->offset_bits;
uint32_t this_word = hs->this_word;
uint32_t next_word;
int RANGELEN;
int32_t result;
 
for (;;)
{
int log_table_size = table->log_table_size;
int PREFLEN;
 
entry = &table->entries[this_word >> (32 - log_table_size)];
flags = entry->flags;
PREFLEN = entry->PREFLEN;
 
next_word = hs->next_word;
offset_bits += PREFLEN;
if (offset_bits >= 32)
{
Jbig2WordStream *ws = hs->ws;
this_word = next_word;
hs->offset += 4;
next_word = ws->get_next_word (ws, hs->offset + 4);
offset_bits -= 32;
hs->next_word = next_word;
PREFLEN = offset_bits;
}
if (PREFLEN)
this_word = (this_word << PREFLEN) |
(next_word >> (32 - offset_bits));
if (flags & JBIG2_HUFFMAN_FLAGS_ISEXT)
{
table = entry->u.ext_table;
}
else
break;
}
result = entry->u.RANGELOW;
RANGELEN = entry->RANGELEN;
if (RANGELEN > 0)
{
int32_t HTOFFSET;
 
HTOFFSET = this_word >> (32 - RANGELEN);
if (flags & JBIG2_HUFFMAN_FLAGS_ISLOW)
result -= HTOFFSET;
else
result += HTOFFSET;
 
offset_bits += RANGELEN;
if (offset_bits >= 32)
{
Jbig2WordStream *ws = hs->ws;
this_word = next_word;
hs->offset += 4;
next_word = ws->get_next_word (ws, hs->offset + 4);
offset_bits -= 32;
hs->next_word = next_word;
RANGELEN = offset_bits;
}
if (RANGELEN)
this_word = (this_word << RANGELEN) |
(next_word >> (32 - offset_bits));
}
 
hs->this_word = this_word;
hs->offset_bits = offset_bits;
 
if (oob != NULL)
*oob = (flags & JBIG2_HUFFMAN_FLAGS_ISOOB);
 
return result;
}
 
/* TODO: more than 8 bits here is wasteful of memory. We have support
for sub-trees in jbig2_huffman_get() above, but don't use it here.
We should, and then revert to 8 bits */
#define LOG_TABLE_SIZE_MAX 16
 
/** Build an in-memory representation of a Huffman table from the
* set of template params provided by the spec or a table segment
*/
Jbig2HuffmanTable *
jbig2_build_huffman_table (Jbig2Ctx *ctx, const Jbig2HuffmanParams *params)
{
int *LENCOUNT;
int LENMAX = -1;
const int lencountsize = 256 * sizeof(*LENCOUNT);
const Jbig2HuffmanLine *lines = params->lines;
int n_lines = params->n_lines;
int i, j;
int max_j;
int log_table_size = 0;
Jbig2HuffmanTable *result;
Jbig2HuffmanEntry *entries;
int CURLEN;
int firstcode = 0;
int CURCODE;
int CURTEMP;
 
LENCOUNT = jbig2_alloc(ctx->allocator, lencountsize);
if (LENCOUNT == NULL) {
jbig2_error(ctx, JBIG2_SEVERITY_FATAL, -1,
"couldn't allocate storage for huffman histogram");
return NULL;
}
memset(LENCOUNT, 0, lencountsize);
 
/* B.3, 1. */
for (i = 0; i < params->n_lines; i++)
{
int PREFLEN = lines[i].PREFLEN;
int lts;
 
if (PREFLEN > LENMAX)
{
for (j = LENMAX + 1; j < PREFLEN + 1; j++)
LENCOUNT[j] = 0;
LENMAX = PREFLEN;
}
LENCOUNT[PREFLEN]++;
 
lts = PREFLEN + lines[i].RANGELEN;
if (lts > LOG_TABLE_SIZE_MAX)
lts = PREFLEN;
if (lts <= LOG_TABLE_SIZE_MAX && log_table_size < lts)
log_table_size = lts;
}
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, -1,
"constructing huffman table log size %d", log_table_size);
max_j = 1 << log_table_size;
 
result = (Jbig2HuffmanTable *)jbig2_alloc(ctx->allocator, sizeof(Jbig2HuffmanTable));
result->log_table_size = log_table_size;
entries = (Jbig2HuffmanEntry *)jbig2_alloc(ctx->allocator, max_j * sizeof(Jbig2HuffmanEntry));
result->entries = entries;
 
LENCOUNT[0] = 0;
 
for (CURLEN = 1; CURLEN <= LENMAX; CURLEN++)
{
int shift = log_table_size - CURLEN;
 
/* B.3 3.(a) */
firstcode = (firstcode + LENCOUNT[CURLEN - 1]) << 1;
CURCODE = firstcode;
/* B.3 3.(b) */
for (CURTEMP = 0; CURTEMP < n_lines; CURTEMP++)
{
int PREFLEN = lines[CURTEMP].PREFLEN;
if (PREFLEN == CURLEN)
{
int RANGELEN = lines[CURTEMP].RANGELEN;
int start_j = CURCODE << shift;
int end_j = (CURCODE + 1) << shift;
byte eflags = 0;
 
if (end_j > max_j) {
jbig2_error(ctx, JBIG2_SEVERITY_FATAL, -1,
"ran off the end of the entries table! (%d >= %d)",
end_j, max_j);
jbig2_free(ctx->allocator, result->entries);
jbig2_free(ctx->allocator, result);
jbig2_free(ctx->allocator, LENCOUNT);
return NULL;
}
/* todo: build extension tables */
if (params->HTOOB && CURTEMP == n_lines - 1)
eflags |= JBIG2_HUFFMAN_FLAGS_ISOOB;
if (CURTEMP == n_lines - (params->HTOOB ? 3 : 2))
eflags |= JBIG2_HUFFMAN_FLAGS_ISLOW;
if (PREFLEN + RANGELEN > LOG_TABLE_SIZE_MAX) {
for (j = start_j; j < end_j; j++) {
entries[j].u.RANGELOW = lines[CURTEMP].RANGELOW;
entries[j].PREFLEN = PREFLEN;
entries[j].RANGELEN = RANGELEN;
entries[j].flags = eflags;
}
} else {
for (j = start_j; j < end_j; j++) {
int32_t HTOFFSET = (j >> (shift - RANGELEN)) &
((1 << RANGELEN) - 1);
if (eflags & JBIG2_HUFFMAN_FLAGS_ISLOW)
entries[j].u.RANGELOW = lines[CURTEMP].RANGELOW -
HTOFFSET;
else
entries[j].u.RANGELOW = lines[CURTEMP].RANGELOW +
HTOFFSET;
entries[j].PREFLEN = PREFLEN + RANGELEN;
entries[j].RANGELEN = 0;
entries[j].flags = eflags;
}
}
CURCODE++;
}
}
}
 
jbig2_free(ctx->allocator, LENCOUNT);
 
return result;
}
 
/** Free the memory associated with the representation of table */
void
jbig2_release_huffman_table (Jbig2Ctx *ctx, Jbig2HuffmanTable *table)
{
if (table != NULL) {
jbig2_free(ctx->allocator, table->entries);
jbig2_free(ctx->allocator, table);
}
return;
}
 
#ifdef TEST
#include <stdio.h>
 
/* a test bitstream, and a list of the table indicies
to use in decoding it. 1 = table B.1 (A), 2 = table B.2 (B), and so on */
/* this test stream should decode to { 8, 5, oob, 8 } */
 
const byte test_stream[] = { 0xe9, 0xcb, 0xf4, 0x00 };
const byte test_tabindex[] = { 4, 2, 2, 1 };
 
static uint32_t
test_get_word (Jbig2WordStream *self, int offset)
{
/* assume test_stream[] is at least 4 bytes */
if (offset+3 > sizeof(test_stream))
return 0;
else
return ( (test_stream[offset] << 24) |
(test_stream[offset+1] << 16) |
(test_stream[offset+2] << 8) |
(test_stream[offset+3]) );
}
 
int
main (int argc, char **argv)
{
Jbig2Ctx *ctx;
Jbig2HuffmanTable *tables[5];
Jbig2HuffmanState *hs;
Jbig2WordStream ws;
bool oob;
int32_t code;
 
ctx = jbig2_ctx_new(NULL, 0, NULL, NULL, NULL);
 
tables[0] = NULL;
tables[1] = jbig2_build_huffman_table (ctx, &jbig2_huffman_params_A);
tables[2] = jbig2_build_huffman_table (ctx, &jbig2_huffman_params_B);
tables[3] = NULL;
tables[4] = jbig2_build_huffman_table (ctx, &jbig2_huffman_params_D);
ws.get_next_word = test_get_word;
hs = jbig2_huffman_new (ctx, &ws);
 
printf("testing jbig2 huffmann decoding...");
printf("\t(should be 8 5 (oob) 8)\n");
 
{
int i;
int sequence_length = sizeof(test_tabindex);
 
for (i = 0; i < sequence_length; i++) {
code = jbig2_huffman_get (hs, tables[test_tabindex[i]], &oob);
if (oob) printf("(oob) ");
else printf("%d ", code);
}
}
 
printf("\n");
 
jbig2_ctx_free(ctx);
 
return 0;
}
#endif
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2_huffman.h
0,0 → 1,105
/*
jbig2dec
 
Copyright (C) 2001-2005 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
#ifndef JBIG2_HUFFMAN_H
#define JBIG2_HUFFMAN_H
 
/* Huffman coder interface */
 
typedef struct _Jbig2HuffmanEntry Jbig2HuffmanEntry;
typedef struct _Jbig2HuffmanState Jbig2HuffmanState;
typedef struct _Jbig2HuffmanTable Jbig2HuffmanTable;
typedef struct _Jbig2HuffmanParams Jbig2HuffmanParams;
 
struct _Jbig2HuffmanEntry {
union {
int32_t RANGELOW;
Jbig2HuffmanTable *ext_table;
} u;
byte PREFLEN;
byte RANGELEN;
byte flags;
};
 
struct _Jbig2HuffmanTable {
int log_table_size;
Jbig2HuffmanEntry *entries;
};
 
typedef struct _Jbig2HuffmanLine Jbig2HuffmanLine;
 
struct _Jbig2HuffmanLine {
int PREFLEN;
int RANGELEN;
int RANGELOW;
};
 
struct _Jbig2HuffmanParams {
bool HTOOB;
int n_lines;
const Jbig2HuffmanLine *lines;
};
 
Jbig2HuffmanState *
jbig2_huffman_new (Jbig2Ctx *ctx, Jbig2WordStream *ws);
 
void
jbig2_huffman_free (Jbig2Ctx *ctx, Jbig2HuffmanState *hs);
 
void
jbig2_huffman_skip(Jbig2HuffmanState *hs);
 
void jbig2_huffman_advance(Jbig2HuffmanState *hs, int offset);
 
int
jbig2_huffman_offset(Jbig2HuffmanState *hs);
 
int32_t
jbig2_huffman_get (Jbig2HuffmanState *hs,
const Jbig2HuffmanTable *table, bool *oob);
 
int32_t
jbig2_huffman_get_bits (Jbig2HuffmanState *hs, const int bits);
 
#ifdef JBIG2_DEBUG
void jbig2_dump_huffman_state(Jbig2HuffmanState *hs);
void jbig2_dump_huffman_binary(Jbig2HuffmanState *hs);
#endif
 
Jbig2HuffmanTable *
jbig2_build_huffman_table (Jbig2Ctx *ctx, const Jbig2HuffmanParams *params);
 
void
jbig2_release_huffman_table (Jbig2Ctx *ctx, Jbig2HuffmanTable *table);
 
/* standard Huffman templates defined by the specification */
extern const Jbig2HuffmanParams jbig2_huffman_params_A; /* Table B.1 */
extern const Jbig2HuffmanParams jbig2_huffman_params_B; /* Table B.2 */
extern const Jbig2HuffmanParams jbig2_huffman_params_C; /* Table B.3 */
extern const Jbig2HuffmanParams jbig2_huffman_params_D; /* Table B.4 */
extern const Jbig2HuffmanParams jbig2_huffman_params_E; /* Table B.5 */
extern const Jbig2HuffmanParams jbig2_huffman_params_F; /* Table B.6 */
extern const Jbig2HuffmanParams jbig2_huffman_params_G; /* Table B.7 */
extern const Jbig2HuffmanParams jbig2_huffman_params_H; /* Table B.8 */
extern const Jbig2HuffmanParams jbig2_huffman_params_I; /* Table B.9 */
extern const Jbig2HuffmanParams jbig2_huffman_params_J; /* Table B.10 */
extern const Jbig2HuffmanParams jbig2_huffman_params_K; /* Table B.11 */
extern const Jbig2HuffmanParams jbig2_huffman_params_L; /* Table B.12 */
extern const Jbig2HuffmanParams jbig2_huffman_params_M; /* Table B.13 */
extern const Jbig2HuffmanParams jbig2_huffman_params_N; /* Table B.14 */
extern const Jbig2HuffmanParams jbig2_huffman_params_O; /* Table B.15 */
 
 
#endif /* JBIG2_HUFFMAN_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2_hufftab.h
0,0 → 1,335
/*
jbig2dec
 
Copyright (C) 2001-2005 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
/* predefined Huffman table definitions
-- See Annex B of the JBIG2 specification */
 
#ifndef JBIG2_HUFFTAB_H
#define JBIG2_HUFFTAB_H
 
/* types are in jbig2_huffman.h, you must include that first */
 
 
/* Table B.1 */
const Jbig2HuffmanLine
jbig2_huffman_lines_A[] = {
{ 1, 4, 0 },
{ 2, 8, 16 },
{ 3, 16, 272 },
{ 0, 32, -1 }, /* low */
{ 3, 32, 65808 } /* high */
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_A = { FALSE, 5, jbig2_huffman_lines_A };
 
/* Table B.2 */
const Jbig2HuffmanLine
jbig2_huffman_lines_B[] = {
{ 1, 0, 0 },
{ 2, 0, 1 },
{ 3, 0, 2 },
{ 4, 3, 3 },
{ 5, 6, 11 },
{ 0, 32, -1 }, /* low */
{ 6, 32, 75 }, /* high */
{ 6, 0, 0 }
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_B = { TRUE, 8, jbig2_huffman_lines_B };
 
/* Table B.3 */
const Jbig2HuffmanLine
jbig2_huffman_lines_C[] = {
{ 8, 8, -256 },
{ 1, 0, 0 },
{ 2, 0, 1 },
{ 3, 0, 2 },
{ 4, 3, 3 },
{ 5, 6, 11 },
{ 8, 32, -257 }, /* low */
{ 7, 32, 75 }, /* high */
{ 6, 0, 0 } /* OOB */
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_C = { TRUE, 9, jbig2_huffman_lines_C };
 
/* Table B.4 */
const Jbig2HuffmanLine
jbig2_huffman_lines_D[] = {
{ 1, 0, 1 },
{ 2, 0, 2 },
{ 3, 0, 3 },
{ 4, 3, 4 },
{ 5, 6, 12 },
{ 0, 32, -1 }, /* low */
{ 5, 32, 76 }, /* high */
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_D = { FALSE, 7, jbig2_huffman_lines_D };
 
/* Table B.5 */
const Jbig2HuffmanLine
jbig2_huffman_lines_E[] = {
{7, 8, -255},
{1, 0, 1},
{2, 0, 2},
{3, 0, 3},
{4, 3, 4},
{5, 6, 12},
{7, 32, -256}, /* low */
{6, 32, 76} /* high */
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_E = { FALSE, 8, jbig2_huffman_lines_E };
 
/* Table B.6 */
const Jbig2HuffmanLine
jbig2_huffman_lines_F[] = {
{5, 10, -2048},
{4, 9, -1024},
{4, 8, -512},
{4, 7, -256},
{5, 6, -128},
{5, 5, -64},
{4, 5, -32},
{2, 7, 0},
{3, 7, 128},
{3, 8, 256},
{4, 9, 512},
{4, 10, 1024},
{6, 32, -2049}, /* low */
{6, 32, 2048} /* high */
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_F = { FALSE, 14, jbig2_huffman_lines_F };
 
/* Table B.7 */
const Jbig2HuffmanLine
jbig2_huffman_lines_G[] = {
{4, 9, -1024},
{3, 8, -512},
{4, 7, -256},
{5, 6, -128},
{5, 5, -64},
{4, 5, -32},
{4, 5, 0},
{5, 5, 32},
{5, 6, 64},
{4, 7, 128},
{3, 8, 256},
{3, 9, 512},
{3, 10, 1024},
{5, 32, -1025}, /* low */
{5, 32, 2048} /* high */
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_G = { FALSE, 15, jbig2_huffman_lines_G };
 
/* Table B.8 */
const Jbig2HuffmanLine
jbig2_huffman_lines_H[] = {
{8, 3, -15},
{9, 1, -7},
{8, 1, -5},
{9, 0, -3},
{7, 0, -2},
{4, 0, -1},
{2, 1, 0},
{5, 0, 2},
{6, 0, 3},
{3, 4, 4},
{6, 1, 20},
{4, 4, 22},
{4, 5, 38},
{5, 6, 70},
{5, 7, 134},
{6, 7, 262},
{7, 8, 390},
{6, 10, 646},
{9, 32, -16}, /* low */
{9, 32, 1670}, /* high */
{2, 0, 0} /* OOB */
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_H = { TRUE, 21, jbig2_huffman_lines_H };
 
/* Table B.9 */
const Jbig2HuffmanLine
jbig2_huffman_lines_I[] = {
{8, 4, -31},
{9, 2, -15},
{8, 2, -11},
{9, 1, -7},
{7, 1, -5},
{4, 1, -3},
{3, 1, -1},
{3, 1, 1},
{5, 1, 3},
{6, 1, 5},
{3, 5, 7},
{6, 2, 39},
{4, 5, 43},
{4, 6, 75},
{5, 7, 139},
{5, 8, 267},
{6, 8, 523},
{7, 9, 779},
{6, 11, 1291},
{9, 32, -32}, /* low */
{9, 32, 3339}, /* high */
{2, 0, 0} /* OOB */
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_I = { TRUE, 22, jbig2_huffman_lines_I };
 
/* Table B.10 */
const Jbig2HuffmanLine
jbig2_huffman_lines_J[] = {
{7, 4, -21},
{8, 0, -5},
{7, 0, -4},
{5, 0, -3},
{2, 2, -2},
{5, 0, 2},
{6, 0, 3},
{7, 0, 4},
{8, 0, 5},
{2, 6, 6},
{5, 5, 70},
{6, 5, 102},
{6, 6, 134},
{6, 7, 198},
{6, 8, 326},
{6, 9, 582},
{6, 10, 1094},
{7, 11, 2118},
{8, 32, -22}, /* low */
{8, 32, 4166}, /* high */
{2, 0, 0} /* OOB */
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_J = { TRUE, 21, jbig2_huffman_lines_J };
 
/* Table B.11 */
const Jbig2HuffmanLine
jbig2_huffman_lines_K[] = {
{1, 0, 1},
{2, 1, 2},
{4, 0, 3},
{4, 1, 5},
{5, 1, 7},
{5, 2, 9},
{6, 2, 13},
{7, 2, 17},
{7, 3, 21},
{7, 4, 29},
{7, 5, 45},
{7, 6, 77},
{7, 32, 141} /* high */
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_K = { FALSE, 13, jbig2_huffman_lines_K };
 
/* Table B.12 */
const Jbig2HuffmanLine
jbig2_huffman_lines_L[] = {
{1, 0, 1},
{2, 0, 2},
{3, 1, 3},
{5, 0, 5},
{5, 1, 6},
{6, 1, 8},
{7, 0, 10},
{7, 1, 11},
{7, 2, 13},
{7, 3, 17},
{7, 4, 25},
{8, 5, 41},
{8, 32, 73}
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_L = { FALSE, 13, jbig2_huffman_lines_L };
 
 
/* Table B.13 */
const Jbig2HuffmanLine
jbig2_huffman_lines_M[] = {
{1, 0, 1},
{3, 0, 2},
{4, 0, 3},
{5, 0, 4},
{4, 1, 5},
{3, 3, 7},
{6, 1, 15},
{6, 2, 17},
{6, 3, 21},
{6, 4, 29},
{6, 5, 45},
{7, 6, 77},
{7, 32, 141} /* high */
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_M = { FALSE, 13, jbig2_huffman_lines_M };
 
/* Table B.14 */
const Jbig2HuffmanLine
jbig2_huffman_lines_N[] = {
{ 3, 0, -2 },
{ 3, 0, -1 },
{ 1, 0, 0 },
{ 3, 3, 1 },
{ 3, 6, 2 },
{ 0, 32, -1 }, /* low */
{ 0, 32, 3 }, /* high */
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_N = { FALSE, 7, jbig2_huffman_lines_N };
 
/* Table B.15 */
const Jbig2HuffmanLine
jbig2_huffman_lines_O[] = {
{7, 4, -24},
{6, 2, -8},
{5, 1, -4},
{4, 0, -2},
{3, 0, -1},
{1, 0, 0},
{3, 0, 1},
{4, 0, 2},
{5, 1, 3},
{6, 2, 5},
{7, 4, 9},
{7, 32, -25}, /* low */
{7, 32, 25} /* high */
};
 
const Jbig2HuffmanParams
jbig2_huffman_params_O = { FALSE, 13, jbig2_huffman_lines_O };
 
#endif /* JBIG2_HUFFTAB_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2_image.c
0,0 → 1,313
/*
jbig2dec
 
Copyright (C) 2001-2005 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "os_types.h"
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h> /* memcpy() */
 
#include "jbig2.h"
#include "jbig2_priv.h"
#include "jbig2_image.h"
 
 
/* allocate a Jbig2Image structure and its associated bitmap */
Jbig2Image* jbig2_image_new(Jbig2Ctx *ctx, int width, int height)
{
Jbig2Image *image;
int stride;
 
image = (Jbig2Image *)jbig2_alloc(ctx->allocator, sizeof(*image));
if (image == NULL) {
jbig2_error(ctx, JBIG2_SEVERITY_FATAL, -1,
"could not allocate image structure");
return NULL;
}
 
stride = ((width - 1) >> 3) + 1; /* generate a byte-aligned stride */
image->data = (uint8_t *)jbig2_alloc(ctx->allocator, stride*height);
if (image->data == NULL) {
jbig2_error(ctx, JBIG2_SEVERITY_FATAL, -1,
"could not allocate image data buffer! [%d bytes]\n", stride*height);
jbig2_free(ctx->allocator, image);
return NULL;
}
 
image->width = width;
image->height = height;
image->stride = stride;
image->refcount = 1;
 
return image;
}
 
/* clone an image pointer by bumping its reference count */
Jbig2Image* jbig2_image_clone(Jbig2Ctx *ctx, Jbig2Image *image)
{
image->refcount++;
return image;
}
 
/* release an image pointer, freeing it it appropriate */
void jbig2_image_release(Jbig2Ctx *ctx, Jbig2Image *image)
{
image->refcount--;
if (!image->refcount) jbig2_image_free(ctx, image);
}
 
/* free a Jbig2Image structure and its associated memory */
void jbig2_image_free(Jbig2Ctx *ctx, Jbig2Image *image)
{
jbig2_free(ctx->allocator, image->data);
jbig2_free(ctx->allocator, image);
}
 
/* resize a Jbig2Image */
Jbig2Image *jbig2_image_resize(Jbig2Ctx *ctx, Jbig2Image *image,
int width, int height)
{
if (width == image->width) {
/* use the same stride, just change the length */
image->data = jbig2_realloc(ctx->allocator,
image->data, image->stride*height);
if (image->data == NULL) {
jbig2_error(ctx, JBIG2_SEVERITY_FATAL, -1,
"could not resize image buffer!");
return NULL;
}
if (height > image->height) {
memset(image->data + image->height*image->stride,
0, (height - image->height)*image->stride);
}
image->height = height;
 
} else {
/* we must allocate a new image buffer and copy */
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, -1,
"jbig2_image_resize called with a different width (NYI)");
}
 
return NULL;
}
 
/* composite one jbig2_image onto another
slow but general version */
int jbig2_image_compose_unopt(Jbig2Ctx *ctx,
Jbig2Image *dst, Jbig2Image *src,
int x, int y, Jbig2ComposeOp op)
{
int i, j;
int sw = src->width;
int sh = src->height;
int sx = 0;
int sy = 0;
 
/* clip to the dst image boundaries */
if (x < 0) { sx += -x; sw -= -x; x = 0; }
if (y < 0) { sy += -y; sh -= -y; y = 0; }
if (x + sw >= dst->width) sw = dst->width - x;
if (y + sh >= dst->height) sh = dst->height - y;
 
switch (op) {
case JBIG2_COMPOSE_OR:
for (j = 0; j < sh; j++) {
for (i = 0; i < sw; i++) {
jbig2_image_set_pixel(dst, i+x, j+y,
jbig2_image_get_pixel(src, i+sx, j+sy) |
jbig2_image_get_pixel(dst, i+x, j+y));
}
}
break;
case JBIG2_COMPOSE_AND:
for (j = 0; j < sh; j++) {
for (i = 0; i < sw; i++) {
jbig2_image_set_pixel(dst, i+x, j+y,
jbig2_image_get_pixel(src, i+sx, j+sy) &
jbig2_image_get_pixel(dst, i+x, j+y));
}
}
break;
case JBIG2_COMPOSE_XOR:
for (j = 0; j < sh; j++) {
for (i = 0; i < sw; i++) {
jbig2_image_set_pixel(dst, i+x, j+y,
jbig2_image_get_pixel(src, i+sx, j+sy) ^
jbig2_image_get_pixel(dst, i+x, j+y));
}
}
break;
case JBIG2_COMPOSE_XNOR:
for (j = 0; j < sh; j++) {
for (i = 0; i < sw; i++) {
jbig2_image_set_pixel(dst, i+x, j+y,
~(jbig2_image_get_pixel(src, i+sx, j+sy) ^
jbig2_image_get_pixel(dst, i+x, j+y)));
}
}
break;
case JBIG2_COMPOSE_REPLACE:
for (j = 0; j < sh; j++) {
for (i = 0; i < sw; i++) {
jbig2_image_set_pixel(dst, i+x, j+y,
jbig2_image_get_pixel(src, i+sx, j+sy));
}
}
break;
}
 
return 0;
}
 
/* composite one jbig2_image onto another */
int jbig2_image_compose(Jbig2Ctx *ctx, Jbig2Image *dst, Jbig2Image *src,
int x, int y, Jbig2ComposeOp op)
{
int i, j;
int w, h;
int leftbyte, rightbyte;
int shift;
uint8_t *s, *ss;
uint8_t *d, *dd;
uint8_t mask, rightmask;
 
if (op != JBIG2_COMPOSE_OR) {
/* hand off the the general routine */
return jbig2_image_compose_unopt(ctx, dst, src, x, y, op);
}
 
/* clip */
w = src->width;
h = src->height;
ss = src->data;
/* FIXME: this isn't sufficient for the < 0 cases */
if (x < 0) { w += x; x = 0; }
if (y < 0) { h += y; y = 0; }
w = (x + w < dst->width) ? w : dst->width - x;
h = (y + h < dst->height) ? h : dst->height - y;
#ifdef JBIG2_DEBUG
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, -1,
"compositing %dx%d at (%d, %d) after clipping\n",
w, h, x, y);
#endif
 
#if 0
/* special case complete/strip replacement */
/* disabled because it's only safe to do when the destination
buffer is all-blank. */
if ((x == 0) && (w == src->width)) {
memcpy(dst->data + y*dst->stride, src->data, h*src->stride);
return 0;
}
#endif
 
leftbyte = x >> 3;
rightbyte = (x + w - 1) >> 3;
shift = x & 7;
 
/* general OR case */
s = ss;
d = dd = dst->data + y*dst->stride + leftbyte;
if (leftbyte == rightbyte) {
mask = 0x100 - (0x100 >> w);
for (j = 0; j < h; j++) {
*d |= (*s & mask) >> shift;
d += dst->stride;
s += src->stride;
}
} else if (shift == 0) {
rightmask = (w & 7) ? 0x100 - (1 << (8 - (w & 7))) : 0xFF;
for (j = 0; j < h; j++) {
for (i = leftbyte; i < rightbyte; i++)
*d++ |= *s++;
*d |= *s & rightmask;
d = (dd += dst->stride);
s = (ss += src->stride);
}
} else {
bool overlap = (((w + 7) >> 3) < ((x + w + 7) >> 3) - (x >> 3));
mask = 0x100 - (1 << shift);
if (overlap)
rightmask = (0x100 - (0x100 >> ((x + w) & 7))) >> (8 - shift);
else
rightmask = 0x100 - (0x100 >> (w & 7));
for (j = 0; j < h; j++) {
*d++ |= (*s & mask) >> shift;
for(i = leftbyte; i < rightbyte - 1; i++) {
*d |= ((*s++ & ~mask) << (8 - shift));
*d++ |= ((*s & mask) >> shift);
}
if (overlap)
*d |= (*s & rightmask) << (8 - shift);
else
*d |= ((s[0] & ~mask) << (8 - shift)) |
((s[1] & rightmask) >> shift);
d = (dd += dst->stride);
s = (ss += src->stride);
}
}
 
return 0;
}
 
 
/* initialize an image bitmap to a constant value */
void jbig2_image_clear(Jbig2Ctx *ctx, Jbig2Image *image, int value)
{
const uint8_t fill = value ? 0xFF : 0x00;
 
memset(image->data, fill, image->stride*image->height);
}
 
/* look up a pixel value in an image.
returns 0 outside the image frame for the convenience of
the template code
*/
int jbig2_image_get_pixel(Jbig2Image *image, int x, int y)
{
const int w = image->width;
const int h = image->height;
const int byte = (x >> 3) + y*image->stride;
const int bit = 7 - (x & 7);
 
if ((x < 0) || (x >= w)) return 0;
if ((y < 0) || (y >= h)) return 0;
 
return ((image->data[byte]>>bit) & 1);
}
 
/* set an individual pixel value in an image */
int jbig2_image_set_pixel(Jbig2Image *image, int x, int y, bool value)
{
const int w = image->width;
const int h = image->height;
int scratch, mask;
int bit, byte;
 
if ((x < 0) || (x >= w)) return 0;
if ((y < 0) || (y >= h)) return 0;
 
byte = (x >> 3) + y*image->stride;
bit = 7 - (x & 7);
mask = (1 << bit) ^ 0xff;
 
scratch = image->data[byte] & mask;
image->data[byte] = scratch | (value << bit);
 
return 1;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2_image.h
0,0 → 1,38
/*
jbig2dec
 
Copyright (C) 2001-2002 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
 
#ifndef _JBIG2_IMAGE_H
#define _JBIG2_IMAGE_H
 
int jbig2_image_get_pixel(Jbig2Image *image, int x, int y);
int jbig2_image_set_pixel(Jbig2Image *image, int x, int y, int value);
 
/* routines for dumping the image data in various formats */
/* FIXME: should these be in the client instead? */
 
#include <stdio.h>
 
int jbig2_image_write_pbm_file(Jbig2Image *image, char *filename);
int jbig2_image_write_pbm(Jbig2Image *image, FILE *out);
Jbig2Image *jbig2_image_read_pbm_file(Jbig2Ctx *ctx, char *filename);
Jbig2Image *jbig2_image_read_pbm(Jbig2Ctx *ctx, FILE *in);
 
#ifdef HAVE_LIBPNG
int jbig2_image_write_png_file(Jbig2Image *image, char *filename);
int jbig2_image_write_png(Jbig2Image *image, FILE *out);
#endif
 
#endif /* _JBIG2_IMAGE_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2_image_pbm.c
0,0 → 1,150
/*
jbig2dec
 
Copyright (C) 2009 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "os_types.h"
 
#include <stdio.h>
#include <ctype.h>
 
#include "jbig2.h"
#include "jbig2_image.h"
 
/* take an image structure and write it to a file in pbm format */
 
int jbig2_image_write_pbm_file(Jbig2Image *image, char *filename)
{
FILE *out;
int error;
 
if ((out = fopen(filename, "wb")) == NULL) {
fprintf(stderr, "unable to open '%s' for writing", filename);
return 1;
}
 
error = jbig2_image_write_pbm(image, out);
 
fclose(out);
return (error);
}
 
/* write out an image struct as a pbm stream to an open file pointer */
 
int jbig2_image_write_pbm(Jbig2Image *image, FILE *out)
{
/* pbm header */
fprintf(out, "P4\n%d %d\n", image->width, image->height);
 
/* pbm format pads to a byte boundary, so we can
just write out the whole data buffer
NB: this assumes minimal stride for the width */
fwrite(image->data, 1, image->height*image->stride, out);
 
/* success */
return 0;
}
 
/* take an image from a file in pbm format */
Jbig2Image *jbig2_image_read_pbm_file(Jbig2Ctx *ctx, char *filename)
{
FILE *in;
Jbig2Image *image;
 
if ((in = fopen(filename, "rb")) == NULL) {
fprintf(stderr, "unable to open '%s' for reading\n", filename);
return NULL;
}
 
image = jbig2_image_read_pbm(ctx, in);
 
fclose(in);
 
return (image);
}
 
/* FIXME: should handle multi-image files */
Jbig2Image *jbig2_image_read_pbm(Jbig2Ctx *ctx, FILE *in)
{
int i, dim[2];
int done;
Jbig2Image *image;
int c;
char buf[32];
 
/* look for 'P4' magic */
while ((c = fgetc(in)) != 'P') {
if (feof(in)) return NULL;
}
if ((c = fgetc(in)) != '4') {
fprintf(stderr, "not a binary pbm file.\n");
return NULL;
}
/* read size. we must find two decimal numbers representing
the image dimensions. 'done' will index whether we're
looking for the width or the height and 'i' will be our
array index for copying strings into our buffer */
done = 0;
i = 0;
while (done < 2) {
c = fgetc(in);
/* skip whitespace */
if (c == ' ' || c == '\t' || c == '\r' || c == '\n') continue;
/* skip comments */
if (c == '#') {
while ((c = fgetc(in)) != '\n');
continue;
}
/* report unexpected eof */
if (c == EOF) {
fprintf(stderr, "end-of-file parsing pbm header\n");
return NULL;
}
if (isdigit(c)) {
buf[i++] = c;
while (isdigit(c = fgetc(in))) {
if (i >= 32) {
fprintf(stderr, "pbm parsing error\n");
return NULL;
}
buf[i++] = c;
}
buf[i] = '\0';
if (sscanf(buf, "%d", &dim[done]) != 1) {
fprintf(stderr, "couldn't read pbm image dimensions\n");
return NULL;
}
i = 0;
done++;
}
}
/* allocate image structure */
image = jbig2_image_new(ctx, dim[0], dim[1]);
if (image == NULL) {
fprintf(stderr, "could not allocate %dx%d image for pbm file\n", dim[0], dim[1]);
return NULL;
}
/* the pbm data is byte-aligned, so we can
do a simple block read */
fread(image->data, 1, image->height*image->stride, in);
if (feof(in)) {
fprintf(stderr, "unexpected end of pbm file.\n");
jbig2_image_release(ctx, image);
return NULL;
}
/* success */
return image;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2_metadata.c
0,0 → 1,155
/*
jbig2dec
 
Copyright (C) 2003 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "os_types.h"
 
#include <stdlib.h>
#include <string.h>
 
#include "jbig2.h"
#include "jbig2_priv.h"
#include "jbig2_metadata.h"
 
/* metadata key,value list object */
Jbig2Metadata *jbig2_metadata_new(Jbig2Ctx *ctx, Jbig2Encoding encoding)
{
Jbig2Metadata *md = jbig2_alloc(ctx->allocator, sizeof(Jbig2Metadata));
 
if (md != NULL) {
md->encoding = encoding;
md->entries = 0;
md->max_entries = 4;
md->keys = jbig2_alloc(ctx->allocator, md->max_entries*sizeof(char*));
md->values = jbig2_alloc(ctx->allocator, md->max_entries*sizeof(char*));
if (md->keys == NULL || md->values == NULL) {
jbig2_metadata_free(ctx, md);
md = NULL;
}
}
return md;
}
 
void jbig2_metadata_free(Jbig2Ctx *ctx, Jbig2Metadata *md)
{
int i;
 
if (md->keys) {
/* assume we own the pointers */
for (i = 0; i < md->entries; i++)
jbig2_free(ctx->allocator, md->keys[i]);
jbig2_free(ctx->allocator, md->keys);
}
if (md->values) {
for (i = 0; i < md->entries; i++)
jbig2_free(ctx->allocator, md->values[i]);
jbig2_free(ctx->allocator, md->values);
}
jbig2_free(ctx->allocator, md);
}
 
static char *jbig2_strndup(Jbig2Ctx *ctx, const char *c, const int len)
{
char *s = jbig2_alloc(ctx->allocator, len*sizeof(char));
if (s == NULL) {
jbig2_error(ctx, JBIG2_SEVERITY_FATAL, -1,
"unable to duplicate comment string");
} else {
memcpy(s, c, len);
}
return s;
}
 
int jbig2_metadata_add(Jbig2Ctx *ctx, Jbig2Metadata *md,
const char *key, const int key_length,
const char *value, const int value_length)
{
char **keys, **values;
 
/* grow the array if necessary */
if (md->entries == md->max_entries) {
md->max_entries >>= 2;
keys = jbig2_realloc(ctx->allocator, md->keys, md->max_entries);
values = jbig2_realloc(ctx->allocator, md->values, md->max_entries);
if (keys == NULL || values == NULL) {
jbig2_error(ctx, JBIG2_SEVERITY_FATAL, -1,
"unable to resize metadata structure");
return -1;
}
md->keys = keys;
md->values = values;
}
 
/* copy the passed key,value pair */
md->keys[md->entries] = jbig2_strndup(ctx, key, key_length);
md->values[md->entries] = jbig2_strndup(ctx, value, value_length);
md->entries++;
 
return 0;
}
 
 
/* decode an ascii comment segment 7.4.15.1 */
int jbig2_comment_ascii(Jbig2Ctx *ctx, Jbig2Segment *segment,
const uint8_t *segment_data)
{
char *s = (char *)(segment_data + 4);
char *end = (char *)(segment_data + segment->data_length);
Jbig2Metadata *comment;
char *key, *value;
int key_length, value_length;
 
jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,
"ASCII comment data");
 
comment = jbig2_metadata_new(ctx, JBIG2_ENCODING_ASCII);
if (comment == NULL) {
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"unable to allocate comment structure");
return -1;
}
/* loop over the segment data pulling out the key,value pairs */
while(*s && s < end) {
key_length = strlen(s) + 1;
key = s; s += key_length;
if (s >= end) goto too_short;
value_length = strlen(s) + 1;
value = s; s += value_length;
if (s >= end) goto too_short;
jbig2_metadata_add(ctx, comment, key, key_length, value, value_length);
jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,
"'%s'\t'%s'", key, value);
}
 
/* TODO: associate with ctx, page, or referred-to segment(s) */
segment->result = comment;
 
return 0;
 
too_short:
jbig2_metadata_free(ctx, comment);
return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"unexpected end of comment segment");
}
 
/* decode a UCS-16 comment segement 7.4.15.2 */
int jbig2_comment_unicode(Jbig2Ctx *ctx, Jbig2Segment *segment,
const uint8_t *segment_data)
{
return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"unhandled unicode comment segment");
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2_metadata.h
0,0 → 1,48
/*
jbig2dec
 
Copyright (C) 2003 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
 
#ifndef _JBIG2_METADATA_H
#define _JBIG2_METADATA_H
 
/* metadata from extension segments */
 
/* these bits should be moved to jbig2.h for public access */
typedef enum {
JBIG2_ENCODING_ASCII,
JBIG2_ENCODING_UCS16
} Jbig2Encoding;
 
typedef struct _Jbig2Metadata Jbig2Metadata;
 
Jbig2Metadata *jbig2_metadata_new(Jbig2Ctx *ctx, Jbig2Encoding encoding);
void jbig2_metadata_free(Jbig2Ctx *ctx, Jbig2Metadata *md);
int jbig2_metadata_add(Jbig2Ctx *ctx, Jbig2Metadata *md,
const char *key, const int key_length,
const char *value, const int value_length);
 
struct _Jbig2Metadata {
Jbig2Encoding encoding;
char **keys, **values;
int entries, max_entries;
};
 
/* these bits can go to jbig2_priv.h */
int jbig2_comment_ascii(Jbig2Ctx *ctx, Jbig2Segment *segment,
const uint8_t *segment_data);
int jbig2_comment_unicode(Jbig2Ctx *ctx, Jbig2Segment *segment,
const uint8_t *segment_data);
 
#endif /* _JBIG2_METADATA_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2_mmr.c
0,0 → 1,998
/*
jbig2dec
 
Copyright (C) 2001-2002 Artifex Software, Inc.
 
This software is provided AS-IS with no warranty,
either express or implied.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
/* An implementation of MMR decoding. This is based on the
implementation in Fitz, which in turn is based on the one
in Ghostscript.
*/
 
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "os_types.h"
 
#include <stddef.h>
#include <stdio.h>
#include <string.h>
 
#include "jbig2.h"
#include "jbig2_priv.h"
#include "jbig2_arith.h"
#include "jbig2_generic.h"
#include "jbig2_mmr.h"
 
typedef struct {
int width;
int height;
const byte *data;
size_t size;
int data_index;
int bit_index;
uint32_t word;
} Jbig2MmrCtx;
 
 
static void
jbig2_decode_mmr_init(Jbig2MmrCtx *mmr, int width, int height, const byte *data, size_t size)
{
int i;
uint32_t word = 0;
 
mmr->width = width;
mmr->height = height;
mmr->data = data;
mmr->size = size;
mmr->data_index = 0;
mmr->bit_index = 0;
 
for (i = 0; i < size && i < 4; i++)
word |= (data[i] << ((3 - i) << 3));
mmr->word = word;
}
 
static void
jbig2_decode_mmr_consume(Jbig2MmrCtx *mmr, int n_bits)
{
mmr->word <<= n_bits;
mmr->bit_index += n_bits;
while (mmr->bit_index >= 8) {
mmr->bit_index -= 8;
if (mmr->data_index + 4 < mmr->size)
mmr->word |= (mmr->data[mmr->data_index + 4] << mmr->bit_index);
mmr->data_index++;
}
}
 
/*
<raph> the first 2^(initialbits) entries map bit patterns to decodes
<raph> let's say initial_bits is 8 for the sake of example
<raph> and that the code is 1001
<raph> that means that entries 0x90 .. 0x9f have the entry { val, 4 }
<raph> because those are all the bytes that start with the code
<raph> and the 4 is the length of the code
... if (n_bits > initial_bits) ...
<raph> anyway, in that case, it basically points to a mini table
<raph> the n_bits is the maximum length of all codes beginning with that byte
<raph> so 2^(n_bits - initial_bits) is the size of the mini-table
<raph> peter came up with this, and it makes sense
*/
 
typedef struct {
short val;
short n_bits;
} mmr_table_node;
 
/* white decode table (runlength huffman codes) */
const mmr_table_node jbig2_mmr_white_decode[] = {
{ 256, 12 },
{ 272, 12 },
{ 29, 8 },
{ 30, 8 },
{ 45, 8 },
{ 46, 8 },
{ 22, 7 },
{ 22, 7 },
{ 23, 7 },
{ 23, 7 },
{ 47, 8 },
{ 48, 8 },
{ 13, 6 },
{ 13, 6 },
{ 13, 6 },
{ 13, 6 },
{ 20, 7 },
{ 20, 7 },
{ 33, 8 },
{ 34, 8 },
{ 35, 8 },
{ 36, 8 },
{ 37, 8 },
{ 38, 8 },
{ 19, 7 },
{ 19, 7 },
{ 31, 8 },
{ 32, 8 },
{ 1, 6 },
{ 1, 6 },
{ 1, 6 },
{ 1, 6 },
{ 12, 6 },
{ 12, 6 },
{ 12, 6 },
{ 12, 6 },
{ 53, 8 },
{ 54, 8 },
{ 26, 7 },
{ 26, 7 },
{ 39, 8 },
{ 40, 8 },
{ 41, 8 },
{ 42, 8 },
{ 43, 8 },
{ 44, 8 },
{ 21, 7 },
{ 21, 7 },
{ 28, 7 },
{ 28, 7 },
{ 61, 8 },
{ 62, 8 },
{ 63, 8 },
{ 0, 8 },
{ 320, 8 },
{ 384, 8 },
{ 10, 5 },
{ 10, 5 },
{ 10, 5 },
{ 10, 5 },
{ 10, 5 },
{ 10, 5 },
{ 10, 5 },
{ 10, 5 },
{ 11, 5 },
{ 11, 5 },
{ 11, 5 },
{ 11, 5 },
{ 11, 5 },
{ 11, 5 },
{ 11, 5 },
{ 11, 5 },
{ 27, 7 },
{ 27, 7 },
{ 59, 8 },
{ 60, 8 },
{ 288, 9 },
{ 290, 9 },
{ 18, 7 },
{ 18, 7 },
{ 24, 7 },
{ 24, 7 },
{ 49, 8 },
{ 50, 8 },
{ 51, 8 },
{ 52, 8 },
{ 25, 7 },
{ 25, 7 },
{ 55, 8 },
{ 56, 8 },
{ 57, 8 },
{ 58, 8 },
{ 192, 6 },
{ 192, 6 },
{ 192, 6 },
{ 192, 6 },
{ 1664, 6 },
{ 1664, 6 },
{ 1664, 6 },
{ 1664, 6 },
{ 448, 8 },
{ 512, 8 },
{ 292, 9 },
{ 640, 8 },
{ 576, 8 },
{ 294, 9 },
{ 296, 9 },
{ 298, 9 },
{ 300, 9 },
{ 302, 9 },
{ 256, 7 },
{ 256, 7 },
{ 2, 4 },
{ 2, 4 },
{ 2, 4 },
{ 2, 4 },
{ 2, 4 },
{ 2, 4 },
{ 2, 4 },
{ 2, 4 },
{ 2, 4 },
{ 2, 4 },
{ 2, 4 },
{ 2, 4 },
{ 2, 4 },
{ 2, 4 },
{ 2, 4 },
{ 2, 4 },
{ 3, 4 },
{ 3, 4 },
{ 3, 4 },
{ 3, 4 },
{ 3, 4 },
{ 3, 4 },
{ 3, 4 },
{ 3, 4 },
{ 3, 4 },
{ 3, 4 },
{ 3, 4 },
{ 3, 4 },
{ 3, 4 },
{ 3, 4 },
{ 3, 4 },
{ 3, 4 },
{ 128, 5 },
{ 128, 5 },
{ 128, 5 },
{ 128, 5 },
{ 128, 5 },
{ 128, 5 },
{ 128, 5 },
{ 128, 5 },
{ 8, 5 },
{ 8, 5 },
{ 8, 5 },
{ 8, 5 },
{ 8, 5 },
{ 8, 5 },
{ 8, 5 },
{ 8, 5 },
{ 9, 5 },
{ 9, 5 },
{ 9, 5 },
{ 9, 5 },
{ 9, 5 },
{ 9, 5 },
{ 9, 5 },
{ 9, 5 },
{ 16, 6 },
{ 16, 6 },
{ 16, 6 },
{ 16, 6 },
{ 17, 6 },
{ 17, 6 },
{ 17, 6 },
{ 17, 6 },
{ 4, 4 },
{ 4, 4 },
{ 4, 4 },
{ 4, 4 },
{ 4, 4 },
{ 4, 4 },
{ 4, 4 },
{ 4, 4 },
{ 4, 4 },
{ 4, 4 },
{ 4, 4 },
{ 4, 4 },
{ 4, 4 },
{ 4, 4 },
{ 4, 4 },
{ 4, 4 },
{ 5, 4 },
{ 5, 4 },
{ 5, 4 },
{ 5, 4 },
{ 5, 4 },
{ 5, 4 },
{ 5, 4 },
{ 5, 4 },
{ 5, 4 },
{ 5, 4 },
{ 5, 4 },
{ 5, 4 },
{ 5, 4 },
{ 5, 4 },
{ 5, 4 },
{ 5, 4 },
{ 14, 6 },
{ 14, 6 },
{ 14, 6 },
{ 14, 6 },
{ 15, 6 },
{ 15, 6 },
{ 15, 6 },
{ 15, 6 },
{ 64, 5 },
{ 64, 5 },
{ 64, 5 },
{ 64, 5 },
{ 64, 5 },
{ 64, 5 },
{ 64, 5 },
{ 64, 5 },
{ 6, 4 },
{ 6, 4 },
{ 6, 4 },
{ 6, 4 },
{ 6, 4 },
{ 6, 4 },
{ 6, 4 },
{ 6, 4 },
{ 6, 4 },
{ 6, 4 },
{ 6, 4 },
{ 6, 4 },
{ 6, 4 },
{ 6, 4 },
{ 6, 4 },
{ 6, 4 },
{ 7, 4 },
{ 7, 4 },
{ 7, 4 },
{ 7, 4 },
{ 7, 4 },
{ 7, 4 },
{ 7, 4 },
{ 7, 4 },
{ 7, 4 },
{ 7, 4 },
{ 7, 4 },
{ 7, 4 },
{ 7, 4 },
{ 7, 4 },
{ 7, 4 },
{ 7, 4 },
{ -2, 3 },
{ -2, 3 },
{ -1, 0 },
{ -1, 0 },
{ -1, 0 },
{ -1, 0 },
{ -1, 0 },
{ -1, 0 },
{ -1, 0 },
{ -1, 0 },
{ -1, 0 },
{ -1, 0 },
{ -1, 0 },
{ -1, 0 },
{ -1, 0 },
{ -3, 4 },
{ 1792, 3 },
{ 1792, 3 },
{ 1984, 4 },
{ 2048, 4 },
{ 2112, 4 },
{ 2176, 4 },
{ 2240, 4 },
{ 2304, 4 },
{ 1856, 3 },
{ 1856, 3 },
{ 1920, 3 },
{ 1920, 3 },
{ 2368, 4 },
{ 2432, 4 },
{ 2496, 4 },
{ 2560, 4 },
{ 1472, 1 },
{ 1536, 1 },
{ 1600, 1 },
{ 1728, 1 },
{ 704, 1 },
{ 768, 1 },
{ 832, 1 },
{ 896, 1 },
{ 960, 1 },
{ 1024, 1 },
{ 1088, 1 },
{ 1152, 1 },
{ 1216, 1 },
{ 1280, 1 },
{ 1344, 1 },
{ 1408, 1 }
};
 
/* black decode table (runlength huffman codes) */
const mmr_table_node jbig2_mmr_black_decode[] = {
{ 128, 12 },
{ 160, 13 },
{ 224, 12 },
{ 256, 12 },
{ 10, 7 },
{ 11, 7 },
{ 288, 12 },
{ 12, 7 },
{ 9, 6 },
{ 9, 6 },
{ 8, 6 },
{ 8, 6 },
{ 7, 5 },
{ 7, 5 },
{ 7, 5 },
{ 7, 5 },
{ 6, 4 },
{ 6, 4 },
{ 6, 4 },
{ 6, 4 },
{ 6, 4 },
{ 6, 4 },
{ 6, 4 },
{ 6, 4 },
{ 5, 4 },
{ 5, 4 },
{ 5, 4 },
{ 5, 4 },
{ 5, 4 },
{ 5, 4 },
{ 5, 4 },
{ 5, 4 },
{ 1, 3 },
{ 1, 3 },
{ 1, 3 },
{ 1, 3 },
{ 1, 3 },
{ 1, 3 },
{ 1, 3 },
{ 1, 3 },
{ 1, 3 },
{ 1, 3 },
{ 1, 3 },
{ 1, 3 },
{ 1, 3 },
{ 1, 3 },
{ 1, 3 },
{ 1, 3 },
{ 4, 3 },
{ 4, 3 },
{ 4, 3 },
{ 4, 3 },
{ 4, 3 },
{ 4, 3 },
{ 4, 3 },
{ 4, 3 },
{ 4, 3 },
{ 4, 3 },
{ 4, 3 },
{ 4, 3 },
{ 4, 3 },
{ 4, 3 },
{ 4, 3 },
{ 4, 3 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 3, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ 2, 2 },
{ -2, 4 },
{ -2, 4 },
{ -1, 0 },
{ -1, 0 },
{ -1, 0 },
{ -1, 0 },
{ -1, 0 },
{ -1, 0 },
{ -1, 0 },
{ -1, 0 },
{ -1, 0 },
{ -1, 0 },
{ -1, 0 },
{ -1, 0 },
{ -1, 0 },
{ -3, 5 },
{ 1792, 4 },
{ 1792, 4 },
{ 1984, 5 },
{ 2048, 5 },
{ 2112, 5 },
{ 2176, 5 },
{ 2240, 5 },
{ 2304, 5 },
{ 1856, 4 },
{ 1856, 4 },
{ 1920, 4 },
{ 1920, 4 },
{ 2368, 5 },
{ 2432, 5 },
{ 2496, 5 },
{ 2560, 5 },
{ 18, 3 },
{ 18, 3 },
{ 18, 3 },
{ 18, 3 },
{ 18, 3 },
{ 18, 3 },
{ 18, 3 },
{ 18, 3 },
{ 52, 5 },
{ 52, 5 },
{ 640, 6 },
{ 704, 6 },
{ 768, 6 },
{ 832, 6 },
{ 55, 5 },
{ 55, 5 },
{ 56, 5 },
{ 56, 5 },
{ 1280, 6 },
{ 1344, 6 },
{ 1408, 6 },
{ 1472, 6 },
{ 59, 5 },
{ 59, 5 },
{ 60, 5 },
{ 60, 5 },
{ 1536, 6 },
{ 1600, 6 },
{ 24, 4 },
{ 24, 4 },
{ 24, 4 },
{ 24, 4 },
{ 25, 4 },
{ 25, 4 },
{ 25, 4 },
{ 25, 4 },
{ 1664, 6 },
{ 1728, 6 },
{ 320, 5 },
{ 320, 5 },
{ 384, 5 },
{ 384, 5 },
{ 448, 5 },
{ 448, 5 },
{ 512, 6 },
{ 576, 6 },
{ 53, 5 },
{ 53, 5 },
{ 54, 5 },
{ 54, 5 },
{ 896, 6 },
{ 960, 6 },
{ 1024, 6 },
{ 1088, 6 },
{ 1152, 6 },
{ 1216, 6 },
{ 64, 3 },
{ 64, 3 },
{ 64, 3 },
{ 64, 3 },
{ 64, 3 },
{ 64, 3 },
{ 64, 3 },
{ 64, 3 },
{ 13, 1 },
{ 13, 1 },
{ 13, 1 },
{ 13, 1 },
{ 13, 1 },
{ 13, 1 },
{ 13, 1 },
{ 13, 1 },
{ 13, 1 },
{ 13, 1 },
{ 13, 1 },
{ 13, 1 },
{ 13, 1 },
{ 13, 1 },
{ 13, 1 },
{ 13, 1 },
{ 23, 4 },
{ 23, 4 },
{ 50, 5 },
{ 51, 5 },
{ 44, 5 },
{ 45, 5 },
{ 46, 5 },
{ 47, 5 },
{ 57, 5 },
{ 58, 5 },
{ 61, 5 },
{ 256, 5 },
{ 16, 3 },
{ 16, 3 },
{ 16, 3 },
{ 16, 3 },
{ 17, 3 },
{ 17, 3 },
{ 17, 3 },
{ 17, 3 },
{ 48, 5 },
{ 49, 5 },
{ 62, 5 },
{ 63, 5 },
{ 30, 5 },
{ 31, 5 },
{ 32, 5 },
{ 33, 5 },
{ 40, 5 },
{ 41, 5 },
{ 22, 4 },
{ 22, 4 },
{ 14, 1 },
{ 14, 1 },
{ 14, 1 },
{ 14, 1 },
{ 14, 1 },
{ 14, 1 },
{ 14, 1 },
{ 14, 1 },
{ 14, 1 },
{ 14, 1 },
{ 14, 1 },
{ 14, 1 },
{ 14, 1 },
{ 14, 1 },
{ 14, 1 },
{ 14, 1 },
{ 15, 2 },
{ 15, 2 },
{ 15, 2 },
{ 15, 2 },
{ 15, 2 },
{ 15, 2 },
{ 15, 2 },
{ 15, 2 },
{ 128, 5 },
{ 192, 5 },
{ 26, 5 },
{ 27, 5 },
{ 28, 5 },
{ 29, 5 },
{ 19, 4 },
{ 19, 4 },
{ 20, 4 },
{ 20, 4 },
{ 34, 5 },
{ 35, 5 },
{ 36, 5 },
{ 37, 5 },
{ 38, 5 },
{ 39, 5 },
{ 21, 4 },
{ 21, 4 },
{ 42, 5 },
{ 43, 5 },
{ 0, 3 },
{ 0, 3 },
{ 0, 3 },
{ 0, 3 }
};
 
#define getbit(buf, x) ( ( buf[x >> 3] >> ( 7 - (x & 7) ) ) & 1 )
 
static int
jbig2_find_changing_element(const byte *line, int x, int w)
{
int a, b;
 
if (line == 0)
return w;
 
if (x == -1) {
a = 0;
x = 0;
}
else {
a = getbit(line, x);
x ++;
}
 
while (x < w) {
b = getbit(line, x);
if (a != b)
break;
x++;
}
 
return x;
}
 
static int
jbig2_find_changing_element_of_color(const byte *line, int x, int w, int color)
{
if (line == 0)
return w;
x = jbig2_find_changing_element(line, x, w);
if (x < w && getbit(line, x) != color)
x = jbig2_find_changing_element(line, x, w);
return x;
}
 
static const byte lm[8] = { 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01 };
static const byte rm[8] = { 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE };
 
static void
jbig2_set_bits(byte *line, int x0, int x1)
{
int a0, a1, b0, b1, a;
 
a0 = x0 >> 3;
a1 = x1 >> 3;
 
b0 = x0 & 7;
b1 = x1 & 7;
 
if (a0 == a1) {
line[a0] |= lm[b0] & rm[b1];
}
else {
line[a0] |= lm[b0];
for (a = a0 + 1; a < a1; a++)
line[a] = 0xFF;
line[a1] |= rm[b1];
}
}
 
 
static int
jbig2_decode_get_code(Jbig2MmrCtx *mmr, const mmr_table_node *table, int initial_bits)
{
uint32_t word = mmr->word;
int table_ix = word >> (32 - initial_bits);
int val = table[table_ix].val;
int n_bits = table[table_ix].n_bits;
 
if (n_bits > initial_bits) {
int mask = (1 << (32 - initial_bits)) - 1;
table_ix = val + ((word & mask) >> (32 - n_bits));
val = table[table_ix].val;
n_bits = initial_bits + table[table_ix].n_bits;
}
 
jbig2_decode_mmr_consume(mmr, n_bits);
 
return val;
}
 
static int
jbig2_decode_get_run(Jbig2MmrCtx *mmr, const mmr_table_node *table, int initial_bits)
{
int result = 0;
int val;
 
do {
val = jbig2_decode_get_code(mmr, table, initial_bits);
result += val;
} while (val >= 64);
 
return result;
}
 
static void
jbig2_decode_mmr_line(Jbig2MmrCtx *mmr, const byte *ref, byte *dst)
{
int a0, a1, a2, b1, b2;
int c;
 
a0 = -1;
c = 0; /* 0 is white, black is 1 */
 
while (1)
{
uint32_t word = mmr->word;
/* printf ("%08x\n", word); */
 
if (a0 >= mmr->width)
break;
 
if ((word >> (32 - 3)) == 1)
{
int white_run, black_run;
 
jbig2_decode_mmr_consume(mmr, 3);
 
if (a0 == -1)
a0 = 0;
 
if (c == 0) {
white_run = jbig2_decode_get_run(mmr, jbig2_mmr_white_decode, 8);
black_run = jbig2_decode_get_run(mmr, jbig2_mmr_black_decode, 7);
a1 = a0 + white_run;
a2 = a1 + black_run;
if (a1 > mmr->width) a1 = mmr->width;
if (a2 > mmr->width) a2 = mmr->width;
jbig2_set_bits(dst, a1, a2);
a0 = a2;
/* printf ("H %d %d\n", white_run, black_run); */
}
else
{
black_run = jbig2_decode_get_run(mmr, jbig2_mmr_black_decode, 7);
white_run = jbig2_decode_get_run(mmr, jbig2_mmr_white_decode, 8);
a1 = a0 + black_run;
a2 = a1 + white_run;
if (a1 > mmr->width) a1 = mmr->width;
if (a2 > mmr->width) a2 = mmr->width;
jbig2_set_bits(dst, a0, a1);
a0 = a2;
/* printf ("H %d %d\n", black_run, white_run); */
}
}
 
else if ((word >> (32 - 4)) == 1)
{
/* printf ("P\n"); */
jbig2_decode_mmr_consume(mmr, 4);
b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);
b2 = jbig2_find_changing_element(ref, b1, mmr->width);
if (c) jbig2_set_bits(dst, a0, b2);
a0 = b2;
}
 
else if ((word >> (32 - 1)) == 1)
{
/* printf ("V(0)\n"); */
jbig2_decode_mmr_consume(mmr, 1);
b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);
if (c) jbig2_set_bits(dst, a0, b1);
a0 = b1;
c = !c;
}
 
else if ((word >> (32 - 3)) == 3)
{
/* printf ("VR(1)\n"); */
jbig2_decode_mmr_consume(mmr, 3);
b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);
if (b1 + 1 > mmr->width) break;
if (c) jbig2_set_bits(dst, a0, b1 + 1);
a0 = b1 + 1;
c = !c;
}
 
else if ((word >> (32 - 6)) == 3)
{
/* printf ("VR(2)\n"); */
jbig2_decode_mmr_consume(mmr, 6);
b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);
if (b1 + 2 > mmr->width) break;
if (c) jbig2_set_bits(dst, a0, b1 + 2);
a0 = b1 + 2;
c = !c;
}
 
else if ((word >> (32 - 7)) == 3)
{
/* printf ("VR(3)\n"); */
jbig2_decode_mmr_consume(mmr, 7);
b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);
if (b1 + 3 > mmr->width) break;
if (c) jbig2_set_bits(dst, a0, b1 + 3);
a0 = b1 + 3;
c = !c;
}
 
else if ((word >> (32 - 3)) == 2)
{
/* printf ("VL(1)\n"); */
jbig2_decode_mmr_consume(mmr, 3);
b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);
if (b1 - 1 < 0) break;
if (c) jbig2_set_bits(dst, a0, b1 - 1);
a0 = b1 - 1;
c = !c;
}
 
else if ((word >> (32 - 6)) == 2)
{
/* printf ("VL(2)\n"); */
jbig2_decode_mmr_consume(mmr, 6);
b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);
if (b1 - 2 < 0) break;
if (c) jbig2_set_bits(dst, a0, b1 - 2);
a0 = b1 - 2;
c = !c;
}
 
else if ((word >> (32 - 7)) == 2)
{
/* printf ("VL(3)\n"); */
jbig2_decode_mmr_consume(mmr, 7);
b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);
if (b1 - 3 < 0) break;
if (c) jbig2_set_bits(dst, a0, b1 - 3);
a0 = b1 - 3;
c = !c;
}
 
else
break;
}
}
 
int
jbig2_decode_generic_mmr(Jbig2Ctx *ctx,
Jbig2Segment *segment,
const Jbig2GenericRegionParams *params,
const byte *data, size_t size,
Jbig2Image *image)
{
Jbig2MmrCtx mmr;
const int rowstride = image->stride;
byte *dst = image->data;
byte *ref = NULL;
int y;
 
jbig2_decode_mmr_init(&mmr, image->width, image->height, data, size);
 
for (y = 0; y < image->height; y++) {
memset(dst, 0, rowstride);
jbig2_decode_mmr_line(&mmr, ref, dst);
ref = dst;
dst += rowstride;
}
 
return 0;
}
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2_mmr.h
0,0 → 1,22
/*
jbig2dec
 
Copyright (C) 2001 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
int
jbig2_decode_generic_mmr(Jbig2Ctx *ctx,
Jbig2Segment *segment,
const Jbig2GenericRegionParams *params,
const byte *data, size_t size,
Jbig2Image *image);
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2_page.c
0,0 → 1,327
/*
jbig2dec
 
Copyright (C) 2001-2005 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "os_types.h"
 
#include <stdlib.h>
 
#include "jbig2.h"
#include "jbig2_priv.h"
 
#ifdef OUTPUT_PBM
#include <stdio.h>
#include "jbig2_image.h"
#endif
 
/* dump the page struct info */
static void
dump_page_info(Jbig2Ctx *ctx, Jbig2Segment *segment, Jbig2Page *page)
{
if (page->x_resolution == 0) {
jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,
"page %d image is %dx%d (unknown res)", page->number,
page->width, page->height);
} else if (page->x_resolution == page->y_resolution) {
jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,
"page %d image is %dx%d (%d ppm)", page->number,
page->width, page->height,
page->x_resolution);
} else {
jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,
"page %d image is %dx%d (%dx%d ppm)", page->number,
page->width, page->height,
page->x_resolution, page->y_resolution);
}
if (page->striped) {
jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,
"\tmaximum stripe size: %d", page->stripe_size);
}
}
 
/**
* jbig2_page_info: parse page info segment
*
* Parse the page info segment data and fill out a corresponding
* Jbig2Page struct and ready it for subsequent rendered data,
* including allocating an image buffer for the page (or the first stripe)
**/
int
jbig2_page_info (Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data)
{
Jbig2Page *page;
 
/* a new page info segment implies the previous page is finished */
page = &(ctx->pages[ctx->current_page]);
if ((page->number != 0) &&
((page->state == JBIG2_PAGE_NEW) || (page->state == JBIG2_PAGE_FREE))) {
page->state = JBIG2_PAGE_COMPLETE;
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"unexpected page info segment, marking previous page finished");
}
 
/* find a free page */
{
int index, j;
index = ctx->current_page;
while (ctx->pages[index].state != JBIG2_PAGE_FREE) {
index++;
if (index >= ctx->max_page_index) {
/* grow the list */
ctx->pages = jbig2_realloc(ctx->allocator, ctx->pages,
(ctx->max_page_index <<= 2) * sizeof(Jbig2Page));
for (j=index; j < ctx->max_page_index; j++) {
ctx->pages[j].state = JBIG2_PAGE_FREE;
ctx->pages[j].number = 0;
ctx->pages[j].image = NULL;
 
}
}
}
page = &(ctx->pages[index]);
ctx->current_page = index;
page->state = JBIG2_PAGE_NEW;
page->number = segment->page_association;
}
 
/* FIXME: would be nice if we tried to work around this */
if (segment->data_length < 19) {
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"segment too short");
}
 
/* 7.4.8.x */
page->width = jbig2_get_int32(segment_data);
page->height = jbig2_get_int32(segment_data + 4);
 
page->x_resolution = jbig2_get_int32(segment_data + 8);
page->y_resolution = jbig2_get_int32(segment_data + 12);
page->flags = segment_data[16];
 
/* 7.4.8.6 */
{
int16_t striping = jbig2_get_int16(segment_data +17);
if (striping & 0x8000) {
page->striped = TRUE;
page->stripe_size = striping & 0x7FFF;
} else {
page->striped = FALSE;
page->stripe_size = 0; /* would page->height be better? */
}
}
if (page->height == 0xFFFFFFFF && page->striped == FALSE) {
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"height is unspecified but page is not markes as striped");
page->striped = TRUE;
}
page->end_row = 0;
 
if (segment->data_length > 19) {
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"extra data in segment");
}
 
dump_page_info(ctx, segment, page);
 
/* allocate an approprate page image buffer */
/* 7.4.8.2 */
if (page->height == 0xFFFFFFFF) {
page->image = jbig2_image_new(ctx, page->width, page->stripe_size);
} else {
page->image = jbig2_image_new(ctx, page->width, page->height);
}
if (page->image == NULL) {
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"failed to allocate buffer for page image");
} else {
/* 8.2 (3) fill the page with the default pixel value */
jbig2_image_clear(ctx, page->image, (page->flags & 4));
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
"allocated %dx%d page image (%d bytes)",
page->image->width, page->image->height,
page->image->stride*page->image->height);
}
 
return 0;
}
 
/**
* jbig2_end_of_stripe: parse and implement an end of stripe segment
**/
int
jbig2_end_of_stripe(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data)
{
Jbig2Page page = ctx->pages[ctx->current_page];
int end_row;
 
end_row = jbig2_get_int32(segment_data);
if (end_row < page.end_row) {
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"end of stripe segment with non-positive end row advance"
" (new end row %d vs current end row %d)",
end_row, page.end_row);
} else {
jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,
"end of stripe: advancing end row to %d", end_row);
}
 
page.end_row = end_row;
 
return 0;
}
 
/**
* jbig2_complete_page: complete a page image
*
* called upon seeing an 'end of page' segment, this routine
* marks a page as completed so it can be returned.
* compositing will have already happened in the previous
* segment handlers.
**/
int
jbig2_complete_page (Jbig2Ctx *ctx)
{
 
/* check for unfinished segments */
if (ctx->segment_index != ctx->n_segments) {
Jbig2Segment *segment = ctx->segments[ctx->segment_index];
int code = 0;
/* Some versions of Xerox Workcentre generate PDF files
with the segment data length field of the last segment
set to -1. Try to cope with this here. */
if ((segment->data_length & 0xffffffff) == 0xffffffff) {
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"File has an invalid segment data length!"
" Trying to decode using the available data.");
segment->data_length = ctx->buf_wr_ix - ctx->buf_rd_ix;
code = jbig2_parse_segment(ctx, segment, ctx->buf + ctx->buf_rd_ix);
ctx->buf_rd_ix += segment->data_length;
ctx->segment_index++;
}
}
ctx->pages[ctx->current_page].state = JBIG2_PAGE_COMPLETE;
 
return 0;
}
 
/**
* jbig2_end_of_page: parse and implement an end of page segment
**/
int
jbig2_end_of_page(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data)
{
uint32_t page_number = ctx->pages[ctx->current_page].number;
 
if (segment->page_association != page_number) {
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"end of page marker for page %d doesn't match current page number %d",
segment->page_association, page_number);
}
 
jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,
"end of page %d", page_number);
 
jbig2_complete_page(ctx);
 
#ifdef OUTPUT_PBM
jbig2_image_write_pbm(ctx->pages[ctx->current_page].image, stdout);
#endif
 
return 0;
}
 
/**
* jbig2_add_page_result: composite a decoding result onto a page
*
* this is called to add the results of segment decode (when it
* is an image) to a page image buffer
**/
int
jbig2_page_add_result(Jbig2Ctx *ctx, Jbig2Page *page, Jbig2Image *image,
int x, int y, Jbig2ComposeOp op)
{
/* grow the page to accomodate a new stripe if necessary */
if (page->striped) {
int new_height = y + image->height + page->end_row;
if (page->image->height < new_height) {
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, -1,
"growing page buffer to %d rows "
"to accomodate new stripe", new_height);
jbig2_image_resize(ctx, page->image,
page->image->width, new_height);
}
}
 
jbig2_image_compose(ctx, page->image, image,
x, y + page->end_row, JBIG2_COMPOSE_OR);
 
return 0;
}
 
/**
* jbig2_get_page: return the next available page image buffer
*
* the client can call this at any time to check if any pages
* have been decoded. If so, it returns the first available
* one. The client should then call jbig2_release_page() when
* it no longer needs to refer to the image buffer.
*
* since this is a public routine for the library clients, we
* return an image structure pointer, even though the function
* name refers to a page; the page structure is private.
**/
Jbig2Image *jbig2_page_out(Jbig2Ctx *ctx)
{
int index;
 
/* search for a completed page */
for (index=0; index < ctx->max_page_index; index++) {
if (ctx->pages[index].state == JBIG2_PAGE_COMPLETE) {
ctx->pages[index].state = JBIG2_PAGE_RETURNED;
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, -1,
"page %d returned to the client", ctx->pages[index].number);
return jbig2_image_clone(ctx, ctx->pages[index].image);
}
}
 
/* no pages available */
return NULL;
}
 
/**
* jbig2_release_page: tell the library a page can be freed
**/
int jbig2_release_page(Jbig2Ctx *ctx, Jbig2Image *image)
{
int index;
 
/* find the matching page struct and mark it released */
for (index = 0; index < ctx->max_page_index; index++) {
if (ctx->pages[index].image == image) {
jbig2_image_release(ctx, image);
ctx->pages[index].state = JBIG2_PAGE_RELEASED;
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, -1,
"page %d released by the client", ctx->pages[index].number);
return 0;
}
}
 
/* no matching pages */
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, -1,
"jbig2_release_page called on unknown page");
return 1;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2_priv.h
0,0 → 1,177
/*
jbig2dec
 
Copyright (C) 2002 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
/* library internals */
 
typedef uint8_t byte;
typedef int bool;
 
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
 
#ifndef NULL
#define NULL ((void*)0)
#endif
 
typedef enum {
JBIG2_FILE_HEADER,
JBIG2_FILE_SEQUENTIAL_HEADER,
JBIG2_FILE_SEQUENTIAL_BODY,
JBIG2_FILE_RANDOM_HEADERS,
JBIG2_FILE_RANDOM_BODIES,
JBIG2_FILE_EOF
} Jbig2FileState;
 
struct _Jbig2Ctx {
Jbig2Allocator *allocator;
Jbig2Options options;
const Jbig2Ctx *global_ctx;
Jbig2ErrorCallback error_callback;
void *error_callback_data;
 
byte *buf;
size_t buf_size;
unsigned int buf_rd_ix;
unsigned int buf_wr_ix;
 
Jbig2FileState state;
 
uint8_t file_header_flags;
int32_t n_pages;
 
int n_segments_max;
Jbig2Segment **segments;
int n_segments; /* index of last segment header parsed */
int segment_index; /* index of last segment body parsed */
 
/* list of decoded pages, including the one in progress,
currently stored as a contiguous, 0-indexed array. */
int current_page;
int max_page_index;
Jbig2Page *pages;
};
 
int32_t
jbig2_get_int32 (const byte *buf);
 
int16_t
jbig2_get_int16 (const byte *buf);
 
/* dynamic memory management */
void *
jbig2_alloc (Jbig2Allocator *allocator, size_t size);
 
void
jbig2_free (Jbig2Allocator *allocator, void *p);
 
void *
jbig2_realloc (Jbig2Allocator *allocator, void *p, size_t size);
 
#define jbig2_new(ctx, t, size) ((t *)jbig2_alloc(ctx->allocator, (size) * sizeof(t)))
 
#define jbig2_renew(ctx, p, t, size) ((t *)jbig2_realloc(ctx->allocator, (p), (size) * sizeof(t)))
 
int
jbig2_error (Jbig2Ctx *ctx, Jbig2Severity severity, int32_t seg_idx,
const char *fmt, ...);
 
/* the page structure handles decoded page
results. it's allocated by a 'page info'
segement and marked complete by an 'end of page'
segment.
*/
typedef enum {
JBIG2_PAGE_FREE,
JBIG2_PAGE_NEW,
JBIG2_PAGE_COMPLETE,
JBIG2_PAGE_RETURNED,
JBIG2_PAGE_RELEASED
} Jbig2PageState;
 
struct _Jbig2Page {
Jbig2PageState state;
uint32_t number;
uint32_t height, width; /* in pixels */
uint32_t x_resolution,
y_resolution; /* in pixels per meter */
uint16_t stripe_size;
bool striped;
int end_row;
uint8_t flags;
Jbig2Image *image;
};
 
int jbig2_page_info (Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data);
int jbig2_end_of_stripe(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data);
int jbig2_end_of_page(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data);
int jbig2_extension_segment(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data);
 
typedef enum {
JBIG2_COMPOSE_OR = 0,
JBIG2_COMPOSE_AND = 1,
JBIG2_COMPOSE_XOR = 2,
JBIG2_COMPOSE_XNOR = 3,
JBIG2_COMPOSE_REPLACE = 4
} Jbig2ComposeOp;
 
int jbig2_image_compose(Jbig2Ctx *ctx, Jbig2Image *dst, Jbig2Image *src, int x, int y, Jbig2ComposeOp op);
int jbig2_page_add_result(Jbig2Ctx *ctx, Jbig2Page *page, Jbig2Image *src, int x, int y, Jbig2ComposeOp op);
 
/* region segment info */
 
typedef struct {
int32_t width;
int32_t height;
int32_t x;
int32_t y;
Jbig2ComposeOp op;
uint8_t flags;
} Jbig2RegionSegmentInfo;
 
void jbig2_get_region_segment_info(Jbig2RegionSegmentInfo *info, const uint8_t *segment_data);
int jbig2_text_region(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data);
 
/* 7.4 */
int jbig2_immediate_generic_region(Jbig2Ctx *ctx, Jbig2Segment *segment,
const uint8_t *segment_data);
int jbig2_refinement_region(Jbig2Ctx *ctx, Jbig2Segment *segment,
const byte *segment_data);
 
int jbig2_pattern_dictionary(Jbig2Ctx *ctx, Jbig2Segment *segment,
const byte *segment_data);
int jbig2_halftone_region(Jbig2Ctx *ctx, Jbig2Segment *segment,
const byte *segment_data);
 
 
/* The word stream design is a compromise between simplicity and
trying to amortize the number of method calls. Each ::get_next_word
invocation pulls 4 bytes from the stream, packed big-endian into a
32 bit word. The offset argument is provided as a convenience. It
begins at 0 and increments by 4 for each successive invocation. */
typedef struct _Jbig2WordStream Jbig2WordStream;
 
struct _Jbig2WordStream {
uint32_t (*get_next_word) (Jbig2WordStream *self, int offset);
};
 
Jbig2WordStream *
jbig2_word_stream_buf_new(Jbig2Ctx *ctx, const byte *data, size_t size);
 
void
jbig2_word_stream_buf_free(Jbig2Ctx *ctx, Jbig2WordStream *ws);
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2_refinement.c
0,0 → 1,440
/*
jbig2dec
 
Copyright (C) 2004 Artifex Software, Inc.
 
This software is provided AS-IS with no warranty,
either express or implied.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
/**
* Generic Refinement region handlers.
**/
 
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "os_types.h"
 
#include <stddef.h>
#include <string.h> /* memcpy(), memset() */
 
#include <stdio.h>
 
#include "jbig2.h"
#include "jbig2_priv.h"
#include "jbig2_arith.h"
#include "jbig2_generic.h"
#include "jbig2_image.h"
 
static int
jbig2_decode_refinement_template0(Jbig2Ctx *ctx,
Jbig2Segment *segment,
const Jbig2RefinementRegionParams *params,
Jbig2ArithState *as,
Jbig2Image *image,
Jbig2ArithCx *GR_stats)
{
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"refinement region template 0 NYI");
}
 
static int
jbig2_decode_refinement_template0_unopt(Jbig2Ctx *ctx,
Jbig2Segment *segment,
const Jbig2RefinementRegionParams *params,
Jbig2ArithState *as,
Jbig2Image *image,
Jbig2ArithCx *GR_stats)
{
const int GRW = image->width;
const int GRH = image->height;
const int dx = params->DX;
const int dy = params->DY;
Jbig2Image *ref = params->reference;
uint32_t CONTEXT;
int x,y;
bool bit;
 
for (y = 0; y < GRH; y++) {
for (x = 0; x < GRW; x++) {
CONTEXT = 0;
CONTEXT |= jbig2_image_get_pixel(image, x - 1, y + 0) << 0;
CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 1) << 1;
CONTEXT |= jbig2_image_get_pixel(image, x + 0, y - 1) << 2;
CONTEXT |= jbig2_image_get_pixel(image, x + params->grat[0],
y + params->grat[1]) << 3;
CONTEXT |= jbig2_image_get_pixel(ref, x-dx+1, y-dy+1) << 4;
CONTEXT |= jbig2_image_get_pixel(ref, x-dx+0, y-dy+1) << 5;
CONTEXT |= jbig2_image_get_pixel(ref, x-dx-1, y-dy+1) << 6;
CONTEXT |= jbig2_image_get_pixel(ref, x-dx+1, y-dy+0) << 7;
CONTEXT |= jbig2_image_get_pixel(ref, x-dx+0, y-dy+0) << 8;
CONTEXT |= jbig2_image_get_pixel(ref, x-dx-1, y-dy+0) << 9;
CONTEXT |= jbig2_image_get_pixel(ref, x-dx+1, y-dy-1) << 10;
CONTEXT |= jbig2_image_get_pixel(ref, x-dx+0, y-dy-1) << 11;
CONTEXT |= jbig2_image_get_pixel(ref, x-dx+params->grat[2],
y-dy+params->grat[3]) << 12;
bit = jbig2_arith_decode(as, &GR_stats[CONTEXT]);
jbig2_image_set_pixel(image, x, y, bit);
}
}
#ifdef JBIG2_DEBUG_DUMP
{
static count = 0;
char name[32];
snprintf(name, 32, "refin-%d.pbm", count);
jbig2_image_write_pbm_file(ref, name);
snprintf(name, 32, "refout-%d.pbm", count);
jbig2_image_write_pbm_file(image, name);
count++;
}
#endif
 
return 0;
}
 
 
static int
jbig2_decode_refinement_template1_unopt(Jbig2Ctx *ctx,
Jbig2Segment *segment,
const Jbig2RefinementRegionParams *params,
Jbig2ArithState *as,
Jbig2Image *image,
Jbig2ArithCx *GR_stats)
{
const int GRW = image->width;
const int GRH = image->height;
const int dx = params->DX;
const int dy = params->DY;
Jbig2Image *ref = params->reference;
uint32_t CONTEXT;
int x,y;
bool bit;
 
for (y = 0; y < GRH; y++) {
for (x = 0; x < GRW; x++) {
CONTEXT = 0;
CONTEXT |= jbig2_image_get_pixel(image, x - 1, y + 0) << 0;
CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 1) << 1;
CONTEXT |= jbig2_image_get_pixel(image, x + 0, y - 1) << 2;
CONTEXT |= jbig2_image_get_pixel(image, x - 1, y - 1) << 3;
CONTEXT |= jbig2_image_get_pixel(ref, x-dx+1, y-dy+1) << 4;
CONTEXT |= jbig2_image_get_pixel(ref, x-dx+0, y-dy+1) << 5;
CONTEXT |= jbig2_image_get_pixel(ref, x-dx+1, y-dy+0) << 6;
CONTEXT |= jbig2_image_get_pixel(ref, x-dx+0, y-dy+0) << 7;
CONTEXT |= jbig2_image_get_pixel(ref, x-dx-1, y-dy+0) << 8;
CONTEXT |= jbig2_image_get_pixel(ref, x-dx+0, y-dy-1) << 9;
bit = jbig2_arith_decode(as, &GR_stats[CONTEXT]);
jbig2_image_set_pixel(image, x, y, bit);
}
}
 
#ifdef JBIG2_DEBUG_DUMP
{
static count = 0;
char name[32];
snprintf(name, 32, "refin-%d.pbm", count);
jbig2_image_write_pbm_file(ref, name);
snprintf(name, 32, "refout-%d.pbm", count);
jbig2_image_write_pbm_file(image, name);
count++;
}
#endif
 
return 0;
}
 
static int
jbig2_decode_refinement_template1(Jbig2Ctx *ctx,
Jbig2Segment *segment,
const Jbig2RefinementRegionParams *params,
Jbig2ArithState *as,
Jbig2Image *image,
Jbig2ArithCx *GR_stats)
{
const int GRW = image->width;
const int GRH = image->height;
const int stride = image->stride;
const int refstride = params->reference->stride;
const int dy = params->DY;
byte *grreg_line = (byte *)image->data;
byte *grref_line = (byte *)params->reference->data;
int x,y;
 
for (y = 0; y < GRH; y++) {
const int padded_width = (GRW + 7) & -8;
uint32_t CONTEXT;
uint32_t refline_m1; /* previous line of the reference bitmap */
uint32_t refline_0; /* current line of the reference bitmap */
uint32_t refline_1; /* next line of the reference bitmap */
uint32_t line_m1; /* previous line of the decoded bitmap */
 
line_m1 = (y >= 1) ? grreg_line[-stride] : 0;
refline_m1 = ((y-dy) >= 1) ? grref_line[(-1-dy)*stride] << 2: 0;
refline_0 = (((y-dy) > 0) && ((y-dy) < GRH)) ? grref_line[(0-dy)*stride] << 4 : 0;
refline_1 = (y < GRH - 1) ? grref_line[(+1-dy)*stride] << 7 : 0;
CONTEXT = ((line_m1 >> 5) & 0x00e) |
((refline_1 >> 5) & 0x030) |
((refline_0 >> 5) & 0x1c0) |
((refline_m1 >> 5) & 0x200);
 
for (x = 0; x < padded_width; x += 8) {
byte result = 0;
int x_minor;
const int minor_width = GRW - x > 8 ? 8 : GRW - x;
 
if (y >= 1) {
line_m1 = (line_m1 << 8) |
(x + 8 < GRW ? grreg_line[-stride + (x >> 3) + 1] : 0);
refline_m1 = (refline_m1 << 8) |
(x + 8 < GRW ? grref_line[-refstride + (x >> 3) + 1] << 2 : 0);
}
 
refline_0 = (refline_0 << 8) |
(x + 8 < GRW ? grref_line[(x >> 3) + 1] << 4 : 0);
 
if (y < GRH - 1)
refline_1 = (refline_1 << 8) |
(x + 8 < GRW ? grref_line[+refstride + (x >> 3) + 1] << 7 : 0);
else
refline_1 = 0;
 
/* this is the speed critical inner-loop */
for (x_minor = 0; x_minor < minor_width; x_minor++) {
bool bit;
 
bit = jbig2_arith_decode(as, &GR_stats[CONTEXT]);
result |= bit << (7 - x_minor);
CONTEXT = ((CONTEXT & 0x0d6) << 1) | bit |
((line_m1 >> (9 - x_minor)) & 0x002) |
((refline_1 >> (9 - x_minor)) & 0x010) |
((refline_0 >> (9 - x_minor)) & 0x040) |
((refline_m1 >> (9 - x_minor)) & 0x200);
}
 
grreg_line[x>>3] = result;
 
}
 
grreg_line += stride;
grref_line += refstride;
 
}
 
return 0;
 
}
 
 
/**
* jbig2_decode_refinement_region: Decode a generic refinement region.
* @ctx: The context for allocation and error reporting.
* @segment: A segment reference for error reporting.
* @params: Decoding parameter set.
* @as: Arithmetic decoder state.
* @image: Where to store the decoded image.
* @GR_stats: Arithmetic stats.
*
* Decodes a generic refinement region, according to section 6.3.
* an already allocated Jbig2Image object in @image for the result.
*
* Because this API is based on an arithmetic decoding state, it is
* not suitable for MMR decoding.
*
* Return code: 0 on success.
**/
int
jbig2_decode_refinement_region(Jbig2Ctx *ctx,
Jbig2Segment *segment,
const Jbig2RefinementRegionParams *params,
Jbig2ArithState *as,
Jbig2Image *image,
Jbig2ArithCx *GR_stats)
{
{
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
"decoding generic refinement region with offset %d,%x,\n"
" GRTEMPLATE=%d, TPGRON=%d, RA1=(%d,%d) RA2=(%d,%d)\n",
params->DX, params->DY, params->GRTEMPLATE, params->TPGRON,
params->grat[0], params->grat[1], params->grat[2], params->grat[3]);
}
if (params->TPGRON)
return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"decode_refinement_region: typical prediction coding NYI");
if (params->GRTEMPLATE)
return jbig2_decode_refinement_template1_unopt(ctx, segment, params,
as, image, GR_stats);
else
return jbig2_decode_refinement_template0_unopt(ctx, segment, params,
as, image, GR_stats);
}
 
/**
* Find the first referred-to intermediate region segment
* with a non-NULL result for use as a reference image
*/
Jbig2Segment *
jbig2_region_find_referred(Jbig2Ctx *ctx,Jbig2Segment *segment)
{
const int nsegments = segment->referred_to_segment_count;
Jbig2Segment *rsegment;
int index;
 
for (index = 0; index < nsegments; index++) {
rsegment = jbig2_find_segment(ctx,
segment->referred_to_segments[index]);
if (rsegment == NULL) {
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"could not find referred to segment %d",
segment->referred_to_segments[index]);
continue;
}
switch (rsegment->flags & 63) {
case 4: /* intermediate text region */
case 20: /* intermediate halftone region */
case 36: /* intermediate generic region */
case 40: /* intermediate generic refinement region */
if (rsegment->result) return rsegment;
break;
default: /* keep looking */
break;
}
}
/* no appropriate reference was found. */
return NULL;
}
 
/**
* Handler for generic refinement region segments
*/
int
jbig2_refinement_region(Jbig2Ctx *ctx, Jbig2Segment *segment,
const byte *segment_data)
{
Jbig2RefinementRegionParams params;
Jbig2RegionSegmentInfo rsi;
int offset = 0;
byte seg_flags;
 
/* 7.4.7 */
if (segment->data_length < 18)
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"Segment too short");
 
jbig2_get_region_segment_info(&rsi, segment_data);
jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,
"generic region: %d x %d @ (%d, %d), flags = %02x",
rsi.width, rsi.height, rsi.x, rsi.y, rsi.flags);
 
/* 7.4.7.2 */
seg_flags = segment_data[17];
params.GRTEMPLATE = seg_flags & 0x01;
params.TPGRON = seg_flags & 0x02 ? 1 : 0;
jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,
"segment flags = %02x %s%s", seg_flags,
params.GRTEMPLATE ? " GRTEMPLATE" :"",
params.TPGRON ? " TPGRON" : "" );
if (seg_flags & 0xFC)
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"reserved segment flag bits are non-zero");
offset += 18;
 
/* 7.4.7.3 */
if (!params.GRTEMPLATE) {
if (segment->data_length < 22)
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"Segment too short");
params.grat[0] = segment_data[offset + 0];
params.grat[1] = segment_data[offset + 1];
params.grat[2] = segment_data[offset + 2];
params.grat[3] = segment_data[offset + 3];
jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,
"grat1: (%d, %d) grat2: (%d, %d)",
params.grat[0], params.grat[1],
params.grat[2], params.grat[3]);
offset += 4;
}
 
/* 7.4.7.4 - set up the reference image */
if (segment->referred_to_segment_count) {
Jbig2Segment *ref;
 
ref = jbig2_region_find_referred(ctx, segment);
if (ref == NULL)
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"could not find reference bitmap!");
/* the reference bitmap is the result of a previous
intermediate region segment; the reference selection
rules say to use the first one available, and not to
reuse any intermediate result, so we simply clone it
and free the original to keep track of this. */
params.reference = jbig2_image_clone(ctx, ref->result);
jbig2_image_release(ctx, ref->result);
ref->result = NULL;
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
"found reference bitmap in segment %d", ref->number);
} else {
/* the reference is just (a subset of) the page buffer */
params.reference = jbig2_image_clone(ctx,
ctx->pages[ctx->current_page].image);
/* TODO: subset the image if appropriate */
}
 
/* 7.4.7.5 */
params.DX = 0;
params.DY = 0;
{
Jbig2WordStream *ws;
Jbig2ArithState *as;
Jbig2ArithCx *GR_stats = NULL;
int stats_size;
Jbig2Image *image;
int code;
 
image = jbig2_image_new(ctx, rsi.width, rsi.height);
if (image == NULL)
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"unable to allocate refinement image");
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
"allocated %d x %d image buffer for region decode results",
rsi.width, rsi.height);
 
stats_size = params.GRTEMPLATE ? 1 << 10 : 1 << 13;
GR_stats = jbig2_alloc(ctx->allocator, stats_size);
memset(GR_stats, 0, stats_size);
 
ws = jbig2_word_stream_buf_new(ctx, segment_data + offset,
segment->data_length - offset);
as = jbig2_arith_new(ctx, ws);
code = jbig2_decode_refinement_region(ctx, segment, &params,
as, image, GR_stats);
 
jbig2_free(ctx->allocator, as);
jbig2_word_stream_buf_free(ctx, ws);
jbig2_free(ctx->allocator, GR_stats);
 
if ((segment->flags & 63) == 40) {
/* intermediate region. save the result for later */
segment->result = image;
} else {
/* immediate region. composite onto the page */
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
"composing %dx%d decoded refinement region onto page at (%d, %d)",
rsi.width, rsi.height, rsi.x, rsi.y);
jbig2_page_add_result(ctx, &ctx->pages[ctx->current_page],
image, rsi.x, rsi.y, rsi.op);
jbig2_image_release(ctx, image);
}
}
 
return 0;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2_segment.c
0,0 → 1,295
/*
jbig2dec
 
Copyright (C) 2002-2005 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "os_types.h"
 
#include <stddef.h> /* size_t */
 
#include "jbig2.h"
#include "jbig2_priv.h"
#include "jbig2_symbol_dict.h"
#include "jbig2_metadata.h"
 
Jbig2Segment *
jbig2_parse_segment_header (Jbig2Ctx *ctx, uint8_t *buf, size_t buf_size,
size_t *p_header_size)
{
Jbig2Segment *result;
uint8_t rtscarf;
uint32_t rtscarf_long;
uint32_t *referred_to_segments;
int referred_to_segment_count;
int referred_to_segment_size;
int pa_size;
int offset;
 
/* minimum possible size of a jbig2 segment header */
if (buf_size < 11)
return NULL;
 
result = (Jbig2Segment *)jbig2_alloc(ctx->allocator,
sizeof(Jbig2Segment));
 
/* 7.2.2 */
result->number = jbig2_get_int32(buf);
 
/* 7.2.3 */
result->flags = buf[4];
 
/* 7.2.4 referred-to segments */
rtscarf = buf[5];
if ((rtscarf & 0xe0) == 0xe0)
{
rtscarf_long = jbig2_get_int32(buf + 5);
referred_to_segment_count = rtscarf_long & 0x1fffffff;
offset = 5 + 4 + (referred_to_segment_count + 1) / 8;
}
else
{
referred_to_segment_count = (rtscarf >> 5);
offset = 5 + 1;
}
result->referred_to_segment_count = referred_to_segment_count;
 
/* we now have enough information to compute the full header length */
referred_to_segment_size = result->number <= 256 ? 1:
result->number <= 65536 ? 2 : 4; /* 7.2.5 */
pa_size = result->flags & 0x40 ? 4 : 1; /* 7.2.6 */
if (offset + referred_to_segment_count*referred_to_segment_size + pa_size + 4 > buf_size)
{
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, result->number,
"jbig2_parse_segment_header() called with insufficient data", -1);
jbig2_free (ctx->allocator, result);
return NULL;
}
 
/* 7.2.5 */
if (referred_to_segment_count)
{
int i;
 
referred_to_segments = jbig2_alloc(ctx->allocator, referred_to_segment_count * referred_to_segment_size * sizeof(uint32_t));
 
for (i = 0; i < referred_to_segment_count; i++) {
referred_to_segments[i] =
(referred_to_segment_size == 1) ? buf[offset] :
(referred_to_segment_size == 2) ? jbig2_get_int16(buf+offset) :
jbig2_get_int32(buf + offset);
offset += referred_to_segment_size;
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, result->number,
"segment %d refers to segment %d",
result->number, referred_to_segments[i]);
}
result->referred_to_segments = referred_to_segments;
}
else /* no referred-to segments */
{
result->referred_to_segments = NULL;
}
 
/* 7.2.6 */
if (result->flags & 0x40) {
result->page_association = jbig2_get_int32(buf + offset);
offset += 4;
} else {
result->page_association = buf[offset++];
}
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, result->number,
"segment %d is associated with page %d",
result->number, result->page_association);
 
/* 7.2.7 */
result->data_length = jbig2_get_int32(buf + offset);
*p_header_size = offset + 4;
 
/* no body parsing results yet */
result->result = NULL;
 
return result;
}
 
void
jbig2_free_segment (Jbig2Ctx *ctx, Jbig2Segment *segment)
{
if (segment->referred_to_segments != NULL) {
jbig2_free(ctx->allocator, segment->referred_to_segments);
}
/* todo: we need either some separate fields or
a more complex result object rather than this
brittle special casing */
switch (segment->flags & 63) {
case 0: /* symbol dictionary */
if (segment->result != NULL)
jbig2_sd_release(ctx, segment->result);
break;
case 4: /* intermediate text region */
case 40: /* intermediate refinement region */
if (segment->result != NULL)
jbig2_image_release(ctx, segment->result);
break;
case 62:
if (segment->result != NULL)
jbig2_metadata_free(ctx, segment->result);
break;
default:
/* anything else is probably an undefined pointer */
break;
}
jbig2_free (ctx->allocator, segment);
}
 
/* find a segment by number */
Jbig2Segment *
jbig2_find_segment(Jbig2Ctx *ctx, uint32_t number)
{
int index, index_max = ctx->segment_index - 1;
const Jbig2Ctx *global_ctx = ctx->global_ctx;
 
/* FIXME: binary search would be better */
for (index = index_max; index >= 0; index--)
if (ctx->segments[index]->number == number)
return (ctx->segments[index]);
 
if (global_ctx)
for (index = global_ctx->segment_index - 1; index >= 0; index--)
if (global_ctx->segments[index]->number == number)
return (global_ctx->segments[index]);
 
/* didn't find a match */
return NULL;
}
 
/* parse the generic portion of a region segment data header */
void
jbig2_get_region_segment_info(Jbig2RegionSegmentInfo *info,
const uint8_t *segment_data)
{
/* 7.4.1 */
info->width = jbig2_get_int32(segment_data);
info->height = jbig2_get_int32(segment_data + 4);
info->x = jbig2_get_int32(segment_data + 8);
info->y = jbig2_get_int32(segment_data + 12);
info->flags = segment_data[16];
info->op = info->flags & 0x7;
}
 
/* dispatch code for extension segment parsing */
int jbig2_parse_extension_segment(Jbig2Ctx *ctx, Jbig2Segment *segment,
const uint8_t *segment_data)
{
uint32_t type;
bool reserved, dependent, necessary;
 
type = jbig2_get_int32(segment_data);
 
reserved = type & 0x20000000;
dependent = type & 0x40000000;
necessary = type & 0x80000000;
 
if (necessary && !reserved) {
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"extension segment is marked 'necessary' but not 'reservered' contrary to spec");
}
 
switch (type) {
case 0x20000000: return jbig2_comment_ascii(ctx, segment, segment_data);
case 0x20000002: return jbig2_comment_unicode(ctx, segment, segment_data);
default:
if (necessary) {
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"unhandled necessary extension segment type 0x%08x", type);
} else {
return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"unhandled extension segment");
}
}
 
return 0;
}
 
/* general segment parsing dispatch */
int jbig2_parse_segment (Jbig2Ctx *ctx, Jbig2Segment *segment,
const uint8_t *segment_data)
{
jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,
"Segment %d, flags=%x, type=%d, data_length=%d",
segment->number, segment->flags, segment->flags & 63,
segment->data_length);
switch (segment->flags & 63)
{
case 0:
return jbig2_symbol_dictionary(ctx, segment, segment_data);
case 4: /* intermediate text region */
case 6: /* immediate text region */
case 7: /* immediate lossless text region */
return jbig2_text_region(ctx, segment, segment_data);
#ifdef JBIG2_HALFTONE
case 16:
return jbig2_pattern_dictionary(ctx, segment, segment_data);
case 20: /* intermediate halftone region */
case 22: /* immediate halftone region */
case 23: /* immediate lossless halftone region */
return jbig2_halftone_region(ctx, segment, segment_data);
#else
case 16:
return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"unhandled segment type 'pattern dictionary'");
case 20:
return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"unhandled segment type 'intermediate halftone region'");
case 22:
return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"unhandled segment type 'immediate halftone region'");
case 23:
return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"unhandled segment type 'immediate lossless halftone region'");
#endif
case 36:
return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"unhandled segment type 'intermediate generic region'");
case 38: /* immediate generic region */
case 39: /* immediate lossless generic region */
return jbig2_immediate_generic_region(ctx, segment, segment_data);
case 40: /* intermediate generic refinement region */
case 42: /* immediate generic refinement region */
case 43: /* immediate lossless generic refinement region */
return jbig2_refinement_region(ctx, segment, segment_data);
case 48:
return jbig2_page_info(ctx, segment, segment_data);
case 49:
return jbig2_end_of_page(ctx, segment, segment_data);
case 50:
return jbig2_end_of_stripe(ctx, segment, segment_data);
case 51:
ctx->state = JBIG2_FILE_EOF;
return jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,
"end of file");
case 52:
return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"unhandled segment type 'profile'");
case 53:
return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"unhandled table segment");
case 62:
return jbig2_parse_extension_segment(ctx, segment, segment_data);
default:
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"unknown segment type %d", segment->flags & 63);
}
return 0;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2_symbol_dict.c
0,0 → 1,937
/*
jbig2dec
 
Copyright (C) 2001-2005 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
/* symbol dictionary segment decode and support */
 
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "os_types.h"
 
#include <stddef.h>
#include <string.h> /* memset() */
 
#include "jbig2.h"
#include "jbig2_priv.h"
#include "jbig2_arith.h"
#include "jbig2_arith_int.h"
#include "jbig2_arith_iaid.h"
#include "jbig2_huffman.h"
#include "jbig2_generic.h"
#include "jbig2_mmr.h"
#include "jbig2_symbol_dict.h"
#include "jbig2_text.h"
 
#if defined(OUTPUT_PBM) || defined(DUMP_SYMDICT)
#include <stdio.h>
#include "jbig2_image.h"
#endif
 
/* Table 13 */
typedef struct {
bool SDHUFF;
bool SDREFAGG;
int32_t SDNUMINSYMS;
Jbig2SymbolDict *SDINSYMS;
uint32_t SDNUMNEWSYMS;
uint32_t SDNUMEXSYMS;
Jbig2HuffmanTable *SDHUFFDH;
Jbig2HuffmanTable *SDHUFFDW;
Jbig2HuffmanTable *SDHUFFBMSIZE;
Jbig2HuffmanTable *SDHUFFAGGINST;
int SDTEMPLATE;
int8_t sdat[8];
bool SDRTEMPLATE;
int8_t sdrat[4];
} Jbig2SymbolDictParams;
 
 
/* Utility routines */
 
#ifdef DUMP_SYMDICT
void
jbig2_dump_symbol_dict(Jbig2Ctx *ctx, Jbig2Segment *segment)
{
Jbig2SymbolDict *dict = (Jbig2SymbolDict *)segment->result;
int index;
char filename[24];
 
if (dict == NULL) return;
jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,
"dumping symbol dict as %d individual png files\n", dict->n_symbols);
for (index = 0; index < dict->n_symbols; index++) {
snprintf(filename, sizeof(filename), "symbol_%02d-%04d.png",
segment->number, index);
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
"dumping symbol %d/%d as '%s'", index, dict->n_symbols, filename);
#ifdef HAVE_LIBPNG
jbig2_image_write_png_file(dict->glyphs[index], filename);
#else
jbig2_image_write_pbm_file(dict->glyphs[index], filename);
#endif
}
}
#endif /* DUMP_SYMDICT */
 
/* return a new empty symbol dict */
Jbig2SymbolDict *
jbig2_sd_new(Jbig2Ctx *ctx, int n_symbols)
{
Jbig2SymbolDict *new = NULL;
 
new = (Jbig2SymbolDict *)jbig2_alloc(ctx->allocator,
sizeof(Jbig2SymbolDict));
if (new != NULL) {
new->glyphs = (Jbig2Image **)jbig2_alloc(ctx->allocator,
n_symbols*sizeof(Jbig2Image*));
new->n_symbols = n_symbols;
} else {
return NULL;
}
 
if (new->glyphs != NULL) {
memset(new->glyphs, 0, n_symbols*sizeof(Jbig2Image*));
} else {
jbig2_free(ctx->allocator, new);
return NULL;
}
 
return new;
}
 
/* release the memory associated with a symbol dict */
void
jbig2_sd_release(Jbig2Ctx *ctx, Jbig2SymbolDict *dict)
{
int i;
 
if (dict == NULL) return;
for (i = 0; i < dict->n_symbols; i++)
if (dict->glyphs[i]) jbig2_image_release(ctx, dict->glyphs[i]);
jbig2_free(ctx->allocator, dict->glyphs);
jbig2_free(ctx->allocator, dict);
}
 
/* get a particular glyph by index */
Jbig2Image *
jbig2_sd_glyph(Jbig2SymbolDict *dict, unsigned int id)
{
if (dict == NULL) return NULL;
return dict->glyphs[id];
}
 
/* count the number of dictionary segments referred to by the given segment */
int
jbig2_sd_count_referred(Jbig2Ctx *ctx, Jbig2Segment *segment)
{
int index;
Jbig2Segment *rsegment;
int n_dicts = 0;
 
for (index = 0; index < segment->referred_to_segment_count; index++) {
rsegment = jbig2_find_segment(ctx, segment->referred_to_segments[index]);
if (rsegment && ((rsegment->flags & 63) == 0)) n_dicts++;
}
 
return (n_dicts);
}
 
/* return an array of pointers to symbol dictionaries referred to by the given segment */
Jbig2SymbolDict **
jbig2_sd_list_referred(Jbig2Ctx *ctx, Jbig2Segment *segment)
{
int index;
Jbig2Segment *rsegment;
Jbig2SymbolDict **dicts;
int n_dicts = jbig2_sd_count_referred(ctx, segment);
int dindex = 0;
 
dicts = jbig2_alloc(ctx->allocator, sizeof(Jbig2SymbolDict *) * n_dicts);
for (index = 0; index < segment->referred_to_segment_count; index++) {
rsegment = jbig2_find_segment(ctx, segment->referred_to_segments[index]);
if (rsegment && ((rsegment->flags & 63) == 0)) {
/* add this referred to symbol dictionary */
dicts[dindex++] = (Jbig2SymbolDict *)rsegment->result;
}
}
 
if (dindex != n_dicts) {
/* should never happen */
jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"counted %d symbol dictionaries but build a list with %d.\n",
n_dicts, dindex);
}
 
return (dicts);
}
 
/* generate a new symbol dictionary by concatenating a list of
existing dictionaries */
Jbig2SymbolDict *
jbig2_sd_cat(Jbig2Ctx *ctx, int n_dicts, Jbig2SymbolDict **dicts)
{
int i,j,k, symbols;
Jbig2SymbolDict *new = NULL;
 
/* count the imported symbols and allocate a new array */
symbols = 0;
for(i = 0; i < n_dicts; i++)
symbols += dicts[i]->n_symbols;
 
/* fill a new array with cloned glyph pointers */
new = jbig2_sd_new(ctx, symbols);
if (new != NULL) {
k = 0;
for (i = 0; i < n_dicts; i++)
for (j = 0; j < dicts[i]->n_symbols; j++)
new->glyphs[k++] = jbig2_image_clone(ctx, dicts[i]->glyphs[j]);
}
 
return new;
}
 
 
/* Decoding routines */
 
/* 6.5 */
static Jbig2SymbolDict *
jbig2_decode_symbol_dict(Jbig2Ctx *ctx,
Jbig2Segment *segment,
const Jbig2SymbolDictParams *params,
const byte *data, size_t size,
Jbig2ArithCx *GB_stats,
Jbig2ArithCx *GR_stats)
{
Jbig2SymbolDict *SDNEWSYMS;
Jbig2SymbolDict *SDEXSYMS;
int32_t HCHEIGHT;
uint32_t NSYMSDECODED;
int32_t SYMWIDTH, TOTWIDTH;
uint32_t HCFIRSTSYM;
uint32_t *SDNEWSYMWIDTHS = NULL;
int SBSYMCODELEN = 0;
Jbig2WordStream *ws = NULL;
Jbig2HuffmanState *hs = NULL;
Jbig2HuffmanTable *SDHUFFRDX = NULL;
Jbig2ArithState *as = NULL;
Jbig2ArithIntCtx *IADH = NULL;
Jbig2ArithIntCtx *IADW = NULL;
Jbig2ArithIntCtx *IAEX = NULL;
Jbig2ArithIntCtx *IAAI = NULL;
Jbig2ArithIaidCtx *IAID = NULL;
Jbig2ArithIntCtx *IARDX = NULL;
Jbig2ArithIntCtx *IARDY = NULL;
int code = 0;
Jbig2SymbolDict **refagg_dicts;
int n_refagg_dicts = 1;
 
Jbig2TextRegionParams *tparams = NULL;
 
/* 6.5.5 (3) */
HCHEIGHT = 0;
NSYMSDECODED = 0;
 
ws = jbig2_word_stream_buf_new(ctx, data, size);
 
if (!params->SDHUFF) {
as = jbig2_arith_new(ctx, ws);
IADH = jbig2_arith_int_ctx_new(ctx);
IADW = jbig2_arith_int_ctx_new(ctx);
IAEX = jbig2_arith_int_ctx_new(ctx);
IAAI = jbig2_arith_int_ctx_new(ctx);
if (params->SDREFAGG) {
int tmp = params->SDINSYMS->n_symbols + params->SDNUMNEWSYMS;
for (SBSYMCODELEN = 0; (1 << SBSYMCODELEN) < tmp; SBSYMCODELEN++);
IAID = jbig2_arith_iaid_ctx_new(ctx, SBSYMCODELEN);
IARDX = jbig2_arith_int_ctx_new(ctx);
IARDY = jbig2_arith_int_ctx_new(ctx);
}
} else {
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
"huffman coded symbol dictionary");
hs = jbig2_huffman_new(ctx, ws);
SDHUFFRDX = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_O);
if (!params->SDREFAGG) {
SDNEWSYMWIDTHS = jbig2_alloc(ctx->allocator,
sizeof(*SDNEWSYMWIDTHS)*params->SDNUMNEWSYMS);
if (SDNEWSYMWIDTHS == NULL) {
jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"could not allocate storage for symbol widths");
return NULL;
}
}
}
 
SDNEWSYMS = jbig2_sd_new(ctx, params->SDNUMNEWSYMS);
 
/* 6.5.5 (4a) */
while (NSYMSDECODED < params->SDNUMNEWSYMS) {
int32_t HCDH, DW;
 
/* 6.5.6 */
if (params->SDHUFF) {
HCDH = jbig2_huffman_get(hs, params->SDHUFFDH, &code);
} else {
code = jbig2_arith_int_decode(IADH, as, &HCDH);
}
 
if (code != 0) {
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"error or OOB decoding height class delta (%d)\n", code);
}
 
/* 6.5.5 (4b) */
HCHEIGHT = HCHEIGHT + HCDH;
SYMWIDTH = 0;
TOTWIDTH = 0;
HCFIRSTSYM = NSYMSDECODED;
 
if (HCHEIGHT < 0) {
/* todo: mem cleanup */
code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"Invalid HCHEIGHT value");
return NULL;
}
#ifdef JBIG2_DEBUG
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
"HCHEIGHT = %d", HCHEIGHT);
#endif
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
"decoding height class %d with %d syms decoded", HCHEIGHT, NSYMSDECODED);
 
for (;;) {
/* check for broken symbol table */
if (NSYMSDECODED > params->SDNUMNEWSYMS)
{
/* todo: mem cleanup? */
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"No OOB signalling end of height class %d", HCHEIGHT);
break;
}
/* 6.5.7 */
if (params->SDHUFF) {
DW = jbig2_huffman_get(hs, params->SDHUFFDW, &code);
} else {
code = jbig2_arith_int_decode(IADW, as, &DW);
}
 
/* 6.5.5 (4c.i) */
if (code == 1) {
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
" OOB signals end of height class %d", HCHEIGHT);
break;
}
SYMWIDTH = SYMWIDTH + DW;
TOTWIDTH = TOTWIDTH + SYMWIDTH;
if (SYMWIDTH < 0) {
/* todo: mem cleanup */
code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"Invalid SYMWIDTH value (%d) at symbol %d", SYMWIDTH, NSYMSDECODED+1);
return NULL;
}
#ifdef JBIG2_DEBUG
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
"SYMWIDTH = %d TOTWIDTH = %d", SYMWIDTH, TOTWIDTH);
#endif
/* 6.5.5 (4c.ii) */
if (!params->SDHUFF || params->SDREFAGG) {
#ifdef JBIG2_DEBUG
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
"SDHUFF = %d; SDREFAGG = %d", params->SDHUFF, params->SDREFAGG);
#endif
/* 6.5.8 */
if (!params->SDREFAGG) {
Jbig2GenericRegionParams region_params;
int sdat_bytes;
Jbig2Image *image;
 
/* Table 16 */
region_params.MMR = 0;
region_params.GBTEMPLATE = params->SDTEMPLATE;
region_params.TPGDON = 0;
region_params.USESKIP = 0;
sdat_bytes = params->SDTEMPLATE == 0 ? 8 : 2;
memcpy(region_params.gbat, params->sdat, sdat_bytes);
 
image = jbig2_image_new(ctx, SYMWIDTH, HCHEIGHT);
 
code = jbig2_decode_generic_region(ctx, segment, &region_params,
as, image, GB_stats);
/* todo: handle errors */
 
SDNEWSYMS->glyphs[NSYMSDECODED] = image;
 
} else {
/* 6.5.8.2 refinement/aggregate symbol */
uint32_t REFAGGNINST;
 
if (params->SDHUFF) {
REFAGGNINST = jbig2_huffman_get(hs, params->SDHUFFAGGINST, &code);
} else {
code = jbig2_arith_int_decode(IAAI, as, (int32_t*)&REFAGGNINST);
}
if (code || (int32_t)REFAGGNINST <= 0) {
code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"invalid number of symbols or OOB in aggregate glyph");
return NULL;
}
 
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
"aggregate symbol coding (%d instances)", REFAGGNINST);
 
if (REFAGGNINST > 1) {
Jbig2Image *image;
int i;
 
if (tparams == NULL)
{
/* First time through, we need to initialise the */
/* various tables for Huffman or adaptive encoding */
/* as well as the text region parameters structure */
refagg_dicts = jbig2_alloc(ctx->allocator, sizeof(Jbig2SymbolDict *) * n_refagg_dicts);
if (refagg_dicts == NULL) {
code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"Out of memory allocating dictionary array");
return NULL;
}
refagg_dicts[0] = jbig2_sd_new(ctx, params->SDNUMINSYMS + params->SDNUMNEWSYMS);
if (refagg_dicts[0] == NULL) {
code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"Out of memory allocating symbol dictionary");
jbig2_free(ctx->allocator, refagg_dicts);
return NULL;
}
refagg_dicts[0]->n_symbols = params->SDNUMINSYMS + params->SDNUMNEWSYMS;
for (i=0;i < params->SDNUMINSYMS;i++)
{
refagg_dicts[0]->glyphs[i] = jbig2_image_clone(ctx, params->SDINSYMS->glyphs[i]);
}
 
tparams = jbig2_alloc(ctx->allocator, sizeof(Jbig2TextRegionParams));
if (tparams == NULL) {
code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"Out of memory creating text region params");
jbig2_sd_release(ctx, refagg_dicts[0]);
jbig2_free(ctx->allocator, refagg_dicts);
return NULL;
}
if (!params->SDHUFF) {
/* Values from Table 17, section 6.5.8.2 (2) */
tparams->IADT = jbig2_arith_int_ctx_new(ctx);
tparams->IAFS = jbig2_arith_int_ctx_new(ctx);
tparams->IADS = jbig2_arith_int_ctx_new(ctx);
tparams->IAIT = jbig2_arith_int_ctx_new(ctx);
/* Table 31 */
for (SBSYMCODELEN = 0; (1 << SBSYMCODELEN) <
(int)(params->SDNUMINSYMS + params->SDNUMNEWSYMS); SBSYMCODELEN++);
tparams->IAID = jbig2_arith_iaid_ctx_new(ctx, SBSYMCODELEN);
tparams->IARI = jbig2_arith_int_ctx_new(ctx);
tparams->IARDW = jbig2_arith_int_ctx_new(ctx);
tparams->IARDH = jbig2_arith_int_ctx_new(ctx);
tparams->IARDX = jbig2_arith_int_ctx_new(ctx);
tparams->IARDY = jbig2_arith_int_ctx_new(ctx);
} else {
tparams->SBHUFFFS = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_F); /* Table B.6 */
tparams->SBHUFFDS = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_H); /* Table B.8 */
tparams->SBHUFFDT = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_K); /* Table B.11 */
tparams->SBHUFFRDW = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_O); /* Table B.15 */
tparams->SBHUFFRDH = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_O); /* Table B.15 */
tparams->SBHUFFRDX = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_O); /* Table B.15 */
tparams->SBHUFFRDY = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_O); /* Table B.15 */
}
tparams->SBHUFF = params->SDHUFF;
tparams->SBREFINE = 1;
tparams->SBSTRIPS = 1;
tparams->SBDEFPIXEL = 0;
tparams->SBCOMBOP = JBIG2_COMPOSE_OR;
tparams->TRANSPOSED = 0;
tparams->REFCORNER = JBIG2_CORNER_TOPLEFT;
tparams->SBDSOFFSET = 0;
tparams->SBRTEMPLATE = params->SDRTEMPLATE;
}
tparams->SBNUMINSTANCES = REFAGGNINST;
 
image = jbig2_image_new(ctx, SYMWIDTH, HCHEIGHT);
if (image == NULL) {
code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"Out of memory creating symbol image");
jbig2_free(ctx->allocator, tparams);
jbig2_sd_release(ctx, refagg_dicts[0]);
jbig2_free(ctx->allocator, refagg_dicts);
return NULL;
}
 
/* multiple symbols are handled as a text region */
jbig2_decode_text_region(ctx, segment, tparams, (const Jbig2SymbolDict * const *)refagg_dicts,
n_refagg_dicts, image, data, size, GR_stats, as, (Jbig2WordStream *)NULL);
 
SDNEWSYMS->glyphs[NSYMSDECODED] = image;
refagg_dicts[0]->glyphs[params->SDNUMINSYMS + NSYMSDECODED] = jbig2_image_clone(ctx, SDNEWSYMS->glyphs[NSYMSDECODED]);
} else {
/* 6.5.8.2.2 */
/* bool SBHUFF = params->SDHUFF; */
Jbig2RefinementRegionParams rparams;
Jbig2Image *image;
uint32_t ID;
int32_t RDX, RDY;
int ninsyms = params->SDINSYMS->n_symbols;
 
if (params->SDHUFF) {
ID = jbig2_huffman_get_bits(hs, SBSYMCODELEN);
RDX = jbig2_huffman_get(hs, SDHUFFRDX, &code);
RDY = jbig2_huffman_get(hs, SDHUFFRDX, &code);
} else {
code = jbig2_arith_iaid_decode(IAID, as, (int32_t*)&ID);
code = jbig2_arith_int_decode(IARDX, as, &RDX);
code = jbig2_arith_int_decode(IARDY, as, &RDY);
}
 
if (ID >= ninsyms+NSYMSDECODED) {
code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"refinement references unknown symbol %d", ID);
return NULL;
}
 
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
"symbol is a refinement of id %d with the refinement applied at (%d,%d)",
ID, RDX, RDY);
 
image = jbig2_image_new(ctx, SYMWIDTH, HCHEIGHT);
 
/* Table 18 */
rparams.GRTEMPLATE = params->SDRTEMPLATE;
rparams.reference = (ID < ninsyms) ?
params->SDINSYMS->glyphs[ID] :
SDNEWSYMS->glyphs[ID-ninsyms];
rparams.DX = RDX;
rparams.DY = RDY;
rparams.TPGRON = 0;
memcpy(rparams.grat, params->sdrat, 4);
jbig2_decode_refinement_region(ctx, segment,
&rparams, as, image, GR_stats);
 
SDNEWSYMS->glyphs[NSYMSDECODED] = image;
 
}
}
 
#ifdef OUTPUT_PBM
{
char name[64];
FILE *out;
snprintf(name, 64, "sd.%04d.%04d.pbm",
segment->number, NSYMSDECODED);
out = fopen(name, "wb");
jbig2_image_write_pbm(SDNEWSYMS->glyphs[NSYMSDECODED], out);
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
"writing out glyph as '%s' ...", name);
fclose(out);
}
#endif
 
}
 
/* 6.5.5 (4c.iii) */
if (params->SDHUFF && !params->SDREFAGG) {
SDNEWSYMWIDTHS[NSYMSDECODED] = SYMWIDTH;
}
 
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
"decoded symbol %d of %d (%dx%d)",
NSYMSDECODED, params->SDNUMNEWSYMS,
SYMWIDTH, HCHEIGHT);
 
/* 6.5.5 (4c.iv) */
NSYMSDECODED = NSYMSDECODED + 1;
 
} /* end height class decode loop */
 
/* 6.5.5 (4d) */
if (params->SDHUFF && !params->SDREFAGG) {
/* 6.5.9 */
Jbig2Image *image;
int BMSIZE = jbig2_huffman_get(hs, params->SDHUFFBMSIZE, &code);
int j, x;
 
if (code || (BMSIZE < 0)) {
jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"error decoding size of collective bitmap!");
/* todo: memory cleanup */
return NULL;
}
 
/* skip any bits before the next byte boundary */
jbig2_huffman_skip(hs);
 
image = jbig2_image_new(ctx, TOTWIDTH, HCHEIGHT);
if (image == NULL) {
jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"could not allocate collective bitmap image!");
/* todo: memory cleanup */
return NULL;
}
 
if (BMSIZE == 0) {
/* if BMSIZE == 0 bitmap is uncompressed */
const byte *src = data + jbig2_huffman_offset(hs);
const int stride = (image->width >> 3) +
((image->width & 7) ? 1 : 0);
byte *dst = image->data;
 
BMSIZE = image->height * stride;
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
"reading %dx%d uncompressed bitmap"
" for %d symbols (%d bytes)",
image->width, image->height, NSYMSDECODED - HCFIRSTSYM, BMSIZE);
 
for (j = 0; j < image->height; j++) {
memcpy(dst, src, stride);
dst += image->stride;
src += stride;
}
} else {
Jbig2GenericRegionParams rparams;
 
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
"reading %dx%d collective bitmap for %d symbols (%d bytes)",
image->width, image->height, NSYMSDECODED - HCFIRSTSYM, BMSIZE);
 
rparams.MMR = 1;
code = jbig2_decode_generic_mmr(ctx, segment, &rparams,
data + jbig2_huffman_offset(hs), BMSIZE, image);
if (code) {
jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"error decoding MMR bitmap image!");
/* todo: memory cleanup */
return NULL;
}
}
 
/* advance past the data we've just read */
jbig2_huffman_advance(hs, BMSIZE);
 
/* copy the collective bitmap into the symbol dictionary */
x = 0;
for (j = HCFIRSTSYM; j < NSYMSDECODED; j++) {
Jbig2Image *glyph;
glyph = jbig2_image_new(ctx, SDNEWSYMWIDTHS[j], HCHEIGHT);
jbig2_image_compose(ctx, glyph, image,
-x, 0, JBIG2_COMPOSE_REPLACE);
x += SDNEWSYMWIDTHS[j];
SDNEWSYMS->glyphs[j] = glyph;
}
jbig2_image_release(ctx, image);
}
 
} /* end of symbol decode loop */
 
if (tparams != NULL)
{
if (!params->SDHUFF)
{
jbig2_arith_int_ctx_free(ctx, tparams->IADT);
jbig2_arith_int_ctx_free(ctx, tparams->IAFS);
jbig2_arith_int_ctx_free(ctx, tparams->IADS);
jbig2_arith_int_ctx_free(ctx, tparams->IAIT);
jbig2_arith_iaid_ctx_free(ctx, tparams->IAID);
jbig2_arith_int_ctx_free(ctx, tparams->IARI);
jbig2_arith_int_ctx_free(ctx, tparams->IARDW);
jbig2_arith_int_ctx_free(ctx, tparams->IARDH);
jbig2_arith_int_ctx_free(ctx, tparams->IARDX);
jbig2_arith_int_ctx_free(ctx, tparams->IARDY);
}
else
{
jbig2_release_huffman_table(ctx, tparams->SBHUFFFS);
jbig2_release_huffman_table(ctx, tparams->SBHUFFDS);
jbig2_release_huffman_table(ctx, tparams->SBHUFFDT);
jbig2_release_huffman_table(ctx, tparams->SBHUFFRDX);
jbig2_release_huffman_table(ctx, tparams->SBHUFFRDY);
jbig2_release_huffman_table(ctx, tparams->SBHUFFRDW);
jbig2_release_huffman_table(ctx, tparams->SBHUFFRDH);
}
jbig2_free(ctx->allocator, tparams);
tparams = NULL;
jbig2_sd_release(ctx, refagg_dicts[0]);
jbig2_free(ctx->allocator, refagg_dicts);
}
 
jbig2_free(ctx->allocator, GB_stats);
 
/* 6.5.10 */
SDEXSYMS = jbig2_sd_new(ctx, params->SDNUMEXSYMS);
{
int i = 0;
int j = 0;
int k, m, exflag = 0;
int32_t exrunlength;
 
if (params->SDINSYMS != NULL)
m = params->SDINSYMS->n_symbols;
else
m = 0;
while (j < params->SDNUMEXSYMS) {
if (params->SDHUFF)
/* FIXME: implement reading from huff table B.1 */
exrunlength = params->SDNUMEXSYMS;
else
code = jbig2_arith_int_decode(IAEX, as, &exrunlength);
if (exrunlength > params->SDNUMEXSYMS - j) {
jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"runlength too large in export symbol table (%d > %d - %d)\n",
exrunlength, params->SDNUMEXSYMS, j);
jbig2_sd_release(ctx, SDEXSYMS);
/* skip to the cleanup code and return SDEXSYMS = NULL */
SDEXSYMS = NULL;
break;
}
for(k = 0; k < exrunlength; k++)
if (exflag) {
SDEXSYMS->glyphs[j++] = (i < m) ?
jbig2_image_clone(ctx, params->SDINSYMS->glyphs[i]) :
jbig2_image_clone(ctx, SDNEWSYMS->glyphs[i-m]);
i++;
}
exflag = !exflag;
}
}
 
jbig2_sd_release(ctx, SDNEWSYMS);
 
if (!params->SDHUFF) {
jbig2_arith_int_ctx_free(ctx, IADH);
jbig2_arith_int_ctx_free(ctx, IADW);
jbig2_arith_int_ctx_free(ctx, IAEX);
jbig2_arith_int_ctx_free(ctx, IAAI);
if (params->SDREFAGG) {
jbig2_arith_iaid_ctx_free(ctx, IAID);
jbig2_arith_int_ctx_free(ctx, IARDX);
jbig2_arith_int_ctx_free(ctx, IARDY);
}
jbig2_free(ctx->allocator, as);
} else {
if (params->SDREFAGG) {
jbig2_free(ctx->allocator, SDNEWSYMWIDTHS);
}
jbig2_release_huffman_table(ctx, SDHUFFRDX);
jbig2_free(ctx->allocator, hs);
}
 
jbig2_word_stream_buf_free(ctx, ws);
 
return SDEXSYMS;
}
 
/* 7.4.2 */
int
jbig2_symbol_dictionary(Jbig2Ctx *ctx, Jbig2Segment *segment,
const byte *segment_data)
{
Jbig2SymbolDictParams params;
uint16_t flags;
int sdat_bytes;
int offset;
Jbig2ArithCx *GB_stats = NULL;
Jbig2ArithCx *GR_stats = NULL;
 
if (segment->data_length < 10)
goto too_short;
 
/* 7.4.2.1.1 */
flags = jbig2_get_int16(segment_data);
params.SDHUFF = flags & 1;
params.SDREFAGG = (flags >> 1) & 1;
params.SDTEMPLATE = (flags >> 10) & 3;
params.SDRTEMPLATE = (flags >> 12) & 1;
 
params.SDHUFFDH = NULL;
params.SDHUFFDW = NULL;
params.SDHUFFBMSIZE = NULL;
params.SDHUFFAGGINST = NULL;
 
if (params.SDHUFF) {
switch ((flags & 0x000c) >> 2) {
case 0: /* Table B.4 */
params.SDHUFFDH = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_D);
break;
case 1: /* Table B.5 */
params.SDHUFFDH = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_E);
break;
case 3: /* Custom table from referred segment */
/* We handle this case later by leaving the table as NULL */
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"symbol dictionary uses custom DH huffman table (NYI)");
case 2:
default:
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"symbol dictionary specified invalid huffman table");
break;
}
switch ((flags & 0x0030) >> 4) {
case 0: /* Table B.2 */
params.SDHUFFDW = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_B);
break;
case 1: /* Table B.3 */
params.SDHUFFDW = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_C);
break;
case 3: /* Custom table from referred segment */
/* We handle this case later by leaving the table as NULL */
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"symbol dictionary uses custom DW huffman table (NYI)");
case 2:
default:
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"symbol dictionary specified invalid huffman table");
break;
}
if (flags & 0x0040) {
/* Custom table from referred segment */
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"symbol dictionary uses custom BMSIZE huffman table (NYI)");
} else {
/* Table B.1 */
params.SDHUFFBMSIZE = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_A);
}
if (flags & 0x0080) {
/* Custom table from referred segment */
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"symbol dictionary uses custom REFAGG huffman table (NYI)");
} else {
/* Table B.1 */
params.SDHUFFAGGINST = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_A);
}
}
 
/* FIXME: there are quite a few of these conditions to check */
/* maybe #ifdef CONFORMANCE and a separate routine */
if (!params.SDHUFF) {
if (flags & 0x000c) {
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"SDHUFF is zero, but contrary to spec SDHUFFDH is not.");
}
if (flags & 0x0030) {
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"SDHUFF is zero, but contrary to spec SDHUFFDW is not.");
}
}
 
if (flags & 0x0080) {
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"bitmap coding context is used (NYI) symbol data likely to be garbage!");
}
 
/* 7.4.2.1.2 */
sdat_bytes = params.SDHUFF ? 0 : params.SDTEMPLATE == 0 ? 8 : 2;
memcpy(params.sdat, segment_data + 2, sdat_bytes);
offset = 2 + sdat_bytes;
 
/* 7.4.2.1.3 */
if (params.SDREFAGG && !params.SDRTEMPLATE) {
if (offset + 4 > segment->data_length)
goto too_short;
memcpy(params.sdrat, segment_data + offset, 4);
offset += 4;
} else {
/* sdrat is meaningless if SDRTEMPLATE is 1, but set a value
to avoid confusion if anybody looks */
memset(params.sdrat, 0, 4);
}
 
if (offset + 8 > segment->data_length)
goto too_short;
 
/* 7.4.2.1.4 */
params.SDNUMEXSYMS = jbig2_get_int32(segment_data + offset);
/* 7.4.2.1.5 */
params.SDNUMNEWSYMS = jbig2_get_int32(segment_data + offset + 4);
offset += 8;
 
jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,
"symbol dictionary, flags=%04x, %d exported syms, %d new syms",
flags, params.SDNUMEXSYMS, params.SDNUMNEWSYMS);
 
/* 7.4.2.2 (2) */
{
int n_dicts = jbig2_sd_count_referred(ctx, segment);
Jbig2SymbolDict **dicts = NULL;
 
params.SDINSYMS = NULL;
if (n_dicts > 0) {
dicts = jbig2_sd_list_referred(ctx, segment);
params.SDINSYMS = jbig2_sd_cat(ctx, n_dicts, dicts);
}
if (params.SDINSYMS != NULL) {
params.SDNUMINSYMS = params.SDINSYMS->n_symbols;
} else {
params.SDNUMINSYMS = 0;
}
}
 
/* 7.4.2.2 (4) */
if (!params.SDHUFF) {
int stats_size = params.SDTEMPLATE == 0 ? 65536 :
params.SDTEMPLATE == 1 ? 8192 : 1024;
GB_stats = jbig2_alloc(ctx->allocator, stats_size);
memset(GB_stats, 0, stats_size);
if (params.SDREFAGG) {
stats_size = params.SDRTEMPLATE ? 1 << 10 : 1 << 13;
GR_stats = jbig2_alloc(ctx->allocator, stats_size);
memset(GR_stats, 0, stats_size);
}
}
 
if (flags & 0x0100) {
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"segment marks bitmap coding context as retained (NYI)");
}
 
segment->result = (void *)jbig2_decode_symbol_dict(ctx, segment,
&params,
segment_data + offset,
segment->data_length - offset,
GB_stats, GR_stats);
#ifdef DUMP_SYMDICT
if (segment->result) jbig2_dump_symbol_dict(ctx, segment);
#endif
 
if (params.SDHUFF) {
jbig2_release_huffman_table(ctx, params.SDHUFFDH);
jbig2_release_huffman_table(ctx, params.SDHUFFDW);
jbig2_release_huffman_table(ctx, params.SDHUFFBMSIZE);
jbig2_release_huffman_table(ctx, params.SDHUFFAGGINST);
}
 
/* todo: retain or free GB_stats, GR_stats */
 
return (segment->result != NULL) ? 0 : -1;
 
too_short:
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"Segment too short");
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2_symbol_dict.h
0,0 → 1,56
/*
jbig2dec
 
Copyright (C) 2001-2002 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
/* symbol dictionary header */
 
/* the results of decoding a symbol dictionary */
typedef struct {
int n_symbols;
Jbig2Image **glyphs;
} Jbig2SymbolDict;
 
/* decode a symbol dictionary segment and store the results */
int
jbig2_symbol_dictionary(Jbig2Ctx *ctx, Jbig2Segment *segment,
const byte *segment_data);
 
/* get a particular glyph by index */
Jbig2Image *
jbig2_sd_glyph(Jbig2SymbolDict *dict, unsigned int id);
 
/* return a new empty symbol dict */
Jbig2SymbolDict *
jbig2_sd_new(Jbig2Ctx *ctx, int n_symbols);
 
/* release the memory associated with a symbol dict */
void
jbig2_sd_release(Jbig2Ctx *ctx, Jbig2SymbolDict *dict);
 
/* generate a new symbol dictionary by concatenating a list of
existing dictionaries */
Jbig2SymbolDict *
jbig2_sd_cat(Jbig2Ctx *ctx, int n_dicts,
Jbig2SymbolDict **dicts);
 
/* count the number of dictionary segments referred
to by the given segment */
int
jbig2_sd_count_referred(Jbig2Ctx *ctx, Jbig2Segment *segment);
 
/* return an array of pointers to symbol dictionaries referred
to by a segment */
Jbig2SymbolDict **
jbig2_sd_list_referred(Jbig2Ctx *ctx, Jbig2Segment *segment);
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2_text.c
0,0 → 1,787
/*
jbig2dec
 
Copyright (C) 2002-2008 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "os_types.h"
 
#include <stddef.h>
#include <string.h> /* memset() */
 
#include "jbig2.h"
#include "jbig2_priv.h"
#include "jbig2_arith.h"
#include "jbig2_arith_int.h"
#include "jbig2_arith_iaid.h"
#include "jbig2_huffman.h"
#include "jbig2_generic.h"
#include "jbig2_symbol_dict.h"
#include "jbig2_text.h"
 
 
/**
* jbig2_decode_text_region: decode a text region segment
*
* @ctx: jbig2 decoder context
* @segment: jbig2 segment (header) structure
* @params: parameters from the text region header
* @dicts: an array of referenced symbol dictionaries
* @n_dicts: the number of referenced symbol dictionaries
* @image: image structure in which to store the decoded region bitmap
* @data: pointer to text region data to be decoded
* @size: length of text region data
*
* Implements the text region decoding procedure
* described in section 6.4 of the JBIG2 spec.
*
* returns: 0 on success
**/
int
jbig2_decode_text_region(Jbig2Ctx *ctx, Jbig2Segment *segment,
const Jbig2TextRegionParams *params,
const Jbig2SymbolDict * const *dicts, const int n_dicts,
Jbig2Image *image,
const byte *data, const size_t size,
Jbig2ArithCx *GR_stats, Jbig2ArithState *as, Jbig2WordStream *ws)
{
/* relevent bits of 6.4.4 */
uint32_t NINSTANCES;
uint32_t ID;
int32_t STRIPT;
int32_t FIRSTS;
int32_t DT;
int32_t DFS;
int32_t IDS;
int32_t CURS;
int32_t CURT;
int S,T;
int x,y;
bool first_symbol;
uint32_t index, SBNUMSYMS;
Jbig2Image *IB;
Jbig2HuffmanState *hs = NULL;
Jbig2HuffmanTable *SBSYMCODES = NULL;
int code = 0;
int RI;
 
SBNUMSYMS = 0;
for (index = 0; index < n_dicts; index++) {
SBNUMSYMS += dicts[index]->n_symbols;
}
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
"symbol list contains %d glyphs in %d dictionaries", SBNUMSYMS, n_dicts);
 
if (params->SBHUFF) {
Jbig2HuffmanTable *runcodes;
Jbig2HuffmanParams runcodeparams;
Jbig2HuffmanLine runcodelengths[35];
Jbig2HuffmanLine *symcodelengths;
Jbig2HuffmanParams symcodeparams;
int code, err, len, range, r;
 
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
"huffman coded text region");
hs = jbig2_huffman_new(ctx, ws);
 
/* 7.4.3.1.7 - decode symbol ID Huffman table */
/* this is actually part of the segment header, but it is more
convenient to handle it here */
 
/* parse and build the runlength code huffman table */
for (index = 0; index < 35; index++) {
runcodelengths[index].PREFLEN = jbig2_huffman_get_bits(hs, 4);
runcodelengths[index].RANGELEN = 0;
runcodelengths[index].RANGELOW = index;
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
" read runcode%d length %d", index, runcodelengths[index].PREFLEN);
}
runcodeparams.HTOOB = 0;
runcodeparams.lines = runcodelengths;
runcodeparams.n_lines = 35;
runcodes = jbig2_build_huffman_table(ctx, &runcodeparams);
if (runcodes == NULL) {
jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"error constructing symbol id runcode table!");
return -1;
}
 
/* decode the symbol id codelengths using the runlength table */
symcodelengths = jbig2_alloc(ctx->allocator, SBNUMSYMS*sizeof(Jbig2HuffmanLine));
if (symcodelengths == NULL) {
jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"memory allocation failure reading symbol ID huffman table!");
return -1;
}
index = 0;
while (index < SBNUMSYMS) {
code = jbig2_huffman_get(hs, runcodes, &err);
if (err != 0 || code < 0 || code >= 35) {
jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"error reading symbol ID huffman table!");
return err ? err : -1;
}
 
if (code < 32) {
len = code;
range = 1;
} else {
if (code == 32) {
len = symcodelengths[index-1].PREFLEN;
if (index < 1) {
jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"error decoding symbol id table: run length with no antecedent!");
/* todo: memory cleanup */
return -1;
}
} else {
len = 0; /* code == 33 or 34 */
}
if (code == 32) range = jbig2_huffman_get_bits(hs, 2) + 3;
else if (code == 33) range = jbig2_huffman_get_bits(hs, 3) + 3;
else if (code == 34) range = jbig2_huffman_get_bits(hs, 7) + 11;
}
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
" read runcode%d at index %d (length %d range %d)", code, index, len, range);
if (index+range > SBNUMSYMS) {
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"runlength extends %d entries beyond the end of symbol id table!",
index+range - SBNUMSYMS);
range = SBNUMSYMS - index;
}
for (r = 0; r < range; r++) {
symcodelengths[index+r].PREFLEN = len;
symcodelengths[index+r].RANGELEN = 0;
symcodelengths[index+r].RANGELOW = index + r;
}
index += r;
}
 
if (index < SBNUMSYMS) {
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"runlength codes do not cover the available symbol set");
}
symcodeparams.HTOOB = 0;
symcodeparams.lines = symcodelengths;
symcodeparams.n_lines = SBNUMSYMS;
 
/* skip to byte boundary */
jbig2_huffman_skip(hs);
 
/* finally, construct the symbol id huffman table itself */
SBSYMCODES = jbig2_build_huffman_table(ctx, &symcodeparams);
 
jbig2_free(ctx->allocator, symcodelengths);
jbig2_release_huffman_table(ctx, runcodes);
 
if (SBSYMCODES == NULL) {
jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"could not construct Symbol ID huffman table!");
return -1;
}
}
 
/* 6.4.5 (1) */
jbig2_image_clear(ctx, image, params->SBDEFPIXEL);
 
/* 6.4.6 */
if (params->SBHUFF) {
STRIPT = jbig2_huffman_get(hs, params->SBHUFFDT, &code);
} else {
code = jbig2_arith_int_decode(params->IADT, as, &STRIPT);
}
 
/* 6.4.5 (2) */
STRIPT *= -(params->SBSTRIPS);
FIRSTS = 0;
NINSTANCES = 0;
 
/* 6.4.5 (3) */
while (NINSTANCES < params->SBNUMINSTANCES) {
/* (3b) */
if (params->SBHUFF) {
DT = jbig2_huffman_get(hs, params->SBHUFFDT, &code);
} else {
code = jbig2_arith_int_decode(params->IADT, as, &DT);
}
DT *= params->SBSTRIPS;
STRIPT += DT;
 
first_symbol = TRUE;
/* 6.4.5 (3c) - decode symbols in strip */
for (;;) {
/* (3c.i) */
if (first_symbol) {
/* 6.4.7 */
if (params->SBHUFF) {
DFS = jbig2_huffman_get(hs, params->SBHUFFFS, &code);
} else {
code = jbig2_arith_int_decode(params->IAFS, as, &DFS);
}
FIRSTS += DFS;
CURS = FIRSTS;
first_symbol = FALSE;
 
} else {
/* (3c.ii) / 6.4.8 */
if (params->SBHUFF) {
IDS = jbig2_huffman_get(hs, params->SBHUFFDS, &code);
} else {
code = jbig2_arith_int_decode(params->IADS, as, &IDS);
}
if (code) {
break;
}
CURS += IDS + params->SBDSOFFSET;
}
 
/* (3c.iii) / 6.4.9 */
if (params->SBSTRIPS == 1) {
CURT = 0;
} else if (params->SBHUFF) {
CURT = jbig2_huffman_get_bits(hs, params->LOGSBSTRIPS);
} else {
code = jbig2_arith_int_decode(params->IAIT, as, &CURT);
}
T = STRIPT + CURT;
 
/* (3b.iv) / 6.4.10 - decode the symbol id */
if (params->SBHUFF) {
ID = jbig2_huffman_get(hs, SBSYMCODES, &code);
} else {
code = jbig2_arith_iaid_decode(params->IAID, as, (int *)&ID);
}
if (ID >= SBNUMSYMS) {
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"symbol id out of range! (%d/%d)", ID, SBNUMSYMS);
}
 
/* (3c.v) / 6.4.11 - look up the symbol bitmap IB */
{
uint32_t id = ID;
 
index = 0;
while (id >= dicts[index]->n_symbols)
id -= dicts[index++]->n_symbols;
IB = jbig2_image_clone(ctx, dicts[index]->glyphs[id]);
}
if (params->SBREFINE) {
if (params->SBHUFF) {
RI = jbig2_huffman_get_bits(hs, 1);
} else {
code = jbig2_arith_int_decode(params->IARI, as, &RI);
}
} else {
RI = 0;
}
if (RI) {
Jbig2RefinementRegionParams rparams;
Jbig2Image *IBO;
int32_t RDW, RDH, RDX, RDY;
Jbig2Image *refimage;
int BMSIZE = 0;
 
/* 6.4.11 (1, 2, 3, 4) */
if (!params->SBHUFF) {
code = jbig2_arith_int_decode(params->IARDW, as, &RDW);
code = jbig2_arith_int_decode(params->IARDH, as, &RDH);
code = jbig2_arith_int_decode(params->IARDX, as, &RDX);
code = jbig2_arith_int_decode(params->IARDY, as, &RDY);
} else {
RDW = jbig2_huffman_get(hs, params->SBHUFFRDW, &code);
RDH = jbig2_huffman_get(hs, params->SBHUFFRDH, &code);
RDX = jbig2_huffman_get(hs, params->SBHUFFRDX, &code);
RDY = jbig2_huffman_get(hs, params->SBHUFFRDY, &code);
BMSIZE = jbig2_huffman_get(hs, params->SBHUFFRSIZE, &code);
jbig2_huffman_skip(hs);
}
 
/* 6.4.11 (6) */
IBO = IB;
refimage = jbig2_image_new(ctx, IBO->width + RDW,
IBO->height + RDH);
if (refimage == NULL) {
jbig2_image_release(ctx, IBO);
if (params->SBHUFF) {
jbig2_release_huffman_table(ctx, SBSYMCODES);
}
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL,
segment->number,
"couldn't allocate reference image");
}
 
/* Table 12 */
rparams.GRTEMPLATE = params->SBRTEMPLATE;
rparams.reference = IBO;
rparams.DX = (RDW >> 1) + RDX;
rparams.DY = (RDH >> 1) + RDY;
rparams.TPGRON = 0;
memcpy(rparams.grat, params->sbrat, 4);
jbig2_decode_refinement_region(ctx, segment,
&rparams, as, refimage, GR_stats);
IB = refimage;
 
jbig2_image_release(ctx, IBO);
 
/* 6.4.11 (7) */
if (params->SBHUFF) {
jbig2_huffman_advance(hs, BMSIZE);
}
 
}
 
/* (3c.vi) */
if ((!params->TRANSPOSED) && (params->REFCORNER > 1)) {
CURS += IB->width - 1;
} else if ((params->TRANSPOSED) && !(params->REFCORNER & 1)) {
CURS += IB->height - 1;
}
 
/* (3c.vii) */
S = CURS;
 
/* (3c.viii) */
if (!params->TRANSPOSED) {
switch (params->REFCORNER) {
case JBIG2_CORNER_TOPLEFT: x = S; y = T; break;
case JBIG2_CORNER_TOPRIGHT: x = S - IB->width + 1; y = T; break;
case JBIG2_CORNER_BOTTOMLEFT: x = S; y = T - IB->height + 1; break;
case JBIG2_CORNER_BOTTOMRIGHT: x = S - IB->width + 1; y = T - IB->height + 1; break;
}
} else { /* TRANSPOSED */
switch (params->REFCORNER) {
case JBIG2_CORNER_TOPLEFT: x = T; y = S; break;
case JBIG2_CORNER_TOPRIGHT: x = T - IB->width + 1; y = S; break;
case JBIG2_CORNER_BOTTOMLEFT: x = T; y = S - IB->height + 1; break;
case JBIG2_CORNER_BOTTOMRIGHT: x = T - IB->width + 1; y = S - IB->height + 1; break;
}
}
 
/* (3c.ix) */
#ifdef JBIG2_DEBUG
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
"composing glyph id %d: %dx%d @ (%d,%d) symbol %d/%d",
ID, IB->width, IB->height, x, y, NINSTANCES + 1,
params->SBNUMINSTANCES);
#endif
jbig2_image_compose(ctx, image, IB, x, y, params->SBCOMBOP);
 
/* (3c.x) */
if ((!params->TRANSPOSED) && (params->REFCORNER < 2)) {
CURS += IB->width -1 ;
} else if ((params->TRANSPOSED) && (params->REFCORNER & 1)) {
CURS += IB->height - 1;
}
 
/* (3c.xi) */
NINSTANCES++;
 
jbig2_image_release(ctx, IB);
}
/* end strip */
}
/* 6.4.5 (4) */
 
if (params->SBHUFF) {
jbig2_release_huffman_table(ctx, SBSYMCODES);
}
 
return 0;
}
 
/**
* jbig2_text_region: read a text region segment header
**/
int
jbig2_text_region(Jbig2Ctx *ctx, Jbig2Segment *segment, const byte *segment_data)
{
int offset = 0;
Jbig2RegionSegmentInfo region_info;
Jbig2TextRegionParams params;
Jbig2Image *image;
Jbig2SymbolDict **dicts;
int n_dicts;
uint16_t flags;
uint16_t huffman_flags = 0;
Jbig2ArithCx *GR_stats = NULL;
int code = 0;
Jbig2WordStream *ws = NULL;
Jbig2ArithState *as = NULL;
 
/* 7.4.1 */
if (segment->data_length < 17)
goto too_short;
jbig2_get_region_segment_info(&region_info, segment_data);
offset += 17;
 
/* 7.4.3.1.1 */
flags = jbig2_get_int16(segment_data + offset);
offset += 2;
 
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
"text region header flags 0x%04x", flags);
 
params.SBHUFF = flags & 0x0001;
params.SBREFINE = flags & 0x0002;
params.LOGSBSTRIPS = (flags & 0x000c) >> 2;
params.SBSTRIPS = 1 << params.LOGSBSTRIPS;
params.REFCORNER = (flags & 0x0030) >> 4;
params.TRANSPOSED = flags & 0x0040;
params.SBCOMBOP = (flags & 0x0180) >> 7;
params.SBDEFPIXEL = flags & 0x0200;
/* SBDSOFFSET is a signed 5 bit integer */
params.SBDSOFFSET = (flags & 0x7C00) >> 10;
if (params.SBDSOFFSET > 0x0f) params.SBDSOFFSET -= 0x20;
params.SBRTEMPLATE = flags & 0x8000;
 
if (params.SBDSOFFSET) {
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
"text region has SBDSOFFSET %d", params.SBDSOFFSET);
}
 
if (params.SBHUFF) /* Huffman coding */
{
/* 7.4.3.1.2 */
huffman_flags = jbig2_get_int16(segment_data + offset);
offset += 2;
 
if (huffman_flags & 0x8000)
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"reserved bit 15 of text region huffman flags is not zero");
}
else /* arithmetic coding */
{
/* 7.4.3.1.3 */
if ((params.SBREFINE) && !(params.SBRTEMPLATE))
{
params.sbrat[0] = segment_data[offset];
params.sbrat[1] = segment_data[offset + 1];
params.sbrat[2] = segment_data[offset + 2];
params.sbrat[3] = segment_data[offset + 3];
offset += 4;
} else {
/* zero these for the sake of later debug messages */
memset(params.sbrat, 0, sizeof(params.sbrat));
}
}
 
/* 7.4.3.1.4 */
params.SBNUMINSTANCES = jbig2_get_int32(segment_data + offset);
offset += 4;
 
if (params.SBHUFF) {
/* 7.4.3.1.5 - Symbol ID Huffman table */
/* ...this is handled in the segment body decoder */
 
/* 7.4.3.1.6 - Other Huffman table selection */
switch (huffman_flags & 0x0003) {
case 0: /* Table B.6 */
params.SBHUFFFS = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_F);
break;
case 1: /* Table B.7 */
params.SBHUFFFS = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_G);
break;
case 3: /* Custom table from referred segment */
/* We handle this case later by leaving the table as NULL */
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"text region uses custom FS huffman table (NYI)");
break;
case 2: /* invalid */
default:
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"text region specified invalid FS huffman table");
break;
}
switch ((huffman_flags & 0x000c) >> 2) {
case 0: /* Table B.8 */
params.SBHUFFDS = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_H);
break;
case 1: /* Table B.9 */
params.SBHUFFDS = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_I);
break;
case 2: /* Table B.10 */
params.SBHUFFDS = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_J);
break;
case 3: /* Custom table from referred segment */
/* We handle this case later by leaving the table as NULL */
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"text region uses custom DS huffman table (NYI)");
break;
}
switch ((huffman_flags & 0x0030) >> 4) {
case 0: /* Table B.11 */
params.SBHUFFDT = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_K);
break;
case 1: /* Table B.12 */
params.SBHUFFDT = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_L);
break;
case 2: /* Table B.13 */
params.SBHUFFDT = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_M);
break;
case 3: /* Custom table from referred segment */
/* We handle this case later by leaving the table as NULL */
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"text region uses custom DT huffman table (NYI)");
break;
}
switch ((huffman_flags & 0x00c0) >> 6) {
case 0: /* Table B.14 */
params.SBHUFFRDW = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_N);
break;
case 1: /* Table B.15 */
params.SBHUFFRDW = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_O);
break;
case 3: /* Custom table from referred segment */
/* We handle this case later by leaving the table as NULL */
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"text region uses custom RDW huffman table (NYI)");
break;
case 2: /* invalid */
default:
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"text region specified invalid RDW huffman table");
break;
}
switch ((huffman_flags & 0x0300) >> 8) {
case 0: /* Table B.14 */
params.SBHUFFRDH = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_N);
break;
case 1: /* Table B.15 */
params.SBHUFFRDH = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_O);
break;
case 3: /* Custom table from referred segment */
/* We handle this case later by leaving the table as NULL */
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"text region uses custom RDH huffman table (NYI)");
break;
case 2: /* invalid */
default:
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"text region specified invalid RDH huffman table");
break;
}
switch ((huffman_flags & 0x0c00) >> 10) {
case 0: /* Table B.14 */
params.SBHUFFRDX = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_N);
break;
case 1: /* Table B.15 */
params.SBHUFFRDX = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_O);
break;
case 3: /* Custom table from referred segment */
/* We handle this case later by leaving the table as NULL */
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"text region uses custom RDX huffman table (NYI)");
break;
case 2: /* invalid */
default:
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"text region specified invalid RDX huffman table");
break;
}
switch ((huffman_flags & 0x3000) >> 12) {
case 0: /* Table B.14 */
params.SBHUFFRDY = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_N);
break;
case 1: /* Table B.15 */
params.SBHUFFRDY = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_O);
break;
case 3: /* Custom table from referred segment */
/* We handle this case later by leaving the table as NULL */
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"text region uses custom RDY huffman table (NYI)");
break;
case 2: /* invalid */
default:
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"text region specified invalid RDY huffman table");
break;
}
switch ((huffman_flags & 0x4000) >> 14) {
case 0: /* Table B.1 */
params.SBHUFFRSIZE = jbig2_build_huffman_table(ctx,
&jbig2_huffman_params_A);
break;
case 1: /* Custom table from referred segment */
/* We handle this case later by leaving the table as NULL */
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"text region uses custom RSIZE huffman table (NYI)");
break;
}
 
if (huffman_flags & 0x8000) {
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"text region huffman flags bit 15 is set, contrary to spec");
}
 
/* 7.4.3.1.7 */
/* For convenience this is done in the body decoder routine */
}
 
jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,
"text region: %d x %d @ (%d,%d) %d symbols",
region_info.width, region_info.height,
region_info.x, region_info.y, params.SBNUMINSTANCES);
 
/* 7.4.3.2 (2) - compose the list of symbol dictionaries */
n_dicts = jbig2_sd_count_referred(ctx, segment);
if (n_dicts != 0) {
dicts = jbig2_sd_list_referred(ctx, segment);
} else {
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"text region refers to no symbol dictionaries!");
}
if (dicts == NULL) {
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"unable to retrive symbol dictionaries!"
" previous parsing error?");
} else {
int index;
if (dicts[0] == NULL) {
return jbig2_error(ctx, JBIG2_SEVERITY_WARNING,
segment->number,
"unable to find first referenced symbol dictionary!");
}
for (index = 1; index < n_dicts; index++)
if (dicts[index] == NULL) {
jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
"unable to find all referenced symbol dictionaries!");
n_dicts = index;
}
}
 
/* 7.4.3.2 (3) */
if (!params.SBHUFF && params.SBREFINE) {
int stats_size = params.SBRTEMPLATE ? 1 << 10 : 1 << 13;
GR_stats = jbig2_alloc(ctx->allocator, stats_size);
memset(GR_stats, 0, stats_size);
}
 
image = jbig2_image_new(ctx, region_info.width, region_info.height);
if (image == NULL) {
if (!params.SBHUFF && params.SBREFINE) {
jbig2_free(ctx->allocator, GR_stats);
} else if (params.SBHUFF) {
jbig2_release_huffman_table(ctx, params.SBHUFFFS);
jbig2_release_huffman_table(ctx, params.SBHUFFDS);
jbig2_release_huffman_table(ctx, params.SBHUFFDT);
jbig2_release_huffman_table(ctx, params.SBHUFFRDX);
jbig2_release_huffman_table(ctx, params.SBHUFFRDY);
jbig2_release_huffman_table(ctx, params.SBHUFFRDW);
jbig2_release_huffman_table(ctx, params.SBHUFFRDH);
jbig2_release_huffman_table(ctx, params.SBHUFFRSIZE);
}
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"couldn't allocate text region image");
}
 
ws = jbig2_word_stream_buf_new(ctx, segment_data + offset, segment->data_length - offset);
if (!params.SBHUFF) {
int SBSYMCODELEN, index;
int SBNUMSYMS = 0;
for (index = 0; index < n_dicts; index++) {
SBNUMSYMS += dicts[index]->n_symbols;
}
 
as = jbig2_arith_new(ctx, ws);
ws = 0;
 
params.IADT = jbig2_arith_int_ctx_new(ctx);
params.IAFS = jbig2_arith_int_ctx_new(ctx);
params.IADS = jbig2_arith_int_ctx_new(ctx);
params.IAIT = jbig2_arith_int_ctx_new(ctx);
/* Table 31 */
for (SBSYMCODELEN = 0; (1 << SBSYMCODELEN) < SBNUMSYMS; SBSYMCODELEN++);
params.IAID = jbig2_arith_iaid_ctx_new(ctx, SBSYMCODELEN);
params.IARI = jbig2_arith_int_ctx_new(ctx);
params.IARDW = jbig2_arith_int_ctx_new(ctx);
params.IARDH = jbig2_arith_int_ctx_new(ctx);
params.IARDX = jbig2_arith_int_ctx_new(ctx);
params.IARDY = jbig2_arith_int_ctx_new(ctx);
}
 
code = jbig2_decode_text_region(ctx, segment, &params,
(const Jbig2SymbolDict * const *)dicts, n_dicts, image,
segment_data + offset, segment->data_length - offset,
GR_stats, as, ws);
 
if (!params.SBHUFF && params.SBREFINE) {
jbig2_free(ctx->allocator, GR_stats);
}
 
if (params.SBHUFF) {
jbig2_release_huffman_table(ctx, params.SBHUFFFS);
jbig2_release_huffman_table(ctx, params.SBHUFFDS);
jbig2_release_huffman_table(ctx, params.SBHUFFDT);
jbig2_release_huffman_table(ctx, params.SBHUFFRDX);
jbig2_release_huffman_table(ctx, params.SBHUFFRDY);
jbig2_release_huffman_table(ctx, params.SBHUFFRDW);
jbig2_release_huffman_table(ctx, params.SBHUFFRDH);
jbig2_release_huffman_table(ctx, params.SBHUFFRSIZE);
}
else {
jbig2_arith_int_ctx_free(ctx, params.IADT);
jbig2_arith_int_ctx_free(ctx, params.IAFS);
jbig2_arith_int_ctx_free(ctx, params.IADS);
jbig2_arith_int_ctx_free(ctx, params.IAIT);
jbig2_arith_iaid_ctx_free(ctx, params.IAID);
jbig2_arith_int_ctx_free(ctx, params.IARI);
jbig2_arith_int_ctx_free(ctx, params.IARDW);
jbig2_arith_int_ctx_free(ctx, params.IARDH);
jbig2_arith_int_ctx_free(ctx, params.IARDX);
jbig2_arith_int_ctx_free(ctx, params.IARDY);
jbig2_free(ctx->allocator, as);
jbig2_word_stream_buf_free(ctx, ws);
}
 
jbig2_free(ctx->allocator, dicts);
 
/* todo: check errors */
 
if ((segment->flags & 63) == 4) {
/* we have an intermediate region here. save it for later */
segment->result = image;
} else {
/* otherwise composite onto the page */
jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
"composing %dx%d decoded text region onto page at (%d, %d)",
region_info.width, region_info.height, region_info.x, region_info.y);
jbig2_page_add_result(ctx, &ctx->pages[ctx->current_page], image,
region_info.x, region_info.y, region_info.op);
jbig2_image_release(ctx, image);
}
 
/* success */
return 0;
 
too_short:
return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
"Segment too short");
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2_text.h
0,0 → 1,73
/*
jbig2dec
 
Copyright (C) 2002-2004 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
/**
* Headers for Text region handling
**/
 
typedef enum {
JBIG2_CORNER_BOTTOMLEFT = 0,
JBIG2_CORNER_TOPLEFT = 1,
JBIG2_CORNER_BOTTOMRIGHT = 2,
JBIG2_CORNER_TOPRIGHT = 3
} Jbig2RefCorner;
 
typedef struct {
bool SBHUFF;
bool SBREFINE;
bool SBDEFPIXEL;
Jbig2ComposeOp SBCOMBOP;
bool TRANSPOSED;
Jbig2RefCorner REFCORNER;
int SBDSOFFSET;
/* int SBW; */
/* int SBH; */
uint32_t SBNUMINSTANCES;
int LOGSBSTRIPS;
int SBSTRIPS;
/* int SBNUMSYMS; */
/* SBSYMCODES */
/* SBSYMCODELEN */
/* SBSYMS */
Jbig2HuffmanTable *SBHUFFFS;
Jbig2HuffmanTable *SBHUFFDS;
Jbig2HuffmanTable *SBHUFFDT;
Jbig2HuffmanTable *SBHUFFRDW;
Jbig2HuffmanTable *SBHUFFRDH;
Jbig2HuffmanTable *SBHUFFRDX;
Jbig2HuffmanTable *SBHUFFRDY;
Jbig2HuffmanTable *SBHUFFRSIZE;
Jbig2ArithIntCtx *IADT;
Jbig2ArithIntCtx *IAFS;
Jbig2ArithIntCtx *IADS;
Jbig2ArithIntCtx *IAIT;
Jbig2ArithIaidCtx *IAID;
Jbig2ArithIntCtx *IARI;
Jbig2ArithIntCtx *IARDW;
Jbig2ArithIntCtx *IARDH;
Jbig2ArithIntCtx *IARDX;
Jbig2ArithIntCtx *IARDY;
bool SBRTEMPLATE;
int8_t sbrat[4];
} Jbig2TextRegionParams;
 
int
jbig2_decode_text_region(Jbig2Ctx *ctx, Jbig2Segment *segment,
const Jbig2TextRegionParams *params,
const Jbig2SymbolDict * const *dicts, const int n_dicts,
Jbig2Image *image,
const byte *data, const size_t size,
Jbig2ArithCx *GR_stats,
Jbig2ArithState *as, Jbig2WordStream *ws);
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/jbig2dec.c
0,0 → 1,513
/*
jbig2dec
 
Copyright (C) 2001-2009 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
 
#ifndef PACKAGE
#define PACKAGE "jbig2dec"
#endif
#ifndef VERSION
#define VERSION "unknown-version"
#endif
 
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
 
#ifdef HAVE_GETOPT_H
# include <getopt.h>
#else
# include "getopt.h"
#endif
 
#include "os_types.h"
#include "sha1.h"
 
#include "jbig2.h"
#include "jbig2_image.h"
 
typedef enum {
usage,dump,render
} jbig2dec_mode;
 
typedef enum {
jbig2dec_format_jbig2,
jbig2dec_format_pbm,
jbig2dec_format_png,
jbig2dec_format_none
} jbig2dec_format;
 
typedef struct {
jbig2dec_mode mode;
int verbose, hash;
SHA1_CTX *hash_ctx;
char *output_file;
jbig2dec_format output_format;
} jbig2dec_params_t;
 
static int print_version(void);
static int print_usage(void);
 
/* page hashing functions */
static void
hash_init(jbig2dec_params_t *params)
{
params->hash_ctx = malloc(sizeof(SHA1_CTX));
if (params->hash_ctx == NULL) {
fprintf(stderr, "unable to allocate hash state\n");
params->hash = 0;
return;
} else {
SHA1_Init(params->hash_ctx);
}
}
 
static void
hash_image(jbig2dec_params_t *params, Jbig2Image *image)
{
unsigned int N = image->stride * image->height;
SHA1_Update(params->hash_ctx, image->data, N);
}
 
static void
hash_print(jbig2dec_params_t *params, FILE *out)
{
unsigned char md[SHA1_DIGEST_SIZE];
char digest[2*SHA1_DIGEST_SIZE + 1];
int i;
 
SHA1_Final(params->hash_ctx, md);
for (i = 0; i < SHA1_DIGEST_SIZE; i++) {
snprintf(&(digest[2*i]), 3, "%02x", md[i]);
}
fprintf(out, "%s", digest);
}
 
static void
hash_free(jbig2dec_params_t *params)
{
free(params->hash_ctx);
params->hash_ctx = NULL;
}
 
static int
set_output_format(jbig2dec_params_t *params, const char *format)
{
#ifdef HAVE_LIBPNG
/* this should really by strncasecmp()
TODO: we need to provide our own for portability */
if (!strncmp(format, "png", 3) || !strncmp(format, "PNG", 3)) {
params->output_format=jbig2dec_format_png;
return 0;
}
#endif
/* default to pbm */
params->output_format=jbig2dec_format_pbm;
 
return 0;
}
 
static int
parse_options(int argc, char *argv[], jbig2dec_params_t *params)
{
static struct option long_options[] = {
{"version", 0, NULL, 'V'},
{"help", 0, NULL, 'h'},
{"quiet", 0, NULL, 'q'},
{"verbose", 2, NULL, 'v'},
{"dump", 0, NULL, 'd'},
{"hash", 0, NULL, 'm'},
{"output", 1, NULL, 'o'},
{"format", 1, NULL, 't'},
{NULL, 0, NULL, 0}
};
int option_idx = 1;
int option;
 
while (1) {
option = getopt_long(argc, argv,
"Vh?qvdo:t:", long_options, &option_idx);
if (option == -1) break;
 
switch (option) {
case 0: /* unknown long option */
if (!params->verbose) fprintf(stdout,
"unrecognized option: --%s\n",
long_options[option_idx].name);
break;
case 'q':
params->verbose = 0;
break;
case 'v':
if (optarg) params->verbose = atoi(optarg);
else params->verbose = 2;
break;
case 'h':
case '?':
params->mode = usage;
break;
case 'V':
/* the GNU Coding Standards suggest --version
should override all other options */
print_version();
exit(0);
break;
case 'd':
params->mode=dump;
break;
case 'm':
params->hash = 1;
break;
case 'o':
params->output_file = strdup(optarg);
break;
case 't':
set_output_format(params, optarg);
break;
default:
if (!params->verbose) fprintf(stdout,
"unrecognized option: -%c\n", option);
break;
}
}
return (optind);
}
 
static int
print_version (void)
{
fprintf(stdout, "%s %s\n", PACKAGE, VERSION);
return 0;
}
 
static int
print_usage (void)
{
fprintf(stderr,
"Usage: jbig2dec [options] <file.jbig2>\n"
" or jbig2dec [options] <global_stream> <page_stream>\n"
"\n"
" When invoked with a single file, it attempts to parse it as\n"
" a normal jbig2 file. Invoked with two files, it treats the\n"
" first as the global segments, and the second as the segment\n"
" stream for a particular page. This is useful for examining\n"
" embedded streams.\n"
"\n"
" available options:\n"
" -h --help this usage summary\n"
" -q --quiet suppress diagnostic output\n"
" -v --verbose set the verbosity level\n"
" -d --dump print the structure of the jbig2 file\n"
" rather than explicitly decoding\n"
" --version program name and version information\n"
" --hash print a hash of the decoded document\n"
" -o <file> send decoded output to <file>\n"
" Defaults to the the input with a different\n"
" extension. Pass '-' for stdout.\n"
" -t <type> force a particular output file format\n"
#ifdef HAVE_LIBPNG
" supported options are 'png' and 'pbm'\n"
#else
" the only supported option is 'pbm'\n"
#endif
"\n"
);
 
return 1;
}
 
static int
error_callback(void *error_callback_data, const char *buf, Jbig2Severity severity,
int32_t seg_idx)
{
const jbig2dec_params_t *params = error_callback_data;
char *type;
char segment[22];
 
switch (severity) {
case JBIG2_SEVERITY_DEBUG:
if (params->verbose < 3) return 0;
type = "DEBUG"; break;;
case JBIG2_SEVERITY_INFO:
if (params->verbose < 2) return 0;
type = "info"; break;;
case JBIG2_SEVERITY_WARNING:
if (params->verbose < 1) return 0;
type = "WARNING"; break;;
case JBIG2_SEVERITY_FATAL: type = "FATAL ERROR"; break;;
default: type = "unknown message"; break;;
}
if (seg_idx == -1) segment[0] = '\0';
else snprintf(segment, sizeof(segment), "(segment 0x%02x)", seg_idx);
 
fprintf(stderr, "jbig2dec %s %s %s\n", type, buf, segment);
 
return 0;
}
 
static char *
make_output_filename(const char *input_filename, const char *extension)
{
char *output_filename;
const char *c, *e;
int len;
 
if (extension == NULL) {
fprintf(stderr, "make_output_filename called with no extension!\n");
exit (1);
}
 
if (input_filename == NULL)
c = "out";
else {
/* strip any leading path */
c = strrchr(input_filename, '/'); /* *nix */
if (c == NULL)
c = strrchr(input_filename, '\\'); /* win32/dos */
if (c != NULL)
c++; /* skip the path separator */
else
c = input_filename; /* no leading path */
}
 
/* make sure we haven't just stripped the last character */
if (*c == '\0')
c = "out";
 
/* strip the extension */
len = strlen(c);
e = strrchr(c, '.');
if (e != NULL)
len -= strlen(e);
 
/* allocate enough space for the base + ext */
output_filename = malloc(len + strlen(extension) + 1);
if (output_filename == NULL) {
fprintf(stderr, "couldn't allocate memory for output_filename\n");
exit (1);
}
 
strncpy(output_filename, c, len);
strncpy(output_filename + len, extension, strlen(extension));
*(output_filename + len + strlen(extension)) = '\0';
 
/* return the new string */
return (output_filename);
}
 
static int
write_page_image(jbig2dec_params_t *params, Jbig2Image *image)
{
if (!strncmp(params->output_file, "-", 2))
{
switch (params->output_format) {
#ifdef HAVE_LIBPNG
case jbig2dec_format_png:
jbig2_image_write_png(image, stdout);
break;
#endif
case jbig2dec_format_pbm:
jbig2_image_write_pbm(image, stdout);
break;
default:
fprintf(stderr, "unsupported output format.\n");
return 1;
}
}
else
{
if (params->verbose > 1)
fprintf(stderr, "saving decoded page as '%s'\n", params->output_file);
switch (params->output_format) {
#ifdef HAVE_LIBPNG
case jbig2dec_format_png:
jbig2_image_write_png_file(image, params->output_file);
break;
#endif
case jbig2dec_format_pbm:
jbig2_image_write_pbm_file(image, params->output_file);
break;
default:
fprintf(stderr, "unsupported output format.\n");
return 1;
}
}
 
return 0;
}
 
static int
write_document_hash(jbig2dec_params_t *params)
{
FILE *out;
 
if (!strncmp(params->output_file, "-", 2)) {
out = stderr;
} else {
out = stdout;
}
 
fprintf(out, "Hash of decoded document: ");
hash_print(params, out);
fprintf(out, "\n");
 
return 0;
}
 
int
main (int argc, char **argv)
{
FILE *f = NULL, *f_page = NULL;
Jbig2Ctx *ctx;
uint8_t buf[4096];
jbig2dec_params_t params;
int filearg;
 
/* set defaults */
params.mode = render;
params.verbose = 1;
params.hash = 0;
params.output_file = NULL;
params.output_format = jbig2dec_format_none;
 
filearg = parse_options(argc, argv, &params);
 
if (params.hash) hash_init(&params);
 
switch (params.mode) {
case usage:
print_usage();
exit (0);
break;
case dump:
fprintf(stderr, "Sorry, segment dump not yet implemented\n");
break;
case render:
 
if ((argc - filearg) == 1)
/* only one argument--open as a jbig2 file */
{
char *fn = argv[filearg];
 
f = fopen(fn, "rb");
if (f == NULL)
{
fprintf(stderr, "error opening %s\n", fn);
return 1;
}
}
else if ((argc - filearg) == 2)
/* two arguments open as separate global and page streams */
{
char *fn = argv[filearg];
char *fn_page = argv[filearg+1];
 
f = fopen(fn, "rb");
if (f == NULL)
{
fprintf(stderr, "error opening %s\n", fn);
return 1;
}
 
f_page = fopen(fn_page, "rb");
if (f_page == NULL)
{
fprintf(stderr, "error opening %s\n", fn_page);
return 1;
}
}
else
/* any other number of arguments */
return print_usage();
 
ctx = jbig2_ctx_new(NULL, f_page != NULL ? JBIG2_OPTIONS_EMBEDDED : 0,
NULL,
error_callback, &params);
 
/* pull the whole file/global stream into memory */
for (;;)
{
int n_bytes = fread(buf, 1, sizeof(buf), f);
if (n_bytes <= 0)
break;
if (jbig2_data_in(ctx, buf, n_bytes))
break;
}
fclose(f);
 
/* if there's a local page stream read that in its entirety */
if (f_page != NULL)
{
Jbig2GlobalCtx *global_ctx = jbig2_make_global_ctx(ctx);
ctx = jbig2_ctx_new(NULL, JBIG2_OPTIONS_EMBEDDED, global_ctx,
error_callback, &params);
for (;;)
{
int n_bytes = fread(buf, 1, sizeof(buf), f_page);
if (n_bytes <= 0)
break;
if (jbig2_data_in(ctx, buf, n_bytes))
break;
}
fclose(f_page);
jbig2_global_ctx_free(global_ctx);
}
 
/* retrieve and output the returned pages */
{
Jbig2Image *image;
 
/* work around broken CVision embedded streams */
if (f_page != NULL)
jbig2_complete_page(ctx);
 
if (params.output_file == NULL)
{
#ifdef HAVE_LIBPNG
params.output_file = make_output_filename(argv[filearg], ".png");
params.output_format = jbig2dec_format_png;
#else
params.output_file = make_output_filename(argv[filearg], ".pbm");
params.output_format = jbig2dec_format_pbm;
#endif
} else {
int len = strlen(params.output_file);
if ((len >= 3) && (params.output_format == jbig2dec_format_none))
/* try to set the output type by the given extension */
set_output_format(&params, params.output_file + len - 3);
}
 
/* retrieve and write out all the completed pages */
while ((image = jbig2_page_out(ctx)) != NULL) {
write_page_image(&params, image);
if (params.hash) hash_image(&params, image);
jbig2_release_page(ctx, image);
}
if (params.hash) write_document_hash(&params);
}
 
jbig2_ctx_free(ctx);
 
} /* end params.mode switch */
 
if (params.output_file) free(params.output_file);
if (params.hash) hash_free(&params);
 
/* fin */
return 0;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/memcmp.c
0,0 → 1,49
/*
jbig2dec
 
Copyright (C) 2001-2005 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
 
#include <stddef.h>
 
/* replacement for broken memcmp() */
 
/*
* compares two byte strings 'a' and 'b', both assumed to be 'len' bytes long
* returns zero if the two strings are identical, otherwise returns -1 or 1
* depending on the relative magnitude of the first differing elements,
* considered as unsigned chars
*/
 
int memcmp(const void *b1, const void *b2, size_t len)
{
unsigned char *a, *b;
size_t i;
 
a = (unsigned char *)b1;
b = (unsigned char *)b2;
for(i = 0; i < len; i++) {
if (*a != *b) {
/* strings differ */
return (*a < *b) ? -1 : 1;
}
a++;
b++;
}
 
/* strings match */
return 0;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/os_types.h
0,0 → 1,51
/*
jbig2dec
 
Copyright (C) 2003 Artifex Software, Inc.
 
This software is distributed under license and may not
be copied, modified or distributed except as expressly
authorized under the terms of the license contained in
the file LICENSE in this distribution.
 
For further licensing information refer to http://artifex.com/ or
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
 
/*
indirection layer for build and platform-specific definitions
 
in general, this header should ensure that the stdint types are
available, and that any optional compile flags are defined if
the build system doesn't pass them directly.
*/
 
#ifndef _JBIG2_OS_TYPES_H
#define _JBIG2_OS_TYPES_H
 
#if defined(__CYGWIN__) && !defined(HAVE_STDINT_H)
# include <sys/types.h>
# if defined(OLD_CYGWIN_SYS_TYPES)
/*
* Old versions of Cygwin have no stdint.h but define "MS types". Some of
* them conflict with a standard type emulation provided by config_types.h
* so we do a fixup here.
*/
typedef u_int8_t uint8_t;
typedef u_int16_t uint16_t;
typedef u_int32_t uint32_t;
#endif
#elif defined(HAVE_CONFIG_H)
# include "config_types.h"
#elif defined(_WIN32) || defined(__WIN32__)
# include "config_win32.h"
#endif
 
#if defined(HAVE_STDINT_H) || defined(__MACOS__)
# include <stdint.h>
#elif defined(__VMS)
# include <inttypes.h>
#endif
 
#endif /* _JBIG2_OS_TYPES_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/sha1.c
0,0 → 1,375
/*
SHA-1 in C
By Steve Reid <sreid@sea-to-sky.net>
100% Public Domain
 
-----------------
Modified 7/98
By James H. Brown <jbrown@burgoyne.com>
Still 100% Public Domain
 
Corrected a problem which generated improper hash values on 16 bit machines
Routine SHA1Update changed from
void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int
len)
to
void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned
long len)
 
The 'len' parameter was declared an int which works fine on 32 bit machines.
However, on 16 bit machines an int is too small for the shifts being done
against
it. This caused the hash function to generate incorrect values if len was
greater than 8191 (8K - 1) due to the 'len << 3' on line 3 of SHA1Update().
 
Since the file IO in main() reads 16K at a time, any file 8K or larger would
be guaranteed to generate the wrong hash (e.g. Test Vector #3, a million
"a"s).
 
I also changed the declaration of variables i & j in SHA1Update to
unsigned long from unsigned int for the same reason.
 
These changes should make no difference to any 32 bit implementations since
an
int and a long are the same size in those environments.
 
--
I also corrected a few compiler warnings generated by Borland C.
1. Added #include <process.h> for exit() prototype
2. Removed unused variable 'j' in SHA1Final
3. Changed exit(0) to return(0) at end of main.
 
ALL changes I made can be located by searching for comments containing 'JHB'
-----------------
Modified 8/98
By Steve Reid <sreid@sea-to-sky.net>
Still 100% public domain
 
1- Removed #include <process.h> and used return() instead of exit()
2- Fixed overwriting of finalcount in SHA1Final() (discovered by Chris Hall)
3- Changed email address from steve@edmweb.com to sreid@sea-to-sky.net
 
-----------------
Modified 4/01
By Saul Kravitz <Saul.Kravitz@celera.com>
Still 100% PD
Modified to run on Compaq Alpha hardware.
 
-----------------
Modified 07/2002
By Ralph Giles <giles@ghostscript.com>
Still 100% public domain
modified for use with stdint types, autoconf
code cleanup, removed attribution comments
switched SHA1Final() argument order for consistency
use SHA1_ prefix for public api
move public api to sha1.h
*/
 
/*
Test Vectors (from FIPS PUB 180-1)
"abc"
A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D
"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1
A million repetitions of "a"
34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F
*/
 
/* #define SHA1HANDSOFF */
 
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
 
#include <stdio.h>
#include <string.h>
 
#include "os_types.h"
#include "sha1.h"
 
void SHA1_Transform(uint32_t state[5], const uint8_t buffer[64]);
 
#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
 
/* blk0() and blk() perform the initial expand. */
/* I got the idea of expanding during the round function from SSLeay */
/* FIXME: can we do this in an endian-proof way? */
#ifdef WORDS_BIGENDIAN
#define blk0(i) block->l[i]
#else
#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \
|(rol(block->l[i],8)&0x00FF00FF))
#endif
#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \
^block->l[(i+2)&15]^block->l[i&15],1))
 
/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */
#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30);
#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30);
#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30);
#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30);
#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30);
 
 
#ifdef VERBOSE /* SAK */
void SHAPrintContext(SHA1_CTX *context, char *msg){
printf("%s (%d,%d) %x %x %x %x %x\n",
msg,
context->count[0], context->count[1],
context->state[0],
context->state[1],
context->state[2],
context->state[3],
context->state[4]);
}
#endif /* VERBOSE */
 
/* Hash a single 512-bit block. This is the core of the algorithm. */
void SHA1_Transform(uint32_t state[5], const uint8_t buffer[64])
{
uint32_t a, b, c, d, e;
typedef union {
uint8_t c[64];
uint32_t l[16];
} CHAR64LONG16;
CHAR64LONG16* block;
 
#ifdef SHA1HANDSOFF
static uint8_t workspace[64];
block = (CHAR64LONG16*)workspace;
memcpy(block, buffer, 64);
#else
block = (CHAR64LONG16*)buffer;
#endif
 
/* Copy context->state[] to working vars */
a = state[0];
b = state[1];
c = state[2];
d = state[3];
e = state[4];
 
/* 4 rounds of 20 operations each. Loop unrolled. */
R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);
R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);
R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);
R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);
R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);
R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);
R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);
R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);
R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);
R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);
R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);
R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);
R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);
R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);
R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);
R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);
R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);
R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);
R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);
R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);
 
/* Add the working vars back into context.state[] */
state[0] += a;
state[1] += b;
state[2] += c;
state[3] += d;
state[4] += e;
 
/* Wipe variables */
a = b = c = d = e = 0;
}
 
 
/* SHA1Init - Initialize new context */
void SHA1_Init(SHA1_CTX* context)
{
/* SHA1 initialization constants */
context->state[0] = 0x67452301;
context->state[1] = 0xEFCDAB89;
context->state[2] = 0x98BADCFE;
context->state[3] = 0x10325476;
context->state[4] = 0xC3D2E1F0;
context->count[0] = context->count[1] = 0;
}
 
 
/* Run your data through this. */
void SHA1_Update(SHA1_CTX* context, const uint8_t* data, const size_t len)
{
size_t i, j;
 
#ifdef VERBOSE
SHAPrintContext(context, "before");
#endif
 
j = (context->count[0] >> 3) & 63;
if ((context->count[0] += len << 3) < (len << 3)) context->count[1]++;
context->count[1] += (len >> 29);
if ((j + len) > 63) {
memcpy(&context->buffer[j], data, (i = 64-j));
SHA1_Transform(context->state, context->buffer);
for ( ; i + 63 < len; i += 64) {
SHA1_Transform(context->state, data + i);
}
j = 0;
}
else i = 0;
memcpy(&context->buffer[j], &data[i], len - i);
 
#ifdef VERBOSE
SHAPrintContext(context, "after ");
#endif
}
 
 
/* Add padding and return the message digest. */
void SHA1_Final(SHA1_CTX* context, uint8_t digest[SHA1_DIGEST_SIZE])
{
uint32_t i;
uint8_t finalcount[8];
 
for (i = 0; i < 8; i++) {
finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)]
>> ((3-(i & 3)) * 8) ) & 255); /* Endian independent */
}
SHA1_Update(context, (uint8_t *)"\200", 1);
while ((context->count[0] & 504) != 448) {
SHA1_Update(context, (uint8_t *)"\0", 1);
}
SHA1_Update(context, finalcount, 8); /* Should cause a SHA1_Transform() */
for (i = 0; i < SHA1_DIGEST_SIZE; i++) {
digest[i] = (uint8_t)
((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255);
}
 
/* Wipe variables */
i = 0;
memset(context->buffer, 0, 64);
memset(context->state, 0, 20);
memset(context->count, 0, 8);
memset(finalcount, 0, 8); /* SWR */
 
#ifdef SHA1HANDSOFF /* make SHA1Transform overwrite its own static vars */
SHA1_Transform(context->state, context->buffer);
#endif
}
 
/*************************************************************/
 
#if 0
int main(int argc, char** argv)
{
int i, j;
SHA1_CTX context;
unsigned char digest[SHA1_DIGEST_SIZE], buffer[16384];
FILE* file;
 
if (argc > 2) {
puts("Public domain SHA-1 implementation - by Steve Reid <sreid@sea-to-sky.net>");
puts("Modified for 16 bit environments 7/98 - by James H. Brown <jbrown@burgoyne.com>"); /* JHB */
puts("Produces the SHA-1 hash of a file, or stdin if no file is specified.");
return(0);
}
if (argc < 2) {
file = stdin;
}
else {
if (!(file = fopen(argv[1], "rb"))) {
fputs("Unable to open file.", stderr);
return(-1);
}
}
SHA1_Init(&context);
while (!feof(file)) { /* note: what if ferror(file) */
i = fread(buffer, 1, 16384, file);
SHA1_Update(&context, buffer, i);
}
SHA1_Final(&context, digest);
fclose(file);
for (i = 0; i < SHA1_DIGEST_SIZE/4; i++) {
for (j = 0; j < 4; j++) {
printf("%02X", digest[i*4+j]);
}
putchar(' ');
}
putchar('\n');
return(0); /* JHB */
}
#endif
 
/* self test */
 
#ifdef TEST
 
static char *test_data[] = {
"abc",
"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
"A million repetitions of 'a'"};
static char *test_results[] = {
"A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D",
"84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1",
"34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F"};
 
 
void digest_to_hex(const uint8_t digest[SHA1_DIGEST_SIZE], char *output)
{
int i,j;
char *c = output;
 
for (i = 0; i < SHA1_DIGEST_SIZE/4; i++) {
for (j = 0; j < 4; j++) {
sprintf(c,"%02X", digest[i*4+j]);
c += 2;
}
sprintf(c, " ");
c += 1;
}
*(c - 1) = '\0';
}
 
int main(int argc, char** argv)
{
int k;
SHA1_CTX context;
uint8_t digest[20];
char output[80];
 
fprintf(stdout, "verifying SHA-1 implementation... ");
 
for (k = 0; k < 2; k++){
SHA1_Init(&context);
SHA1_Update(&context, (uint8_t*)test_data[k], strlen(test_data[k]));
SHA1_Final(&context, digest);
digest_to_hex(digest, output);
 
if (strcmp(output, test_results[k])) {
fprintf(stdout, "FAIL\n");
fprintf(stderr,"* hash of \"%s\" incorrect:\n", test_data[k]);
fprintf(stderr,"\t%s returned\n", output);
fprintf(stderr,"\t%s is correct\n", test_results[k]);
return (1);
}
}
/* million 'a' vector we feed separately */
SHA1_Init(&context);
for (k = 0; k < 1000000; k++)
SHA1_Update(&context, (uint8_t*)"a", 1);
SHA1_Final(&context, digest);
digest_to_hex(digest, output);
if (strcmp(output, test_results[2])) {
fprintf(stdout, "FAIL\n");
fprintf(stderr,"* hash of \"%s\" incorrect:\n", test_data[2]);
fprintf(stderr,"\t%s returned\n", output);
fprintf(stderr,"\t%s is correct\n", test_results[2]);
return (1);
}
 
/* success */
fprintf(stdout, "ok\n");
return(0);
}
#endif /* TEST */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libjbig2dec/sha1.h
0,0 → 1,27
/* public api for steve reid's public domain SHA-1 implementation */
/* this file is in the public domain */
 
#ifndef __SHA1_H
#define __SHA1_H
 
#ifdef __cplusplus
extern "C" {
#endif
 
typedef struct {
uint32_t state[5];
uint32_t count[2];
uint8_t buffer[64];
} SHA1_CTX;
 
#define SHA1_DIGEST_SIZE 20
 
void SHA1_Init(SHA1_CTX* context);
void SHA1_Update(SHA1_CTX* context, const uint8_t* data, const size_t len);
void SHA1_Final(SHA1_CTX* context, uint8_t digest[SHA1_DIGEST_SIZE]);
 
#ifdef __cplusplus
}
#endif
 
#endif /* __SHA1_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/Makefile
0,0 → 1,18
CC = kos32-gcc
LD = kos32-ld
 
SDK_DIR = /media/maxim/E22406D62406AE1B/SVNKOS/contrib/sdk
CFLAGS = -c -fno-ident -O2 -fomit-frame-pointer -fno-ident -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32
 
INCLUDES = -I $(SDK_DIR)/sources/newlib/libc/include -I $(SDK_DIR)/sources/freetype/include -I $(SDK_DIR)/sources/zlib -I .
 
SRC := $(notdir $(wildcard *.c))
OBJECTS = $(patsubst %.c, %.o, $(SRC))
 
default: $(patsubst %.c,%.o,$(SRC))
ar rcs libopenjpeg.a *.o
rm *.o
mv libopenjpeg.a ../lib
 
%.o : %.c Makefile $(SRC)
$(CC) $(CFLAGS) $(INCLUDES) -o $@ $<
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/bio.c
0,0 → 1,187
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#include "opj_includes.h"
 
/** @defgroup BIO BIO - Individual bit input-output stream */
/*@{*/
 
/** @name Local static functions */
/*@{*/
 
/**
Write a bit
@param bio BIO handle
@param b Bit to write (0 or 1)
*/
static void bio_putbit(opj_bio_t *bio, int b);
/**
Read a bit
@param bio BIO handle
@return Returns the read bit
*/
static int bio_getbit(opj_bio_t *bio);
/**
Write a byte
@param bio BIO handle
@return Returns 0 if successful, returns 1 otherwise
*/
static int bio_byteout(opj_bio_t *bio);
/**
Read a byte
@param bio BIO handle
@return Returns 0 if successful, returns 1 otherwise
*/
static int bio_bytein(opj_bio_t *bio);
 
/*@}*/
 
/*@}*/
 
/*
==========================================================
local functions
==========================================================
*/
 
static int bio_byteout(opj_bio_t *bio) {
bio->buf = (bio->buf << 8) & 0xffff;
bio->ct = bio->buf == 0xff00 ? 7 : 8;
if (bio->bp >= bio->end) {
return 1;
}
*bio->bp++ = bio->buf >> 8;
return 0;
}
 
static int bio_bytein(opj_bio_t *bio) {
bio->buf = (bio->buf << 8) & 0xffff;
bio->ct = bio->buf == 0xff00 ? 7 : 8;
if (bio->bp >= bio->end) {
return 1;
}
bio->buf |= *bio->bp++;
return 0;
}
 
static void bio_putbit(opj_bio_t *bio, int b) {
if (bio->ct == 0) {
bio_byteout(bio);
}
bio->ct--;
bio->buf |= b << bio->ct;
}
 
static int bio_getbit(opj_bio_t *bio) {
if (bio->ct == 0) {
bio_bytein(bio);
}
bio->ct--;
return (bio->buf >> bio->ct) & 1;
}
 
/*
==========================================================
Bit Input/Output interface
==========================================================
*/
 
opj_bio_t* bio_create(void) {
opj_bio_t *bio = (opj_bio_t*)opj_malloc(sizeof(opj_bio_t));
return bio;
}
 
void bio_destroy(opj_bio_t *bio) {
if(bio) {
opj_free(bio);
}
}
 
int bio_numbytes(opj_bio_t *bio) {
return (bio->bp - bio->start);
}
 
void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len) {
bio->start = bp;
bio->end = bp + len;
bio->bp = bp;
bio->buf = 0;
bio->ct = 8;
}
 
void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len) {
bio->start = bp;
bio->end = bp + len;
bio->bp = bp;
bio->buf = 0;
bio->ct = 0;
}
 
void bio_write(opj_bio_t *bio, int v, int n) {
int i;
for (i = n - 1; i >= 0; i--) {
bio_putbit(bio, (v >> i) & 1);
}
}
 
int bio_read(opj_bio_t *bio, int n) {
int i, v;
v = 0;
for (i = n - 1; i >= 0; i--) {
v += bio_getbit(bio) << i;
}
return v;
}
 
int bio_flush(opj_bio_t *bio) {
bio->ct = 0;
if (bio_byteout(bio)) {
return 1;
}
if (bio->ct == 7) {
bio->ct = 0;
if (bio_byteout(bio)) {
return 1;
}
}
return 0;
}
 
int bio_inalign(opj_bio_t *bio) {
bio->ct = 0;
if ((bio->buf & 0xff) == 0xff) {
if (bio_bytein(bio)) {
return 1;
}
bio->ct = 0;
}
return 0;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/bio.h
0,0 → 1,125
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#ifndef __BIO_H
#define __BIO_H
/**
@file bio.h
@brief Implementation of an individual bit input-output (BIO)
 
The functions in BIO.C have for goal to realize an individual bit input - output.
*/
 
/** @defgroup BIO BIO - Individual bit input-output stream */
/*@{*/
 
/**
Individual bit input-output stream (BIO)
*/
typedef struct opj_bio {
/** pointer to the start of the buffer */
unsigned char *start;
/** pointer to the end of the buffer */
unsigned char *end;
/** pointer to the present position in the buffer */
unsigned char *bp;
/** temporary place where each byte is read or written */
unsigned int buf;
/** coder : number of bits free to write. decoder : number of bits read */
int ct;
} opj_bio_t;
 
/** @name Exported functions */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Create a new BIO handle
@return Returns a new BIO handle if successful, returns NULL otherwise
*/
opj_bio_t* bio_create(void);
/**
Destroy a previously created BIO handle
@param bio BIO handle to destroy
*/
void bio_destroy(opj_bio_t *bio);
/**
Number of bytes written.
@param bio BIO handle
@return Returns the number of bytes written
*/
int bio_numbytes(opj_bio_t *bio);
/**
Init encoder
@param bio BIO handle
@param bp Output buffer
@param len Output buffer length
*/
void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len);
/**
Init decoder
@param bio BIO handle
@param bp Input buffer
@param len Input buffer length
*/
void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len);
/**
Write bits
@param bio BIO handle
@param v Value of bits
@param n Number of bits to write
*/
void bio_write(opj_bio_t *bio, int v, int n);
/**
Read bits
@param bio BIO handle
@param n Number of bits to read
@return Returns the corresponding read number
*/
int bio_read(opj_bio_t *bio, int n);
/**
Flush bits
@param bio BIO handle
@return Returns 1 if successful, returns 0 otherwise
*/
int bio_flush(opj_bio_t *bio);
/**
Passes the ending bits (coming from flushing)
@param bio BIO handle
@return Returns 1 if successful, returns 0 otherwise
*/
int bio_inalign(opj_bio_t *bio);
/* ----------------------------------------------------------------------- */
/*@}*/
 
/*@}*/
 
#endif /* __BIO_H */
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/cio.c
0,0 → 1,191
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#include "opj_includes.h"
 
/* ----------------------------------------------------------------------- */
 
opj_cio_t* OPJ_CALLCONV opj_cio_open(opj_common_ptr cinfo, unsigned char *buffer, int length) {
opj_cp_t *cp = NULL;
opj_cio_t *cio = (opj_cio_t*)opj_malloc(sizeof(opj_cio_t));
if(!cio) return NULL;
cio->cinfo = cinfo;
if(buffer && length) {
/* wrap a user buffer containing the encoded image */
cio->openmode = OPJ_STREAM_READ;
cio->buffer = buffer;
cio->length = length;
}
else if(!buffer && !length && cinfo) {
/* allocate a buffer for the encoded image */
cio->openmode = OPJ_STREAM_WRITE;
switch(cinfo->codec_format) {
case CODEC_J2K:
cp = ((opj_j2k_t*)cinfo->j2k_handle)->cp;
break;
case CODEC_JP2:
cp = ((opj_jp2_t*)cinfo->jp2_handle)->j2k->cp;
break;
default:
opj_free(cio);
return NULL;
}
cio->length = (unsigned int) (0.1625 * cp->img_size + 2000); /* 0.1625 = 1.3/8 and 2000 bytes as a minimum for headers */
cio->buffer = (unsigned char *)opj_malloc(cio->length);
if(!cio->buffer) {
opj_event_msg(cio->cinfo, EVT_ERROR, "Error allocating memory for compressed bitstream\n");
opj_free(cio);
return NULL;
}
}
else {
opj_free(cio);
return NULL;
}
 
/* Initialize byte IO */
cio->start = cio->buffer;
cio->end = cio->buffer + cio->length;
cio->bp = cio->buffer;
 
return cio;
}
 
void OPJ_CALLCONV opj_cio_close(opj_cio_t *cio) {
if(cio) {
if(cio->openmode == OPJ_STREAM_WRITE) {
/* destroy the allocated buffer */
opj_free(cio->buffer);
}
/* destroy the cio */
opj_free(cio);
}
}
 
 
/* ----------------------------------------------------------------------- */
 
/*
* Get position in byte stream.
*/
int OPJ_CALLCONV cio_tell(opj_cio_t *cio) {
return cio->bp - cio->start;
}
 
/*
* Set position in byte stream.
*
* pos : position, in number of bytes, from the beginning of the stream
*/
void OPJ_CALLCONV cio_seek(opj_cio_t *cio, int pos) {
cio->bp = cio->start + pos;
}
 
/*
* Number of bytes left before the end of the stream.
*/
int cio_numbytesleft(opj_cio_t *cio) {
return cio->end - cio->bp;
}
 
/*
* Get pointer to the current position in the stream.
*/
unsigned char *cio_getbp(opj_cio_t *cio) {
return cio->bp;
}
 
/*
* Write a byte.
*/
bool cio_byteout(opj_cio_t *cio, unsigned char v) {
if (cio->bp >= cio->end) {
opj_event_msg(cio->cinfo, EVT_ERROR, "write error\n");
return false;
}
*cio->bp++ = v;
return true;
}
 
/*
* Read a byte.
*/
unsigned char cio_bytein(opj_cio_t *cio) {
if (cio->bp >= cio->end) {
opj_event_msg(cio->cinfo, EVT_ERROR, "read error: passed the end of the codestream (start = %d, current = %d, end = %d\n", cio->start, cio->bp, cio->end);
return 0;
}
return *cio->bp++;
}
 
/*
* Write some bytes.
*
* v : value to write
* n : number of bytes to write
*/
unsigned int cio_write(opj_cio_t *cio, unsigned int v, int n) {
int i;
for (i = n - 1; i >= 0; i--) {
if( !cio_byteout(cio, (unsigned char) ((v >> (i << 3)) & 0xff)) )
return 0;
}
return n;
}
 
/*
* Read some bytes.
*
* n : number of bytes to read
*
* return : value of the n bytes read
*/
unsigned int cio_read(opj_cio_t *cio, int n) {
int i;
unsigned int v;
v = 0;
for (i = n - 1; i >= 0; i--) {
v += cio_bytein(cio) << (i << 3);
}
return v;
}
 
/*
* Skip some bytes.
*
* n : number of bytes to skip
*/
void cio_skip(opj_cio_t *cio, int n) {
cio->bp += n;
}
 
 
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/cio.h
0,0 → 1,86
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#ifndef __CIO_H
#define __CIO_H
/**
@file cio.h
@brief Implementation of a byte input-output process (CIO)
 
The functions in CIO.C have for goal to realize a byte input / output process.
*/
 
/** @defgroup CIO CIO - byte input-output stream */
/*@{*/
 
/** @name Exported functions (see also openjpeg.h) */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Number of bytes left before the end of the stream
@param cio CIO handle
@return Returns the number of bytes before the end of the stream
*/
int cio_numbytesleft(opj_cio_t *cio);
/**
Get pointer to the current position in the stream
@param cio CIO handle
@return Returns a pointer to the current position
*/
unsigned char *cio_getbp(opj_cio_t *cio);
/**
Write some bytes
@param cio CIO handle
@param v Value to write
@param n Number of bytes to write
@return Returns the number of bytes written or 0 if an error occured
*/
unsigned int cio_write(opj_cio_t *cio, unsigned int v, int n);
/**
Read some bytes
@param cio CIO handle
@param n Number of bytes to read
@return Returns the value of the n bytes read
*/
unsigned int cio_read(opj_cio_t *cio, int n);
/**
Skip some bytes
@param cio CIO handle
@param n Number of bytes to skip
*/
void cio_skip(opj_cio_t *cio, int n);
/* ----------------------------------------------------------------------- */
/*@}*/
 
/*@}*/
 
#endif /* __CIO_H */
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/dwt.c
0,0 → 1,858
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* Copyright (c) 2007, Jonathan Ballard <dzonatas@dzonux.net>
* Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#ifdef __SSE__
#include <xmmintrin.h>
#endif
 
#include "opj_includes.h"
 
/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */
/*@{*/
 
#define WS(i) v->mem[(i)*2]
#define WD(i) v->mem[(1+(i)*2)]
 
/** @name Local data structures */
/*@{*/
 
typedef struct dwt_local {
int* mem;
int dn;
int sn;
int cas;
} dwt_t;
 
typedef union {
float f[4];
} v4;
 
typedef struct v4dwt_local {
v4* wavelet ;
int dn ;
int sn ;
int cas ;
} v4dwt_t ;
 
static const float dwt_alpha = 1.586134342f; // 12994
static const float dwt_beta = 0.052980118f; // 434
static const float dwt_gamma = -0.882911075f; // -7233
static const float dwt_delta = -0.443506852f; // -3633
 
static const float K = 1.230174105f; // 10078
/* FIXME: What is this constant? */
static const float c13318 = 1.625732422f;
 
/*@}*/
 
/**
Virtual function type for wavelet transform in 1-D
*/
typedef void (*DWT1DFN)(dwt_t* v);
 
/** @name Local static functions */
/*@{*/
 
/**
Forward lazy transform (horizontal)
*/
static void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas);
/**
Forward lazy transform (vertical)
*/
static void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas);
/**
Inverse lazy transform (horizontal)
*/
static void dwt_interleave_h(dwt_t* h, int *a);
/**
Inverse lazy transform (vertical)
*/
static void dwt_interleave_v(dwt_t* v, int *a, int x);
/**
Forward 5-3 wavelet transform in 1-D
*/
static void dwt_encode_1(int *a, int dn, int sn, int cas);
/**
Inverse 5-3 wavelet transform in 1-D
*/
static void dwt_decode_1(dwt_t *v);
/**
Forward 9-7 wavelet transform in 1-D
*/
static void dwt_encode_1_real(int *a, int dn, int sn, int cas);
/**
Explicit calculation of the Quantization Stepsizes
*/
static void dwt_encode_stepsize(int stepsize, int numbps, opj_stepsize_t *bandno_stepsize);
/**
Inverse wavelet transform in 2-D.
*/
static void dwt_decode_tile(opj_tcd_tilecomp_t* tilec, int i, DWT1DFN fn);
 
/*@}*/
 
/*@}*/
 
#define S(i) a[(i)*2]
#define D(i) a[(1+(i)*2)]
#define S_(i) ((i)<0?S(0):((i)>=sn?S(sn-1):S(i)))
#define D_(i) ((i)<0?D(0):((i)>=dn?D(dn-1):D(i)))
/* new */
#define SS_(i) ((i)<0?S(0):((i)>=dn?S(dn-1):S(i)))
#define DD_(i) ((i)<0?D(0):((i)>=sn?D(sn-1):D(i)))
 
/* <summary> */
/* This table contains the norms of the 5-3 wavelets for different bands. */
/* </summary> */
static const double dwt_norms[4][10] = {
{1.000, 1.500, 2.750, 5.375, 10.68, 21.34, 42.67, 85.33, 170.7, 341.3},
{1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9},
{1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9},
{.7186, .9218, 1.586, 3.043, 6.019, 12.01, 24.00, 47.97, 95.93}
};
 
/* <summary> */
/* This table contains the norms of the 9-7 wavelets for different bands. */
/* </summary> */
static const double dwt_norms_real[4][10] = {
{1.000, 1.965, 4.177, 8.403, 16.90, 33.84, 67.69, 135.3, 270.6, 540.9},
{2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0},
{2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0},
{2.080, 3.865, 8.307, 17.18, 34.71, 69.59, 139.3, 278.6, 557.2}
};
 
/*
==========================================================
local functions
==========================================================
*/
 
/* <summary> */
/* Forward lazy transform (horizontal). */
/* </summary> */
static void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas) {
int i;
for (i=0; i<sn; i++) b[i]=a[2*i+cas];
for (i=0; i<dn; i++) b[sn+i]=a[(2*i+1-cas)];
}
 
/* <summary> */
/* Forward lazy transform (vertical). */
/* </summary> */
static void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas) {
int i;
for (i=0; i<sn; i++) b[i*x]=a[2*i+cas];
for (i=0; i<dn; i++) b[(sn+i)*x]=a[(2*i+1-cas)];
}
 
/* <summary> */
/* Inverse lazy transform (horizontal). */
/* </summary> */
static void dwt_interleave_h(dwt_t* h, int *a) {
int *ai = a;
int *bi = h->mem + h->cas;
int i = h->sn;
while( i-- ) {
*bi = *(ai++);
bi += 2;
}
ai = a + h->sn;
bi = h->mem + 1 - h->cas;
i = h->dn ;
while( i-- ) {
*bi = *(ai++);
bi += 2;
}
}
 
/* <summary> */
/* Inverse lazy transform (vertical). */
/* </summary> */
static void dwt_interleave_v(dwt_t* v, int *a, int x) {
int *ai = a;
int *bi = v->mem + v->cas;
int i = v->sn;
while( i-- ) {
*bi = *ai;
bi += 2;
ai += x;
}
ai = a + (v->sn * x);
bi = v->mem + 1 - v->cas;
i = v->dn ;
while( i-- ) {
*bi = *ai;
bi += 2;
ai += x;
}
}
 
 
/* <summary> */
/* Forward 5-3 wavelet transform in 1-D. */
/* </summary> */
static void dwt_encode_1(int *a, int dn, int sn, int cas) {
int i;
if (!cas) {
if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
for (i = 0; i < dn; i++) D(i) -= (S_(i) + S_(i + 1)) >> 1;
for (i = 0; i < sn; i++) S(i) += (D_(i - 1) + D_(i) + 2) >> 2;
}
} else {
if (!sn && dn == 1) /* NEW : CASE ONE ELEMENT */
S(0) *= 2;
else {
for (i = 0; i < dn; i++) S(i) -= (DD_(i) + DD_(i - 1)) >> 1;
for (i = 0; i < sn; i++) D(i) += (SS_(i) + SS_(i + 1) + 2) >> 2;
}
}
}
 
/* <summary> */
/* Inverse 5-3 wavelet transform in 1-D. */
/* </summary> */
static void dwt_decode_1_(int *a, int dn, int sn, int cas) {
int i;
if (!cas) {
if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
for (i = 0; i < sn; i++) S(i) -= (D_(i - 1) + D_(i) + 2) >> 2;
for (i = 0; i < dn; i++) D(i) += (S_(i) + S_(i + 1)) >> 1;
}
} else {
if (!sn && dn == 1) /* NEW : CASE ONE ELEMENT */
S(0) /= 2;
else {
for (i = 0; i < sn; i++) D(i) -= (SS_(i) + SS_(i + 1) + 2) >> 2;
for (i = 0; i < dn; i++) S(i) += (DD_(i) + DD_(i - 1)) >> 1;
}
}
}
 
/* <summary> */
/* Inverse 5-3 wavelet transform in 1-D. */
/* </summary> */
static void dwt_decode_1(dwt_t *v) {
dwt_decode_1_(v->mem, v->dn, v->sn, v->cas);
}
 
/* <summary> */
/* Forward 9-7 wavelet transform in 1-D. */
/* </summary> */
static void dwt_encode_1_real(int *a, int dn, int sn, int cas) {
int i;
if (!cas) {
if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
for (i = 0; i < dn; i++)
D(i) -= fix_mul(S_(i) + S_(i + 1), 12993);
for (i = 0; i < sn; i++)
S(i) -= fix_mul(D_(i - 1) + D_(i), 434);
for (i = 0; i < dn; i++)
D(i) += fix_mul(S_(i) + S_(i + 1), 7233);
for (i = 0; i < sn; i++)
S(i) += fix_mul(D_(i - 1) + D_(i), 3633);
for (i = 0; i < dn; i++)
D(i) = fix_mul(D(i), 5038); /*5038 */
for (i = 0; i < sn; i++)
S(i) = fix_mul(S(i), 6659); /*6660 */
}
} else {
if ((sn > 0) || (dn > 1)) { /* NEW : CASE ONE ELEMENT */
for (i = 0; i < dn; i++)
S(i) -= fix_mul(DD_(i) + DD_(i - 1), 12993);
for (i = 0; i < sn; i++)
D(i) -= fix_mul(SS_(i) + SS_(i + 1), 434);
for (i = 0; i < dn; i++)
S(i) += fix_mul(DD_(i) + DD_(i - 1), 7233);
for (i = 0; i < sn; i++)
D(i) += fix_mul(SS_(i) + SS_(i + 1), 3633);
for (i = 0; i < dn; i++)
S(i) = fix_mul(S(i), 5038); /*5038 */
for (i = 0; i < sn; i++)
D(i) = fix_mul(D(i), 6659); /*6660 */
}
}
}
 
static void dwt_encode_stepsize(int stepsize, int numbps, opj_stepsize_t *bandno_stepsize) {
int p, n;
p = int_floorlog2(stepsize) - 13;
n = 11 - int_floorlog2(stepsize);
bandno_stepsize->mant = (n < 0 ? stepsize >> -n : stepsize << n) & 0x7ff;
bandno_stepsize->expn = numbps - p;
}
 
/*
==========================================================
DWT interface
==========================================================
*/
 
/* <summary> */
/* Forward 5-3 wavelet transform in 2-D. */
/* </summary> */
void dwt_encode(opj_tcd_tilecomp_t * tilec) {
int i, j, k;
int *a = NULL;
int *aj = NULL;
int *bj = NULL;
int w, l;
w = tilec->x1-tilec->x0;
l = tilec->numresolutions-1;
a = tilec->data;
for (i = 0; i < l; i++) {
int rw; /* width of the resolution level computed */
int rh; /* height of the resolution level computed */
int rw1; /* width of the resolution level once lower than computed one */
int rh1; /* height of the resolution level once lower than computed one */
int cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */
int cas_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */
int dn, sn;
rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0;
rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0;
rw1= tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0;
rh1= tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0;
cas_row = tilec->resolutions[l - i].x0 % 2;
cas_col = tilec->resolutions[l - i].y0 % 2;
sn = rh1;
dn = rh - rh1;
bj = (int*)opj_malloc(rh * sizeof(int));
for (j = 0; j < rw; j++) {
aj = a + j;
for (k = 0; k < rh; k++) bj[k] = aj[k*w];
dwt_encode_1(bj, dn, sn, cas_col);
dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col);
}
opj_free(bj);
sn = rw1;
dn = rw - rw1;
bj = (int*)opj_malloc(rw * sizeof(int));
for (j = 0; j < rh; j++) {
aj = a + j * w;
for (k = 0; k < rw; k++) bj[k] = aj[k];
dwt_encode_1(bj, dn, sn, cas_row);
dwt_deinterleave_h(bj, aj, dn, sn, cas_row);
}
opj_free(bj);
}
}
 
 
/* <summary> */
/* Inverse 5-3 wavelet transform in 2-D. */
/* </summary> */
void dwt_decode(opj_tcd_tilecomp_t* tilec, int numres) {
dwt_decode_tile(tilec, numres, &dwt_decode_1);
}
 
 
/* <summary> */
/* Get gain of 5-3 wavelet transform. */
/* </summary> */
int dwt_getgain(int orient) {
if (orient == 0)
return 0;
if (orient == 1 || orient == 2)
return 1;
return 2;
}
 
/* <summary> */
/* Get norm of 5-3 wavelet. */
/* </summary> */
double dwt_getnorm(int level, int orient) {
return dwt_norms[orient][level];
}
 
/* <summary> */
/* Forward 9-7 wavelet transform in 2-D. */
/* </summary> */
 
void dwt_encode_real(opj_tcd_tilecomp_t * tilec) {
int i, j, k;
int *a = NULL;
int *aj = NULL;
int *bj = NULL;
int w, l;
w = tilec->x1-tilec->x0;
l = tilec->numresolutions-1;
a = tilec->data;
for (i = 0; i < l; i++) {
int rw; /* width of the resolution level computed */
int rh; /* height of the resolution level computed */
int rw1; /* width of the resolution level once lower than computed one */
int rh1; /* height of the resolution level once lower than computed one */
int cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */
int cas_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */
int dn, sn;
rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0;
rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0;
rw1= tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0;
rh1= tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0;
cas_row = tilec->resolutions[l - i].x0 % 2;
cas_col = tilec->resolutions[l - i].y0 % 2;
sn = rh1;
dn = rh - rh1;
bj = (int*)opj_malloc(rh * sizeof(int));
for (j = 0; j < rw; j++) {
aj = a + j;
for (k = 0; k < rh; k++) bj[k] = aj[k*w];
dwt_encode_1_real(bj, dn, sn, cas_col);
dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col);
}
opj_free(bj);
sn = rw1;
dn = rw - rw1;
bj = (int*)opj_malloc(rw * sizeof(int));
for (j = 0; j < rh; j++) {
aj = a + j * w;
for (k = 0; k < rw; k++) bj[k] = aj[k];
dwt_encode_1_real(bj, dn, sn, cas_row);
dwt_deinterleave_h(bj, aj, dn, sn, cas_row);
}
opj_free(bj);
}
}
 
 
/* <summary> */
/* Get gain of 9-7 wavelet transform. */
/* </summary> */
int dwt_getgain_real(int orient) {
(void)orient;
return 0;
}
 
/* <summary> */
/* Get norm of 9-7 wavelet. */
/* </summary> */
double dwt_getnorm_real(int level, int orient) {
return dwt_norms_real[orient][level];
}
 
void dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, int prec) {
int numbands, bandno;
numbands = 3 * tccp->numresolutions - 2;
for (bandno = 0; bandno < numbands; bandno++) {
double stepsize;
int resno, level, orient, gain;
 
resno = (bandno == 0) ? 0 : ((bandno - 1) / 3 + 1);
orient = (bandno == 0) ? 0 : ((bandno - 1) % 3 + 1);
level = tccp->numresolutions - 1 - resno;
gain = (tccp->qmfbid == 0) ? 0 : ((orient == 0) ? 0 : (((orient == 1) || (orient == 2)) ? 1 : 2));
if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
stepsize = 1.0;
} else {
double norm = dwt_norms_real[orient][level];
stepsize = (1 << (gain)) / norm;
}
dwt_encode_stepsize((int) floor(stepsize * 8192.0), prec + gain, &tccp->stepsizes[bandno]);
}
}
 
 
/* <summary> */
/* Determine maximum computed resolution level for inverse wavelet transform */
/* </summary> */
static int dwt_decode_max_resolution(opj_tcd_resolution_t* restrict r, int i) {
int mr = 1;
int w;
while( --i ) {
r++;
if( mr < ( w = r->x1 - r->x0 ) )
mr = w ;
if( mr < ( w = r->y1 - r->y0 ) )
mr = w ;
}
return mr ;
}
 
 
/* <summary> */
/* Inverse wavelet transform in 2-D. */
/* </summary> */
static void dwt_decode_tile(opj_tcd_tilecomp_t* tilec, int numres, DWT1DFN dwt_1D) {
dwt_t h;
dwt_t v;
 
opj_tcd_resolution_t* tr = tilec->resolutions;
 
int rw = tr->x1 - tr->x0; /* width of the resolution level computed */
int rh = tr->y1 - tr->y0; /* height of the resolution level computed */
 
int w = tilec->x1 - tilec->x0;
 
h.mem = opj_aligned_malloc(dwt_decode_max_resolution(tr, numres) * sizeof(int));
v.mem = h.mem;
 
while( --numres) {
int * restrict tiledp = tilec->data;
int j;
 
++tr;
h.sn = rw;
v.sn = rh;
 
rw = tr->x1 - tr->x0;
rh = tr->y1 - tr->y0;
 
h.dn = rw - h.sn;
h.cas = tr->x0 % 2;
 
for(j = 0; j < rh; ++j) {
dwt_interleave_h(&h, &tiledp[j*w]);
(dwt_1D)(&h);
memcpy(&tiledp[j*w], h.mem, rw * sizeof(int));
}
 
v.dn = rh - v.sn;
v.cas = tr->y0 % 2;
 
for(j = 0; j < rw; ++j){
int k;
dwt_interleave_v(&v, &tiledp[j], w);
(dwt_1D)(&v);
for(k = 0; k < rh; ++k) {
tiledp[k * w + j] = v.mem[k];
}
}
}
opj_aligned_free(h.mem);
}
 
static void v4dwt_interleave_h(v4dwt_t* restrict w, float* restrict a, int x, int size){
float* restrict bi = (float*) (w->wavelet + w->cas);
int count = w->sn;
int i, k;
for(k = 0; k < 2; ++k){
if (count + 3 * x < size && ((int) a & 0x0f) == 0 && ((int) bi & 0x0f) == 0 && (x & 0x0f) == 0) {
/* Fast code path */
for(i = 0; i < count; ++i){
int j = i;
bi[i*8 ] = a[j];
j += x;
bi[i*8 + 1] = a[j];
j += x;
bi[i*8 + 2] = a[j];
j += x;
bi[i*8 + 3] = a[j];
}
} else {
/* Slow code path */
for(i = 0; i < count; ++i){
int j = i;
bi[i*8 ] = a[j];
j += x;
if(j > size) continue;
bi[i*8 + 1] = a[j];
j += x;
if(j > size) continue;
bi[i*8 + 2] = a[j];
j += x;
if(j > size) continue;
bi[i*8 + 3] = a[j];
}
}
bi = (float*) (w->wavelet + 1 - w->cas);
a += w->sn;
size -= w->sn;
count = w->dn;
}
}
 
static void v4dwt_interleave_v(v4dwt_t* restrict v , float* restrict a , int x){
v4* restrict bi = v->wavelet + v->cas;
int i;
for(i = 0; i < v->sn; ++i){
memcpy(&bi[i*2], &a[i*x], 4 * sizeof(float));
}
a += v->sn * x;
bi = v->wavelet + 1 - v->cas;
for(i = 0; i < v->dn; ++i){
memcpy(&bi[i*2], &a[i*x], 4 * sizeof(float));
}
}
 
#ifdef __SSE__
 
static void v4dwt_decode_step1_sse(v4* w, int count, const __m128 c){
__m128* restrict vw = (__m128*) w;
int i;
/* 4x unrolled loop */
for(i = 0; i < count >> 2; ++i){
*vw = _mm_mul_ps(*vw, c);
vw += 2;
*vw = _mm_mul_ps(*vw, c);
vw += 2;
*vw = _mm_mul_ps(*vw, c);
vw += 2;
*vw = _mm_mul_ps(*vw, c);
vw += 2;
}
count &= 3;
for(i = 0; i < count; ++i){
*vw = _mm_mul_ps(*vw, c);
vw += 2;
}
}
 
static void v4dwt_decode_step2_sse(v4* l, v4* w, int k, int m, __m128 c){
__m128* restrict vl = (__m128*) l;
__m128* restrict vw = (__m128*) w;
int i;
__m128 tmp1, tmp2, tmp3;
tmp1 = vl[0];
for(i = 0; i < m; ++i){
tmp2 = vw[-1];
tmp3 = vw[ 0];
vw[-1] = _mm_add_ps(tmp2, _mm_mul_ps(_mm_add_ps(tmp1, tmp3), c));
tmp1 = tmp3;
vw += 2;
}
vl = vw - 2;
if(m >= k){
return;
}
c = _mm_add_ps(c, c);
c = _mm_mul_ps(c, vl[0]);
for(; m < k; ++m){
__m128 tmp = vw[-1];
vw[-1] = _mm_add_ps(tmp, c);
vw += 2;
}
}
 
#else
 
static void v4dwt_decode_step1(v4* w, int count, const float c){
float* restrict fw = (float*) w;
int i;
for(i = 0; i < count; ++i){
float tmp1 = fw[i*8 ];
float tmp2 = fw[i*8 + 1];
float tmp3 = fw[i*8 + 2];
float tmp4 = fw[i*8 + 3];
fw[i*8 ] = tmp1 * c;
fw[i*8 + 1] = tmp2 * c;
fw[i*8 + 2] = tmp3 * c;
fw[i*8 + 3] = tmp4 * c;
}
}
 
static void v4dwt_decode_step2(v4* l, v4* w, int k, int m, float c){
float* restrict fl = (float*) l;
float* restrict fw = (float*) w;
int i;
for(i = 0; i < m; ++i){
float tmp1_1 = fl[0];
float tmp1_2 = fl[1];
float tmp1_3 = fl[2];
float tmp1_4 = fl[3];
float tmp2_1 = fw[-4];
float tmp2_2 = fw[-3];
float tmp2_3 = fw[-2];
float tmp2_4 = fw[-1];
float tmp3_1 = fw[0];
float tmp3_2 = fw[1];
float tmp3_3 = fw[2];
float tmp3_4 = fw[3];
fw[-4] = tmp2_1 + ((tmp1_1 + tmp3_1) * c);
fw[-3] = tmp2_2 + ((tmp1_2 + tmp3_2) * c);
fw[-2] = tmp2_3 + ((tmp1_3 + tmp3_3) * c);
fw[-1] = tmp2_4 + ((tmp1_4 + tmp3_4) * c);
fl = fw;
fw += 8;
}
if(m < k){
float c1;
float c2;
float c3;
float c4;
c += c;
c1 = fl[0] * c;
c2 = fl[1] * c;
c3 = fl[2] * c;
c4 = fl[3] * c;
for(; m < k; ++m){
float tmp1 = fw[-4];
float tmp2 = fw[-3];
float tmp3 = fw[-2];
float tmp4 = fw[-1];
fw[-4] = tmp1 + c1;
fw[-3] = tmp2 + c2;
fw[-2] = tmp3 + c3;
fw[-1] = tmp4 + c4;
fw += 8;
}
}
}
 
#endif
 
/* <summary> */
/* Inverse 9-7 wavelet transform in 1-D. */
/* </summary> */
static void v4dwt_decode(v4dwt_t* restrict dwt){
int a, b;
if(dwt->cas == 0) {
if(!((dwt->dn > 0) || (dwt->sn > 1))){
return;
}
a = 0;
b = 1;
}else{
if(!((dwt->sn > 0) || (dwt->dn > 1))) {
return;
}
a = 1;
b = 0;
}
#ifdef __SSE__
v4dwt_decode_step1_sse(dwt->wavelet+a, dwt->sn, _mm_set1_ps(K));
v4dwt_decode_step1_sse(dwt->wavelet+b, dwt->dn, _mm_set1_ps(c13318));
v4dwt_decode_step2_sse(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, int_min(dwt->sn, dwt->dn-a), _mm_set1_ps(dwt_delta));
v4dwt_decode_step2_sse(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, int_min(dwt->dn, dwt->sn-b), _mm_set1_ps(dwt_gamma));
v4dwt_decode_step2_sse(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, int_min(dwt->sn, dwt->dn-a), _mm_set1_ps(dwt_beta));
v4dwt_decode_step2_sse(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, int_min(dwt->dn, dwt->sn-b), _mm_set1_ps(dwt_alpha));
#else
v4dwt_decode_step1(dwt->wavelet+a, dwt->sn, K);
v4dwt_decode_step1(dwt->wavelet+b, dwt->dn, c13318);
v4dwt_decode_step2(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, int_min(dwt->sn, dwt->dn-a), dwt_delta);
v4dwt_decode_step2(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, int_min(dwt->dn, dwt->sn-b), dwt_gamma);
v4dwt_decode_step2(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, int_min(dwt->sn, dwt->dn-a), dwt_beta);
v4dwt_decode_step2(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, int_min(dwt->dn, dwt->sn-b), dwt_alpha);
#endif
}
 
/* <summary> */
/* Inverse 9-7 wavelet transform in 2-D. */
/* </summary> */
void dwt_decode_real(opj_tcd_tilecomp_t* restrict tilec, int numres){
v4dwt_t h;
v4dwt_t v;
 
opj_tcd_resolution_t* res = tilec->resolutions;
 
int rw = res->x1 - res->x0; /* width of the resolution level computed */
int rh = res->y1 - res->y0; /* height of the resolution level computed */
 
int w = tilec->x1 - tilec->x0;
 
h.wavelet = (v4*) opj_aligned_malloc((dwt_decode_max_resolution(res, numres)+5) * sizeof(v4));
v.wavelet = h.wavelet;
 
while( --numres) {
float * restrict aj = (float*) tilec->data;
int bufsize = (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0);
int j;
 
h.sn = rw;
v.sn = rh;
 
++res;
 
rw = res->x1 - res->x0; /* width of the resolution level computed */
rh = res->y1 - res->y0; /* height of the resolution level computed */
 
h.dn = rw - h.sn;
h.cas = res->x0 % 2;
 
for(j = rh; j > 3; j -= 4){
int k;
v4dwt_interleave_h(&h, aj, w, bufsize);
v4dwt_decode(&h);
for(k = rw; --k >= 0;){
aj[k ] = h.wavelet[k].f[0];
aj[k+w ] = h.wavelet[k].f[1];
aj[k+w*2] = h.wavelet[k].f[2];
aj[k+w*3] = h.wavelet[k].f[3];
}
aj += w*4;
bufsize -= w*4;
}
if (rh & 0x03) {
int k;
j = rh & 0x03;
v4dwt_interleave_h(&h, aj, w, bufsize);
v4dwt_decode(&h);
for(k = rw; --k >= 0;){
switch(j) {
case 3: aj[k+w*2] = h.wavelet[k].f[2];
case 2: aj[k+w ] = h.wavelet[k].f[1];
case 1: aj[k ] = h.wavelet[k].f[0];
}
}
}
 
v.dn = rh - v.sn;
v.cas = res->y0 % 2;
 
aj = (float*) tilec->data;
for(j = rw; j > 3; j -= 4){
int k;
v4dwt_interleave_v(&v, aj, w);
v4dwt_decode(&v);
for(k = 0; k < rh; ++k){
memcpy(&aj[k*w], &v.wavelet[k], 4 * sizeof(float));
}
aj += 4;
}
if (rw & 0x03){
int k;
j = rw & 0x03;
v4dwt_interleave_v(&v, aj, w);
v4dwt_decode(&v);
for(k = 0; k < rh; ++k){
memcpy(&aj[k*w], &v.wavelet[k], j * sizeof(float));
}
}
}
 
opj_aligned_free(h.wavelet);
}
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/dwt.h
0,0 → 1,113
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#ifndef __DWT_H
#define __DWT_H
/**
@file dwt.h
@brief Implementation of a discrete wavelet transform (DWT)
 
The functions in DWT.C have for goal to realize forward and inverse discret wavelet
transform with filter 5-3 (reversible) and filter 9-7 (irreversible). The functions in
DWT.C are used by some function in TCD.C.
*/
 
/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */
/*@{*/
 
 
/** @name Exported functions */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Forward 5-3 wavelet tranform in 2-D.
Apply a reversible DWT transform to a component of an image.
@param tilec Tile component information (current tile)
*/
void dwt_encode(opj_tcd_tilecomp_t * tilec);
/**
Inverse 5-3 wavelet tranform in 2-D.
Apply a reversible inverse DWT transform to a component of an image.
@param tilec Tile component information (current tile)
@param numres Number of resolution levels to decode
*/
void dwt_decode(opj_tcd_tilecomp_t* tilec, int numres);
/**
Get the gain of a subband for the reversible 5-3 DWT.
@param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH)
@return Returns 0 if orient = 0, returns 1 if orient = 1 or 2, returns 2 otherwise
*/
int dwt_getgain(int orient);
/**
Get the norm of a wavelet function of a subband at a specified level for the reversible 5-3 DWT.
@param level Level of the wavelet function
@param orient Band of the wavelet function
@return Returns the norm of the wavelet function
*/
double dwt_getnorm(int level, int orient);
/**
Forward 9-7 wavelet transform in 2-D.
Apply an irreversible DWT transform to a component of an image.
@param tilec Tile component information (current tile)
*/
void dwt_encode_real(opj_tcd_tilecomp_t * tilec);
/**
Inverse 9-7 wavelet transform in 2-D.
Apply an irreversible inverse DWT transform to a component of an image.
@param tilec Tile component information (current tile)
@param numres Number of resolution levels to decode
*/
void dwt_decode_real(opj_tcd_tilecomp_t* tilec, int numres);
/**
Get the gain of a subband for the irreversible 9-7 DWT.
@param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH)
@return Returns the gain of the 9-7 wavelet transform
*/
int dwt_getgain_real(int orient);
/**
Get the norm of a wavelet function of a subband at a specified level for the irreversible 9-7 DWT
@param level Level of the wavelet function
@param orient Band of the wavelet function
@return Returns the norm of the 9-7 wavelet
*/
double dwt_getnorm_real(int level, int orient);
/**
Explicit calculation of the Quantization Stepsizes
@param tccp Tile-component coding parameters
@param prec Precint analyzed
*/
void dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, int prec);
/* ----------------------------------------------------------------------- */
/*@}*/
 
/*@}*/
 
#endif /* __DWT_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/event.c
0,0 → 1,121
/*
* Copyright (c) 2005, Hervé Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#include "opj_includes.h"
 
/* ==========================================================
Utility functions
==========================================================*/
 
#ifndef _WIN32
static char*
i2a(unsigned i, char *a, unsigned r) {
if (i/r > 0) a = i2a(i/r,a,r);
*a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[i%r];
return a+1;
}
 
/**
Transforms integer i into an ascii string and stores the result in a;
string is encoded in the base indicated by r.
@param i Number to be converted
@param a String result
@param r Base of value; must be in the range 2 - 36
@return Returns a
*/
static char *
_itoa(int i, char *a, int r) {
r = ((r < 2) || (r > 36)) ? 10 : r;
if(i < 0) {
*a = '-';
*i2a(-i, a+1, r) = 0;
}
else *i2a(i, a, r) = 0;
return a;
}
 
#endif /* !_WIN32 */
 
/* ----------------------------------------------------------------------- */
 
opj_event_mgr_t* OPJ_CALLCONV opj_set_event_mgr(opj_common_ptr cinfo, opj_event_mgr_t *event_mgr, void *context) {
if(cinfo) {
opj_event_mgr_t *previous = cinfo->event_mgr;
cinfo->event_mgr = event_mgr;
cinfo->client_data = context;
return previous;
}
 
return NULL;
}
 
bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...) {
#define MSG_SIZE 512 /* 512 bytes should be more than enough for a short message */
opj_msg_callback msg_handler = NULL;
 
opj_event_mgr_t *event_mgr = cinfo->event_mgr;
if(event_mgr != NULL) {
switch(event_type) {
case EVT_ERROR:
msg_handler = event_mgr->error_handler;
break;
case EVT_WARNING:
msg_handler = event_mgr->warning_handler;
break;
case EVT_INFO:
msg_handler = event_mgr->info_handler;
break;
default:
break;
}
if(msg_handler == NULL) {
return false;
}
} else {
return false;
}
 
if ((fmt != NULL) && (event_mgr != NULL)) {
va_list arg;
int str_length/*, i, j*/; /* UniPG */
char message[MSG_SIZE];
memset(message, 0, MSG_SIZE);
/* initialize the optional parameter list */
va_start(arg, fmt);
/* check the length of the format string */
str_length = (strlen(fmt) > MSG_SIZE) ? MSG_SIZE : strlen(fmt);
/* parse the format string and put the result in 'message' */
vsprintf(message, fmt, arg); /* UniPG */
/* deinitialize the optional parameter list */
va_end(arg);
 
/* output the message to the user program */
msg_handler(message, cinfo->client_data);
}
 
return true;
}
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/event.h
0,0 → 1,58
/*
* Copyright (c) 2005, Hervé Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __EVENT_H
#define __EVENT_H
/**
@file event.h
@brief Implementation of a event callback system
 
The functions in EVENT.C have for goal to send output messages (errors, warnings, debug) to the user.
*/
 
#define EVT_ERROR 1 /**< Error event type */
#define EVT_WARNING 2 /**< Warning event type */
#define EVT_INFO 4 /**< Debug event type */
 
/** @defgroup EVENT EVENT - Implementation of a event callback system */
/*@{*/
 
/** @name Exported functions (see also openjpeg.h) */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Write formatted data to a string and send the string to a user callback.
@param cinfo Codec context info
@param event_type Event type or callback to use to send the message
@param fmt Format-control string (plus optionnal arguments)
@return Returns true if successful, returns false otherwise
*/
bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...);
/* ----------------------------------------------------------------------- */
/*@}*/
 
/*@}*/
 
#endif /* __EVENT_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/fix.h
0,0 → 1,64
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __FIX_H
#define __FIX_H
 
#if defined(_MSC_VER) || defined(__BORLANDC__)
#define int64 __int64
#else
#define int64 long long
#endif
 
/**
@file fix.h
@brief Implementation of operations of specific multiplication (FIX)
 
The functions in FIX.H have for goal to realize specific multiplication.
*/
 
/** @defgroup FIX FIX - Implementation of operations of specific multiplication */
/*@{*/
 
/**
Multiply two fixed-precision rational numbers.
@param a
@param b
@return Returns a * b
*/
static INLINE int fix_mul(int a, int b) {
int64 temp = (int64) a * (int64) b ;
temp += temp & 4096;
return (int) (temp >> 13) ;
}
 
/*@}*/
 
#endif /* __FIX_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/image.c
0,0 → 1,89
/*
* Copyright (c) 2005, Hervé Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#include "opj_includes.h"
 
opj_image_t* opj_image_create0(void) {
opj_image_t *image = (opj_image_t*)opj_calloc(1, sizeof(opj_image_t));
return image;
}
 
opj_image_t* OPJ_CALLCONV opj_image_create(int numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc) {
int compno;
opj_image_t *image = NULL;
 
image = (opj_image_t*) opj_calloc(1, sizeof(opj_image_t));
if(image) {
image->color_space = clrspc;
image->numcomps = numcmpts;
/* allocate memory for the per-component information */
image->comps = (opj_image_comp_t*)opj_malloc(image->numcomps * sizeof(opj_image_comp_t));
if(!image->comps) {
fprintf(stderr,"Unable to allocate memory for image.\n");
opj_image_destroy(image);
return NULL;
}
/* create the individual image components */
for(compno = 0; compno < numcmpts; compno++) {
opj_image_comp_t *comp = &image->comps[compno];
comp->dx = cmptparms[compno].dx;
comp->dy = cmptparms[compno].dy;
comp->w = cmptparms[compno].w;
comp->h = cmptparms[compno].h;
comp->x0 = cmptparms[compno].x0;
comp->y0 = cmptparms[compno].y0;
comp->prec = cmptparms[compno].prec;
comp->bpp = cmptparms[compno].bpp;
comp->sgnd = cmptparms[compno].sgnd;
comp->data = (int*) opj_calloc(comp->w * comp->h, sizeof(int));
if(!comp->data) {
fprintf(stderr,"Unable to allocate memory for image.\n");
opj_image_destroy(image);
return NULL;
}
}
}
 
return image;
}
 
void OPJ_CALLCONV opj_image_destroy(opj_image_t *image) {
int i;
if(image) {
if(image->comps) {
/* image components */
for(i = 0; i < image->numcomps; i++) {
opj_image_comp_t *image_comp = &image->comps[i];
if(image_comp->data) {
opj_free(image_comp->data);
}
}
opj_free(image->comps);
}
opj_free(image);
}
}
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/image.h
0,0 → 1,48
/*
* Copyright (c) 2005, Hervé Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __IMAGE_H
#define __IMAGE_H
/**
@file image.h
@brief Implementation of operations on images (IMAGE)
 
The functions in IMAGE.C have for goal to realize operations on images.
*/
 
/** @defgroup IMAGE IMAGE - Implementation of operations on images */
/*@{*/
 
/**
Create an empty image
@todo this function should be removed
@return returns an empty image if successful, returns NULL otherwise
*/
opj_image_t* opj_image_create0(void);
 
/*@}*/
 
#endif /* __IMAGE_H */
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/int.h
0,0 → 1,119
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __INT_H
#define __INT_H
/**
@file int.h
@brief Implementation of operations on integers (INT)
 
The functions in INT.H have for goal to realize operations on integers.
*/
 
/** @defgroup INT INT - Implementation of operations on integers */
/*@{*/
 
/** @name Exported functions (see also openjpeg.h) */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Get the minimum of two integers
@return Returns a if a < b else b
*/
static INLINE int int_min(int a, int b) {
return a < b ? a : b;
}
/**
Get the maximum of two integers
@return Returns a if a > b else b
*/
static INLINE int int_max(int a, int b) {
return (a > b) ? a : b;
}
/**
Clamp an integer inside an interval
@return
<ul>
<li>Returns a if (min < a < max)
<li>Returns max if (a > max)
<li>Returns min if (a < min)
</ul>
*/
static INLINE int int_clamp(int a, int min, int max) {
if (a < min)
return min;
if (a > max)
return max;
return a;
}
/**
@return Get absolute value of integer
*/
static INLINE int int_abs(int a) {
return a < 0 ? -a : a;
}
/**
Divide an integer and round upwards
@return Returns a divided by b
*/
static INLINE int int_ceildiv(int a, int b) {
return (a + b - 1) / b;
}
/**
Divide an integer by a power of 2 and round upwards
@return Returns a divided by 2^b
*/
static INLINE int int_ceildivpow2(int a, int b) {
return (a + (1 << b) - 1) >> b;
}
/**
Divide an integer by a power of 2 and round downwards
@return Returns a divided by 2^b
*/
static INLINE int int_floordivpow2(int a, int b) {
return a >> b;
}
/**
Get logarithm of an integer and round downwards
@return Returns log2(a)
*/
static INLINE int int_floorlog2(int a) {
int l;
for (l = 0; a > 1; l++) {
a >>= 1;
}
return l;
}
/* ----------------------------------------------------------------------- */
/*@}*/
 
/*@}*/
 
#endif
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/j2k.c
0,0 → 1,2434
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* Copyright (c) 2006-2007, Parvatha Elangovan
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#include "opj_includes.h"
 
/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */
/*@{*/
 
/** @name Local static functions */
/*@{*/
 
/**
Write the SOC marker (Start Of Codestream)
@param j2k J2K handle
*/
static void j2k_write_soc(opj_j2k_t *j2k);
/**
Read the SOC marker (Start of Codestream)
@param j2k J2K handle
*/
static void j2k_read_soc(opj_j2k_t *j2k);
/**
Write the SIZ marker (image and tile size)
@param j2k J2K handle
*/
static void j2k_write_siz(opj_j2k_t *j2k);
/**
Read the SIZ marker (image and tile size)
@param j2k J2K handle
*/
static void j2k_read_siz(opj_j2k_t *j2k);
/**
Write the COM marker (comment)
@param j2k J2K handle
*/
static void j2k_write_com(opj_j2k_t *j2k);
/**
Read the COM marker (comment)
@param j2k J2K handle
*/
static void j2k_read_com(opj_j2k_t *j2k);
/**
Write the value concerning the specified component in the marker COD and COC
@param j2k J2K handle
@param compno Number of the component concerned by the information written
*/
static void j2k_write_cox(opj_j2k_t *j2k, int compno);
/**
Read the value concerning the specified component in the marker COD and COC
@param j2k J2K handle
@param compno Number of the component concerned by the information read
*/
static void j2k_read_cox(opj_j2k_t *j2k, int compno);
/**
Write the COD marker (coding style default)
@param j2k J2K handle
*/
static void j2k_write_cod(opj_j2k_t *j2k);
/**
Read the COD marker (coding style default)
@param j2k J2K handle
*/
static void j2k_read_cod(opj_j2k_t *j2k);
/**
Write the COC marker (coding style component)
@param j2k J2K handle
@param compno Number of the component concerned by the information written
*/
static void j2k_write_coc(opj_j2k_t *j2k, int compno);
/**
Read the COC marker (coding style component)
@param j2k J2K handle
*/
static void j2k_read_coc(opj_j2k_t *j2k);
/**
Write the value concerning the specified component in the marker QCD and QCC
@param j2k J2K handle
@param compno Number of the component concerned by the information written
*/
static void j2k_write_qcx(opj_j2k_t *j2k, int compno);
/**
Read the value concerning the specified component in the marker QCD and QCC
@param j2k J2K handle
@param compno Number of the component concern by the information read
@param len Length of the information in the QCX part of the marker QCD/QCC
*/
static void j2k_read_qcx(opj_j2k_t *j2k, int compno, int len);
/**
Write the QCD marker (quantization default)
@param j2k J2K handle
*/
static void j2k_write_qcd(opj_j2k_t *j2k);
/**
Read the QCD marker (quantization default)
@param j2k J2K handle
*/
static void j2k_read_qcd(opj_j2k_t *j2k);
/**
Write the QCC marker (quantization component)
@param j2k J2K handle
@param compno Number of the component concerned by the information written
*/
static void j2k_write_qcc(opj_j2k_t *j2k, int compno);
/**
Read the QCC marker (quantization component)
@param j2k J2K handle
*/
static void j2k_read_qcc(opj_j2k_t *j2k);
/**
Write the POC marker (progression order change)
@param j2k J2K handle
*/
static void j2k_write_poc(opj_j2k_t *j2k);
/**
Read the POC marker (progression order change)
@param j2k J2K handle
*/
static void j2k_read_poc(opj_j2k_t *j2k);
/**
Read the CRG marker (component registration)
@param j2k J2K handle
*/
static void j2k_read_crg(opj_j2k_t *j2k);
/**
Read the TLM marker (tile-part lengths)
@param j2k J2K handle
*/
static void j2k_read_tlm(opj_j2k_t *j2k);
/**
Read the PLM marker (packet length, main header)
@param j2k J2K handle
*/
static void j2k_read_plm(opj_j2k_t *j2k);
/**
Read the PLT marker (packet length, tile-part header)
@param j2k J2K handle
*/
static void j2k_read_plt(opj_j2k_t *j2k);
/**
Read the PPM marker (packet packet headers, main header)
@param j2k J2K handle
*/
static void j2k_read_ppm(opj_j2k_t *j2k);
/**
Read the PPT marker (packet packet headers, tile-part header)
@param j2k J2K handle
*/
static void j2k_read_ppt(opj_j2k_t *j2k);
/**
Write the TLM marker (Mainheader)
@param j2k J2K handle
*/
static void j2k_write_tlm(opj_j2k_t *j2k);
/**
Write the SOT marker (start of tile-part)
@param j2k J2K handle
*/
static void j2k_write_sot(opj_j2k_t *j2k);
/**
Read the SOT marker (start of tile-part)
@param j2k J2K handle
*/
static void j2k_read_sot(opj_j2k_t *j2k);
/**
Write the SOD marker (start of data)
@param j2k J2K handle
@param tile_coder Pointer to a TCD handle
*/
static void j2k_write_sod(opj_j2k_t *j2k, void *tile_coder);
/**
Read the SOD marker (start of data)
@param j2k J2K handle
*/
static void j2k_read_sod(opj_j2k_t *j2k);
/**
Write the RGN marker (region-of-interest)
@param j2k J2K handle
@param compno Number of the component concerned by the information written
@param tileno Number of the tile concerned by the information written
*/
static void j2k_write_rgn(opj_j2k_t *j2k, int compno, int tileno);
/**
Read the RGN marker (region-of-interest)
@param j2k J2K handle
*/
static void j2k_read_rgn(opj_j2k_t *j2k);
/**
Write the EOC marker (end of codestream)
@param j2k J2K handle
*/
static void j2k_write_eoc(opj_j2k_t *j2k);
/**
Read the EOC marker (end of codestream)
@param j2k J2K handle
*/
static void j2k_read_eoc(opj_j2k_t *j2k);
/**
Read an unknown marker
@param j2k J2K handle
*/
static void j2k_read_unk(opj_j2k_t *j2k);
 
/*@}*/
 
/*@}*/
 
/* ----------------------------------------------------------------------- */
typedef struct j2k_prog_order{
OPJ_PROG_ORDER enum_prog;
char str_prog[4];
}j2k_prog_order_t;
 
j2k_prog_order_t j2k_prog_order_list[] = {
{CPRL, "CPRL"},
{LRCP, "LRCP"},
{PCRL, "PCRL"},
{RLCP, "RLCP"},
{RPCL, "RPCL"},
{(OPJ_PROG_ORDER)-1, ""}
};
 
char *j2k_convert_progression_order(OPJ_PROG_ORDER prg_order){
j2k_prog_order_t *po;
for(po = j2k_prog_order_list; po->enum_prog != -1; po++ ){
if(po->enum_prog == prg_order){
break;
}
}
return po->str_prog;
}
 
/* ----------------------------------------------------------------------- */
static int j2k_get_num_tp(opj_cp_t *cp,int pino,int tileno){
char *prog;
int i;
int tpnum=1,tpend=0;
opj_tcp_t *tcp = &cp->tcps[tileno];
prog = j2k_convert_progression_order(tcp->prg);
if(cp->tp_on == 1){
for(i=0;i<4;i++){
if(tpend!=1){
if( cp->tp_flag == prog[i] ){
tpend=1;cp->tp_pos=i;
}
switch(prog[i]){
case 'C':
tpnum= tpnum * tcp->pocs[pino].compE;
break;
case 'R':
tpnum= tpnum * tcp->pocs[pino].resE;
break;
case 'P':
tpnum= tpnum * tcp->pocs[pino].prcE;
break;
case 'L':
tpnum= tpnum * tcp->pocs[pino].layE;
break;
}
}
}
}else{
tpnum=1;
}
return tpnum;
}
 
/** mem allocation for TLM marker*/
int j2k_calculate_tp(opj_cp_t *cp,int img_numcomp,opj_image_t *image,opj_j2k_t *j2k ){
int pino,tileno,totnum_tp=0;
j2k->cur_totnum_tp = (int *) opj_malloc(cp->tw * cp->th * sizeof(int));
for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
int cur_totnum_tp = 0;
opj_tcp_t *tcp = &cp->tcps[tileno];
for(pino = 0; pino <= tcp->numpocs; pino++) {
int tp_num=0;
opj_pi_iterator_t *pi = pi_initialise_encode(image, cp, tileno,FINAL_PASS);
if(!pi) { return -1;}
tp_num = j2k_get_num_tp(cp,pino,tileno);
totnum_tp = totnum_tp + tp_num;
cur_totnum_tp = cur_totnum_tp + tp_num;
pi_destroy(pi, cp, tileno);
}
j2k->cur_totnum_tp[tileno] = cur_totnum_tp;
/* INDEX >> */
if (j2k->cstr_info) {
j2k->cstr_info->tile[tileno].num_tps = cur_totnum_tp;
j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(cur_totnum_tp * sizeof(opj_tp_info_t));
}
/* << INDEX */
}
return totnum_tp;
}
 
static void j2k_write_soc(opj_j2k_t *j2k) {
opj_cio_t *cio = j2k->cio;
cio_write(cio, J2K_MS_SOC, 2);
 
/* UniPG>> */
#ifdef USE_JPWL
 
/* update markers struct */
j2k_add_marker(j2k->cstr_info, J2K_MS_SOC, cio_tell(cio) - 2, 2);
 
#endif /* USE_JPWL */
/* <<UniPG */
}
 
static void j2k_read_soc(opj_j2k_t *j2k) {
j2k->state = J2K_STATE_MHSIZ;
/* Index */
if (j2k->cstr_info) {
j2k->cstr_info->main_head_start = cio_tell(j2k->cio) - 2;
j2k->cstr_info->codestream_size = cio_numbytesleft(j2k->cio) + 2 - j2k->cstr_info->main_head_start;
}
}
 
static void j2k_write_siz(opj_j2k_t *j2k) {
int i;
int lenp, len;
 
opj_cio_t *cio = j2k->cio;
opj_image_t *image = j2k->image;
opj_cp_t *cp = j2k->cp;
cio_write(cio, J2K_MS_SIZ, 2); /* SIZ */
lenp = cio_tell(cio);
cio_skip(cio, 2);
cio_write(cio, cp->rsiz, 2); /* Rsiz (capabilities) */
cio_write(cio, image->x1, 4); /* Xsiz */
cio_write(cio, image->y1, 4); /* Ysiz */
cio_write(cio, image->x0, 4); /* X0siz */
cio_write(cio, image->y0, 4); /* Y0siz */
cio_write(cio, cp->tdx, 4); /* XTsiz */
cio_write(cio, cp->tdy, 4); /* YTsiz */
cio_write(cio, cp->tx0, 4); /* XT0siz */
cio_write(cio, cp->ty0, 4); /* YT0siz */
cio_write(cio, image->numcomps, 2); /* Csiz */
for (i = 0; i < image->numcomps; i++) {
cio_write(cio, image->comps[i].prec - 1 + (image->comps[i].sgnd << 7), 1); /* Ssiz_i */
cio_write(cio, image->comps[i].dx, 1); /* XRsiz_i */
cio_write(cio, image->comps[i].dy, 1); /* YRsiz_i */
}
len = cio_tell(cio) - lenp;
cio_seek(cio, lenp);
cio_write(cio, len, 2); /* Lsiz */
cio_seek(cio, lenp + len);
}
 
static void j2k_read_siz(opj_j2k_t *j2k) {
int len, i;
opj_cio_t *cio = j2k->cio;
opj_image_t *image = j2k->image;
opj_cp_t *cp = j2k->cp;
len = cio_read(cio, 2); /* Lsiz */
cio_read(cio, 2); /* Rsiz (capabilities) */
image->x1 = cio_read(cio, 4); /* Xsiz */
image->y1 = cio_read(cio, 4); /* Ysiz */
image->x0 = cio_read(cio, 4); /* X0siz */
image->y0 = cio_read(cio, 4); /* Y0siz */
cp->tdx = cio_read(cio, 4); /* XTsiz */
cp->tdy = cio_read(cio, 4); /* YTsiz */
cp->tx0 = cio_read(cio, 4); /* XT0siz */
cp->ty0 = cio_read(cio, 4); /* YT0siz */
if ((image->x0<0)||(image->x1<0)||(image->y0<0)||(image->y1<0)) {
opj_event_msg(j2k->cinfo, EVT_ERROR,
"%s: invalid image size (x0:%d, x1:%d, y0:%d, y1:%d)\n",
image->x0,image->x1,image->y0,image->y1);
return;
}
image->numcomps = cio_read(cio, 2); /* Csiz */
 
#ifdef USE_JPWL
if (j2k->cp->correct) {
/* if JPWL is on, we check whether TX errors have damaged
too much the SIZ parameters */
if (!(image->x1 * image->y1)) {
opj_event_msg(j2k->cinfo, EVT_ERROR,
"JPWL: bad image size (%d x %d)\n",
image->x1, image->y1);
if (!JPWL_ASSUME || JPWL_ASSUME) {
opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
return;
}
}
if (image->numcomps != ((len - 38) / 3)) {
opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
"JPWL: Csiz is %d => space in SIZ only for %d comps.!!!\n",
image->numcomps, ((len - 38) / 3));
if (!JPWL_ASSUME) {
opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
return;
}
/* we try to correct */
opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n");
if (image->numcomps < ((len - 38) / 3)) {
len = 38 + 3 * image->numcomps;
opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting Lsiz to %d => HYPOTHESIS!!!\n",
len);
} else {
image->numcomps = ((len - 38) / 3);
opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting Csiz to %d => HYPOTHESIS!!!\n",
image->numcomps);
}
}
 
/* update components number in the jpwl_exp_comps filed */
cp->exp_comps = image->numcomps;
}
#endif /* USE_JPWL */
 
image->comps = (opj_image_comp_t*) opj_calloc(image->numcomps, sizeof(opj_image_comp_t));
for (i = 0; i < image->numcomps; i++) {
int tmp, w, h;
tmp = cio_read(cio, 1); /* Ssiz_i */
image->comps[i].prec = (tmp & 0x7f) + 1;
image->comps[i].sgnd = tmp >> 7;
image->comps[i].dx = cio_read(cio, 1); /* XRsiz_i */
image->comps[i].dy = cio_read(cio, 1); /* YRsiz_i */
#ifdef USE_JPWL
if (j2k->cp->correct) {
/* if JPWL is on, we check whether TX errors have damaged
too much the SIZ parameters, again */
if (!(image->comps[i].dx * image->comps[i].dy)) {
opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
"JPWL: bad XRsiz_%d/YRsiz_%d (%d x %d)\n",
i, i, image->comps[i].dx, image->comps[i].dy);
if (!JPWL_ASSUME) {
opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
return;
}
/* we try to correct */
opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust them\n");
if (!image->comps[i].dx) {
image->comps[i].dx = 1;
opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting XRsiz_%d to %d => HYPOTHESIS!!!\n",
i, image->comps[i].dx);
}
if (!image->comps[i].dy) {
image->comps[i].dy = 1;
opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting YRsiz_%d to %d => HYPOTHESIS!!!\n",
i, image->comps[i].dy);
}
}
}
#endif /* USE_JPWL */
 
/* TODO: unused ? */
w = int_ceildiv(image->x1 - image->x0, image->comps[i].dx);
h = int_ceildiv(image->y1 - image->y0, image->comps[i].dy);
 
image->comps[i].resno_decoded = 0; /* number of resolution decoded */
image->comps[i].factor = cp->reduce; /* reducing factor per component */
}
cp->tw = int_ceildiv(image->x1 - cp->tx0, cp->tdx);
cp->th = int_ceildiv(image->y1 - cp->ty0, cp->tdy);
 
#ifdef USE_JPWL
if (j2k->cp->correct) {
/* if JPWL is on, we check whether TX errors have damaged
too much the SIZ parameters */
if ((cp->tw < 1) || (cp->th < 1) || (cp->tw > cp->max_tiles) || (cp->th > cp->max_tiles)) {
opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
"JPWL: bad number of tiles (%d x %d)\n",
cp->tw, cp->th);
if (!JPWL_ASSUME) {
opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
return;
}
/* we try to correct */
opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust them\n");
if (cp->tw < 1) {
cp->tw= 1;
opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting %d tiles in x => HYPOTHESIS!!!\n",
cp->tw);
}
if (cp->tw > cp->max_tiles) {
cp->tw= 1;
opj_event_msg(j2k->cinfo, EVT_WARNING, "- too large x, increase expectance of %d\n"
"- setting %d tiles in x => HYPOTHESIS!!!\n",
cp->max_tiles, cp->tw);
}
if (cp->th < 1) {
cp->th= 1;
opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting %d tiles in y => HYPOTHESIS!!!\n",
cp->th);
}
if (cp->th > cp->max_tiles) {
cp->th= 1;
opj_event_msg(j2k->cinfo, EVT_WARNING, "- too large y, increase expectance of %d to continue\n",
"- setting %d tiles in y => HYPOTHESIS!!!\n",
cp->max_tiles, cp->th);
}
}
}
#endif /* USE_JPWL */
 
cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t));
cp->tileno = (int*) opj_malloc(cp->tw * cp->th * sizeof(int));
cp->tileno_size = 0;
#ifdef USE_JPWL
if (j2k->cp->correct) {
if (!cp->tcps) {
opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
"JPWL: could not alloc tcps field of cp\n");
if (!JPWL_ASSUME || JPWL_ASSUME) {
opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
return;
}
}
}
#endif /* USE_JPWL */
 
for (i = 0; i < cp->tw * cp->th; i++) {
cp->tcps[i].POC = 0;
cp->tcps[i].numpocs = 0;
cp->tcps[i].first = 1;
}
/* Initialization for PPM marker */
cp->ppm = 0;
cp->ppm_data = NULL;
cp->ppm_data_first = NULL;
cp->ppm_previous = 0;
cp->ppm_store = 0;
 
j2k->default_tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, sizeof(opj_tccp_t));
for (i = 0; i < cp->tw * cp->th; i++) {
cp->tcps[i].tccps = (opj_tccp_t*) opj_malloc(image->numcomps * sizeof(opj_tccp_t));
}
j2k->tile_data = (unsigned char**) opj_calloc(cp->tw * cp->th, sizeof(unsigned char*));
j2k->tile_len = (int*) opj_calloc(cp->tw * cp->th, sizeof(int));
j2k->state = J2K_STATE_MH;
 
/* Index */
if (j2k->cstr_info) {
opj_codestream_info_t *cstr_info = j2k->cstr_info;
cstr_info->image_w = image->x1 - image->x0;
cstr_info->image_h = image->y1 - image->y0;
cstr_info->numcomps = image->numcomps;
cstr_info->tw = cp->tw;
cstr_info->th = cp->th;
cstr_info->tile_x = cp->tdx;
cstr_info->tile_y = cp->tdy;
cstr_info->tile_Ox = cp->tx0;
cstr_info->tile_Oy = cp->ty0;
cstr_info->tile = (opj_tile_info_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tile_info_t));
}
}
 
static void j2k_write_com(opj_j2k_t *j2k) {
unsigned int i;
int lenp, len;
 
if(j2k->cp->comment) {
opj_cio_t *cio = j2k->cio;
char *comment = j2k->cp->comment;
 
cio_write(cio, J2K_MS_COM, 2);
lenp = cio_tell(cio);
cio_skip(cio, 2);
cio_write(cio, 1, 2); /* General use (IS 8859-15:1999 (Latin) values) */
for (i = 0; i < strlen(comment); i++) {
cio_write(cio, comment[i], 1);
}
len = cio_tell(cio) - lenp;
cio_seek(cio, lenp);
cio_write(cio, len, 2);
cio_seek(cio, lenp + len);
}
}
 
static void j2k_read_com(opj_j2k_t *j2k) {
int len;
opj_cio_t *cio = j2k->cio;
 
len = cio_read(cio, 2);
cio_skip(cio, len - 2);
}
 
static void j2k_write_cox(opj_j2k_t *j2k, int compno) {
int i;
 
opj_cp_t *cp = j2k->cp;
opj_tcp_t *tcp = &cp->tcps[j2k->curtileno];
opj_tccp_t *tccp = &tcp->tccps[compno];
opj_cio_t *cio = j2k->cio;
cio_write(cio, tccp->numresolutions - 1, 1); /* SPcox (D) */
cio_write(cio, tccp->cblkw - 2, 1); /* SPcox (E) */
cio_write(cio, tccp->cblkh - 2, 1); /* SPcox (F) */
cio_write(cio, tccp->cblksty, 1); /* SPcox (G) */
cio_write(cio, tccp->qmfbid, 1); /* SPcox (H) */
if (tccp->csty & J2K_CCP_CSTY_PRT) {
for (i = 0; i < tccp->numresolutions; i++) {
cio_write(cio, tccp->prcw[i] + (tccp->prch[i] << 4), 1); /* SPcox (I_i) */
}
}
}
 
static void j2k_read_cox(opj_j2k_t *j2k, int compno) {
int i;
 
opj_cp_t *cp = j2k->cp;
opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp;
opj_tccp_t *tccp = &tcp->tccps[compno];
opj_cio_t *cio = j2k->cio;
 
tccp->numresolutions = cio_read(cio, 1) + 1; /* SPcox (D) */
 
// If user wants to remove more resolutions than the codestream contains, return error
if (cp->reduce >= tccp->numresolutions) {
opj_event_msg(j2k->cinfo, EVT_ERROR, "Error decoding component %d.\nThe number of resolutions to remove is higher than the number "
"of resolutions of this component\nModify the cp_reduce parameter.\n\n", compno);
j2k->state |= J2K_STATE_ERR;
}
 
tccp->cblkw = cio_read(cio, 1) + 2; /* SPcox (E) */
tccp->cblkh = cio_read(cio, 1) + 2; /* SPcox (F) */
tccp->cblksty = cio_read(cio, 1); /* SPcox (G) */
tccp->qmfbid = cio_read(cio, 1); /* SPcox (H) */
if (tccp->csty & J2K_CP_CSTY_PRT) {
for (i = 0; i < tccp->numresolutions; i++) {
int tmp = cio_read(cio, 1); /* SPcox (I_i) */
tccp->prcw[i] = tmp & 0xf;
tccp->prch[i] = tmp >> 4;
}
}
 
/* INDEX >> */
if(j2k->cstr_info && compno == 0) {
for (i = 0; i < tccp->numresolutions; i++) {
if (tccp->csty & J2K_CP_CSTY_PRT) {
j2k->cstr_info->tile[j2k->curtileno].pdx[i] = tccp->prcw[i];
j2k->cstr_info->tile[j2k->curtileno].pdy[i] = tccp->prch[i];
}
else {
j2k->cstr_info->tile[j2k->curtileno].pdx[i] = 15;
j2k->cstr_info->tile[j2k->curtileno].pdx[i] = 15;
}
}
}
/* << INDEX */
}
 
static void j2k_write_cod(opj_j2k_t *j2k) {
opj_cp_t *cp = NULL;
opj_tcp_t *tcp = NULL;
int lenp, len;
 
opj_cio_t *cio = j2k->cio;
cio_write(cio, J2K_MS_COD, 2); /* COD */
lenp = cio_tell(cio);
cio_skip(cio, 2);
cp = j2k->cp;
tcp = &cp->tcps[j2k->curtileno];
 
cio_write(cio, tcp->csty, 1); /* Scod */
cio_write(cio, tcp->prg, 1); /* SGcod (A) */
cio_write(cio, tcp->numlayers, 2); /* SGcod (B) */
cio_write(cio, tcp->mct, 1); /* SGcod (C) */
j2k_write_cox(j2k, 0);
len = cio_tell(cio) - lenp;
cio_seek(cio, lenp);
cio_write(cio, len, 2); /* Lcod */
cio_seek(cio, lenp + len);
}
 
static void j2k_read_cod(opj_j2k_t *j2k) {
int len, i, pos;
opj_cio_t *cio = j2k->cio;
opj_cp_t *cp = j2k->cp;
opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp;
opj_image_t *image = j2k->image;
len = cio_read(cio, 2); /* Lcod */
tcp->csty = cio_read(cio, 1); /* Scod */
tcp->prg = (OPJ_PROG_ORDER)cio_read(cio, 1); /* SGcod (A) */
tcp->numlayers = cio_read(cio, 2); /* SGcod (B) */
tcp->mct = cio_read(cio, 1); /* SGcod (C) */
pos = cio_tell(cio);
for (i = 0; i < image->numcomps; i++) {
tcp->tccps[i].csty = tcp->csty & J2K_CP_CSTY_PRT;
cio_seek(cio, pos);
j2k_read_cox(j2k, i);
}
 
/* Index */
if (j2k->cstr_info) {
opj_codestream_info_t *cstr_info = j2k->cstr_info;
cstr_info->prog = tcp->prg;
cstr_info->numlayers = tcp->numlayers;
cstr_info->numdecompos = (int*) opj_malloc(image->numcomps * sizeof(int));
for (i = 0; i < image->numcomps; i++) {
cstr_info->numdecompos[i] = tcp->tccps[i].numresolutions - 1;
}
}
}
 
static void j2k_write_coc(opj_j2k_t *j2k, int compno) {
int lenp, len;
 
opj_cp_t *cp = j2k->cp;
opj_tcp_t *tcp = &cp->tcps[j2k->curtileno];
opj_image_t *image = j2k->image;
opj_cio_t *cio = j2k->cio;
cio_write(cio, J2K_MS_COC, 2); /* COC */
lenp = cio_tell(cio);
cio_skip(cio, 2);
cio_write(cio, compno, image->numcomps <= 256 ? 1 : 2); /* Ccoc */
cio_write(cio, tcp->tccps[compno].csty, 1); /* Scoc */
j2k_write_cox(j2k, compno);
len = cio_tell(cio) - lenp;
cio_seek(cio, lenp);
cio_write(cio, len, 2); /* Lcoc */
cio_seek(cio, lenp + len);
}
 
static void j2k_read_coc(opj_j2k_t *j2k) {
int len, compno;
 
opj_cp_t *cp = j2k->cp;
opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp;
opj_image_t *image = j2k->image;
opj_cio_t *cio = j2k->cio;
len = cio_read(cio, 2); /* Lcoc */
compno = cio_read(cio, image->numcomps <= 256 ? 1 : 2); /* Ccoc */
tcp->tccps[compno].csty = cio_read(cio, 1); /* Scoc */
j2k_read_cox(j2k, compno);
}
 
static void j2k_write_qcx(opj_j2k_t *j2k, int compno) {
int bandno, numbands;
int expn, mant;
opj_cp_t *cp = j2k->cp;
opj_tcp_t *tcp = &cp->tcps[j2k->curtileno];
opj_tccp_t *tccp = &tcp->tccps[compno];
opj_cio_t *cio = j2k->cio;
cio_write(cio, tccp->qntsty + (tccp->numgbits << 5), 1); /* Sqcx */
numbands = tccp->qntsty == J2K_CCP_QNTSTY_SIQNT ? 1 : tccp->numresolutions * 3 - 2;
for (bandno = 0; bandno < numbands; bandno++) {
expn = tccp->stepsizes[bandno].expn;
mant = tccp->stepsizes[bandno].mant;
if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
cio_write(cio, expn << 3, 1); /* SPqcx_i */
} else {
cio_write(cio, (expn << 11) + mant, 2); /* SPqcx_i */
}
}
}
 
static void j2k_read_qcx(opj_j2k_t *j2k, int compno, int len) {
int tmp;
int bandno, numbands;
 
opj_cp_t *cp = j2k->cp;
opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp;
opj_tccp_t *tccp = &tcp->tccps[compno];
opj_cio_t *cio = j2k->cio;
 
tmp = cio_read(cio, 1); /* Sqcx */
tccp->qntsty = tmp & 0x1f;
tccp->numgbits = tmp >> 5;
numbands = (tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ?
1 : ((tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) ? len - 1 : (len - 1) / 2);
 
#ifdef USE_JPWL
if (j2k->cp->correct) {
 
/* if JPWL is on, we check whether there are too many subbands */
if ((numbands < 0) || (numbands >= J2K_MAXBANDS)) {
opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
"JPWL: bad number of subbands in Sqcx (%d)\n",
numbands);
if (!JPWL_ASSUME) {
opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
return;
}
/* we try to correct */
numbands = 1;
opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust them\n"
"- setting number of bands to %d => HYPOTHESIS!!!\n",
numbands);
};
 
};
#endif /* USE_JPWL */
 
for (bandno = 0; bandno < numbands; bandno++) {
int expn, mant;
if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
expn = cio_read(cio, 1) >> 3; /* SPqcx_i */
mant = 0;
} else {
tmp = cio_read(cio, 2); /* SPqcx_i */
expn = tmp >> 11;
mant = tmp & 0x7ff;
}
tccp->stepsizes[bandno].expn = expn;
tccp->stepsizes[bandno].mant = mant;
}
/* Add Antonin : if scalar_derived -> compute other stepsizes */
if (tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) {
for (bandno = 1; bandno < J2K_MAXBANDS; bandno++) {
tccp->stepsizes[bandno].expn =
((tccp->stepsizes[0].expn) - ((bandno - 1) / 3) > 0) ?
(tccp->stepsizes[0].expn) - ((bandno - 1) / 3) : 0;
tccp->stepsizes[bandno].mant = tccp->stepsizes[0].mant;
}
}
/* ddA */
}
 
static void j2k_write_qcd(opj_j2k_t *j2k) {
int lenp, len;
 
opj_cio_t *cio = j2k->cio;
cio_write(cio, J2K_MS_QCD, 2); /* QCD */
lenp = cio_tell(cio);
cio_skip(cio, 2);
j2k_write_qcx(j2k, 0);
len = cio_tell(cio) - lenp;
cio_seek(cio, lenp);
cio_write(cio, len, 2); /* Lqcd */
cio_seek(cio, lenp + len);
}
 
static void j2k_read_qcd(opj_j2k_t *j2k) {
int len, i, pos;
 
opj_cio_t *cio = j2k->cio;
opj_image_t *image = j2k->image;
len = cio_read(cio, 2); /* Lqcd */
pos = cio_tell(cio);
for (i = 0; i < image->numcomps; i++) {
cio_seek(cio, pos);
j2k_read_qcx(j2k, i, len - 2);
}
}
 
static void j2k_write_qcc(opj_j2k_t *j2k, int compno) {
int lenp, len;
 
opj_cio_t *cio = j2k->cio;
cio_write(cio, J2K_MS_QCC, 2); /* QCC */
lenp = cio_tell(cio);
cio_skip(cio, 2);
cio_write(cio, compno, j2k->image->numcomps <= 256 ? 1 : 2); /* Cqcc */
j2k_write_qcx(j2k, compno);
len = cio_tell(cio) - lenp;
cio_seek(cio, lenp);
cio_write(cio, len, 2); /* Lqcc */
cio_seek(cio, lenp + len);
}
 
static void j2k_read_qcc(opj_j2k_t *j2k) {
int len, compno;
int numcomp = j2k->image->numcomps;
opj_cio_t *cio = j2k->cio;
len = cio_read(cio, 2); /* Lqcc */
compno = cio_read(cio, numcomp <= 256 ? 1 : 2); /* Cqcc */
 
#ifdef USE_JPWL
if (j2k->cp->correct) {
 
static int backup_compno = 0;
 
/* compno is negative or larger than the number of components!!! */
if ((compno < 0) || (compno >= numcomp)) {
opj_event_msg(j2k->cinfo, EVT_ERROR,
"JPWL: bad component number in QCC (%d out of a maximum of %d)\n",
compno, numcomp);
if (!JPWL_ASSUME) {
opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
return;
}
/* we try to correct */
compno = backup_compno % numcomp;
opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n"
"- setting component number to %d\n",
compno);
}
 
/* keep your private count of tiles */
backup_compno++;
};
#endif /* USE_JPWL */
 
j2k_read_qcx(j2k, compno, len - 2 - (numcomp <= 256 ? 1 : 2));
}
 
static void j2k_write_poc(opj_j2k_t *j2k) {
int len, numpchgs, i;
 
int numcomps = j2k->image->numcomps;
opj_cp_t *cp = j2k->cp;
opj_tcp_t *tcp = &cp->tcps[j2k->curtileno];
opj_tccp_t *tccp = &tcp->tccps[0];
opj_cio_t *cio = j2k->cio;
 
numpchgs = 1 + tcp->numpocs;
cio_write(cio, J2K_MS_POC, 2); /* POC */
len = 2 + (5 + 2 * (numcomps <= 256 ? 1 : 2)) * numpchgs;
cio_write(cio, len, 2); /* Lpoc */
for (i = 0; i < numpchgs; i++) {
opj_poc_t *poc = &tcp->pocs[i];
cio_write(cio, poc->resno0, 1); /* RSpoc_i */
cio_write(cio, poc->compno0, (numcomps <= 256 ? 1 : 2)); /* CSpoc_i */
cio_write(cio, poc->layno1, 2); /* LYEpoc_i */
poc->layno1 = int_min(poc->layno1, tcp->numlayers);
cio_write(cio, poc->resno1, 1); /* REpoc_i */
poc->resno1 = int_min(poc->resno1, tccp->numresolutions);
cio_write(cio, poc->compno1, (numcomps <= 256 ? 1 : 2)); /* CEpoc_i */
poc->compno1 = int_min(poc->compno1, numcomps);
cio_write(cio, poc->prg, 1); /* Ppoc_i */
}
}
 
static void j2k_read_poc(opj_j2k_t *j2k) {
int len, numpchgs, i, old_poc;
 
int numcomps = j2k->image->numcomps;
opj_cp_t *cp = j2k->cp;
opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp;
opj_cio_t *cio = j2k->cio;
old_poc = tcp->POC ? tcp->numpocs + 1 : 0;
tcp->POC = 1;
len = cio_read(cio, 2); /* Lpoc */
numpchgs = (len - 2) / (5 + 2 * (numcomps <= 256 ? 1 : 2));
for (i = old_poc; i < numpchgs + old_poc; i++) {
opj_poc_t *poc;
poc = &tcp->pocs[i];
poc->resno0 = cio_read(cio, 1); /* RSpoc_i */
poc->compno0 = cio_read(cio, numcomps <= 256 ? 1 : 2); /* CSpoc_i */
poc->layno1 = cio_read(cio, 2); /* LYEpoc_i */
poc->resno1 = cio_read(cio, 1); /* REpoc_i */
poc->compno1 = int_min(
cio_read(cio, numcomps <= 256 ? 1 : 2), (unsigned int) numcomps); /* CEpoc_i */
poc->prg = (OPJ_PROG_ORDER)cio_read(cio, 1); /* Ppoc_i */
}
tcp->numpocs = numpchgs + old_poc - 1;
}
 
static void j2k_read_crg(opj_j2k_t *j2k) {
int len, i, Xcrg_i, Ycrg_i;
opj_cio_t *cio = j2k->cio;
int numcomps = j2k->image->numcomps;
len = cio_read(cio, 2); /* Lcrg */
for (i = 0; i < numcomps; i++) {
Xcrg_i = cio_read(cio, 2); /* Xcrg_i */
Ycrg_i = cio_read(cio, 2); /* Ycrg_i */
}
}
 
static void j2k_read_tlm(opj_j2k_t *j2k) {
int len, Ztlm, Stlm, ST, SP, tile_tlm, i;
long int Ttlm_i, Ptlm_i;
 
opj_cio_t *cio = j2k->cio;
len = cio_read(cio, 2); /* Ltlm */
Ztlm = cio_read(cio, 1); /* Ztlm */
Stlm = cio_read(cio, 1); /* Stlm */
ST = ((Stlm >> 4) & 0x01) + ((Stlm >> 4) & 0x02);
SP = (Stlm >> 6) & 0x01;
tile_tlm = (len - 4) / ((SP + 1) * 2 + ST);
for (i = 0; i < tile_tlm; i++) {
Ttlm_i = cio_read(cio, ST); /* Ttlm_i */
Ptlm_i = cio_read(cio, SP ? 4 : 2); /* Ptlm_i */
}
}
 
static void j2k_read_plm(opj_j2k_t *j2k) {
int len, i, Zplm, Nplm, add, packet_len = 0;
opj_cio_t *cio = j2k->cio;
 
len = cio_read(cio, 2); /* Lplm */
Zplm = cio_read(cio, 1); /* Zplm */
len -= 3;
while (len > 0) {
Nplm = cio_read(cio, 4); /* Nplm */
len -= 4;
for (i = Nplm; i > 0; i--) {
add = cio_read(cio, 1);
len--;
packet_len = (packet_len << 7) + add; /* Iplm_ij */
if ((add & 0x80) == 0) {
/* New packet */
packet_len = 0;
}
if (len <= 0)
break;
}
}
}
 
static void j2k_read_plt(opj_j2k_t *j2k) {
int len, i, Zplt, packet_len = 0, add;
opj_cio_t *cio = j2k->cio;
len = cio_read(cio, 2); /* Lplt */
Zplt = cio_read(cio, 1); /* Zplt */
for (i = len - 3; i > 0; i--) {
add = cio_read(cio, 1);
packet_len = (packet_len << 7) + add; /* Iplt_i */
if ((add & 0x80) == 0) {
/* New packet */
packet_len = 0;
}
}
}
 
static void j2k_read_ppm(opj_j2k_t *j2k) {
int len, Z_ppm, i, j;
int N_ppm;
 
opj_cp_t *cp = j2k->cp;
opj_cio_t *cio = j2k->cio;
len = cio_read(cio, 2);
cp->ppm = 1;
Z_ppm = cio_read(cio, 1); /* Z_ppm */
len -= 3;
while (len > 0) {
if (cp->ppm_previous == 0) {
N_ppm = cio_read(cio, 4); /* N_ppm */
len -= 4;
} else {
N_ppm = cp->ppm_previous;
}
j = cp->ppm_store;
if (Z_ppm == 0) { /* First PPM marker */
cp->ppm_data = (unsigned char *) opj_malloc(N_ppm * sizeof(unsigned char));
cp->ppm_data_first = cp->ppm_data;
cp->ppm_len = N_ppm;
} else { /* NON-first PPM marker */
cp->ppm_data = (unsigned char *) opj_realloc(cp->ppm_data, (N_ppm + cp->ppm_store) * sizeof(unsigned char));
 
#ifdef USE_JPWL
/* this memory allocation check could be done even in non-JPWL cases */
if (cp->correct) {
if (!cp->ppm_data) {
opj_event_msg(j2k->cinfo, EVT_ERROR,
"JPWL: failed memory allocation during PPM marker parsing (pos. %x)\n",
cio_tell(cio));
if (!JPWL_ASSUME || JPWL_ASSUME) {
opj_free(cp->ppm_data);
opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
return;
}
}
}
#endif
 
cp->ppm_data_first = cp->ppm_data;
cp->ppm_len = N_ppm + cp->ppm_store;
}
for (i = N_ppm; i > 0; i--) { /* Read packet header */
cp->ppm_data[j] = cio_read(cio, 1);
j++;
len--;
if (len == 0)
break; /* Case of non-finished packet header in present marker but finished in next one */
}
cp->ppm_previous = i - 1;
cp->ppm_store = j;
}
}
 
static void j2k_read_ppt(opj_j2k_t *j2k) {
int len, Z_ppt, i, j = 0;
 
opj_cp_t *cp = j2k->cp;
opj_tcp_t *tcp = cp->tcps + j2k->curtileno;
opj_cio_t *cio = j2k->cio;
 
len = cio_read(cio, 2);
Z_ppt = cio_read(cio, 1);
tcp->ppt = 1;
if (Z_ppt == 0) { /* First PPT marker */
tcp->ppt_data = (unsigned char *) opj_malloc((len - 3) * sizeof(unsigned char));
tcp->ppt_data_first = tcp->ppt_data;
tcp->ppt_store = 0;
tcp->ppt_len = len - 3;
} else { /* NON-first PPT marker */
tcp->ppt_data = (unsigned char *) opj_realloc(tcp->ppt_data, (len - 3 + tcp->ppt_store) * sizeof(unsigned char));
tcp->ppt_data_first = tcp->ppt_data;
tcp->ppt_len = len - 3 + tcp->ppt_store;
}
j = tcp->ppt_store;
for (i = len - 3; i > 0; i--) {
tcp->ppt_data[j] = cio_read(cio, 1);
j++;
}
tcp->ppt_store = j;
}
 
static void j2k_write_tlm(opj_j2k_t *j2k){
int lenp;
opj_cio_t *cio = j2k->cio;
j2k->tlm_start = cio_tell(cio);
cio_write(cio, J2K_MS_TLM, 2);/* TLM */
lenp = 4 + (5*j2k->totnum_tp);
cio_write(cio,lenp,2); /* Ltlm */
cio_write(cio, 0,1); /* Ztlm=0*/
cio_write(cio,80,1); /* Stlm ST=1(8bits-255 tiles max),SP=1(Ptlm=32bits) */
cio_skip(cio,5*j2k->totnum_tp);
}
 
static void j2k_write_sot(opj_j2k_t *j2k) {
int lenp, len;
 
opj_cio_t *cio = j2k->cio;
 
j2k->sot_start = cio_tell(cio);
cio_write(cio, J2K_MS_SOT, 2); /* SOT */
lenp = cio_tell(cio);
cio_skip(cio, 2); /* Lsot (further) */
cio_write(cio, j2k->curtileno, 2); /* Isot */
cio_skip(cio, 4); /* Psot (further in j2k_write_sod) */
cio_write(cio, j2k->cur_tp_num , 1); /* TPsot */
cio_write(cio, j2k->cur_totnum_tp[j2k->curtileno], 1); /* TNsot */
len = cio_tell(cio) - lenp;
cio_seek(cio, lenp);
cio_write(cio, len, 2); /* Lsot */
cio_seek(cio, lenp + len);
 
/* UniPG>> */
#ifdef USE_JPWL
/* update markers struct */
j2k_add_marker(j2k->cstr_info, J2K_MS_SOT, j2k->sot_start, len + 2);
#endif /* USE_JPWL */
/* <<UniPG */
}
 
static void j2k_read_sot(opj_j2k_t *j2k) {
int len, tileno, totlen, partno, numparts, i;
opj_tcp_t *tcp = NULL;
char status = 0;
 
opj_cp_t *cp = j2k->cp;
opj_cio_t *cio = j2k->cio;
 
len = cio_read(cio, 2);
tileno = cio_read(cio, 2);
 
#ifdef USE_JPWL
if (j2k->cp->correct) {
 
static int backup_tileno = 0;
 
/* tileno is negative or larger than the number of tiles!!! */
if ((tileno < 0) || (tileno > (cp->tw * cp->th))) {
opj_event_msg(j2k->cinfo, EVT_ERROR,
"JPWL: bad tile number (%d out of a maximum of %d)\n",
tileno, (cp->tw * cp->th));
if (!JPWL_ASSUME) {
opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
return;
}
/* we try to correct */
tileno = backup_tileno;
opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n"
"- setting tile number to %d\n",
tileno);
}
 
/* keep your private count of tiles */
backup_tileno++;
};
#endif /* USE_JPWL */
if (cp->tileno_size == 0) {
cp->tileno[cp->tileno_size] = tileno;
cp->tileno_size++;
} else {
i = 0;
while (i < cp->tileno_size && status == 0) {
status = cp->tileno[i] == tileno ? 1 : 0;
i++;
}
if (status == 0) {
cp->tileno[cp->tileno_size] = tileno;
cp->tileno_size++;
}
}
totlen = cio_read(cio, 4);
 
#ifdef USE_JPWL
if (j2k->cp->correct) {
 
/* totlen is negative or larger than the bytes left!!! */
if ((totlen < 0) || (totlen > (cio_numbytesleft(cio) + 8))) {
opj_event_msg(j2k->cinfo, EVT_ERROR,
"JPWL: bad tile byte size (%d bytes against %d bytes left)\n",
totlen, cio_numbytesleft(cio) + 8);
if (!JPWL_ASSUME) {
opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
return;
}
/* we try to correct */
totlen = 0;
opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n"
"- setting Psot to %d => assuming it is the last tile\n",
totlen);
}
 
};
#endif /* USE_JPWL */
 
if (!totlen)
totlen = cio_numbytesleft(cio) + 8;
partno = cio_read(cio, 1);
numparts = cio_read(cio, 1);
j2k->curtileno = tileno;
j2k->cur_tp_num = partno;
j2k->eot = cio_getbp(cio) - 12 + totlen;
j2k->state = J2K_STATE_TPH;
tcp = &cp->tcps[j2k->curtileno];
 
/* Index */
if (j2k->cstr_info) {
if (tcp->first) {
if (tileno == 0)
j2k->cstr_info->main_head_end = cio_tell(cio) - 13;
j2k->cstr_info->tile[tileno].tileno = tileno;
j2k->cstr_info->tile[tileno].start_pos = cio_tell(cio) - 12;
j2k->cstr_info->tile[tileno].end_pos = j2k->cstr_info->tile[tileno].start_pos + totlen - 1;
j2k->cstr_info->tile[tileno].num_tps = numparts;
if (numparts)
j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(numparts * sizeof(opj_tp_info_t));
else
j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(10 * sizeof(opj_tp_info_t)); // Fixme (10)
}
else {
j2k->cstr_info->tile[tileno].end_pos += totlen;
}
j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos = cio_tell(cio) - 12;
j2k->cstr_info->tile[tileno].tp[partno].tp_end_pos =
j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos + totlen - 1;
}
if (tcp->first == 1) {
/* Initialization PPT */
opj_tccp_t *tmp = tcp->tccps;
memcpy(tcp, j2k->default_tcp, sizeof(opj_tcp_t));
tcp->ppt = 0;
tcp->ppt_data = NULL;
tcp->ppt_data_first = NULL;
tcp->tccps = tmp;
 
for (i = 0; i < j2k->image->numcomps; i++) {
tcp->tccps[i] = j2k->default_tcp->tccps[i];
}
cp->tcps[j2k->curtileno].first = 0;
}
}
 
static void j2k_write_sod(opj_j2k_t *j2k, void *tile_coder) {
int l, layno;
int totlen;
opj_tcp_t *tcp = NULL;
opj_codestream_info_t *cstr_info = NULL;
opj_tcd_t *tcd = (opj_tcd_t*)tile_coder; /* cast is needed because of conflicts in header inclusions */
opj_cp_t *cp = j2k->cp;
opj_cio_t *cio = j2k->cio;
 
tcd->tp_num = j2k->tp_num ;
tcd->cur_tp_num = j2k->cur_tp_num;
cio_write(cio, J2K_MS_SOD, 2);
if (j2k->curtileno == 0) {
j2k->sod_start = cio_tell(cio) + j2k->pos_correction;
}
 
/* INDEX >> */
cstr_info = j2k->cstr_info;
if (cstr_info) {
if (!j2k->cur_tp_num ) {
cstr_info->tile[j2k->curtileno].end_header = cio_tell(cio) + j2k->pos_correction - 1;
j2k->cstr_info->tile[j2k->curtileno].tileno = j2k->curtileno;
}
else{
if(cstr_info->tile[j2k->curtileno].packet[cstr_info->packno - 1].end_pos < cio_tell(cio))
cstr_info->tile[j2k->curtileno].packet[cstr_info->packno].start_pos = cio_tell(cio);
}
/* UniPG>> */
#ifdef USE_JPWL
/* update markers struct */
j2k_add_marker(j2k->cstr_info, J2K_MS_SOD, j2k->sod_start, 2);
#endif /* USE_JPWL */
/* <<UniPG */
}
/* << INDEX */
tcp = &cp->tcps[j2k->curtileno];
for (layno = 0; layno < tcp->numlayers; layno++) {
if (tcp->rates[layno]>(j2k->sod_start / (cp->th * cp->tw))) {
tcp->rates[layno]-=(j2k->sod_start / (cp->th * cp->tw));
} else if (tcp->rates[layno]) {
tcp->rates[layno]=1;
}
}
if(j2k->cur_tp_num == 0){
tcd->tcd_image->tiles->packno = 0;
if(cstr_info)
cstr_info->packno = 0;
}
l = tcd_encode_tile(tcd, j2k->curtileno, cio_getbp(cio), cio_numbytesleft(cio) - 2, cstr_info);
/* Writing Psot in SOT marker */
totlen = cio_tell(cio) + l - j2k->sot_start;
cio_seek(cio, j2k->sot_start + 6);
cio_write(cio, totlen, 4);
cio_seek(cio, j2k->sot_start + totlen);
/* Writing Ttlm and Ptlm in TLM marker */
if(cp->cinema){
cio_seek(cio, j2k->tlm_start + 6 + (5*j2k->cur_tp_num));
cio_write(cio, j2k->curtileno, 1);
cio_write(cio, totlen, 4);
}
cio_seek(cio, j2k->sot_start + totlen);
}
 
static void j2k_read_sod(opj_j2k_t *j2k) {
int len, truncate = 0, i;
unsigned char *data = NULL, *data_ptr = NULL;
 
opj_cio_t *cio = j2k->cio;
int curtileno = j2k->curtileno;
 
/* Index */
if (j2k->cstr_info) {
j2k->cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_end_header =
cio_tell(cio) + j2k->pos_correction - 1;
if (j2k->cur_tp_num == 0)
j2k->cstr_info->tile[j2k->curtileno].end_header = cio_tell(cio) + j2k->pos_correction - 1;
j2k->cstr_info->packno = 0;
}
len = int_min(j2k->eot - cio_getbp(cio), cio_numbytesleft(cio) + 1);
 
if (len == cio_numbytesleft(cio) + 1) {
truncate = 1; /* Case of a truncate codestream */
}
 
data = j2k->tile_data[curtileno];
data = (unsigned char*) opj_realloc(data, (j2k->tile_len[curtileno] + len) * sizeof(unsigned char));
 
data_ptr = data + j2k->tile_len[curtileno];
for (i = 0; i < len; i++) {
data_ptr[i] = cio_read(cio, 1);
}
 
j2k->tile_len[curtileno] += len;
j2k->tile_data[curtileno] = data;
if (!truncate) {
j2k->state = J2K_STATE_TPHSOT;
} else {
j2k->state = J2K_STATE_NEOC; /* RAJOUTE !! */
}
j2k->cur_tp_num++;
}
 
static void j2k_write_rgn(opj_j2k_t *j2k, int compno, int tileno) {
opj_cp_t *cp = j2k->cp;
opj_tcp_t *tcp = &cp->tcps[tileno];
opj_cio_t *cio = j2k->cio;
int numcomps = j2k->image->numcomps;
cio_write(cio, J2K_MS_RGN, 2); /* RGN */
cio_write(cio, numcomps <= 256 ? 5 : 6, 2); /* Lrgn */
cio_write(cio, compno, numcomps <= 256 ? 1 : 2); /* Crgn */
cio_write(cio, 0, 1); /* Srgn */
cio_write(cio, tcp->tccps[compno].roishift, 1); /* SPrgn */
}
 
static void j2k_read_rgn(opj_j2k_t *j2k) {
int len, compno, roisty;
 
opj_cp_t *cp = j2k->cp;
opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp;
opj_cio_t *cio = j2k->cio;
int numcomps = j2k->image->numcomps;
 
len = cio_read(cio, 2); /* Lrgn */
compno = cio_read(cio, numcomps <= 256 ? 1 : 2); /* Crgn */
roisty = cio_read(cio, 1); /* Srgn */
 
#ifdef USE_JPWL
if (j2k->cp->correct) {
/* totlen is negative or larger than the bytes left!!! */
if (compno >= numcomps) {
opj_event_msg(j2k->cinfo, EVT_ERROR,
"JPWL: bad component number in RGN (%d when there are only %d)\n",
compno, numcomps);
if (!JPWL_ASSUME || JPWL_ASSUME) {
opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
return;
}
}
};
#endif /* USE_JPWL */
 
tcp->tccps[compno].roishift = cio_read(cio, 1); /* SPrgn */
}
 
static void j2k_write_eoc(opj_j2k_t *j2k) {
opj_cio_t *cio = j2k->cio;
/* opj_event_msg(j2k->cinfo, "%.8x: EOC\n", cio_tell(cio) + j2k->pos_correction); */
cio_write(cio, J2K_MS_EOC, 2);
 
/* UniPG>> */
#ifdef USE_JPWL
/* update markers struct */
j2k_add_marker(j2k->cstr_info, J2K_MS_EOC, cio_tell(cio) - 2, 2);
#endif /* USE_JPWL */
/* <<UniPG */
}
 
static void j2k_read_eoc(opj_j2k_t *j2k) {
int i, tileno;
bool success;
 
/* if packets should be decoded */
if (j2k->cp->limit_decoding != DECODE_ALL_BUT_PACKETS) {
opj_tcd_t *tcd = tcd_create(j2k->cinfo);
tcd_malloc_decode(tcd, j2k->image, j2k->cp);
for (i = 0; i < j2k->cp->tileno_size; i++) {
tcd_malloc_decode_tile(tcd, j2k->image, j2k->cp, i, j2k->cstr_info);
tileno = j2k->cp->tileno[i];
success = tcd_decode_tile(tcd, j2k->tile_data[tileno], j2k->tile_len[tileno], tileno, j2k->cstr_info);
opj_free(j2k->tile_data[tileno]);
j2k->tile_data[tileno] = NULL;
tcd_free_decode_tile(tcd, i);
if (success == false) {
j2k->state |= J2K_STATE_ERR;
break;
}
}
tcd_free_decode(tcd);
tcd_destroy(tcd);
}
/* if packets should not be decoded */
else {
for (i = 0; i < j2k->cp->tileno_size; i++) {
tileno = j2k->cp->tileno[i];
opj_free(j2k->tile_data[tileno]);
j2k->tile_data[tileno] = NULL;
}
}
if (j2k->state & J2K_STATE_ERR)
j2k->state = J2K_STATE_MT + J2K_STATE_ERR;
else
j2k->state = J2K_STATE_MT;
}
 
typedef struct opj_dec_mstabent {
/** marker value */
int id;
/** value of the state when the marker can appear */
int states;
/** action linked to the marker */
void (*handler) (opj_j2k_t *j2k);
} opj_dec_mstabent_t;
 
opj_dec_mstabent_t j2k_dec_mstab[] = {
{J2K_MS_SOC, J2K_STATE_MHSOC, j2k_read_soc},
{J2K_MS_SOT, J2K_STATE_MH | J2K_STATE_TPHSOT, j2k_read_sot},
{J2K_MS_SOD, J2K_STATE_TPH, j2k_read_sod},
{J2K_MS_EOC, J2K_STATE_TPHSOT, j2k_read_eoc},
{J2K_MS_SIZ, J2K_STATE_MHSIZ, j2k_read_siz},
{J2K_MS_COD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_cod},
{J2K_MS_COC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_coc},
{J2K_MS_RGN, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_rgn},
{J2K_MS_QCD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_qcd},
{J2K_MS_QCC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_qcc},
{J2K_MS_POC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_poc},
{J2K_MS_TLM, J2K_STATE_MH, j2k_read_tlm},
{J2K_MS_PLM, J2K_STATE_MH, j2k_read_plm},
{J2K_MS_PLT, J2K_STATE_TPH, j2k_read_plt},
{J2K_MS_PPM, J2K_STATE_MH, j2k_read_ppm},
{J2K_MS_PPT, J2K_STATE_TPH, j2k_read_ppt},
{J2K_MS_SOP, 0, 0},
{J2K_MS_CRG, J2K_STATE_MH, j2k_read_crg},
{J2K_MS_COM, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_com},
 
#ifdef USE_JPWL
{J2K_MS_EPC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epc},
{J2K_MS_EPB, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epb},
{J2K_MS_ESD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_esd},
{J2K_MS_RED, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_red},
#endif /* USE_JPWL */
#ifdef USE_JPSEC
{J2K_MS_SEC, J2K_STATE_MH, j2k_read_sec},
{J2K_MS_INSEC, 0, j2k_read_insec},
#endif /* USE_JPSEC */
 
{0, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_unk}
};
 
static void j2k_read_unk(opj_j2k_t *j2k) {
opj_event_msg(j2k->cinfo, EVT_WARNING, "Unknown marker\n");
 
#ifdef USE_JPWL
if (j2k->cp->correct) {
int m = 0, id, i;
int min_id = 0, min_dist = 17, cur_dist = 0, tmp_id;
cio_seek(j2k->cio, cio_tell(j2k->cio) - 2);
id = cio_read(j2k->cio, 2);
opj_event_msg(j2k->cinfo, EVT_ERROR,
"JPWL: really don't know this marker %x\n",
id);
if (!JPWL_ASSUME) {
opj_event_msg(j2k->cinfo, EVT_ERROR,
"- possible synch loss due to uncorrectable codestream errors => giving up\n");
return;
}
/* OK, activate this at your own risk!!! */
/* we look for the marker at the minimum hamming distance from this */
while (j2k_dec_mstab[m].id) {
/* 1's where they differ */
tmp_id = j2k_dec_mstab[m].id ^ id;
 
/* compute the hamming distance between our id and the current */
cur_dist = 0;
for (i = 0; i < 16; i++) {
if ((tmp_id >> i) & 0x0001) {
cur_dist++;
}
}
 
/* if current distance is smaller, set the minimum */
if (cur_dist < min_dist) {
min_dist = cur_dist;
min_id = j2k_dec_mstab[m].id;
}
/* jump to the next marker */
m++;
}
 
/* do we substitute the marker? */
if (min_dist < JPWL_MAXIMUM_HAMMING) {
opj_event_msg(j2k->cinfo, EVT_ERROR,
"- marker %x is at distance %d from the read %x\n",
min_id, min_dist, id);
opj_event_msg(j2k->cinfo, EVT_ERROR,
"- trying to substitute in place and crossing fingers!\n");
cio_seek(j2k->cio, cio_tell(j2k->cio) - 2);
cio_write(j2k->cio, min_id, 2);
 
/* rewind */
cio_seek(j2k->cio, cio_tell(j2k->cio) - 2);
 
}
 
};
#endif /* USE_JPWL */
 
}
 
/**
Read the lookup table containing all the marker, status and action
@param id Marker value
*/
static opj_dec_mstabent_t *j2k_dec_mstab_lookup(int id) {
opj_dec_mstabent_t *e;
for (e = j2k_dec_mstab; e->id != 0; e++) {
if (e->id == id) {
break;
}
}
return e;
}
 
/* ----------------------------------------------------------------------- */
/* J2K / JPT decoder interface */
/* ----------------------------------------------------------------------- */
 
opj_j2k_t* j2k_create_decompress(opj_common_ptr cinfo) {
opj_j2k_t *j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t));
if(!j2k)
return NULL;
 
j2k->default_tcp = (opj_tcp_t*) opj_calloc(1, sizeof(opj_tcp_t));
if(!j2k->default_tcp) {
opj_free(j2k);
return NULL;
}
 
j2k->cinfo = cinfo;
j2k->tile_data = NULL;
 
return j2k;
}
 
void j2k_destroy_decompress(opj_j2k_t *j2k) {
int i = 0;
 
if(j2k->tile_len != NULL) {
opj_free(j2k->tile_len);
}
if(j2k->tile_data != NULL) {
opj_free(j2k->tile_data);
}
if(j2k->default_tcp != NULL) {
opj_tcp_t *default_tcp = j2k->default_tcp;
if(default_tcp->ppt_data_first != NULL) {
opj_free(default_tcp->ppt_data_first);
}
if(j2k->default_tcp->tccps != NULL) {
opj_free(j2k->default_tcp->tccps);
}
opj_free(j2k->default_tcp);
}
if(j2k->cp != NULL) {
opj_cp_t *cp = j2k->cp;
if(cp->tcps != NULL) {
for(i = 0; i < cp->tw * cp->th; i++) {
if(cp->tcps[i].ppt_data_first != NULL) {
opj_free(cp->tcps[i].ppt_data_first);
}
if(cp->tcps[i].tccps != NULL) {
opj_free(cp->tcps[i].tccps);
}
}
opj_free(cp->tcps);
}
if(cp->ppm_data_first != NULL) {
opj_free(cp->ppm_data_first);
}
if(cp->tileno != NULL) {
opj_free(cp->tileno);
}
if(cp->comment != NULL) {
opj_free(cp->comment);
}
 
opj_free(cp);
}
opj_free(j2k);
}
 
void j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters) {
if(j2k && parameters) {
/* create and initialize the coding parameters structure */
opj_cp_t *cp = (opj_cp_t*) opj_calloc(1, sizeof(opj_cp_t));
cp->reduce = parameters->cp_reduce;
cp->layer = parameters->cp_layer;
cp->limit_decoding = parameters->cp_limit_decoding;
 
#ifdef USE_JPWL
cp->correct = parameters->jpwl_correct;
cp->exp_comps = parameters->jpwl_exp_comps;
cp->max_tiles = parameters->jpwl_max_tiles;
#endif /* USE_JPWL */
 
 
/* keep a link to cp so that we can destroy it later in j2k_destroy_decompress */
j2k->cp = cp;
}
}
 
opj_image_t* j2k_decode(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info) {
opj_image_t *image = NULL;
 
opj_common_ptr cinfo = j2k->cinfo;
 
j2k->cio = cio;
j2k->cstr_info = cstr_info;
if (cstr_info)
memset(cstr_info, 0, sizeof(opj_codestream_info_t));
 
/* create an empty image */
image = opj_image_create0();
j2k->image = image;
 
j2k->state = J2K_STATE_MHSOC;
 
for (;;) {
opj_dec_mstabent_t *e;
int id = cio_read(cio, 2);
 
#ifdef USE_JPWL
/* we try to honor JPWL correction power */
if (j2k->cp->correct) {
 
int orig_pos = cio_tell(cio);
bool status;
 
/* call the corrector */
status = jpwl_correct(j2k);
 
/* go back to where you were */
cio_seek(cio, orig_pos - 2);
 
/* re-read the marker */
id = cio_read(cio, 2);
 
/* check whether it begins with ff */
if (id >> 8 != 0xff) {
opj_event_msg(cinfo, EVT_ERROR,
"JPWL: possible bad marker %x at %d\n",
id, cio_tell(cio) - 2);
if (!JPWL_ASSUME) {
opj_image_destroy(image);
opj_event_msg(cinfo, EVT_ERROR, "JPWL: giving up\n");
return 0;
}
/* we try to correct */
id = id | 0xff00;
cio_seek(cio, cio_tell(cio) - 2);
cio_write(cio, id, 2);
opj_event_msg(cinfo, EVT_WARNING, "- trying to adjust this\n"
"- setting marker to %x\n",
id);
}
 
}
#endif /* USE_JPWL */
 
if (id >> 8 != 0xff) {
opj_image_destroy(image);
opj_event_msg(cinfo, EVT_ERROR, "%.8x: expected a marker instead of %x\n", cio_tell(cio) - 2, id);
return 0;
}
e = j2k_dec_mstab_lookup(id);
// Check if the marker is known
if (!(j2k->state & e->states)) {
opj_image_destroy(image);
opj_event_msg(cinfo, EVT_ERROR, "%.8x: unexpected marker %x\n", cio_tell(cio) - 2, id);
return 0;
}
// Check if the decoding is limited to the main header
if (e->id == J2K_MS_SOT && j2k->cp->limit_decoding == LIMIT_TO_MAIN_HEADER) {
opj_event_msg(cinfo, EVT_INFO, "Main Header decoded.\n");
return image;
}
 
if (e->handler) {
(*e->handler)(j2k);
}
if (j2k->state & J2K_STATE_ERR)
return NULL;
 
if (j2k->state == J2K_STATE_MT) {
break;
}
if (j2k->state == J2K_STATE_NEOC) {
break;
}
}
if (j2k->state == J2K_STATE_NEOC) {
j2k_read_eoc(j2k);
}
 
if (j2k->state != J2K_STATE_MT) {
opj_event_msg(cinfo, EVT_WARNING, "Incomplete bitstream\n");
}
 
return image;
}
 
/*
* Read a JPT-stream and decode file
*
*/
opj_image_t* j2k_decode_jpt_stream(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info) {
opj_image_t *image = NULL;
opj_jpt_msg_header_t header;
int position;
 
opj_common_ptr cinfo = j2k->cinfo;
j2k->cio = cio;
 
/* create an empty image */
image = opj_image_create0();
j2k->image = image;
 
j2k->state = J2K_STATE_MHSOC;
/* Initialize the header */
jpt_init_msg_header(&header);
/* Read the first header of the message */
jpt_read_msg_header(cinfo, cio, &header);
position = cio_tell(cio);
if (header.Class_Id != 6) { /* 6 : Main header data-bin message */
opj_image_destroy(image);
opj_event_msg(cinfo, EVT_ERROR, "[JPT-stream] : Expecting Main header first [class_Id %d] !\n", header.Class_Id);
return 0;
}
for (;;) {
opj_dec_mstabent_t *e = NULL;
int id;
if (!cio_numbytesleft(cio)) {
j2k_read_eoc(j2k);
return image;
}
/* data-bin read -> need to read a new header */
if ((unsigned int) (cio_tell(cio) - position) == header.Msg_length) {
jpt_read_msg_header(cinfo, cio, &header);
position = cio_tell(cio);
if (header.Class_Id != 4) { /* 4 : Tile data-bin message */
opj_image_destroy(image);
opj_event_msg(cinfo, EVT_ERROR, "[JPT-stream] : Expecting Tile info !\n");
return 0;
}
}
id = cio_read(cio, 2);
if (id >> 8 != 0xff) {
opj_image_destroy(image);
opj_event_msg(cinfo, EVT_ERROR, "%.8x: expected a marker instead of %x\n", cio_tell(cio) - 2, id);
return 0;
}
e = j2k_dec_mstab_lookup(id);
if (!(j2k->state & e->states)) {
opj_image_destroy(image);
opj_event_msg(cinfo, EVT_ERROR, "%.8x: unexpected marker %x\n", cio_tell(cio) - 2, id);
return 0;
}
if (e->handler) {
(*e->handler)(j2k);
}
if (j2k->state == J2K_STATE_MT) {
break;
}
if (j2k->state == J2K_STATE_NEOC) {
break;
}
}
if (j2k->state == J2K_STATE_NEOC) {
j2k_read_eoc(j2k);
}
if (j2k->state != J2K_STATE_MT) {
opj_event_msg(cinfo, EVT_WARNING, "Incomplete bitstream\n");
}
 
return image;
}
 
/* ----------------------------------------------------------------------- */
/* J2K encoder interface */
/* ----------------------------------------------------------------------- */
 
opj_j2k_t* j2k_create_compress(opj_common_ptr cinfo) {
opj_j2k_t *j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t));
if(j2k) {
j2k->cinfo = cinfo;
}
return j2k;
}
 
void j2k_destroy_compress(opj_j2k_t *j2k) {
int tileno;
 
if(!j2k) return;
if(j2k->cp != NULL) {
opj_cp_t *cp = j2k->cp;
 
if(cp->comment) {
opj_free(cp->comment);
}
if(cp->matrice) {
opj_free(cp->matrice);
}
for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
opj_free(cp->tcps[tileno].tccps);
}
opj_free(cp->tcps);
opj_free(cp);
}
 
opj_free(j2k);
}
 
void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, opj_image_t *image) {
int i, j, tileno, numpocs_tile;
opj_cp_t *cp = NULL;
 
if(!j2k || !parameters || ! image) {
return;
}
 
/* create and initialize the coding parameters structure */
cp = (opj_cp_t*) opj_calloc(1, sizeof(opj_cp_t));
 
/* keep a link to cp so that we can destroy it later in j2k_destroy_compress */
j2k->cp = cp;
 
/* set default values for cp */
cp->tw = 1;
cp->th = 1;
 
/*
copy user encoding parameters
*/
cp->cinema = parameters->cp_cinema;
cp->max_comp_size = parameters->max_comp_size;
cp->rsiz = parameters->cp_rsiz;
cp->disto_alloc = parameters->cp_disto_alloc;
cp->fixed_alloc = parameters->cp_fixed_alloc;
cp->fixed_quality = parameters->cp_fixed_quality;
 
/* mod fixed_quality */
if(parameters->cp_matrice) {
size_t array_size = parameters->tcp_numlayers * parameters->numresolution * 3 * sizeof(int);
cp->matrice = (int *) opj_malloc(array_size);
memcpy(cp->matrice, parameters->cp_matrice, array_size);
}
 
/* tiles */
cp->tdx = parameters->cp_tdx;
cp->tdy = parameters->cp_tdy;
 
/* tile offset */
cp->tx0 = parameters->cp_tx0;
cp->ty0 = parameters->cp_ty0;
 
/* comment string */
if(parameters->cp_comment) {
cp->comment = (char*)opj_malloc(strlen(parameters->cp_comment) + 1);
if(cp->comment) {
strcpy(cp->comment, parameters->cp_comment);
}
}
 
/*
calculate other encoding parameters
*/
 
if (parameters->tile_size_on) {
cp->tw = int_ceildiv(image->x1 - cp->tx0, cp->tdx);
cp->th = int_ceildiv(image->y1 - cp->ty0, cp->tdy);
} else {
cp->tdx = image->x1 - cp->tx0;
cp->tdy = image->y1 - cp->ty0;
}
 
if(parameters->tp_on){
cp->tp_flag = parameters->tp_flag;
cp->tp_on = 1;
}
cp->img_size = 0;
for(i=0;i<image->numcomps ;i++){
cp->img_size += (image->comps[i].w *image->comps[i].h * image->comps[i].prec);
}
 
 
#ifdef USE_JPWL
/*
calculate JPWL encoding parameters
*/
 
if (parameters->jpwl_epc_on) {
int i;
 
/* set JPWL on */
cp->epc_on = true;
cp->info_on = false; /* no informative technique */
 
/* set EPB on */
if ((parameters->jpwl_hprot_MH > 0) || (parameters->jpwl_hprot_TPH[0] > 0)) {
cp->epb_on = true;
cp->hprot_MH = parameters->jpwl_hprot_MH;
for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
cp->hprot_TPH_tileno[i] = parameters->jpwl_hprot_TPH_tileno[i];
cp->hprot_TPH[i] = parameters->jpwl_hprot_TPH[i];
}
/* if tile specs are not specified, copy MH specs */
if (cp->hprot_TPH[0] == -1) {
cp->hprot_TPH_tileno[0] = 0;
cp->hprot_TPH[0] = parameters->jpwl_hprot_MH;
}
for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) {
cp->pprot_tileno[i] = parameters->jpwl_pprot_tileno[i];
cp->pprot_packno[i] = parameters->jpwl_pprot_packno[i];
cp->pprot[i] = parameters->jpwl_pprot[i];
}
}
 
/* set ESD writing */
if ((parameters->jpwl_sens_size == 1) || (parameters->jpwl_sens_size == 2)) {
cp->esd_on = true;
 
cp->sens_size = parameters->jpwl_sens_size;
cp->sens_addr = parameters->jpwl_sens_addr;
cp->sens_range = parameters->jpwl_sens_range;
 
cp->sens_MH = parameters->jpwl_sens_MH;
for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
cp->sens_TPH_tileno[i] = parameters->jpwl_sens_TPH_tileno[i];
cp->sens_TPH[i] = parameters->jpwl_sens_TPH[i];
}
}
 
/* always set RED writing to false: we are at the encoder */
cp->red_on = false;
 
} else {
cp->epc_on = false;
}
#endif /* USE_JPWL */
 
 
/* initialize the mutiple tiles */
/* ---------------------------- */
cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t));
 
for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
opj_tcp_t *tcp = &cp->tcps[tileno];
tcp->numlayers = parameters->tcp_numlayers;
for (j = 0; j < tcp->numlayers; j++) {
if(cp->cinema){
if (cp->fixed_quality) {
tcp->distoratio[j] = parameters->tcp_distoratio[j];
}
tcp->rates[j] = parameters->tcp_rates[j];
}else{
if (cp->fixed_quality) { /* add fixed_quality */
tcp->distoratio[j] = parameters->tcp_distoratio[j];
} else {
tcp->rates[j] = parameters->tcp_rates[j];
}
}
}
tcp->csty = parameters->csty;
tcp->prg = parameters->prog_order;
tcp->mct = parameters->tcp_mct;
 
numpocs_tile = 0;
tcp->POC = 0;
if (parameters->numpocs) {
/* initialisation of POC */
tcp->POC = 1;
for (i = 0; i < parameters->numpocs; i++) {
if((tileno == parameters->POC[i].tile - 1) || (parameters->POC[i].tile == -1)) {
opj_poc_t *tcp_poc = &tcp->pocs[numpocs_tile];
tcp_poc->resno0 = parameters->POC[numpocs_tile].resno0;
tcp_poc->compno0 = parameters->POC[numpocs_tile].compno0;
tcp_poc->layno1 = parameters->POC[numpocs_tile].layno1;
tcp_poc->resno1 = parameters->POC[numpocs_tile].resno1;
tcp_poc->compno1 = parameters->POC[numpocs_tile].compno1;
tcp_poc->prg1 = parameters->POC[numpocs_tile].prg1;
tcp_poc->tile = parameters->POC[numpocs_tile].tile;
numpocs_tile++;
}
}
tcp->numpocs = numpocs_tile -1 ;
}else{
tcp->numpocs = 0;
}
 
tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, sizeof(opj_tccp_t));
 
for (i = 0; i < image->numcomps; i++) {
opj_tccp_t *tccp = &tcp->tccps[i];
tccp->csty = parameters->csty & 0x01; /* 0 => one precinct || 1 => custom precinct */
tccp->numresolutions = parameters->numresolution;
tccp->cblkw = int_floorlog2(parameters->cblockw_init);
tccp->cblkh = int_floorlog2(parameters->cblockh_init);
tccp->cblksty = parameters->mode;
tccp->qmfbid = parameters->irreversible ? 0 : 1;
tccp->qntsty = parameters->irreversible ? J2K_CCP_QNTSTY_SEQNT : J2K_CCP_QNTSTY_NOQNT;
tccp->numgbits = 2;
if (i == parameters->roi_compno) {
tccp->roishift = parameters->roi_shift;
} else {
tccp->roishift = 0;
}
 
if(parameters->cp_cinema)
{
//Precinct size for lowest frequency subband=128
tccp->prcw[0] = 7;
tccp->prch[0] = 7;
//Precinct size at all other resolutions = 256
for (j = 1; j < tccp->numresolutions; j++) {
tccp->prcw[j] = 8;
tccp->prch[j] = 8;
}
}else{
if (parameters->csty & J2K_CCP_CSTY_PRT) {
int p = 0;
for (j = tccp->numresolutions - 1; j >= 0; j--) {
if (p < parameters->res_spec) {
if (parameters->prcw_init[p] < 1) {
tccp->prcw[j] = 1;
} else {
tccp->prcw[j] = int_floorlog2(parameters->prcw_init[p]);
}
if (parameters->prch_init[p] < 1) {
tccp->prch[j] = 1;
}else {
tccp->prch[j] = int_floorlog2(parameters->prch_init[p]);
}
 
} else {
int res_spec = parameters->res_spec;
int size_prcw = parameters->prcw_init[res_spec - 1] >> (p - (res_spec - 1));
int size_prch = parameters->prch_init[res_spec - 1] >> (p - (res_spec - 1));
if (size_prcw < 1) {
tccp->prcw[j] = 1;
} else {
tccp->prcw[j] = int_floorlog2(size_prcw);
}
if (size_prch < 1) {
tccp->prch[j] = 1;
} else {
tccp->prch[j] = int_floorlog2(size_prch);
}
}
p++;
/*printf("\nsize precinct for level %d : %d,%d\n", j,tccp->prcw[j], tccp->prch[j]); */
} //end for
} else {
for (j = 0; j < tccp->numresolutions; j++) {
tccp->prcw[j] = 15;
tccp->prch[j] = 15;
}
}
}
 
dwt_calc_explicit_stepsizes(tccp, image->comps[i].prec);
}
}
}
 
bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) {
int tileno, compno;
opj_cp_t *cp = NULL;
 
opj_tcd_t *tcd = NULL; /* TCD component */
 
j2k->cio = cio;
j2k->image = image;
 
cp = j2k->cp;
 
/* INDEX >> */
j2k->cstr_info = cstr_info;
if (cstr_info) {
int compno;
cstr_info->tile = (opj_tile_info_t *) opj_malloc(cp->tw * cp->th * sizeof(opj_tile_info_t));
cstr_info->image_w = image->x1 - image->x0;
cstr_info->image_h = image->y1 - image->y0;
cstr_info->prog = (&cp->tcps[0])->prg;
cstr_info->tw = cp->tw;
cstr_info->th = cp->th;
cstr_info->tile_x = cp->tdx; /* new version parser */
cstr_info->tile_y = cp->tdy; /* new version parser */
cstr_info->tile_Ox = cp->tx0; /* new version parser */
cstr_info->tile_Oy = cp->ty0; /* new version parser */
cstr_info->numcomps = image->numcomps;
cstr_info->numlayers = (&cp->tcps[0])->numlayers;
cstr_info->numdecompos = (int*) opj_malloc(image->numcomps * sizeof(int));
for (compno=0; compno < image->numcomps; compno++) {
cstr_info->numdecompos[compno] = (&cp->tcps[0])->tccps->numresolutions - 1;
}
cstr_info->D_max = 0.0; /* ADD Marcela */
cstr_info->main_head_start = cio_tell(cio); /* position of SOC */
cstr_info->maxmarknum = 100;
cstr_info->marker = (opj_marker_info_t *) opj_malloc(cstr_info->maxmarknum * sizeof(opj_marker_info_t));
cstr_info->marknum = 0;
}
/* << INDEX */
 
j2k_write_soc(j2k);
j2k_write_siz(j2k);
j2k_write_cod(j2k);
j2k_write_qcd(j2k);
 
if(cp->cinema){
for (compno = 1; compno < image->numcomps; compno++) {
j2k_write_coc(j2k, compno);
j2k_write_qcc(j2k, compno);
}
}
 
for (compno = 0; compno < image->numcomps; compno++) {
opj_tcp_t *tcp = &cp->tcps[0];
if (tcp->tccps[compno].roishift)
j2k_write_rgn(j2k, compno, 0);
}
if (cp->comment != NULL) {
j2k_write_com(j2k);
}
 
j2k->totnum_tp = j2k_calculate_tp(cp,image->numcomps,image,j2k);
/* TLM Marker*/
if(cp->cinema){
j2k_write_tlm(j2k);
if (cp->cinema == CINEMA4K_24) {
j2k_write_poc(j2k);
}
}
 
/* uncomment only for testing JPSEC marker writing */
/* j2k_write_sec(j2k); */
 
/* INDEX >> */
if(cstr_info) {
cstr_info->main_head_end = cio_tell(cio) - 1;
}
/* << INDEX */
/**** Main Header ENDS here ***/
 
/* create the tile encoder */
tcd = tcd_create(j2k->cinfo);
 
/* encode each tile */
for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
int pino;
int tilepartno=0;
/* UniPG>> */
int acc_pack_num = 0;
/* <<UniPG */
 
 
opj_tcp_t *tcp = &cp->tcps[tileno];
opj_event_msg(j2k->cinfo, EVT_INFO, "tile number %d / %d\n", tileno + 1, cp->tw * cp->th);
 
j2k->curtileno = tileno;
j2k->cur_tp_num = 0;
tcd->cur_totnum_tp = j2k->cur_totnum_tp[j2k->curtileno];
/* initialisation before tile encoding */
if (tileno == 0) {
tcd_malloc_encode(tcd, image, cp, j2k->curtileno);
} else {
tcd_init_encode(tcd, image, cp, j2k->curtileno);
}
 
/* INDEX >> */
if(cstr_info) {
cstr_info->tile[j2k->curtileno].start_pos = cio_tell(cio) + j2k->pos_correction;
}
/* << INDEX */
 
for(pino = 0; pino <= tcp->numpocs; pino++) {
int tot_num_tp;
tcd->cur_pino=pino;
 
/*Get number of tile parts*/
tot_num_tp = j2k_get_num_tp(cp,pino,tileno);
tcd->tp_pos = cp->tp_pos;
 
for(tilepartno = 0; tilepartno < tot_num_tp ; tilepartno++){
j2k->tp_num = tilepartno;
/* INDEX >> */
if(cstr_info)
cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_start_pos =
cio_tell(cio) + j2k->pos_correction;
/* << INDEX */
j2k_write_sot(j2k);
 
if(j2k->cur_tp_num == 0 && cp->cinema == 0){
for (compno = 1; compno < image->numcomps; compno++) {
j2k_write_coc(j2k, compno);
j2k_write_qcc(j2k, compno);
}
if (cp->tcps[tileno].numpocs) {
j2k_write_poc(j2k);
}
}
 
/* INDEX >> */
if(cstr_info)
cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_end_header =
cio_tell(cio) + j2k->pos_correction + 1;
/* << INDEX */
 
j2k_write_sod(j2k, tcd);
 
/* INDEX >> */
if(cstr_info) {
cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_end_pos =
cio_tell(cio) + j2k->pos_correction - 1;
cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_start_pack =
acc_pack_num;
cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_numpacks =
cstr_info->packno - acc_pack_num;
acc_pack_num = cstr_info->packno;
}
/* << INDEX */
 
j2k->cur_tp_num++;
}
}
if(cstr_info) {
cstr_info->tile[j2k->curtileno].end_pos = cio_tell(cio) + j2k->pos_correction - 1;
}
 
 
/*
if (tile->PPT) { // BAD PPT !!!
FILE *PPT_file;
int i;
PPT_file=fopen("PPT","rb");
fprintf(stderr,"%c%c%c%c",255,97,tile->len_ppt/256,tile->len_ppt%256);
for (i=0;i<tile->len_ppt;i++) {
unsigned char elmt;
fread(&elmt, 1, 1, PPT_file);
fwrite(&elmt,1,1,f);
}
fclose(PPT_file);
unlink("PPT");
}
*/
 
}
 
/* destroy the tile encoder */
tcd_free_encode(tcd);
tcd_destroy(tcd);
 
opj_free(j2k->cur_totnum_tp);
 
j2k_write_eoc(j2k);
 
if(cstr_info) {
cstr_info->codestream_size = cio_tell(cio) + j2k->pos_correction;
/* UniPG>> */
/* The following adjustment is done to adjust the codestream size */
/* if SOD is not at 0 in the buffer. Useful in case of JP2, where */
/* the first bunch of bytes is not in the codestream */
cstr_info->codestream_size -= cstr_info->main_head_start;
/* <<UniPG */
}
 
#ifdef USE_JPWL
/*
preparation of JPWL marker segments
*/
if(cp->epc_on) {
 
/* encode according to JPWL */
jpwl_encode(j2k, cio, image);
 
}
#endif /* USE_JPWL */
 
return true;
}
 
 
 
 
 
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/j2k.h
0,0 → 1,446
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* Copyright (c) 2006-2007, Parvatha Elangovan
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __J2K_H
#define __J2K_H
/**
@file j2k.h
@brief The JPEG-2000 Codestream Reader/Writer (J2K)
 
The functions in J2K.C have for goal to read/write the several parts of the codestream: markers and data.
*/
 
/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */
/*@{*/
 
#define J2K_CP_CSTY_PRT 0x01
#define J2K_CP_CSTY_SOP 0x02
#define J2K_CP_CSTY_EPH 0x04
#define J2K_CCP_CSTY_PRT 0x01
#define J2K_CCP_CBLKSTY_LAZY 0x01 /**< Selective arithmetic coding bypass */
#define J2K_CCP_CBLKSTY_RESET 0x02 /**< Reset context probabilities on coding pass boundaries */
#define J2K_CCP_CBLKSTY_TERMALL 0x04 /**< Termination on each coding pass */
#define J2K_CCP_CBLKSTY_VSC 0x08 /**< Vertically stripe causal context */
#define J2K_CCP_CBLKSTY_PTERM 0x10 /**< Predictable termination */
#define J2K_CCP_CBLKSTY_SEGSYM 0x20 /**< Segmentation symbols are used */
#define J2K_CCP_QNTSTY_NOQNT 0
#define J2K_CCP_QNTSTY_SIQNT 1
#define J2K_CCP_QNTSTY_SEQNT 2
 
/* ----------------------------------------------------------------------- */
 
#define J2K_MS_SOC 0xff4f /**< SOC marker value */
#define J2K_MS_SOT 0xff90 /**< SOT marker value */
#define J2K_MS_SOD 0xff93 /**< SOD marker value */
#define J2K_MS_EOC 0xffd9 /**< EOC marker value */
#define J2K_MS_SIZ 0xff51 /**< SIZ marker value */
#define J2K_MS_COD 0xff52 /**< COD marker value */
#define J2K_MS_COC 0xff53 /**< COC marker value */
#define J2K_MS_RGN 0xff5e /**< RGN marker value */
#define J2K_MS_QCD 0xff5c /**< QCD marker value */
#define J2K_MS_QCC 0xff5d /**< QCC marker value */
#define J2K_MS_POC 0xff5f /**< POC marker value */
#define J2K_MS_TLM 0xff55 /**< TLM marker value */
#define J2K_MS_PLM 0xff57 /**< PLM marker value */
#define J2K_MS_PLT 0xff58 /**< PLT marker value */
#define J2K_MS_PPM 0xff60 /**< PPM marker value */
#define J2K_MS_PPT 0xff61 /**< PPT marker value */
#define J2K_MS_SOP 0xff91 /**< SOP marker value */
#define J2K_MS_EPH 0xff92 /**< EPH marker value */
#define J2K_MS_CRG 0xff63 /**< CRG marker value */
#define J2K_MS_COM 0xff64 /**< COM marker value */
/* UniPG>> */
#ifdef USE_JPWL
#define J2K_MS_EPC 0xff68 /**< EPC marker value (Part 11: JPEG 2000 for Wireless) */
#define J2K_MS_EPB 0xff66 /**< EPB marker value (Part 11: JPEG 2000 for Wireless) */
#define J2K_MS_ESD 0xff67 /**< ESD marker value (Part 11: JPEG 2000 for Wireless) */
#define J2K_MS_RED 0xff69 /**< RED marker value (Part 11: JPEG 2000 for Wireless) */
#endif /* USE_JPWL */
#ifdef USE_JPSEC
#define J2K_MS_SEC 0xff65 /**< SEC marker value (Part 8: Secure JPEG 2000) */
#define J2K_MS_INSEC 0xff94 /**< INSEC marker value (Part 8: Secure JPEG 2000) */
#endif /* USE_JPSEC */
/* <<UniPG */
 
 
/* ----------------------------------------------------------------------- */
 
/**
Values that specify the status of the decoding process when decoding the main header.
These values may be combined with a | operator.
*/
typedef enum J2K_STATUS {
J2K_STATE_MHSOC = 0x0001, /**< a SOC marker is expected */
J2K_STATE_MHSIZ = 0x0002, /**< a SIZ marker is expected */
J2K_STATE_MH = 0x0004, /**< the decoding process is in the main header */
J2K_STATE_TPHSOT = 0x0008, /**< the decoding process is in a tile part header and expects a SOT marker */
J2K_STATE_TPH = 0x0010, /**< the decoding process is in a tile part header */
J2K_STATE_MT = 0x0020, /**< the EOC marker has just been read */
J2K_STATE_NEOC = 0x0040, /**< the decoding process must not expect a EOC marker because the codestream is truncated */
J2K_STATE_ERR = 0x0080 /**< the decoding process has encountered an error */
} J2K_STATUS;
 
/* ----------------------------------------------------------------------- */
 
/**
T2 encoding mode
*/
typedef enum T2_MODE {
THRESH_CALC = 0, /** Function called in Rate allocation process*/
FINAL_PASS = 1 /** Function called in Tier 2 process*/
}J2K_T2_MODE;
 
/**
Quantization stepsize
*/
typedef struct opj_stepsize {
/** exponent */
int expn;
/** mantissa */
int mant;
} opj_stepsize_t;
 
/**
Tile-component coding parameters
*/
typedef struct opj_tccp {
/** coding style */
int csty;
/** number of resolutions */
int numresolutions;
/** code-blocks width */
int cblkw;
/** code-blocks height */
int cblkh;
/** code-block coding style */
int cblksty;
/** discrete wavelet transform identifier */
int qmfbid;
/** quantisation style */
int qntsty;
/** stepsizes used for quantization */
opj_stepsize_t stepsizes[J2K_MAXBANDS];
/** number of guard bits */
int numgbits;
/** Region Of Interest shift */
int roishift;
/** precinct width */
int prcw[J2K_MAXRLVLS];
/** precinct height */
int prch[J2K_MAXRLVLS];
} opj_tccp_t;
 
/**
Tile coding parameters :
this structure is used to store coding/decoding parameters common to all
tiles (information like COD, COC in main header)
*/
typedef struct opj_tcp {
/** 1 : first part-tile of a tile */
int first;
/** coding style */
int csty;
/** progression order */
OPJ_PROG_ORDER prg;
/** number of layers */
int numlayers;
/** multi-component transform identifier */
int mct;
/** rates of layers */
float rates[100];
/** number of progression order changes */
int numpocs;
/** indicates if a POC marker has been used O:NO, 1:YES */
int POC;
/** progression order changes */
opj_poc_t pocs[32];
/** packet header store there for futur use in t2_decode_packet */
unsigned char *ppt_data;
/** pointer remaining on the first byte of the first header if ppt is used */
unsigned char *ppt_data_first;
/** If ppt == 1 --> there was a PPT marker for the present tile */
int ppt;
/** used in case of multiple marker PPT (number of info already stored) */
int ppt_store;
/** ppmbug1 */
int ppt_len;
/** add fixed_quality */
float distoratio[100];
/** tile-component coding parameters */
opj_tccp_t *tccps;
} opj_tcp_t;
 
/**
Coding parameters
*/
typedef struct opj_cp {
/** Digital cinema profile*/
OPJ_CINEMA_MODE cinema;
/** Maximum rate for each component. If == 0, component size limitation is not considered */
int max_comp_size;
/** Size of the image in bits*/
int img_size;
/** Rsiz*/
OPJ_RSIZ_CAPABILITIES rsiz;
/** Enabling Tile part generation*/
char tp_on;
/** Flag determining tile part generation*/
char tp_flag;
/** Position of tile part flag in progression order*/
int tp_pos;
/** allocation by rate/distortion */
int disto_alloc;
/** allocation by fixed layer */
int fixed_alloc;
/** add fixed_quality */
int fixed_quality;
/** if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */
int reduce;
/** if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */
int layer;
/** if == NO_LIMITATION, decode entire codestream; if == LIMIT_TO_MAIN_HEADER then only decode the main header */
OPJ_LIMIT_DECODING limit_decoding;
/** XTOsiz */
int tx0;
/** YTOsiz */
int ty0;
/** XTsiz */
int tdx;
/** YTsiz */
int tdy;
/** comment for coding */
char *comment;
/** number of tiles in width */
int tw;
/** number of tiles in heigth */
int th;
/** ID number of the tiles present in the codestream */
int *tileno;
/** size of the vector tileno */
int tileno_size;
/** packet header store there for futur use in t2_decode_packet */
unsigned char *ppm_data;
/** pointer remaining on the first byte of the first header if ppm is used */
unsigned char *ppm_data_first;
/** if ppm == 1 --> there was a PPM marker for the present tile */
int ppm;
/** use in case of multiple marker PPM (number of info already store) */
int ppm_store;
/** use in case of multiple marker PPM (case on non-finished previous info) */
int ppm_previous;
/** ppmbug1 */
int ppm_len;
/** tile coding parameters */
opj_tcp_t *tcps;
/** fixed layer */
int *matrice;
/* UniPG>> */
#ifdef USE_JPWL
/** enables writing of EPC in MH, thus activating JPWL */
bool epc_on;
/** enables writing of EPB, in case of activated JPWL */
bool epb_on;
/** enables writing of ESD, in case of activated JPWL */
bool esd_on;
/** enables writing of informative techniques of ESD, in case of activated JPWL */
bool info_on;
/** enables writing of RED, in case of activated JPWL */
bool red_on;
/** error protection method for MH (0,1,16,32,37-128) */
int hprot_MH;
/** tile number of header protection specification (>=0) */
int hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS];
/** error protection methods for TPHs (0,1,16,32,37-128) */
int hprot_TPH[JPWL_MAX_NO_TILESPECS];
/** tile number of packet protection specification (>=0) */
int pprot_tileno[JPWL_MAX_NO_PACKSPECS];
/** packet number of packet protection specification (>=0) */
int pprot_packno[JPWL_MAX_NO_PACKSPECS];
/** error protection methods for packets (0,1,16,32,37-128) */
int pprot[JPWL_MAX_NO_PACKSPECS];
/** enables writing of ESD, (0/2/4 bytes) */
int sens_size;
/** sensitivity addressing size (0=auto/2/4 bytes) */
int sens_addr;
/** sensitivity range (0-3) */
int sens_range;
/** sensitivity method for MH (-1,0-7) */
int sens_MH;
/** tile number of sensitivity specification (>=0) */
int sens_TPH_tileno[JPWL_MAX_NO_TILESPECS];
/** sensitivity methods for TPHs (-1,0-7) */
int sens_TPH[JPWL_MAX_NO_TILESPECS];
/** enables JPWL correction at the decoder */
bool correct;
/** expected number of components at the decoder */
int exp_comps;
/** maximum number of tiles at the decoder */
int max_tiles;
#endif /* USE_JPWL */
/* <<UniPG */
} opj_cp_t;
 
/**
JPEG-2000 codestream reader/writer
*/
typedef struct opj_j2k {
/** codec context */
opj_common_ptr cinfo;
 
/** locate in which part of the codestream the decoder is (main header, tile header, end) */
int state;
/** number of the tile curently concern by coding/decoding */
int curtileno;
/** Tile part number*/
int tp_num;
/** Tilepart number currently coding*/
int cur_tp_num;
/** Total number of tileparts of the current tile*/
int *cur_totnum_tp;
/**
locate the start position of the TLM marker
after encoding the tilepart, a jump (in j2k_write_sod) is done to the TLM marker to store the value of its length.
*/
int tlm_start;
/** Total num of tile parts in whole image = num tiles* num tileparts in each tile*/
/** used in TLMmarker*/
int totnum_tp;
/**
locate the position of the end of the tile in the codestream,
used to detect a truncated codestream (in j2k_read_sod)
*/
unsigned char *eot;
/**
locate the start position of the SOT marker of the current coded tile:
after encoding the tile, a jump (in j2k_write_sod) is done to the SOT marker to store the value of its length.
*/
int sot_start;
int sod_start;
/**
as the J2K-file is written in several parts during encoding,
it enables to make the right correction in position return by cio_tell
*/
int pos_correction;
/** array used to store the data of each tile */
unsigned char **tile_data;
/** array used to store the length of each tile */
int *tile_len;
/**
decompression only :
store decoding parameters common to all tiles (information like COD, COC in main header)
*/
opj_tcp_t *default_tcp;
/** pointer to the encoded / decoded image */
opj_image_t *image;
/** pointer to the coding parameters */
opj_cp_t *cp;
/** helper used to write the index file */
opj_codestream_info_t *cstr_info;
/** pointer to the byte i/o stream */
opj_cio_t *cio;
} opj_j2k_t;
 
/** @name Exported functions */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Creates a J2K decompression structure
@param cinfo Codec context info
@return Returns a handle to a J2K decompressor if successful, returns NULL otherwise
*/
opj_j2k_t* j2k_create_decompress(opj_common_ptr cinfo);
/**
Destroy a J2K decompressor handle
@param j2k J2K decompressor handle to destroy
*/
void j2k_destroy_decompress(opj_j2k_t *j2k);
/**
Setup the decoder decoding parameters using user parameters.
Decoding parameters are returned in j2k->cp.
@param j2k J2K decompressor handle
@param parameters decompression parameters
*/
void j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters);
/**
Decode an image from a JPEG-2000 codestream
@param j2k J2K decompressor handle
@param cio Input buffer stream
@param cstr_info Codestream information structure if required, NULL otherwise
@return Returns a decoded image if successful, returns NULL otherwise
*/
opj_image_t* j2k_decode(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info);
/**
Decode an image form a JPT-stream (JPEG 2000, JPIP)
@param j2k J2K decompressor handle
@param cio Input buffer stream
@param cstr_info Codestream information structure if required, NULL otherwise
@return Returns a decoded image if successful, returns NULL otherwise
*/
opj_image_t* j2k_decode_jpt_stream(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info);
/**
Creates a J2K compression structure
@param cinfo Codec context info
@return Returns a handle to a J2K compressor if successful, returns NULL otherwise
*/
opj_j2k_t* j2k_create_compress(opj_common_ptr cinfo);
/**
Destroy a J2K compressor handle
@param j2k J2K compressor handle to destroy
*/
void j2k_destroy_compress(opj_j2k_t *j2k);
/**
Setup the encoder parameters using the current image and using user parameters.
Coding parameters are returned in j2k->cp.
@param j2k J2K compressor handle
@param parameters compression parameters
@param image input filled image
*/
void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, opj_image_t *image);
/**
Converts an enum type progression order to string type
*/
char *j2k_convert_progression_order(OPJ_PROG_ORDER prg_order);
/**
Encode an image into a JPEG-2000 codestream
@param j2k J2K compressor handle
@param cio Output buffer stream
@param image Image to encode
@param cstr_info Codestream information structure if required, NULL otherwise
@return Returns true if successful, returns false otherwise
*/
bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info);
 
/* ----------------------------------------------------------------------- */
/*@}*/
 
/*@}*/
 
#endif /* __J2K_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/j2k_lib.c
0,0 → 1,59
/*
* Copyright (c) 2005, Hervé Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#ifdef _WIN32
#include <windows.h>
#else
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/times.h>
#endif /* _WIN32 */
#include "opj_includes.h"
 
double opj_clock(void) {
#ifdef _WIN32
/* _WIN32: use QueryPerformance (very accurate) */
LARGE_INTEGER freq , t ;
/* freq is the clock speed of the CPU */
QueryPerformanceFrequency(&freq) ;
/* cout << "freq = " << ((double) freq.QuadPart) << endl; */
/* t is the high resolution performance counter (see MSDN) */
QueryPerformanceCounter ( & t ) ;
return ( t.QuadPart /(double) freq.QuadPart ) ;
#else
/* Unix or Linux: use resource usage */
struct rusage t;
double procTime;
/* (1) Get the rusage data structure at this moment (man getrusage) */
getrusage(0,&t);
/* (2) What is the elapsed time ? - CPU time = User time + System time */
/* (2a) Get the seconds */
procTime = t.ru_utime.tv_sec + t.ru_stime.tv_sec;
/* (2b) More precisely! Get the microseconds part ! */
return ( procTime + (t.ru_utime.tv_usec + t.ru_stime.tv_usec) * 1e-6 ) ;
#endif
}
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/j2k_lib.h
0,0 → 1,54
/*
* Copyright (c) 2005, Hervé Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __J2K_LIB_H
#define __J2K_LIB_H
/**
@file j2k_lib.h
@brief Internal functions
 
The functions in J2K_LIB.C are internal utilities mainly used for timing.
*/
 
/** @defgroup MISC MISC - Miscellaneous internal functions */
/*@{*/
 
/** @name Exported functions */
/*@{*/
/* ----------------------------------------------------------------------- */
 
/**
Difference in successive opj_clock() calls tells you the elapsed time
@return Returns time in seconds
*/
double opj_clock(void);
 
/* ----------------------------------------------------------------------- */
/*@}*/
 
/*@}*/
 
#endif /* __J2K_LIB_H */
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/jp2.c
0,0 → 1,1089
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "opj_includes.h"
 
/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */
/*@{*/
 
/** @name Local static functions */
/*@{*/
 
/**
Read box headers
@param cinfo Codec context info
@param cio Input stream
@param box
@return Returns true if successful, returns false otherwise
*/
static bool jp2_read_boxhdr(opj_common_ptr cinfo, opj_cio_t *cio, opj_jp2_box_t *box);
/*static void jp2_write_url(opj_cio_t *cio, char *Idx_file);*/
/**
Read the IHDR box - Image Header box
@param jp2 JP2 handle
@param cio Input buffer stream
@return Returns true if successful, returns false otherwise
*/
static bool jp2_read_ihdr(opj_jp2_t *jp2, opj_cio_t *cio);
static void jp2_write_ihdr(opj_jp2_t *jp2, opj_cio_t *cio);
static void jp2_write_bpcc(opj_jp2_t *jp2, opj_cio_t *cio);
static bool jp2_read_bpcc(opj_jp2_t *jp2, opj_cio_t *cio);
static void jp2_write_colr(opj_jp2_t *jp2, opj_cio_t *cio);
/**
Write the FTYP box - File type box
@param jp2 JP2 handle
@param cio Output buffer stream
*/
static void jp2_write_ftyp(opj_jp2_t *jp2, opj_cio_t *cio);
/**
Read the FTYP box - File type box
@param jp2 JP2 handle
@param cio Input buffer stream
@return Returns true if successful, returns false otherwise
*/
static bool jp2_read_ftyp(opj_jp2_t *jp2, opj_cio_t *cio);
static int jp2_write_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info);
static bool jp2_read_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, unsigned int *j2k_codestream_length, unsigned int *j2k_codestream_offset);
static void jp2_write_jp(opj_cio_t *cio);
/**
Read the JP box - JPEG 2000 signature
@param jp2 JP2 handle
@param cio Input buffer stream
@return Returns true if successful, returns false otherwise
*/
static bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio);
/**
Decode the structure of a JP2 file
@param jp2 JP2 handle
@param cio Input buffer stream
@param color Collector for profile, cdef and pclr data
@return Returns true if successful, returns false otherwise
*/
static bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio,
opj_jp2_color_t *color);
/**
Apply collected palette data
@param color Collector for profile, cdef and pclr data
@param image
*/
static void jp2_apply_pclr(opj_jp2_color_t *color, opj_image_t *image);
/**
Collect palette data
@param jp2 JP2 handle
@param cio Input buffer stream
@param box
@param color Collector for profile, cdef and pclr data
@return Returns true if successful, returns false otherwise
*/
static bool jp2_read_pclr(opj_jp2_t *jp2, opj_cio_t *cio,
opj_jp2_box_t *box, opj_jp2_color_t *color);
/**
Collect component mapping data
@param jp2 JP2 handle
@param cio Input buffer stream
@param box
@param color Collector for profile, cdef and pclr data
@return Returns true if successful, returns false otherwise
*/
static bool jp2_read_cmap(opj_jp2_t *jp2, opj_cio_t *cio,
opj_jp2_box_t *box, opj_jp2_color_t *color);
/**
Collect colour specification data
@param jp2 JP2 handle
@param cio Input buffer stream
@param box
@param color Collector for profile, cdef and pclr data
@return Returns true if successful, returns false otherwise
*/
static bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio,
opj_jp2_box_t *box, opj_jp2_color_t *color);
/*@}*/
 
/*@}*/
 
/* ----------------------------------------------------------------------- */
 
static bool jp2_read_boxhdr(opj_common_ptr cinfo, opj_cio_t *cio, opj_jp2_box_t *box) {
box->init_pos = cio_tell(cio);
box->length = cio_read(cio, 4);
box->type = cio_read(cio, 4);
if (box->length == 1) {
if (cio_read(cio, 4) != 0) {
opj_event_msg(cinfo, EVT_ERROR, "Cannot handle box sizes higher than 2^32\n");
return false;
}
box->length = cio_read(cio, 4);
if (box->length == 0)
box->length = cio_numbytesleft(cio) + 12;
}
else if (box->length == 0) {
box->length = cio_numbytesleft(cio) + 8;
}
return true;
}
 
#if 0
static void jp2_write_url(opj_cio_t *cio, char *Idx_file) {
unsigned int i;
opj_jp2_box_t box;
 
box.init_pos = cio_tell(cio);
cio_skip(cio, 4);
cio_write(cio, JP2_URL, 4); /* DBTL */
cio_write(cio, 0, 1); /* VERS */
cio_write(cio, 0, 3); /* FLAG */
 
if(Idx_file) {
for (i = 0; i < strlen(Idx_file); i++) {
cio_write(cio, Idx_file[i], 1);
}
}
 
box.length = cio_tell(cio) - box.init_pos;
cio_seek(cio, box.init_pos);
cio_write(cio, box.length, 4); /* L */
cio_seek(cio, box.init_pos + box.length);
}
#endif
 
static bool jp2_read_ihdr(opj_jp2_t *jp2, opj_cio_t *cio) {
opj_jp2_box_t box;
 
opj_common_ptr cinfo = jp2->cinfo;
 
jp2_read_boxhdr(cinfo, cio, &box);
if (JP2_IHDR != box.type) {
opj_event_msg(cinfo, EVT_ERROR, "Expected IHDR Marker\n");
return false;
}
 
jp2->h = cio_read(cio, 4); /* HEIGHT */
jp2->w = cio_read(cio, 4); /* WIDTH */
jp2->numcomps = cio_read(cio, 2); /* NC */
jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t));
 
jp2->bpc = cio_read(cio, 1); /* BPC */
 
jp2->C = cio_read(cio, 1); /* C */
jp2->UnkC = cio_read(cio, 1); /* UnkC */
jp2->IPR = cio_read(cio, 1); /* IPR */
 
if (cio_tell(cio) - box.init_pos != box.length) {
opj_event_msg(cinfo, EVT_ERROR, "Error with IHDR Box\n");
return false;
}
 
return true;
}
 
static void jp2_write_ihdr(opj_jp2_t *jp2, opj_cio_t *cio) {
opj_jp2_box_t box;
 
box.init_pos = cio_tell(cio);
cio_skip(cio, 4);
cio_write(cio, JP2_IHDR, 4); /* IHDR */
 
cio_write(cio, jp2->h, 4); /* HEIGHT */
cio_write(cio, jp2->w, 4); /* WIDTH */
cio_write(cio, jp2->numcomps, 2); /* NC */
 
cio_write(cio, jp2->bpc, 1); /* BPC */
 
cio_write(cio, jp2->C, 1); /* C : Always 7 */
cio_write(cio, jp2->UnkC, 1); /* UnkC, colorspace unknown */
cio_write(cio, jp2->IPR, 1); /* IPR, no intellectual property */
 
box.length = cio_tell(cio) - box.init_pos;
cio_seek(cio, box.init_pos);
cio_write(cio, box.length, 4); /* L */
cio_seek(cio, box.init_pos + box.length);
}
 
static void jp2_write_bpcc(opj_jp2_t *jp2, opj_cio_t *cio) {
unsigned int i;
opj_jp2_box_t box;
 
box.init_pos = cio_tell(cio);
cio_skip(cio, 4);
cio_write(cio, JP2_BPCC, 4); /* BPCC */
 
for (i = 0; i < jp2->numcomps; i++) {
cio_write(cio, jp2->comps[i].bpcc, 1);
}
 
box.length = cio_tell(cio) - box.init_pos;
cio_seek(cio, box.init_pos);
cio_write(cio, box.length, 4); /* L */
cio_seek(cio, box.init_pos + box.length);
}
 
 
static bool jp2_read_bpcc(opj_jp2_t *jp2, opj_cio_t *cio) {
unsigned int i;
opj_jp2_box_t box;
 
opj_common_ptr cinfo = jp2->cinfo;
 
jp2_read_boxhdr(cinfo, cio, &box);
if (JP2_BPCC != box.type) {
opj_event_msg(cinfo, EVT_ERROR, "Expected BPCC Marker\n");
return false;
}
 
for (i = 0; i < jp2->numcomps; i++) {
jp2->comps[i].bpcc = cio_read(cio, 1);
}
 
if (cio_tell(cio) - box.init_pos != box.length) {
opj_event_msg(cinfo, EVT_ERROR, "Error with BPCC Box\n");
return false;
}
 
return true;
}
 
static void jp2_write_colr(opj_jp2_t *jp2, opj_cio_t *cio) {
opj_jp2_box_t box;
 
box.init_pos = cio_tell(cio);
cio_skip(cio, 4);
cio_write(cio, JP2_COLR, 4); /* COLR */
 
cio_write(cio, jp2->meth, 1); /* METH */
cio_write(cio, jp2->precedence, 1); /* PRECEDENCE */
cio_write(cio, jp2->approx, 1); /* APPROX */
 
if (jp2->meth == 1) {
cio_write(cio, jp2->enumcs, 4); /* EnumCS */
} else {
cio_write(cio, 0, 1); /* PROFILE (??) */
}
 
box.length = cio_tell(cio) - box.init_pos;
cio_seek(cio, box.init_pos);
cio_write(cio, box.length, 4); /* L */
cio_seek(cio, box.init_pos + box.length);
}
 
static void jp2_free_pclr(opj_jp2_color_t *color)
{
opj_free(color->jp2_pclr->channel_sign);
opj_free(color->jp2_pclr->channel_size);
opj_free(color->jp2_pclr->entries);
 
if(color->jp2_pclr->cmap) opj_free(color->jp2_pclr->cmap);
 
opj_free(color->jp2_pclr); color->jp2_pclr = NULL;
}
 
static void free_color_data(opj_jp2_color_t *color)
{
if(color->jp2_pclr)
{
jp2_free_pclr(color);
}
if(color->jp2_cdef)
{
if(color->jp2_cdef->info) opj_free(color->jp2_cdef->info);
opj_free(color->jp2_cdef);
}
if(color->icc_profile_buf) opj_free(color->icc_profile_buf);
}
 
static void jp2_apply_pclr(opj_jp2_color_t *color, opj_image_t *image)
{
opj_image_comp_t *old_comps, *new_comps;
unsigned char *channel_size, *channel_sign;
unsigned int *entries;
opj_jp2_cmap_comp_t *cmap;
int *src, *dst;
unsigned int j, max;
unsigned short i, nr_channels, cmp, pcol;
int k, top_k;
 
channel_size = color->jp2_pclr->channel_size;
channel_sign = color->jp2_pclr->channel_sign;
entries = color->jp2_pclr->entries;
cmap = color->jp2_pclr->cmap;
nr_channels = color->jp2_pclr->nr_channels;
 
old_comps = image->comps;
new_comps = (opj_image_comp_t*)
opj_malloc(nr_channels * sizeof(opj_image_comp_t));
 
for(i = 0; i < nr_channels; ++i)
{
pcol = cmap[i].pcol; cmp = cmap[i].cmp;
 
new_comps[pcol] = old_comps[cmp];
 
if(cmap[i].mtyp == 0) /* Direct use */
{
old_comps[cmp].data = NULL; continue;
}
/* Palette mapping: */
new_comps[pcol].data = (int*)
opj_malloc(old_comps[cmp].w * old_comps[cmp].h * sizeof(int));
new_comps[pcol].prec = channel_size[i];
new_comps[pcol].sgnd = channel_sign[i];
}
top_k = color->jp2_pclr->nr_entries - 1;
 
for(i = 0; i < nr_channels; ++i)
{
/* Direct use: */
if(cmap[i].mtyp == 0) continue;
 
/* Palette mapping: */
cmp = cmap[i].cmp; pcol = cmap[i].pcol;
src = old_comps[cmp].data;
dst = new_comps[pcol].data;
max = new_comps[pcol].w * new_comps[pcol].h;
 
for(j = 0; j < max; ++j)
{
/* The index */
if((k = src[j]) < 0) k = 0; else if(k > top_k) k = top_k;
/* The colour */
dst[j] = entries[k * nr_channels + pcol];
}
}
max = image->numcomps;
for(i = 0; i < max; ++i)
{
if(old_comps[i].data) opj_free(old_comps[i].data);
}
opj_free(old_comps);
image->comps = new_comps;
image->numcomps = nr_channels;
 
jp2_free_pclr(color);
 
}/* apply_pclr() */
 
static bool jp2_read_pclr(opj_jp2_t *jp2, opj_cio_t *cio,
opj_jp2_box_t *box, opj_jp2_color_t *color)
{
opj_jp2_pclr_t *jp2_pclr;
unsigned char *channel_size, *channel_sign;
unsigned int *entries;
unsigned short nr_entries, nr_channels;
unsigned short i, j;
unsigned char uc;
 
/* Part 1, I.5.3.4: 'There shall be at most one Palette box inside
* a JP2 Header box' :
*/
if(color->jp2_pclr) return false;
 
nr_entries = cio_read(cio, 2); /* NE */
nr_channels = cio_read(cio, 1);/* NPC */
 
entries = (unsigned int*)
opj_malloc(nr_channels * nr_entries * sizeof(unsigned int));
channel_size = (unsigned char*)opj_malloc(nr_channels);
channel_sign = (unsigned char*)opj_malloc(nr_channels);
 
jp2_pclr = (opj_jp2_pclr_t*)opj_malloc(sizeof(opj_jp2_pclr_t));
jp2_pclr->channel_sign = channel_sign;
jp2_pclr->channel_size = channel_size;
jp2_pclr->entries = entries;
jp2_pclr->nr_entries = nr_entries;
jp2_pclr->nr_channels = nr_channels;
jp2_pclr->cmap = NULL;
 
color->jp2_pclr = jp2_pclr;
 
for(i = 0; i < nr_channels; ++i)
{
uc = cio_read(cio, 1); /* Bi */
channel_size[i] = (uc & 0x7f) + 1;
channel_sign[i] = (uc & 0x80)?1:0;
}
 
for(j = 0; j < nr_entries; ++j)
{
for(i = 0; i < nr_channels; ++i)
{
/* Cji */
*entries++ = cio_read(cio, channel_size[i]>>3);
}
}
 
return true;
}/* jp2_read_pclr() */
 
static bool jp2_read_cmap(opj_jp2_t *jp2, opj_cio_t *cio,
opj_jp2_box_t *box, opj_jp2_color_t *color)
{
opj_jp2_cmap_comp_t *cmap;
unsigned short i, nr_channels;
 
/* Need nr_channels: */
if(color->jp2_pclr == NULL) return false;
 
/* Part 1, I.5.3.5: 'There shall be at most one Component Mapping box
* inside a JP2 Header box' :
*/
if(color->jp2_pclr->cmap) return false;
 
nr_channels = color->jp2_pclr->nr_channels;
cmap = (opj_jp2_cmap_comp_t*)
opj_malloc(nr_channels * sizeof(opj_jp2_cmap_comp_t));
 
for(i = 0; i < nr_channels; ++i)
{
cmap[i].cmp = cio_read(cio, 2);
cmap[i].mtyp = cio_read(cio, 1);
cmap[i].pcol = cio_read(cio, 1);
 
}
color->jp2_pclr->cmap = cmap;
 
return true;
}/* jp2_read_cmap() */
 
static void jp2_apply_cdef(opj_image_t *image, opj_jp2_color_t *color)
{
opj_jp2_cdef_info_t *info;
int color_space;
unsigned short i, n, cn, typ, asoc, acn;
 
color_space = image->color_space;
info = color->jp2_cdef->info;
n = color->jp2_cdef->n;
 
for(i = 0; i < n; ++i)
{
/* WATCH: acn = asoc - 1 ! */
if((asoc = info[i].asoc) == 0) continue;
 
cn = info[i].cn; typ = info[i].typ; acn = asoc - 1;
 
if(cn != acn)
{
opj_image_comp_t saved;
 
memcpy(&saved, &image->comps[cn], sizeof(opj_image_comp_t));
memcpy(&image->comps[cn], &image->comps[acn], sizeof(opj_image_comp_t));
memcpy(&image->comps[acn], &saved, sizeof(opj_image_comp_t));
 
info[i].asoc = cn + 1;
info[acn].asoc = info[acn].cn + 1;
}
}
if(color->jp2_cdef->info) opj_free(color->jp2_cdef->info);
 
opj_free(color->jp2_cdef); color->jp2_cdef = NULL;
 
}/* jp2_apply_cdef() */
 
static bool jp2_read_cdef(opj_jp2_t *jp2, opj_cio_t *cio,
opj_jp2_box_t *box, opj_jp2_color_t *color)
{
opj_jp2_cdef_info_t *info;
unsigned short i, n;
 
/* Part 1, I.5.3.6: 'The shall be at most one Channel Definition box
* inside a JP2 Header box.'
*/
if(color->jp2_cdef) return false;
 
if((n = cio_read(cio, 2)) == 0) return false; /* szukw000: FIXME */
 
info = (opj_jp2_cdef_info_t*)
opj_malloc(n * sizeof(opj_jp2_cdef_info_t));
 
color->jp2_cdef = (opj_jp2_cdef_t*)opj_malloc(sizeof(opj_jp2_cdef_t));
color->jp2_cdef->info = info;
color->jp2_cdef->n = n;
 
for(i = 0; i < n; ++i)
{
info[i].cn = cio_read(cio, 2);
info[i].typ = cio_read(cio, 2);
info[i].asoc = cio_read(cio, 2);
 
}
return true;
}/* jp2_read_cdef() */
 
static bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio,
opj_jp2_box_t *box, opj_jp2_color_t *color)
{
int skip_len;
opj_common_ptr cinfo;
 
/* Part 1, I.5.3.3 : 'A conforming JP2 reader shall ignore all Colour
* Specification boxes after the first.'
*/
if(color->jp2_has_colr) return false;
 
cinfo = jp2->cinfo;
 
jp2->meth = cio_read(cio, 1); /* METH */
jp2->precedence = cio_read(cio, 1); /* PRECEDENCE */
jp2->approx = cio_read(cio, 1); /* APPROX */
 
if (jp2->meth == 1)
{
jp2->enumcs = cio_read(cio, 4); /* EnumCS */
}
else
{
/* skip PROFILE */
skip_len = box->init_pos + box->length - cio_tell(cio);
if (skip_len < 0)
{
opj_event_msg(cinfo, EVT_ERROR, "Error with COLR box size\n");
return false;
}
if(skip_len > 0)
{
unsigned char *start;
 
start = cio_getbp(cio);
color->icc_profile_buf = (unsigned char*)opj_malloc(skip_len);
color->icc_profile_len = skip_len;
 
cio_skip(cio, box->init_pos + box->length - cio_tell(cio));
 
memcpy(color->icc_profile_buf, start, skip_len);
}
}
 
if (cio_tell(cio) - box->init_pos != box->length)
{
opj_event_msg(cinfo, EVT_ERROR, "Error with COLR Box\n");
return false;
}
color->jp2_has_colr = 1;
 
return true;
}/* jp2_read_colr() */
 
bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_color_t *color)
{
opj_jp2_box_t box;
unsigned int jp2h_end;
 
opj_common_ptr cinfo = jp2->cinfo;
 
jp2_read_boxhdr(cinfo, cio, &box);
do
{
if (JP2_JP2H != box.type)
{
if (box.type == JP2_JP2C)
{
opj_event_msg(cinfo, EVT_ERROR, "Expected JP2H Marker\n");
return false;
}
cio_skip(cio, box.length - 8);
 
if(cio->bp >= cio->end) return false;
 
jp2_read_boxhdr(cinfo, cio, &box);
}
} while(JP2_JP2H != box.type);
 
if (!jp2_read_ihdr(jp2, cio))
return false;
jp2h_end = box.init_pos + box.length;
 
if (jp2->bpc == 255)
{
if (!jp2_read_bpcc(jp2, cio))
return false;
}
jp2_read_boxhdr(cinfo, cio, &box);
 
while(cio_tell(cio) < jp2h_end)
{
if(box.type == JP2_COLR)
{
if( !jp2_read_colr(jp2, cio, &box, color))
{
cio_seek(cio, box.init_pos + 8);
cio_skip(cio, box.length - 8);
}
jp2_read_boxhdr(cinfo, cio, &box);
continue;
}
if(box.type == JP2_CDEF)
{
if( !jp2_read_cdef(jp2, cio, &box, color))
{
cio_seek(cio, box.init_pos + 8);
cio_skip(cio, box.length - 8);
}
jp2_read_boxhdr(cinfo, cio, &box);
continue;
}
if(box.type == JP2_PCLR)
{
if( !jp2_read_pclr(jp2, cio, &box, color))
{
cio_seek(cio, box.init_pos + 8);
cio_skip(cio, box.length - 8);
}
jp2_read_boxhdr(cinfo, cio, &box);
continue;
}
if(box.type == JP2_CMAP)
{
if( !jp2_read_cmap(jp2, cio, &box, color))
{
cio_seek(cio, box.init_pos + 8);
cio_skip(cio, box.length - 8);
}
jp2_read_boxhdr(cinfo, cio, &box);
continue;
}
cio_seek(cio, box.init_pos + 8);
cio_skip(cio, box.length - 8);
jp2_read_boxhdr(cinfo, cio, &box);
 
}/* while(cio_tell(cio) < box_end) */
 
cio_seek(cio, jp2h_end);
 
/* Part 1, I.5.3.3 : 'must contain at least one' */
return (color->jp2_has_colr == 1);
 
}/* jp2_read_jp2h() */
 
opj_image_t* jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio,
opj_codestream_info_t *cstr_info)
{
opj_common_ptr cinfo;
opj_image_t *image = NULL;
opj_jp2_color_t color;
 
if(!jp2 || !cio)
{
return NULL;
}
memset(&color, 0, sizeof(opj_jp2_color_t));
cinfo = jp2->cinfo;
 
/* JP2 decoding */
if(!jp2_read_struct(jp2, cio, &color))
{
free_color_data(&color);
opj_event_msg(cinfo, EVT_ERROR, "Failed to decode jp2 structure\n");
return NULL;
}
 
/* J2K decoding */
image = j2k_decode(jp2->j2k, cio, cstr_info);
 
if(!image)
{
free_color_data(&color);
opj_event_msg(cinfo, EVT_ERROR, "Failed to decode J2K image\n");
return NULL;
}
 
/* Set Image Color Space */
if (jp2->enumcs == 16)
image->color_space = CLRSPC_SRGB;
else if (jp2->enumcs == 17)
image->color_space = CLRSPC_GRAY;
else if (jp2->enumcs == 18)
image->color_space = CLRSPC_SYCC;
else
image->color_space = CLRSPC_UNKNOWN;
 
if(color.jp2_cdef)
{
jp2_apply_cdef(image, &color);
}
if(color.jp2_pclr)
{
/* Part 1, I.5.3.4: Either both or none : */
if( !color.jp2_pclr->cmap)
jp2_free_pclr(&color);
else
jp2_apply_pclr(&color, image);
}
if(color.icc_profile_buf)
{
image->icc_profile_buf = color.icc_profile_buf;
color.icc_profile_buf = NULL;
image->icc_profile_len = color.icc_profile_len;
}
return image;
 
}/* jp2_decode() */
 
 
void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio) {
opj_jp2_box_t box;
 
box.init_pos = cio_tell(cio);
cio_skip(cio, 4);
cio_write(cio, JP2_JP2H, 4); /* JP2H */
 
jp2_write_ihdr(jp2, cio);
 
if (jp2->bpc == 255) {
jp2_write_bpcc(jp2, cio);
}
jp2_write_colr(jp2, cio);
 
box.length = cio_tell(cio) - box.init_pos;
cio_seek(cio, box.init_pos);
cio_write(cio, box.length, 4); /* L */
cio_seek(cio, box.init_pos + box.length);
}
 
static void jp2_write_ftyp(opj_jp2_t *jp2, opj_cio_t *cio) {
unsigned int i;
opj_jp2_box_t box;
 
box.init_pos = cio_tell(cio);
cio_skip(cio, 4);
cio_write(cio, JP2_FTYP, 4); /* FTYP */
 
cio_write(cio, jp2->brand, 4); /* BR */
cio_write(cio, jp2->minversion, 4); /* MinV */
 
for (i = 0; i < jp2->numcl; i++) {
cio_write(cio, jp2->cl[i], 4); /* CL */
}
 
box.length = cio_tell(cio) - box.init_pos;
cio_seek(cio, box.init_pos);
cio_write(cio, box.length, 4); /* L */
cio_seek(cio, box.init_pos + box.length);
}
 
static bool jp2_read_ftyp(opj_jp2_t *jp2, opj_cio_t *cio) {
int i;
opj_jp2_box_t box;
 
opj_common_ptr cinfo = jp2->cinfo;
 
jp2_read_boxhdr(cinfo, cio, &box);
 
if (JP2_FTYP != box.type) {
opj_event_msg(cinfo, EVT_ERROR, "Expected FTYP Marker\n");
return false;
}
 
jp2->brand = cio_read(cio, 4); /* BR */
jp2->minversion = cio_read(cio, 4); /* MinV */
jp2->numcl = (box.length - 16) / 4;
jp2->cl = (unsigned int *) opj_malloc(jp2->numcl * sizeof(unsigned int));
 
for (i = 0; i < (int)jp2->numcl; i++) {
jp2->cl[i] = cio_read(cio, 4); /* CLi */
}
 
if (cio_tell(cio) - box.init_pos != box.length) {
opj_event_msg(cinfo, EVT_ERROR, "Error with FTYP Box\n");
return false;
}
 
return true;
}
 
static int jp2_write_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) {
unsigned int j2k_codestream_offset, j2k_codestream_length;
opj_jp2_box_t box;
 
opj_j2k_t *j2k = jp2->j2k;
 
box.init_pos = cio_tell(cio);
cio_skip(cio, 4);
cio_write(cio, JP2_JP2C, 4); /* JP2C */
 
/* J2K encoding */
j2k_codestream_offset = cio_tell(cio);
if(!j2k_encode(j2k, cio, image, cstr_info)) {
opj_event_msg(j2k->cinfo, EVT_ERROR, "Failed to encode image\n");
return 0;
}
j2k_codestream_length = cio_tell(cio) - j2k_codestream_offset;
 
jp2->j2k_codestream_offset = j2k_codestream_offset;
jp2->j2k_codestream_length = j2k_codestream_length;
 
box.length = 8 + jp2->j2k_codestream_length;
cio_seek(cio, box.init_pos);
cio_write(cio, box.length, 4); /* L */
cio_seek(cio, box.init_pos + box.length);
 
return box.length;
}
 
static bool jp2_read_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, unsigned int *j2k_codestream_length, unsigned int *j2k_codestream_offset) {
opj_jp2_box_t box;
 
opj_common_ptr cinfo = jp2->cinfo;
 
jp2_read_boxhdr(cinfo, cio, &box);
do {
if(JP2_JP2C != box.type) {
cio_skip(cio, box.length - 8);
jp2_read_boxhdr(cinfo, cio, &box);
}
} while(JP2_JP2C != box.type);
 
*j2k_codestream_offset = cio_tell(cio);
*j2k_codestream_length = box.length - 8;
 
return true;
}
 
static void jp2_write_jp(opj_cio_t *cio) {
opj_jp2_box_t box;
 
box.init_pos = cio_tell(cio);
cio_skip(cio, 4);
cio_write(cio, JP2_JP, 4); /* JP2 signature */
cio_write(cio, 0x0d0a870a, 4);
 
box.length = cio_tell(cio) - box.init_pos;
cio_seek(cio, box.init_pos);
cio_write(cio, box.length, 4); /* L */
cio_seek(cio, box.init_pos + box.length);
}
 
static bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio) {
opj_jp2_box_t box;
 
opj_common_ptr cinfo = jp2->cinfo;
 
jp2_read_boxhdr(cinfo, cio, &box);
if (JP2_JP != box.type) {
opj_event_msg(cinfo, EVT_ERROR, "Expected JP Marker\n");
return false;
}
if (0x0d0a870a != cio_read(cio, 4)) {
opj_event_msg(cinfo, EVT_ERROR, "Error with JP Marker\n");
return false;
}
if (cio_tell(cio) - box.init_pos != box.length) {
opj_event_msg(cinfo, EVT_ERROR, "Error with JP Box size\n");
return false;
}
 
return true;
}
 
 
static bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio,
opj_jp2_color_t *color) {
if (!jp2_read_jp(jp2, cio))
return false;
if (!jp2_read_ftyp(jp2, cio))
return false;
if (!jp2_read_jp2h(jp2, cio, color))
return false;
if (!jp2_read_jp2c(jp2, cio, &jp2->j2k_codestream_length, &jp2->j2k_codestream_offset))
return false;
return true;
}
 
/* ----------------------------------------------------------------------- */
/* JP2 decoder interface */
/* ----------------------------------------------------------------------- */
 
opj_jp2_t* jp2_create_decompress(opj_common_ptr cinfo) {
opj_jp2_t *jp2 = (opj_jp2_t*) opj_calloc(1, sizeof(opj_jp2_t));
if(jp2) {
jp2->cinfo = cinfo;
/* create the J2K codec */
jp2->j2k = j2k_create_decompress(cinfo);
if(jp2->j2k == NULL) {
jp2_destroy_decompress(jp2);
return NULL;
}
}
return jp2;
}
 
void jp2_destroy_decompress(opj_jp2_t *jp2) {
if(jp2) {
/* destroy the J2K codec */
j2k_destroy_decompress(jp2->j2k);
 
if(jp2->comps) {
opj_free(jp2->comps);
}
if(jp2->cl) {
opj_free(jp2->cl);
}
opj_free(jp2);
}
}
 
void jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters) {
/* setup the J2K codec */
j2k_setup_decoder(jp2->j2k, parameters);
/* further JP2 initializations go here */
}
 
/* ----------------------------------------------------------------------- */
/* JP2 encoder interface */
/* ----------------------------------------------------------------------- */
 
opj_jp2_t* jp2_create_compress(opj_common_ptr cinfo) {
opj_jp2_t *jp2 = (opj_jp2_t*)opj_malloc(sizeof(opj_jp2_t));
if(jp2) {
jp2->cinfo = cinfo;
/* create the J2K codec */
jp2->j2k = j2k_create_compress(cinfo);
if(jp2->j2k == NULL) {
jp2_destroy_compress(jp2);
return NULL;
}
}
return jp2;
}
 
void jp2_destroy_compress(opj_jp2_t *jp2) {
if(jp2) {
/* destroy the J2K codec */
j2k_destroy_compress(jp2->j2k);
 
if(jp2->comps) {
opj_free(jp2->comps);
}
if(jp2->cl) {
opj_free(jp2->cl);
}
opj_free(jp2);
}
}
 
void jp2_setup_encoder(opj_jp2_t *jp2, opj_cparameters_t *parameters, opj_image_t *image) {
int i;
int depth_0, sign;
 
if(!jp2 || !parameters || !image)
return;
 
/* setup the J2K codec */
/* ------------------- */
 
/* Check if number of components respects standard */
if (image->numcomps < 1 || image->numcomps > 16384) {
opj_event_msg(jp2->cinfo, EVT_ERROR, "Invalid number of components specified while setting up JP2 encoder\n");
return;
}
 
j2k_setup_encoder(jp2->j2k, parameters, image);
 
/* setup the JP2 codec */
/* ------------------- */
/* Profile box */
 
jp2->brand = JP2_JP2; /* BR */
jp2->minversion = 0; /* MinV */
jp2->numcl = 1;
jp2->cl = (unsigned int*) opj_malloc(jp2->numcl * sizeof(unsigned int));
jp2->cl[0] = JP2_JP2; /* CL0 : JP2 */
 
/* Image Header box */
 
jp2->numcomps = image->numcomps; /* NC */
jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t));
jp2->h = image->y1 - image->y0; /* HEIGHT */
jp2->w = image->x1 - image->x0; /* WIDTH */
/* BPC */
depth_0 = image->comps[0].prec - 1;
sign = image->comps[0].sgnd;
jp2->bpc = depth_0 + (sign << 7);
for (i = 1; i < image->numcomps; i++) {
int depth = image->comps[i].prec - 1;
sign = image->comps[i].sgnd;
if (depth_0 != depth)
jp2->bpc = 255;
}
jp2->C = 7; /* C : Always 7 */
jp2->UnkC = 0; /* UnkC, colorspace specified in colr box */
jp2->IPR = 0; /* IPR, no intellectual property */
/* BitsPerComponent box */
 
for (i = 0; i < image->numcomps; i++) {
jp2->comps[i].bpcc = image->comps[i].prec - 1 + (image->comps[i].sgnd << 7);
}
 
/* Colour Specification box */
 
if ((image->numcomps == 1 || image->numcomps == 3) && (jp2->bpc != 255)) {
jp2->meth = 1; /* METH: Enumerated colourspace */
} else {
jp2->meth = 2; /* METH: Restricted ICC profile */
}
if (jp2->meth == 1) {
if (image->color_space == 1)
jp2->enumcs = 16; /* sRGB as defined by IEC 61966–2–1 */
else if (image->color_space == 2)
jp2->enumcs = 17; /* greyscale */
else if (image->color_space == 3)
jp2->enumcs = 18; /* YUV */
} else {
jp2->enumcs = 0; /* PROFILE (??) */
}
jp2->precedence = 0; /* PRECEDENCE */
jp2->approx = 0; /* APPROX */
 
}
 
bool jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) {
 
/* JP2 encoding */
 
/* JPEG 2000 Signature box */
jp2_write_jp(cio);
/* File Type box */
jp2_write_ftyp(jp2, cio);
/* JP2 Header box */
jp2_write_jp2h(jp2, cio);
 
/* J2K encoding */
 
if(!jp2_write_jp2c(jp2, cio, image, cstr_info)) {
opj_event_msg(jp2->cinfo, EVT_ERROR, "Failed to encode image\n");
return false;
}
 
return true;
}
 
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/jp2.h
0,0 → 1,231
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __JP2_H
#define __JP2_H
/**
@file jp2.h
@brief The JPEG-2000 file format Reader/Writer (JP2)
 
*/
 
/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */
/*@{*/
 
#define JPIP_JPIP 0x6a706970
 
#define JP2_JP 0x6a502020 /**< JPEG 2000 signature box */
#define JP2_FTYP 0x66747970 /**< File type box */
#define JP2_JP2H 0x6a703268 /**< JP2 header box */
#define JP2_IHDR 0x69686472 /**< Image header box */
#define JP2_COLR 0x636f6c72 /**< Colour specification box */
#define JP2_JP2C 0x6a703263 /**< Contiguous codestream box */
#define JP2_URL 0x75726c20 /**< URL box */
#define JP2_DTBL 0x6474626c /**< Data Reference box */
#define JP2_BPCC 0x62706363 /**< Bits per component box */
#define JP2_JP2 0x6a703220 /**< File type fields */
#define JP2_PCLR 0x70636c72 /**< Palette box */
#define JP2_CMAP 0x636d6170 /**< Component Mapping box */
#define JP2_CDEF 0x63646566 /**< Channel Definition box */
 
/* ----------------------------------------------------------------------- */
/**
Channel description: channel index, type, assocation
*/
typedef struct opj_jp2_cdef_info
{
unsigned short cn, typ, asoc;
} opj_jp2_cdef_info_t;
 
/**
Channel descriptions and number of descriptions
*/
typedef struct opj_jp2_cdef
{
opj_jp2_cdef_info_t *info;
unsigned short n;
} opj_jp2_cdef_t;
 
/**
Component mappings: channel index, mapping type, palette index
*/
typedef struct opj_jp2_cmap_comp
{
unsigned short cmp;
unsigned char mtyp, pcol;
} opj_jp2_cmap_comp_t;
 
/**
Palette data: table entries, palette columns
*/
typedef struct opj_jp2_pclr
{
unsigned int *entries;
unsigned char *channel_sign;
unsigned char *channel_size;
opj_jp2_cmap_comp_t *cmap;
unsigned short nr_entries, nr_channels;
} opj_jp2_pclr_t;
 
/**
Collector for ICC profile, palette, component mapping, channel description
*/
typedef struct opj_jp2_color
{
unsigned char *icc_profile_buf;
int icc_profile_len;
 
opj_jp2_cdef_t *jp2_cdef;
opj_jp2_pclr_t *jp2_pclr;
unsigned char jp2_has_colr;
} opj_jp2_color_t;
 
/**
JP2 component
*/
typedef struct opj_jp2_comps {
int depth;
int sgnd;
int bpcc;
} opj_jp2_comps_t;
 
/**
JPEG-2000 file format reader/writer
*/
typedef struct opj_jp2 {
/** codec context */
opj_common_ptr cinfo;
/** handle to the J2K codec */
opj_j2k_t *j2k;
unsigned int w;
unsigned int h;
unsigned int numcomps;
unsigned int bpc;
unsigned int C;
unsigned int UnkC;
unsigned int IPR;
unsigned int meth;
unsigned int approx;
unsigned int enumcs;
unsigned int precedence;
unsigned int brand;
unsigned int minversion;
unsigned int numcl;
unsigned int *cl;
opj_jp2_comps_t *comps;
unsigned int j2k_codestream_offset;
unsigned int j2k_codestream_length;
} opj_jp2_t;
 
/**
JP2 Box
*/
typedef struct opj_jp2_box {
int length;
int type;
int init_pos;
} opj_jp2_box_t;
 
/** @name Exported functions */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Write the JP2H box - JP2 Header box (used in MJ2)
@param jp2 JP2 handle
@param cio Output buffer stream
*/
void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio);
/**
Read the JP2H box - JP2 Header box (used in MJ2)
@param jp2 JP2 handle
@param cio Input buffer stream
@param ext Collector for profile, cdef and pclr data
@return Returns true if successful, returns false otherwise
*/
bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_color_t *color);
/**
Creates a JP2 decompression structure
@param cinfo Codec context info
@return Returns a handle to a JP2 decompressor if successful, returns NULL otherwise
*/
opj_jp2_t* jp2_create_decompress(opj_common_ptr cinfo);
/**
Destroy a JP2 decompressor handle
@param jp2 JP2 decompressor handle to destroy
*/
void jp2_destroy_decompress(opj_jp2_t *jp2);
/**
Setup the decoder decoding parameters using user parameters.
Decoding parameters are returned in jp2->j2k->cp.
@param jp2 JP2 decompressor handle
@param parameters decompression parameters
*/
void jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters);
/**
Decode an image from a JPEG-2000 file stream
@param jp2 JP2 decompressor handle
@param cio Input buffer stream
@param cstr_info Codestream information structure if required, NULL otherwise
@return Returns a decoded image if successful, returns NULL otherwise
*/
opj_image_t* jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio, opj_codestream_info_t *cstr_info);
/**
Creates a JP2 compression structure
@param cinfo Codec context info
@return Returns a handle to a JP2 compressor if successful, returns NULL otherwise
*/
opj_jp2_t* jp2_create_compress(opj_common_ptr cinfo);
/**
Destroy a JP2 compressor handle
@param jp2 JP2 compressor handle to destroy
*/
void jp2_destroy_compress(opj_jp2_t *jp2);
/**
Setup the encoder parameters using the current image and using user parameters.
Coding parameters are returned in jp2->j2k->cp.
@param jp2 JP2 compressor handle
@param parameters compression parameters
@param image input filled image
*/
void jp2_setup_encoder(opj_jp2_t *jp2, opj_cparameters_t *parameters, opj_image_t *image);
/**
Encode an image into a JPEG-2000 file stream
@param jp2 JP2 compressor handle
@param cio Output buffer stream
@param image Image to encode
@param cstr_info Codestream information structure if required, NULL otherwise
@return Returns true if successful, returns false otherwise
*/
bool jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info);
/* ----------------------------------------------------------------------- */
/*@}*/
 
/*@}*/
 
#endif /* __JP2_H */
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/jpt.c
0,0 → 1,155
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#include "opj_includes.h"
 
/*
* Read the information contains in VBAS [JPP/JPT stream message header]
* Store information (7 bits) in value
*
*/
unsigned int jpt_read_VBAS_info(opj_cio_t *cio, unsigned int value) {
unsigned char elmt;
 
elmt = cio_read(cio, 1);
while ((elmt >> 7) == 1) {
value = (value << 7);
value |= (elmt & 0x7f);
elmt = cio_read(cio, 1);
}
value = (value << 7);
value |= (elmt & 0x7f);
 
return value;
}
 
/*
* Initialize the value of the message header structure
*
*/
void jpt_init_msg_header(opj_jpt_msg_header_t * header) {
header->Id = 0; /* In-class Identifier */
header->last_byte = 0; /* Last byte information */
header->Class_Id = 0; /* Class Identifier */
header->CSn_Id = 0; /* CSn : index identifier */
header->Msg_offset = 0; /* Message offset */
header->Msg_length = 0; /* Message length */
header->Layer_nb = 0; /* Auxiliary for JPP case */
}
 
/*
* Re-initialize the value of the message header structure
*
* Only parameters always present in message header
*
*/
void jpt_reinit_msg_header(opj_jpt_msg_header_t * header) {
header->Id = 0; /* In-class Identifier */
header->last_byte = 0; /* Last byte information */
header->Msg_offset = 0; /* Message offset */
header->Msg_length = 0; /* Message length */
}
 
/*
* Read the message header for a JPP/JPT - stream
*
*/
void jpt_read_msg_header(opj_common_ptr cinfo, opj_cio_t *cio, opj_jpt_msg_header_t *header) {
unsigned char elmt, Class = 0, CSn = 0;
jpt_reinit_msg_header(header);
 
/* ------------- */
/* VBAS : Bin-ID */
/* ------------- */
elmt = cio_read(cio, 1);
 
/* See for Class and CSn */
switch ((elmt >> 5) & 0x03) {
case 0:
opj_event_msg(cinfo, EVT_ERROR, "Forbidden value encounter in message header !!\n");
break;
case 1:
Class = 0;
CSn = 0;
break;
case 2:
Class = 1;
CSn = 0;
break;
case 3:
Class = 1;
CSn = 1;
break;
default:
break;
}
 
/* see information on bits 'c' [p 10 : A.2.1 general, ISO/IEC FCD 15444-9] */
if (((elmt >> 4) & 0x01) == 1)
header->last_byte = 1;
 
/* In-class identifier */
header->Id |= (elmt & 0x0f);
if ((elmt >> 7) == 1)
header->Id = jpt_read_VBAS_info(cio, header->Id);
 
/* ------------ */
/* VBAS : Class */
/* ------------ */
if (Class == 1) {
header->Class_Id = 0;
header->Class_Id = jpt_read_VBAS_info(cio, header->Class_Id);
}
 
/* ---------- */
/* VBAS : CSn */
/* ---------- */
if (CSn == 1) {
header->CSn_Id = 0;
header->CSn_Id = jpt_read_VBAS_info(cio, header->CSn_Id);
}
 
/* ----------------- */
/* VBAS : Msg_offset */
/* ----------------- */
header->Msg_offset = jpt_read_VBAS_info(cio, header->Msg_offset);
 
/* ----------------- */
/* VBAS : Msg_length */
/* ----------------- */
header->Msg_length = jpt_read_VBAS_info(cio, header->Msg_length);
 
/* ---------- */
/* VBAS : Aux */
/* ---------- */
if ((header->Class_Id & 0x01) == 1) {
header->Layer_nb = 0;
header->Layer_nb = jpt_read_VBAS_info(cio, header->Layer_nb);
}
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/jpt.h
0,0 → 1,75
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#ifndef __JPT_H
#define __JPT_H
/**
@file jpt.h
@brief JPT-stream reader (JPEG 2000, JPIP)
 
JPT-stream functions are implemented in J2K.C.
*/
 
/**
Message Header JPT stream structure
*/
typedef struct opj_jpt_msg_header {
/** In-class Identifier */
unsigned int Id;
/** Last byte information */
unsigned int last_byte;
/** Class Identifier */
unsigned int Class_Id;
/** CSn : index identifier */
unsigned int CSn_Id;
/** Message offset */
unsigned int Msg_offset;
/** Message length */
unsigned int Msg_length;
/** Auxiliary for JPP case */
unsigned int Layer_nb;
} opj_jpt_msg_header_t;
 
/* ----------------------------------------------------------------------- */
 
/**
Initialize the value of the message header structure
@param header Message header structure
*/
void jpt_init_msg_header(opj_jpt_msg_header_t * header);
 
/**
Read the message header for a JPP/JPT - stream
@param cinfo Codec context info
@param cio CIO handle
@param header Message header structure
*/
void jpt_read_msg_header(opj_common_ptr cinfo, opj_cio_t *cio, opj_jpt_msg_header_t *header);
 
#endif
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/lrintf.c
0,0 → 1,6
#include <math.h>
/*
long long int lrintf(float x) {
return floor(x);
}
*/
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/mct.c
0,0 → 1,190
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#ifdef __SSE__
#include <xmmintrin.h>
#endif
 
#include "opj_includes.h"
 
/* <summary> */
/* This table contains the norms of the basis function of the reversible MCT. */
/* </summary> */
static const double mct_norms[3] = { 1.732, .8292, .8292 };
 
/* <summary> */
/* This table contains the norms of the basis function of the irreversible MCT. */
/* </summary> */
static const double mct_norms_real[3] = { 1.732, 1.805, 1.573 };
 
/* <summary> */
/* Foward reversible MCT. */
/* </summary> */
void mct_encode(
int* restrict c0,
int* restrict c1,
int* restrict c2,
int n)
{
int i;
for(i = 0; i < n; ++i) {
int r = c0[i];
int g = c1[i];
int b = c2[i];
int y = (r + (g * 2) + b) >> 2;
int u = b - g;
int v = r - g;
c0[i] = y;
c1[i] = u;
c2[i] = v;
}
}
 
/* <summary> */
/* Inverse reversible MCT. */
/* </summary> */
void mct_decode(
int* restrict c0,
int* restrict c1,
int* restrict c2,
int n)
{
int i;
for (i = 0; i < n; ++i) {
int y = c0[i];
int u = c1[i];
int v = c2[i];
int g = y - ((u + v) >> 2);
int r = v + g;
int b = u + g;
c0[i] = r;
c1[i] = g;
c2[i] = b;
}
}
 
/* <summary> */
/* Get norm of basis function of reversible MCT. */
/* </summary> */
double mct_getnorm(int compno) {
return mct_norms[compno];
}
 
/* <summary> */
/* Foward irreversible MCT. */
/* </summary> */
void mct_encode_real(
int* restrict c0,
int* restrict c1,
int* restrict c2,
int n)
{
int i;
for(i = 0; i < n; ++i) {
int r = c0[i];
int g = c1[i];
int b = c2[i];
int y = fix_mul(r, 2449) + fix_mul(g, 4809) + fix_mul(b, 934);
int u = -fix_mul(r, 1382) - fix_mul(g, 2714) + fix_mul(b, 4096);
int v = fix_mul(r, 4096) - fix_mul(g, 3430) - fix_mul(b, 666);
c0[i] = y;
c1[i] = u;
c2[i] = v;
}
}
 
/* <summary> */
/* Inverse irreversible MCT. */
/* </summary> */
void mct_decode_real(
float* restrict c0,
float* restrict c1,
float* restrict c2,
int n)
{
int i;
#ifdef __SSE__
__m128 vrv, vgu, vgv, vbu;
vrv = _mm_set1_ps(1.402f);
vgu = _mm_set1_ps(0.34413f);
vgv = _mm_set1_ps(0.71414f);
vbu = _mm_set1_ps(1.772f);
for (i = 0; i < (n >> 3); ++i) {
__m128 vy, vu, vv;
__m128 vr, vg, vb;
 
vy = _mm_load_ps(c0);
vu = _mm_load_ps(c1);
vv = _mm_load_ps(c2);
vr = _mm_add_ps(vy, _mm_mul_ps(vv, vrv));
vg = _mm_sub_ps(_mm_sub_ps(vy, _mm_mul_ps(vu, vgu)), _mm_mul_ps(vv, vgv));
vb = _mm_add_ps(vy, _mm_mul_ps(vu, vbu));
_mm_store_ps(c0, vr);
_mm_store_ps(c1, vg);
_mm_store_ps(c2, vb);
c0 += 4;
c1 += 4;
c2 += 4;
 
vy = _mm_load_ps(c0);
vu = _mm_load_ps(c1);
vv = _mm_load_ps(c2);
vr = _mm_add_ps(vy, _mm_mul_ps(vv, vrv));
vg = _mm_sub_ps(_mm_sub_ps(vy, _mm_mul_ps(vu, vgu)), _mm_mul_ps(vv, vgv));
vb = _mm_add_ps(vy, _mm_mul_ps(vu, vbu));
_mm_store_ps(c0, vr);
_mm_store_ps(c1, vg);
_mm_store_ps(c2, vb);
c0 += 4;
c1 += 4;
c2 += 4;
}
n &= 7;
#endif
for(i = 0; i < n; ++i) {
float y = c0[i];
float u = c1[i];
float v = c2[i];
float r = y + (v * 1.402f);
float g = y - (u * 0.34413f) - (v * (0.71414f));
float b = y + (u * 1.772f);
c0[i] = r;
c1[i] = g;
c2[i] = b;
}
}
 
/* <summary> */
/* Get norm of basis function of irreversible MCT. */
/* </summary> */
double mct_getnorm_real(int compno) {
return mct_norms_real[compno];
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/mct.h
0,0 → 1,98
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#ifndef __MCT_H
#define __MCT_H
/**
@file mct.h
@brief Implementation of a multi-component transforms (MCT)
 
The functions in MCT.C have for goal to realize reversible and irreversible multicomponent
transform. The functions in MCT.C are used by some function in TCD.C.
*/
 
/** @defgroup MCT MCT - Implementation of a multi-component transform */
/*@{*/
 
/** @name Exported functions */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Apply a reversible multi-component transform to an image
@param c0 Samples for red component
@param c1 Samples for green component
@param c2 Samples blue component
@param n Number of samples for each component
*/
void mct_encode(int *c0, int *c1, int *c2, int n);
/**
Apply a reversible multi-component inverse transform to an image
@param c0 Samples for luminance component
@param c1 Samples for red chrominance component
@param c2 Samples for blue chrominance component
@param n Number of samples for each component
*/
void mct_decode(int *c0, int *c1, int *c2, int n);
/**
Get norm of the basis function used for the reversible multi-component transform
@param compno Number of the component (0->Y, 1->U, 2->V)
@return
*/
double mct_getnorm(int compno);
 
/**
Apply an irreversible multi-component transform to an image
@param c0 Samples for red component
@param c1 Samples for green component
@param c2 Samples blue component
@param n Number of samples for each component
*/
void mct_encode_real(int *c0, int *c1, int *c2, int n);
/**
Apply an irreversible multi-component inverse transform to an image
@param c0 Samples for luminance component
@param c1 Samples for red chrominance component
@param c2 Samples for blue chrominance component
@param n Number of samples for each component
*/
void mct_decode_real(float* c0, float* c1, float* c2, int n);
/**
Get norm of the basis function used for the irreversible multi-component transform
@param compno Number of the component (0->Y, 1->U, 2->V)
@return
*/
double mct_getnorm_real(int compno);
/* ----------------------------------------------------------------------- */
/*@}*/
 
/*@}*/
 
#endif /* __MCT_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/mqc.c
0,0 → 1,593
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#include "opj_includes.h"
 
/** @defgroup MQC MQC - Implementation of an MQ-Coder */
/*@{*/
 
/** @name Local static functions */
/*@{*/
 
/**
Output a byte, doing bit-stuffing if necessary.
After a 0xff byte, the next byte must be smaller than 0x90.
@param mqc MQC handle
*/
static void mqc_byteout(opj_mqc_t *mqc);
/**
Renormalize mqc->a and mqc->c while encoding, so that mqc->a stays between 0x8000 and 0x10000
@param mqc MQC handle
*/
static void mqc_renorme(opj_mqc_t *mqc);
/**
Encode the most probable symbol
@param mqc MQC handle
*/
static void mqc_codemps(opj_mqc_t *mqc);
/**
Encode the most least symbol
@param mqc MQC handle
*/
static void mqc_codelps(opj_mqc_t *mqc);
/**
Fill mqc->c with 1's for flushing
@param mqc MQC handle
*/
static void mqc_setbits(opj_mqc_t *mqc);
/**
FIXME: documentation ???
@param mqc MQC handle
@return
*/
static INLINE int mqc_mpsexchange(opj_mqc_t *const mqc);
/**
FIXME: documentation ???
@param mqc MQC handle
@return
*/
static INLINE int mqc_lpsexchange(opj_mqc_t *const mqc);
/**
Input a byte
@param mqc MQC handle
*/
static INLINE void mqc_bytein(opj_mqc_t *const mqc);
/**
Renormalize mqc->a and mqc->c while decoding
@param mqc MQC handle
*/
static INLINE void mqc_renormd(opj_mqc_t *const mqc);
/*@}*/
 
/*@}*/
 
/* <summary> */
/* This array defines all the possible states for a context. */
/* </summary> */
static opj_mqc_state_t mqc_states[47 * 2] = {
{0x5601, 0, &mqc_states[2], &mqc_states[3]},
{0x5601, 1, &mqc_states[3], &mqc_states[2]},
{0x3401, 0, &mqc_states[4], &mqc_states[12]},
{0x3401, 1, &mqc_states[5], &mqc_states[13]},
{0x1801, 0, &mqc_states[6], &mqc_states[18]},
{0x1801, 1, &mqc_states[7], &mqc_states[19]},
{0x0ac1, 0, &mqc_states[8], &mqc_states[24]},
{0x0ac1, 1, &mqc_states[9], &mqc_states[25]},
{0x0521, 0, &mqc_states[10], &mqc_states[58]},
{0x0521, 1, &mqc_states[11], &mqc_states[59]},
{0x0221, 0, &mqc_states[76], &mqc_states[66]},
{0x0221, 1, &mqc_states[77], &mqc_states[67]},
{0x5601, 0, &mqc_states[14], &mqc_states[13]},
{0x5601, 1, &mqc_states[15], &mqc_states[12]},
{0x5401, 0, &mqc_states[16], &mqc_states[28]},
{0x5401, 1, &mqc_states[17], &mqc_states[29]},
{0x4801, 0, &mqc_states[18], &mqc_states[28]},
{0x4801, 1, &mqc_states[19], &mqc_states[29]},
{0x3801, 0, &mqc_states[20], &mqc_states[28]},
{0x3801, 1, &mqc_states[21], &mqc_states[29]},
{0x3001, 0, &mqc_states[22], &mqc_states[34]},
{0x3001, 1, &mqc_states[23], &mqc_states[35]},
{0x2401, 0, &mqc_states[24], &mqc_states[36]},
{0x2401, 1, &mqc_states[25], &mqc_states[37]},
{0x1c01, 0, &mqc_states[26], &mqc_states[40]},
{0x1c01, 1, &mqc_states[27], &mqc_states[41]},
{0x1601, 0, &mqc_states[58], &mqc_states[42]},
{0x1601, 1, &mqc_states[59], &mqc_states[43]},
{0x5601, 0, &mqc_states[30], &mqc_states[29]},
{0x5601, 1, &mqc_states[31], &mqc_states[28]},
{0x5401, 0, &mqc_states[32], &mqc_states[28]},
{0x5401, 1, &mqc_states[33], &mqc_states[29]},
{0x5101, 0, &mqc_states[34], &mqc_states[30]},
{0x5101, 1, &mqc_states[35], &mqc_states[31]},
{0x4801, 0, &mqc_states[36], &mqc_states[32]},
{0x4801, 1, &mqc_states[37], &mqc_states[33]},
{0x3801, 0, &mqc_states[38], &mqc_states[34]},
{0x3801, 1, &mqc_states[39], &mqc_states[35]},
{0x3401, 0, &mqc_states[40], &mqc_states[36]},
{0x3401, 1, &mqc_states[41], &mqc_states[37]},
{0x3001, 0, &mqc_states[42], &mqc_states[38]},
{0x3001, 1, &mqc_states[43], &mqc_states[39]},
{0x2801, 0, &mqc_states[44], &mqc_states[38]},
{0x2801, 1, &mqc_states[45], &mqc_states[39]},
{0x2401, 0, &mqc_states[46], &mqc_states[40]},
{0x2401, 1, &mqc_states[47], &mqc_states[41]},
{0x2201, 0, &mqc_states[48], &mqc_states[42]},
{0x2201, 1, &mqc_states[49], &mqc_states[43]},
{0x1c01, 0, &mqc_states[50], &mqc_states[44]},
{0x1c01, 1, &mqc_states[51], &mqc_states[45]},
{0x1801, 0, &mqc_states[52], &mqc_states[46]},
{0x1801, 1, &mqc_states[53], &mqc_states[47]},
{0x1601, 0, &mqc_states[54], &mqc_states[48]},
{0x1601, 1, &mqc_states[55], &mqc_states[49]},
{0x1401, 0, &mqc_states[56], &mqc_states[50]},
{0x1401, 1, &mqc_states[57], &mqc_states[51]},
{0x1201, 0, &mqc_states[58], &mqc_states[52]},
{0x1201, 1, &mqc_states[59], &mqc_states[53]},
{0x1101, 0, &mqc_states[60], &mqc_states[54]},
{0x1101, 1, &mqc_states[61], &mqc_states[55]},
{0x0ac1, 0, &mqc_states[62], &mqc_states[56]},
{0x0ac1, 1, &mqc_states[63], &mqc_states[57]},
{0x09c1, 0, &mqc_states[64], &mqc_states[58]},
{0x09c1, 1, &mqc_states[65], &mqc_states[59]},
{0x08a1, 0, &mqc_states[66], &mqc_states[60]},
{0x08a1, 1, &mqc_states[67], &mqc_states[61]},
{0x0521, 0, &mqc_states[68], &mqc_states[62]},
{0x0521, 1, &mqc_states[69], &mqc_states[63]},
{0x0441, 0, &mqc_states[70], &mqc_states[64]},
{0x0441, 1, &mqc_states[71], &mqc_states[65]},
{0x02a1, 0, &mqc_states[72], &mqc_states[66]},
{0x02a1, 1, &mqc_states[73], &mqc_states[67]},
{0x0221, 0, &mqc_states[74], &mqc_states[68]},
{0x0221, 1, &mqc_states[75], &mqc_states[69]},
{0x0141, 0, &mqc_states[76], &mqc_states[70]},
{0x0141, 1, &mqc_states[77], &mqc_states[71]},
{0x0111, 0, &mqc_states[78], &mqc_states[72]},
{0x0111, 1, &mqc_states[79], &mqc_states[73]},
{0x0085, 0, &mqc_states[80], &mqc_states[74]},
{0x0085, 1, &mqc_states[81], &mqc_states[75]},
{0x0049, 0, &mqc_states[82], &mqc_states[76]},
{0x0049, 1, &mqc_states[83], &mqc_states[77]},
{0x0025, 0, &mqc_states[84], &mqc_states[78]},
{0x0025, 1, &mqc_states[85], &mqc_states[79]},
{0x0015, 0, &mqc_states[86], &mqc_states[80]},
{0x0015, 1, &mqc_states[87], &mqc_states[81]},
{0x0009, 0, &mqc_states[88], &mqc_states[82]},
{0x0009, 1, &mqc_states[89], &mqc_states[83]},
{0x0005, 0, &mqc_states[90], &mqc_states[84]},
{0x0005, 1, &mqc_states[91], &mqc_states[85]},
{0x0001, 0, &mqc_states[90], &mqc_states[86]},
{0x0001, 1, &mqc_states[91], &mqc_states[87]},
{0x5601, 0, &mqc_states[92], &mqc_states[92]},
{0x5601, 1, &mqc_states[93], &mqc_states[93]},
};
 
/*
==========================================================
local functions
==========================================================
*/
 
static void mqc_byteout(opj_mqc_t *mqc) {
if (*mqc->bp == 0xff) {
mqc->bp++;
*mqc->bp = mqc->c >> 20;
mqc->c &= 0xfffff;
mqc->ct = 7;
} else {
if ((mqc->c & 0x8000000) == 0) { /* ((mqc->c&0x8000000)==0) CHANGE */
mqc->bp++;
*mqc->bp = mqc->c >> 19;
mqc->c &= 0x7ffff;
mqc->ct = 8;
} else {
(*mqc->bp)++;
if (*mqc->bp == 0xff) {
mqc->c &= 0x7ffffff;
mqc->bp++;
*mqc->bp = mqc->c >> 20;
mqc->c &= 0xfffff;
mqc->ct = 7;
} else {
mqc->bp++;
*mqc->bp = mqc->c >> 19;
mqc->c &= 0x7ffff;
mqc->ct = 8;
}
}
}
}
 
static void mqc_renorme(opj_mqc_t *mqc) {
do {
mqc->a <<= 1;
mqc->c <<= 1;
mqc->ct--;
if (mqc->ct == 0) {
mqc_byteout(mqc);
}
} while ((mqc->a & 0x8000) == 0);
}
 
static void mqc_codemps(opj_mqc_t *mqc) {
mqc->a -= (*mqc->curctx)->qeval;
if ((mqc->a & 0x8000) == 0) {
if (mqc->a < (*mqc->curctx)->qeval) {
mqc->a = (*mqc->curctx)->qeval;
} else {
mqc->c += (*mqc->curctx)->qeval;
}
*mqc->curctx = (*mqc->curctx)->nmps;
mqc_renorme(mqc);
} else {
mqc->c += (*mqc->curctx)->qeval;
}
}
 
static void mqc_codelps(opj_mqc_t *mqc) {
mqc->a -= (*mqc->curctx)->qeval;
if (mqc->a < (*mqc->curctx)->qeval) {
mqc->c += (*mqc->curctx)->qeval;
} else {
mqc->a = (*mqc->curctx)->qeval;
}
*mqc->curctx = (*mqc->curctx)->nlps;
mqc_renorme(mqc);
}
 
static void mqc_setbits(opj_mqc_t *mqc) {
unsigned int tempc = mqc->c + mqc->a;
mqc->c |= 0xffff;
if (mqc->c >= tempc) {
mqc->c -= 0x8000;
}
}
 
static INLINE int mqc_mpsexchange(opj_mqc_t *const mqc) {
int d;
if (mqc->a < (*mqc->curctx)->qeval) {
d = 1 - (*mqc->curctx)->mps;
*mqc->curctx = (*mqc->curctx)->nlps;
} else {
d = (*mqc->curctx)->mps;
*mqc->curctx = (*mqc->curctx)->nmps;
}
return d;
}
 
static INLINE int mqc_lpsexchange(opj_mqc_t *const mqc) {
int d;
if (mqc->a < (*mqc->curctx)->qeval) {
mqc->a = (*mqc->curctx)->qeval;
d = (*mqc->curctx)->mps;
*mqc->curctx = (*mqc->curctx)->nmps;
} else {
mqc->a = (*mqc->curctx)->qeval;
d = 1 - (*mqc->curctx)->mps;
*mqc->curctx = (*mqc->curctx)->nlps;
}
return d;
}
 
#ifdef MQC_PERF_OPT
static INLINE void mqc_bytein(opj_mqc_t *const mqc) {
unsigned int i = *((unsigned int *) mqc->bp);
mqc->c += i & 0xffff00;
mqc->ct = i & 0x0f;
mqc->bp += (i >> 2) & 0x04;
}
#else
static void mqc_bytein(opj_mqc_t *const mqc) {
if (mqc->bp != mqc->end) {
unsigned int c;
if (mqc->bp + 1 != mqc->end) {
c = *(mqc->bp + 1);
} else {
c = 0xff;
}
if (*mqc->bp == 0xff) {
if (c > 0x8f) {
mqc->c += 0xff00;
mqc->ct = 8;
} else {
mqc->bp++;
mqc->c += c << 9;
mqc->ct = 7;
}
} else {
mqc->bp++;
mqc->c += c << 8;
mqc->ct = 8;
}
} else {
mqc->c += 0xff00;
mqc->ct = 8;
}
}
#endif
 
static INLINE void mqc_renormd(opj_mqc_t *const mqc) {
do {
if (mqc->ct == 0) {
mqc_bytein(mqc);
}
mqc->a <<= 1;
mqc->c <<= 1;
mqc->ct--;
} while (mqc->a < 0x8000);
}
 
/*
==========================================================
MQ-Coder interface
==========================================================
*/
 
opj_mqc_t* mqc_create(void) {
opj_mqc_t *mqc = (opj_mqc_t*)opj_malloc(sizeof(opj_mqc_t));
#ifdef MQC_PERF_OPT
mqc->buffer = NULL;
#endif
return mqc;
}
 
void mqc_destroy(opj_mqc_t *mqc) {
if(mqc) {
#ifdef MQC_PERF_OPT
if (mqc->buffer) {
opj_free(mqc->buffer);
}
#endif
opj_free(mqc);
}
}
 
int mqc_numbytes(opj_mqc_t *mqc) {
return mqc->bp - mqc->start;
}
 
void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp) {
mqc_setcurctx(mqc, 0);
mqc->a = 0x8000;
mqc->c = 0;
mqc->bp = bp - 1;
mqc->ct = 12;
if (*mqc->bp == 0xff) {
mqc->ct = 13;
}
mqc->start = bp;
}
 
void mqc_encode(opj_mqc_t *mqc, int d) {
if ((*mqc->curctx)->mps == d) {
mqc_codemps(mqc);
} else {
mqc_codelps(mqc);
}
}
 
void mqc_flush(opj_mqc_t *mqc) {
mqc_setbits(mqc);
mqc->c <<= mqc->ct;
mqc_byteout(mqc);
mqc->c <<= mqc->ct;
mqc_byteout(mqc);
if (*mqc->bp != 0xff) {
mqc->bp++;
}
}
 
void mqc_bypass_init_enc(opj_mqc_t *mqc) {
mqc->c = 0;
mqc->ct = 8;
/*if (*mqc->bp == 0xff) {
mqc->ct = 7;
} */
}
 
void mqc_bypass_enc(opj_mqc_t *mqc, int d) {
mqc->ct--;
mqc->c = mqc->c + (d << mqc->ct);
if (mqc->ct == 0) {
mqc->bp++;
*mqc->bp = mqc->c;
mqc->ct = 8;
if (*mqc->bp == 0xff) {
mqc->ct = 7;
}
mqc->c = 0;
}
}
 
int mqc_bypass_flush_enc(opj_mqc_t *mqc) {
unsigned char bit_padding;
bit_padding = 0;
if (mqc->ct != 0) {
while (mqc->ct > 0) {
mqc->ct--;
mqc->c += bit_padding << mqc->ct;
bit_padding = (bit_padding + 1) & 0x01;
}
mqc->bp++;
*mqc->bp = mqc->c;
mqc->ct = 8;
mqc->c = 0;
}
return 1;
}
 
void mqc_reset_enc(opj_mqc_t *mqc) {
mqc_resetstates(mqc);
mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
}
 
int mqc_restart_enc(opj_mqc_t *mqc) {
int correction = 1;
/* <flush part> */
int n = 27 - 15 - mqc->ct;
mqc->c <<= mqc->ct;
while (n > 0) {
mqc_byteout(mqc);
n -= mqc->ct;
mqc->c <<= mqc->ct;
}
mqc_byteout(mqc);
return correction;
}
 
void mqc_restart_init_enc(opj_mqc_t *mqc) {
/* <Re-init part> */
mqc_setcurctx(mqc, 0);
mqc->a = 0x8000;
mqc->c = 0;
mqc->ct = 12;
mqc->bp--;
if (*mqc->bp == 0xff) {
mqc->ct = 13;
}
}
 
void mqc_erterm_enc(opj_mqc_t *mqc) {
int k = 11 - mqc->ct + 1;
while (k > 0) {
mqc->c <<= mqc->ct;
mqc->ct = 0;
mqc_byteout(mqc);
k -= mqc->ct;
}
if (*mqc->bp != 0xff) {
mqc_byteout(mqc);
}
}
 
void mqc_segmark_enc(opj_mqc_t *mqc) {
int i;
mqc_setcurctx(mqc, 18);
for (i = 1; i < 5; i++) {
mqc_encode(mqc, i % 2);
}
}
 
void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len) {
mqc_setcurctx(mqc, 0);
mqc->start = bp;
mqc->end = bp + len;
mqc->bp = bp;
if (len==0) mqc->c = 0xff << 16;
else mqc->c = *mqc->bp << 16;
 
#ifdef MQC_PERF_OPT
{
unsigned int c;
unsigned int *ip;
unsigned char *end = mqc->end - 1;
mqc->buffer = opj_realloc(mqc->buffer, (2 * len + 1) * sizeof(unsigned int));
ip = (unsigned int *) mqc->buffer;
 
while (bp != end) {
c = *(bp + 1);
if (*bp == 0xff) {
if (c > 0x8f) {
*ip = 0x0000ff18;
} else {
bp++;
*ip = 0x00000017 | (c << 9);
}
} else {
bp++;
*ip = 0x00000018 | (c << 8);
}
ip++;
}
 
/* Handle last byte of data */
c = 0xff;
if (*bp == 0xff) {
*ip = 0x0000ff18;
} else {
bp++;
*ip = 0x00000018 | (c << 8);
}
ip++;
 
*ip = 0x0000ff08;
mqc->bp = mqc->buffer;
}
#endif
mqc_bytein(mqc);
mqc->c <<= 7;
mqc->ct -= 7;
mqc->a = 0x8000;
}
 
int mqc_decode(opj_mqc_t *const mqc) {
int d;
mqc->a -= (*mqc->curctx)->qeval;
if ((mqc->c >> 16) < (*mqc->curctx)->qeval) {
d = mqc_lpsexchange(mqc);
mqc_renormd(mqc);
} else {
mqc->c -= (*mqc->curctx)->qeval << 16;
if ((mqc->a & 0x8000) == 0) {
d = mqc_mpsexchange(mqc);
mqc_renormd(mqc);
} else {
d = (*mqc->curctx)->mps;
}
}
 
return d;
}
 
void mqc_resetstates(opj_mqc_t *mqc) {
int i;
for (i = 0; i < MQC_NUMCTXS; i++) {
mqc->ctxs[i] = mqc_states;
}
}
 
void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob) {
mqc->ctxs[ctxno] = &mqc_states[msb + (prob << 1)];
}
 
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/mqc.h
0,0 → 1,200
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#ifndef __MQC_H
#define __MQC_H
/**
@file mqc.h
@brief Implementation of an MQ-Coder (MQC)
 
The functions in MQC.C have for goal to realize the MQ-coder operations. The functions
in MQC.C are used by some function in T1.C.
*/
 
/** @defgroup MQC MQC - Implementation of an MQ-Coder */
/*@{*/
 
/**
This struct defines the state of a context.
*/
typedef struct opj_mqc_state {
/** the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */
unsigned int qeval;
/** the Most Probable Symbol (0 or 1) */
int mps;
/** next state if the next encoded symbol is the MPS */
struct opj_mqc_state *nmps;
/** next state if the next encoded symbol is the LPS */
struct opj_mqc_state *nlps;
} opj_mqc_state_t;
 
#define MQC_NUMCTXS 19
 
/**
MQ coder
*/
typedef struct opj_mqc {
unsigned int c;
unsigned int a;
unsigned int ct;
unsigned char *bp;
unsigned char *start;
unsigned char *end;
opj_mqc_state_t *ctxs[MQC_NUMCTXS];
opj_mqc_state_t **curctx;
#ifdef MQC_PERF_OPT
unsigned char *buffer;
#endif
} opj_mqc_t;
 
/** @name Exported functions */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Create a new MQC handle
@return Returns a new MQC handle if successful, returns NULL otherwise
*/
opj_mqc_t* mqc_create(void);
/**
Destroy a previously created MQC handle
@param mqc MQC handle to destroy
*/
void mqc_destroy(opj_mqc_t *mqc);
/**
Return the number of bytes written/read since initialisation
@param mqc MQC handle
@return Returns the number of bytes already encoded
*/
int mqc_numbytes(opj_mqc_t *mqc);
/**
Reset the states of all the context of the coder/decoder
(each context is set to a state where 0 and 1 are more or less equiprobable)
@param mqc MQC handle
*/
void mqc_resetstates(opj_mqc_t *mqc);
/**
Set the state of a particular context
@param mqc MQC handle
@param ctxno Number that identifies the context
@param msb The MSB of the new state of the context
@param prob Number that identifies the probability of the symbols for the new state of the context
*/
void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob);
/**
Initialize the encoder
@param mqc MQC handle
@param bp Pointer to the start of the buffer where the bytes will be written
*/
void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp);
/**
Set the current context used for coding/decoding
@param mqc MQC handle
@param ctxno Number that identifies the context
*/
#define mqc_setcurctx(mqc, ctxno) (mqc)->curctx = &(mqc)->ctxs[(int)(ctxno)]
/**
Encode a symbol using the MQ-coder
@param mqc MQC handle
@param d The symbol to be encoded (0 or 1)
*/
void mqc_encode(opj_mqc_t *mqc, int d);
/**
Flush the encoder, so that all remaining data is written
@param mqc MQC handle
*/
void mqc_flush(opj_mqc_t *mqc);
/**
BYPASS mode switch, initialization operation.
JPEG 2000 p 505.
<h2>Not fully implemented and tested !!</h2>
@param mqc MQC handle
*/
void mqc_bypass_init_enc(opj_mqc_t *mqc);
/**
BYPASS mode switch, coding operation.
JPEG 2000 p 505.
<h2>Not fully implemented and tested !!</h2>
@param mqc MQC handle
@param d The symbol to be encoded (0 or 1)
*/
void mqc_bypass_enc(opj_mqc_t *mqc, int d);
/**
BYPASS mode switch, flush operation
<h2>Not fully implemented and tested !!</h2>
@param mqc MQC handle
@return Returns 1 (always)
*/
int mqc_bypass_flush_enc(opj_mqc_t *mqc);
/**
RESET mode switch
@param mqc MQC handle
*/
void mqc_reset_enc(opj_mqc_t *mqc);
/**
RESTART mode switch (TERMALL)
@param mqc MQC handle
@return Returns 1 (always)
*/
int mqc_restart_enc(opj_mqc_t *mqc);
/**
RESTART mode switch (TERMALL) reinitialisation
@param mqc MQC handle
*/
void mqc_restart_init_enc(opj_mqc_t *mqc);
/**
ERTERM mode switch (PTERM)
@param mqc MQC handle
*/
void mqc_erterm_enc(opj_mqc_t *mqc);
/**
SEGMARK mode switch (SEGSYM)
@param mqc MQC handle
*/
void mqc_segmark_enc(opj_mqc_t *mqc);
/**
Initialize the decoder
@param mqc MQC handle
@param bp Pointer to the start of the buffer from which the bytes will be read
@param len Length of the input buffer
*/
void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len);
/**
Decode a symbol
@param mqc MQC handle
@return Returns the decoded symbol (0 or 1)
*/
int mqc_decode(opj_mqc_t *const mqc);
/* ----------------------------------------------------------------------- */
/*@}*/
 
/*@}*/
 
#endif /* __MQC_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/openjpeg.c
0,0 → 1,337
/*
* Copyright (c) 2005, Hervé Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#ifdef _WIN32
#include <windows.h>
#endif /* _WIN32 */
 
#include "../opj_config.h"
#include "opj_includes.h"
 
/* ---------------------------------------------------------------------- */
#ifdef _WIN32
#ifndef OPJ_STATIC
BOOL APIENTRY
DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH :
break;
case DLL_PROCESS_DETACH :
break;
case DLL_THREAD_ATTACH :
case DLL_THREAD_DETACH :
break;
}
 
return TRUE;
}
#endif /* OPJ_STATIC */
#endif /* _WIN32 */
 
/* ---------------------------------------------------------------------- */
 
 
const char* OPJ_CALLCONV opj_version(void) {
return PACKAGE_VERSION;
}
 
opj_dinfo_t* OPJ_CALLCONV opj_create_decompress(OPJ_CODEC_FORMAT format) {
opj_dinfo_t *dinfo = (opj_dinfo_t*)opj_calloc(1, sizeof(opj_dinfo_t));
if(!dinfo) return NULL;
dinfo->is_decompressor = true;
switch(format) {
case CODEC_J2K:
case CODEC_JPT:
/* get a J2K decoder handle */
dinfo->j2k_handle = (void*)j2k_create_decompress((opj_common_ptr)dinfo);
if(!dinfo->j2k_handle) {
opj_free(dinfo);
return NULL;
}
break;
case CODEC_JP2:
/* get a JP2 decoder handle */
dinfo->jp2_handle = (void*)jp2_create_decompress((opj_common_ptr)dinfo);
if(!dinfo->jp2_handle) {
opj_free(dinfo);
return NULL;
}
break;
case CODEC_UNKNOWN:
default:
opj_free(dinfo);
return NULL;
}
 
dinfo->codec_format = format;
 
return dinfo;
}
 
void OPJ_CALLCONV opj_destroy_decompress(opj_dinfo_t *dinfo) {
if(dinfo) {
/* destroy the codec */
switch(dinfo->codec_format) {
case CODEC_J2K:
case CODEC_JPT:
j2k_destroy_decompress((opj_j2k_t*)dinfo->j2k_handle);
break;
case CODEC_JP2:
jp2_destroy_decompress((opj_jp2_t*)dinfo->jp2_handle);
break;
case CODEC_UNKNOWN:
default:
break;
}
/* destroy the decompressor */
opj_free(dinfo);
}
}
 
void OPJ_CALLCONV opj_set_default_decoder_parameters(opj_dparameters_t *parameters) {
if(parameters) {
memset(parameters, 0, sizeof(opj_dparameters_t));
/* default decoding parameters */
parameters->cp_layer = 0;
parameters->cp_reduce = 0;
parameters->cp_limit_decoding = NO_LIMITATION;
 
parameters->decod_format = -1;
parameters->cod_format = -1;
/* UniPG>> */
#ifdef USE_JPWL
parameters->jpwl_correct = false;
parameters->jpwl_exp_comps = JPWL_EXPECTED_COMPONENTS;
parameters->jpwl_max_tiles = JPWL_MAXIMUM_TILES;
#endif /* USE_JPWL */
/* <<UniPG */
}
}
 
void OPJ_CALLCONV opj_setup_decoder(opj_dinfo_t *dinfo, opj_dparameters_t *parameters) {
if(dinfo && parameters) {
switch(dinfo->codec_format) {
case CODEC_J2K:
case CODEC_JPT:
j2k_setup_decoder((opj_j2k_t*)dinfo->j2k_handle, parameters);
break;
case CODEC_JP2:
jp2_setup_decoder((opj_jp2_t*)dinfo->jp2_handle, parameters);
break;
case CODEC_UNKNOWN:
default:
break;
}
}
}
 
opj_image_t* OPJ_CALLCONV opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio) {
return opj_decode_with_info(dinfo, cio, NULL);
}
 
opj_image_t* OPJ_CALLCONV opj_decode_with_info(opj_dinfo_t *dinfo, opj_cio_t *cio, opj_codestream_info_t *cstr_info) {
if(dinfo && cio) {
switch(dinfo->codec_format) {
case CODEC_J2K:
return j2k_decode((opj_j2k_t*)dinfo->j2k_handle, cio, cstr_info);
case CODEC_JPT:
return j2k_decode_jpt_stream((opj_j2k_t*)dinfo->j2k_handle, cio, cstr_info);
case CODEC_JP2:
return jp2_decode((opj_jp2_t*)dinfo->jp2_handle, cio, cstr_info);
case CODEC_UNKNOWN:
default:
break;
}
}
return NULL;
}
 
opj_cinfo_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format) {
opj_cinfo_t *cinfo = (opj_cinfo_t*)opj_calloc(1, sizeof(opj_cinfo_t));
if(!cinfo) return NULL;
cinfo->is_decompressor = false;
switch(format) {
case CODEC_J2K:
/* get a J2K coder handle */
cinfo->j2k_handle = (void*)j2k_create_compress((opj_common_ptr)cinfo);
if(!cinfo->j2k_handle) {
opj_free(cinfo);
return NULL;
}
break;
case CODEC_JP2:
/* get a JP2 coder handle */
cinfo->jp2_handle = (void*)jp2_create_compress((opj_common_ptr)cinfo);
if(!cinfo->jp2_handle) {
opj_free(cinfo);
return NULL;
}
break;
case CODEC_JPT:
case CODEC_UNKNOWN:
default:
opj_free(cinfo);
return NULL;
}
 
cinfo->codec_format = format;
 
return cinfo;
}
 
void OPJ_CALLCONV opj_destroy_compress(opj_cinfo_t *cinfo) {
if(cinfo) {
/* destroy the codec */
switch(cinfo->codec_format) {
case CODEC_J2K:
j2k_destroy_compress((opj_j2k_t*)cinfo->j2k_handle);
break;
case CODEC_JP2:
jp2_destroy_compress((opj_jp2_t*)cinfo->jp2_handle);
break;
case CODEC_JPT:
case CODEC_UNKNOWN:
default:
break;
}
/* destroy the decompressor */
opj_free(cinfo);
}
}
 
void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t *parameters) {
if(parameters) {
memset(parameters, 0, sizeof(opj_cparameters_t));
/* default coding parameters */
parameters->cp_cinema = OFF;
parameters->max_comp_size = 0;
parameters->numresolution = 6;
parameters->cp_rsiz = STD_RSIZ;
parameters->cblockw_init = 64;
parameters->cblockh_init = 64;
parameters->prog_order = LRCP;
parameters->roi_compno = -1; /* no ROI */
parameters->subsampling_dx = 1;
parameters->subsampling_dy = 1;
parameters->tp_on = 0;
parameters->decod_format = -1;
parameters->cod_format = -1;
parameters->tcp_rates[0] = 0;
parameters->tcp_numlayers = 0;
parameters->cp_disto_alloc = 0;
parameters->cp_fixed_alloc = 0;
parameters->cp_fixed_quality = 0;
 
/* UniPG>> */
#ifdef USE_JPWL
parameters->jpwl_epc_on = false;
parameters->jpwl_hprot_MH = -1; /* -1 means unassigned */
{
int i;
for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
parameters->jpwl_hprot_TPH_tileno[i] = -1; /* unassigned */
parameters->jpwl_hprot_TPH[i] = 0; /* absent */
}
};
{
int i;
for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) {
parameters->jpwl_pprot_tileno[i] = -1; /* unassigned */
parameters->jpwl_pprot_packno[i] = -1; /* unassigned */
parameters->jpwl_pprot[i] = 0; /* absent */
}
};
parameters->jpwl_sens_size = 0; /* 0 means no ESD */
parameters->jpwl_sens_addr = 0; /* 0 means auto */
parameters->jpwl_sens_range = 0; /* 0 means packet */
parameters->jpwl_sens_MH = -1; /* -1 means unassigned */
{
int i;
for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
parameters->jpwl_sens_TPH_tileno[i] = -1; /* unassigned */
parameters->jpwl_sens_TPH[i] = -1; /* absent */
}
};
#endif /* USE_JPWL */
/* <<UniPG */
}
}
 
void OPJ_CALLCONV opj_setup_encoder(opj_cinfo_t *cinfo, opj_cparameters_t *parameters, opj_image_t *image) {
if(cinfo && parameters && image) {
switch(cinfo->codec_format) {
case CODEC_J2K:
j2k_setup_encoder((opj_j2k_t*)cinfo->j2k_handle, parameters, image);
break;
case CODEC_JP2:
jp2_setup_encoder((opj_jp2_t*)cinfo->jp2_handle, parameters, image);
break;
case CODEC_JPT:
case CODEC_UNKNOWN:
default:
break;
}
}
}
 
bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index) {
if (index != NULL)
opj_event_msg((opj_common_ptr)cinfo, EVT_WARNING, "Set index to NULL when calling the opj_encode function.\n"
"To extract the index, use the opj_encode_with_info() function.\n"
"No index will be generated during this encoding\n");
return opj_encode_with_info(cinfo, cio, image, NULL);
}
 
bool OPJ_CALLCONV opj_encode_with_info(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) {
if(cinfo && cio && image) {
switch(cinfo->codec_format) {
case CODEC_J2K:
return j2k_encode((opj_j2k_t*)cinfo->j2k_handle, cio, image, cstr_info);
case CODEC_JP2:
return jp2_encode((opj_jp2_t*)cinfo->jp2_handle, cio, image, cstr_info);
case CODEC_JPT:
case CODEC_UNKNOWN:
default:
break;
}
}
return false;
}
 
void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_t *cstr_info) {
if (cstr_info) {
int tileno;
for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) {
opj_tile_info_t *tile_info = &cstr_info->tile[tileno];
opj_free(tile_info->thresh);
opj_free(tile_info->packet);
opj_free(tile_info->tp);
}
opj_free(cstr_info->tile);
opj_free(cstr_info->marker);
opj_free(cstr_info->numdecompos);
}
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/openjpeg.h
0,0 → 1,915
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* Copyright (c) 2006-2007, Parvatha Elangovan
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef OPENJPEG_H
#define OPENJPEG_H
 
 
/*
==========================================================
Compiler directives
==========================================================
*/
 
#if defined(OPJ_STATIC) || !defined(_WIN32)
#define OPJ_API
#define OPJ_CALLCONV
#else
#define OPJ_CALLCONV __stdcall
/*
The following ifdef block is the standard way of creating macros which make exporting
from a DLL simpler. All files within this DLL are compiled with the OPJ_EXPORTS
symbol defined on the command line. this symbol should not be defined on any project
that uses this DLL. This way any other project whose source files include this file see
OPJ_API functions as being imported from a DLL, wheras this DLL sees symbols
defined with this macro as being exported.
*/
#if defined(OPJ_EXPORTS) || defined(DLL_EXPORT)
#define OPJ_API __declspec(dllexport)
#else
#define OPJ_API __declspec(dllimport)
#endif /* OPJ_EXPORTS */
#endif /* !OPJ_STATIC || !_WIN32 */
 
#ifndef __cplusplus
#if defined(HAVE_STDBOOL_H)
/*
The C language implementation does correctly provide the standard header
file "stdbool.h".
*/
#include <stdbool.h>
#else
/*
The C language implementation does not provide the standard header file
"stdbool.h" as required by ISO/IEC 9899:1999. Try to compensate for this
braindamage below.
*/
#if !defined(bool)
#define bool int
#endif
#if !defined(true)
#define true 1
#endif
#if !defined(false)
#define false 0
#endif
#endif
#endif /* __cplusplus */
 
/*
==========================================================
Useful constant definitions
==========================================================
*/
 
#define OPJ_PATH_LEN 4096 /**< Maximum allowed size for filenames */
 
#define J2K_MAXRLVLS 33 /**< Number of maximum resolution level authorized */
#define J2K_MAXBANDS (3*J2K_MAXRLVLS-2) /**< Number of maximum sub-band linked to number of resolution level */
 
/* UniPG>> */
#define JPWL_MAX_NO_TILESPECS 16 /**< Maximum number of tile parts expected by JPWL: increase at your will */
#define JPWL_MAX_NO_PACKSPECS 16 /**< Maximum number of packet parts expected by JPWL: increase at your will */
#define JPWL_MAX_NO_MARKERS 512 /**< Maximum number of JPWL markers: increase at your will */
#define JPWL_PRIVATEINDEX_NAME "jpwl_index_privatefilename" /**< index file name used when JPWL is on */
#define JPWL_EXPECTED_COMPONENTS 3 /**< Expect this number of components, so you'll find better the first EPB */
#define JPWL_MAXIMUM_TILES 8192 /**< Expect this maximum number of tiles, to avoid some crashes */
#define JPWL_MAXIMUM_HAMMING 2 /**< Expect this maximum number of bit errors in marker id's */
#define JPWL_MAXIMUM_EPB_ROOM 65450 /**< Expect this maximum number of bytes for composition of EPBs */
/* <<UniPG */
 
/*
==========================================================
enum definitions
==========================================================
*/
/**
Rsiz Capabilities
*/
typedef enum RSIZ_CAPABILITIES {
STD_RSIZ = 0, /** Standard JPEG2000 profile*/
CINEMA2K = 3, /** Profile name for a 2K image*/
CINEMA4K = 4 /** Profile name for a 4K image*/
} OPJ_RSIZ_CAPABILITIES;
 
/**
Digital cinema operation mode
*/
typedef enum CINEMA_MODE {
OFF = 0, /** Not Digital Cinema*/
CINEMA2K_24 = 1, /** 2K Digital Cinema at 24 fps*/
CINEMA2K_48 = 2, /** 2K Digital Cinema at 48 fps*/
CINEMA4K_24 = 3 /** 4K Digital Cinema at 24 fps*/
}OPJ_CINEMA_MODE;
 
/**
Progression order
*/
typedef enum PROG_ORDER {
PROG_UNKNOWN = -1, /**< place-holder */
LRCP = 0, /**< layer-resolution-component-precinct order */
RLCP = 1, /**< resolution-layer-component-precinct order */
RPCL = 2, /**< resolution-precinct-component-layer order */
PCRL = 3, /**< precinct-component-resolution-layer order */
CPRL = 4 /**< component-precinct-resolution-layer order */
} OPJ_PROG_ORDER;
 
/**
Supported image color spaces
*/
typedef enum COLOR_SPACE {
CLRSPC_UNKNOWN = -1, /**< not supported by the library */
CLRSPC_UNSPECIFIED = 0, /**< not specified in the codestream */
CLRSPC_SRGB = 1, /**< sRGB */
CLRSPC_GRAY = 2, /**< grayscale */
CLRSPC_SYCC = 3 /**< YUV */
} OPJ_COLOR_SPACE;
 
/**
Supported codec
*/
typedef enum CODEC_FORMAT {
CODEC_UNKNOWN = -1, /**< place-holder */
CODEC_J2K = 0, /**< JPEG-2000 codestream : read/write */
CODEC_JPT = 1, /**< JPT-stream (JPEG 2000, JPIP) : read only */
CODEC_JP2 = 2 /**< JPEG-2000 file format : read/write */
} OPJ_CODEC_FORMAT;
 
/**
Limit decoding to certain portions of the codestream.
*/
typedef enum LIMIT_DECODING {
NO_LIMITATION = 0, /**< No limitation for the decoding. The entire codestream will de decoded */
LIMIT_TO_MAIN_HEADER = 1, /**< The decoding is limited to the Main Header */
DECODE_ALL_BUT_PACKETS = 2 /**< Decode everything except the JPEG 2000 packets */
} OPJ_LIMIT_DECODING;
 
/*
==========================================================
event manager typedef definitions
==========================================================
*/
 
/**
Callback function prototype for events
@param msg Event message
@param client_data
*/
typedef void (*opj_msg_callback) (const char *msg, void *client_data);
 
/**
Message handler object
used for
<ul>
<li>Error messages
<li>Warning messages
<li>Debugging messages
</ul>
*/
typedef struct opj_event_mgr {
/** Error message callback if available, NULL otherwise */
opj_msg_callback error_handler;
/** Warning message callback if available, NULL otherwise */
opj_msg_callback warning_handler;
/** Debug message callback if available, NULL otherwise */
opj_msg_callback info_handler;
} opj_event_mgr_t;
 
 
/*
==========================================================
codec typedef definitions
==========================================================
*/
 
/**
Progression order changes
*/
typedef struct opj_poc {
/** Resolution num start, Component num start, given by POC */
int resno0, compno0;
/** Layer num end,Resolution num end, Component num end, given by POC */
int layno1, resno1, compno1;
/** Layer num start,Precinct num start, Precinct num end */
int layno0, precno0, precno1;
/** Progression order enum*/
OPJ_PROG_ORDER prg1,prg;
/** Progression order string*/
char progorder[5];
/** Tile number */
int tile;
/** Start and end values for Tile width and height*/
int tx0,tx1,ty0,ty1;
/** Start value, initialised in pi_initialise_encode*/
int layS, resS, compS, prcS;
/** End value, initialised in pi_initialise_encode */
int layE, resE, compE, prcE;
/** Start and end values of Tile width and height, initialised in pi_initialise_encode*/
int txS,txE,tyS,tyE,dx,dy;
/** Temporary values for Tile parts, initialised in pi_create_encode */
int lay_t, res_t, comp_t, prc_t,tx0_t,ty0_t;
} opj_poc_t;
 
/**
Compression parameters
*/
typedef struct opj_cparameters {
/** size of tile: tile_size_on = false (not in argument) or = true (in argument) */
bool tile_size_on;
/** XTOsiz */
int cp_tx0;
/** YTOsiz */
int cp_ty0;
/** XTsiz */
int cp_tdx;
/** YTsiz */
int cp_tdy;
/** allocation by rate/distortion */
int cp_disto_alloc;
/** allocation by fixed layer */
int cp_fixed_alloc;
/** add fixed_quality */
int cp_fixed_quality;
/** fixed layer */
int *cp_matrice;
/** comment for coding */
char *cp_comment;
/** csty : coding style */
int csty;
/** progression order (default LRCP) */
OPJ_PROG_ORDER prog_order;
/** progression order changes */
opj_poc_t POC[32];
/** number of progression order changes (POC), default to 0 */
int numpocs;
/** number of layers */
int tcp_numlayers;
/** rates of layers */
float tcp_rates[100];
/** different psnr for successive layers */
float tcp_distoratio[100];
/** number of resolutions */
int numresolution;
/** initial code block width, default to 64 */
int cblockw_init;
/** initial code block height, default to 64 */
int cblockh_init;
/** mode switch (cblk_style) */
int mode;
/** 1 : use the irreversible DWT 9-7, 0 : use lossless compression (default) */
int irreversible;
/** region of interest: affected component in [0..3], -1 means no ROI */
int roi_compno;
/** region of interest: upshift value */
int roi_shift;
/* number of precinct size specifications */
int res_spec;
/** initial precinct width */
int prcw_init[J2K_MAXRLVLS];
/** initial precinct height */
int prch_init[J2K_MAXRLVLS];
 
/**@name command line encoder parameters (not used inside the library) */
/*@{*/
/** input file name */
char infile[OPJ_PATH_LEN];
/** output file name */
char outfile[OPJ_PATH_LEN];
/** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */
int index_on;
/** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */
char index[OPJ_PATH_LEN];
/** subimage encoding: origin image offset in x direction */
int image_offset_x0;
/** subimage encoding: origin image offset in y direction */
int image_offset_y0;
/** subsampling value for dx */
int subsampling_dx;
/** subsampling value for dy */
int subsampling_dy;
/** input file format 0: PGX, 1: PxM, 2: BMP 3:TIF*/
int decod_format;
/** output file format 0: J2K, 1: JP2, 2: JPT */
int cod_format;
/*@}*/
 
/* UniPG>> */
/**@name JPWL encoding parameters */
/*@{*/
/** enables writing of EPC in MH, thus activating JPWL */
bool jpwl_epc_on;
/** error protection method for MH (0,1,16,32,37-128) */
int jpwl_hprot_MH;
/** tile number of header protection specification (>=0) */
int jpwl_hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS];
/** error protection methods for TPHs (0,1,16,32,37-128) */
int jpwl_hprot_TPH[JPWL_MAX_NO_TILESPECS];
/** tile number of packet protection specification (>=0) */
int jpwl_pprot_tileno[JPWL_MAX_NO_PACKSPECS];
/** packet number of packet protection specification (>=0) */
int jpwl_pprot_packno[JPWL_MAX_NO_PACKSPECS];
/** error protection methods for packets (0,1,16,32,37-128) */
int jpwl_pprot[JPWL_MAX_NO_PACKSPECS];
/** enables writing of ESD, (0=no/1/2 bytes) */
int jpwl_sens_size;
/** sensitivity addressing size (0=auto/2/4 bytes) */
int jpwl_sens_addr;
/** sensitivity range (0-3) */
int jpwl_sens_range;
/** sensitivity method for MH (-1=no,0-7) */
int jpwl_sens_MH;
/** tile number of sensitivity specification (>=0) */
int jpwl_sens_TPH_tileno[JPWL_MAX_NO_TILESPECS];
/** sensitivity methods for TPHs (-1=no,0-7) */
int jpwl_sens_TPH[JPWL_MAX_NO_TILESPECS];
/*@}*/
/* <<UniPG */
 
/** Digital Cinema compliance 0-not compliant, 1-compliant*/
OPJ_CINEMA_MODE cp_cinema;
/** Maximum rate for each component. If == 0, component size limitation is not considered */
int max_comp_size;
/** Profile name*/
OPJ_RSIZ_CAPABILITIES cp_rsiz;
/** Tile part generation*/
char tp_on;
/** Flag for Tile part generation*/
char tp_flag;
/** MCT (multiple component transform) */
char tcp_mct;
} opj_cparameters_t;
 
/**
Decompression parameters
*/
typedef struct opj_dparameters {
/**
Set the number of highest resolution levels to be discarded.
The image resolution is effectively divided by 2 to the power of the number of discarded levels.
The reduce factor is limited by the smallest total number of decomposition levels among tiles.
if != 0, then original dimension divided by 2^(reduce);
if == 0 or not used, image is decoded to the full resolution
*/
int cp_reduce;
/**
Set the maximum number of quality layers to decode.
If there are less quality layers than the specified number, all the quality layers are decoded.
if != 0, then only the first "layer" layers are decoded;
if == 0 or not used, all the quality layers are decoded
*/
int cp_layer;
 
/**@name command line encoder parameters (not used inside the library) */
/*@{*/
/** input file name */
char infile[OPJ_PATH_LEN];
/** output file name */
char outfile[OPJ_PATH_LEN];
/** input file format 0: J2K, 1: JP2, 2: JPT */
int decod_format;
/** output file format 0: PGX, 1: PxM, 2: BMP */
int cod_format;
/*@}*/
 
/* UniPG>> */
/**@name JPWL decoding parameters */
/*@{*/
/** activates the JPWL correction capabilities */
bool jpwl_correct;
/** expected number of components */
int jpwl_exp_comps;
/** maximum number of tiles */
int jpwl_max_tiles;
/*@}*/
/* <<UniPG */
 
/**
Specify whether the decoding should be done on the entire codestream, or be limited to the main header
Limiting the decoding to the main header makes it possible to extract the characteristics of the codestream
if == NO_LIMITATION, the entire codestream is decoded;
if == LIMIT_TO_MAIN_HEADER, only the main header is decoded;
*/
OPJ_LIMIT_DECODING cp_limit_decoding;
 
} opj_dparameters_t;
 
/** Common fields between JPEG-2000 compression and decompression master structs. */
 
#define opj_common_fields \
opj_event_mgr_t *event_mgr; /**< pointer to the event manager */\
void * client_data; /**< Available for use by application */\
bool is_decompressor; /**< So common code can tell which is which */\
OPJ_CODEC_FORMAT codec_format; /**< selected codec */\
void *j2k_handle; /**< pointer to the J2K codec */\
void *jp2_handle; /**< pointer to the JP2 codec */\
void *mj2_handle /**< pointer to the MJ2 codec */
/* Routines that are to be used by both halves of the library are declared
* to receive a pointer to this structure. There are no actual instances of
* opj_common_struct_t, only of opj_cinfo_t and opj_dinfo_t.
*/
typedef struct opj_common_struct {
opj_common_fields; /* Fields common to both master struct types */
/* Additional fields follow in an actual opj_cinfo_t or
* opj_dinfo_t. All three structs must agree on these
* initial fields! (This would be a lot cleaner in C++.)
*/
} opj_common_struct_t;
 
typedef opj_common_struct_t * opj_common_ptr;
 
/**
Compression context info
*/
typedef struct opj_cinfo {
/** Fields shared with opj_dinfo_t */
opj_common_fields;
/* other specific fields go here */
} opj_cinfo_t;
 
/**
Decompression context info
*/
typedef struct opj_dinfo {
/** Fields shared with opj_cinfo_t */
opj_common_fields;
/* other specific fields go here */
} opj_dinfo_t;
 
/*
==========================================================
I/O stream typedef definitions
==========================================================
*/
 
/*
* Stream open flags.
*/
/** The stream was opened for reading. */
#define OPJ_STREAM_READ 0x0001
/** The stream was opened for writing. */
#define OPJ_STREAM_WRITE 0x0002
 
/**
Byte input-output stream (CIO)
*/
typedef struct opj_cio {
/** codec context */
opj_common_ptr cinfo;
 
/** open mode (read/write) either OPJ_STREAM_READ or OPJ_STREAM_WRITE */
int openmode;
/** pointer to the start of the buffer */
unsigned char *buffer;
/** buffer size in bytes */
int length;
 
/** pointer to the start of the stream */
unsigned char *start;
/** pointer to the end of the stream */
unsigned char *end;
/** pointer to the current position */
unsigned char *bp;
} opj_cio_t;
 
/*
==========================================================
image typedef definitions
==========================================================
*/
 
/**
Defines a single image component
*/
typedef struct opj_image_comp {
/** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */
int dx;
/** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */
int dy;
/** data width */
int w;
/** data height */
int h;
/** x component offset compared to the whole image */
int x0;
/** y component offset compared to the whole image */
int y0;
/** precision */
int prec;
/** image depth in bits */
int bpp;
/** signed (1) / unsigned (0) */
int sgnd;
/** number of decoded resolution */
int resno_decoded;
/** number of division by 2 of the out image compared to the original size of image */
int factor;
/** image component data */
int *data;
} opj_image_comp_t;
 
/**
Defines image data and characteristics
*/
typedef struct opj_image {
/** XOsiz: horizontal offset from the origin of the reference grid to the left side of the image area */
int x0;
/** YOsiz: vertical offset from the origin of the reference grid to the top side of the image area */
int y0;
/** Xsiz: width of the reference grid */
int x1;
/** Ysiz: height of the reference grid */
int y1;
/** number of components in the image */
int numcomps;
/** color space: sRGB, Greyscale or YUV */
OPJ_COLOR_SPACE color_space;
/** image components */
opj_image_comp_t *comps;
/** 'restricted' ICC profile */
unsigned char *icc_profile_buf;
/** size of ICC profile */
int icc_profile_len;
} opj_image_t;
 
/**
Component parameters structure used by the opj_image_create function
*/
typedef struct opj_image_comptparm {
/** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */
int dx;
/** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */
int dy;
/** data width */
int w;
/** data height */
int h;
/** x component offset compared to the whole image */
int x0;
/** y component offset compared to the whole image */
int y0;
/** precision */
int prec;
/** image depth in bits */
int bpp;
/** signed (1) / unsigned (0) */
int sgnd;
} opj_image_cmptparm_t;
 
/*
==========================================================
Information on the JPEG 2000 codestream
==========================================================
*/
 
/**
Index structure : Information concerning a packet inside tile
*/
typedef struct opj_packet_info {
/** packet start position (including SOP marker if it exists) */
int start_pos;
/** end of packet header position (including EPH marker if it exists)*/
int end_ph_pos;
/** packet end position */
int end_pos;
/** packet distorsion */
double disto;
} opj_packet_info_t;
 
/**
Index structure : Information concerning tile-parts
*/
typedef struct opj_tp_info {
/** start position of tile part */
int tp_start_pos;
/** end position of tile part header */
int tp_end_header;
/** end position of tile part */
int tp_end_pos;
/** start packet of tile part */
int tp_start_pack;
/** number of packets of tile part */
int tp_numpacks;
} opj_tp_info_t;
 
/**
Index structure : information regarding tiles
*/
typedef struct opj_tile_info {
/** value of thresh for each layer by tile cfr. Marcela */
double *thresh;
/** number of tile */
int tileno;
/** start position */
int start_pos;
/** end position of the header */
int end_header;
/** end position */
int end_pos;
/** precinct number for each resolution level (width) */
int pw[33];
/** precinct number for each resolution level (height) */
int ph[33];
/** precinct size (in power of 2), in X for each resolution level */
int pdx[33];
/** precinct size (in power of 2), in Y for each resolution level */
int pdy[33];
/** information concerning packets inside tile */
opj_packet_info_t *packet;
/** add fixed_quality */
int numpix;
/** add fixed_quality */
double distotile;
/** number of tile parts */
int num_tps;
/** information concerning tile parts */
opj_tp_info_t *tp;
} opj_tile_info_t;
 
/* UniPG>> */
/**
Marker structure
*/
typedef struct opj_marker_info_t {
/** marker type */
unsigned short int type;
/** position in codestream */
int pos;
/** length, marker val included */
int len;
} opj_marker_info_t;
/* <<UniPG */
 
/**
Index structure of the codestream
*/
typedef struct opj_codestream_info {
/** maximum distortion reduction on the whole image (add for Marcela) */
double D_max;
/** packet number */
int packno;
/** writing the packet in the index with t2_encode_packets */
int index_write;
/** image width */
int image_w;
/** image height */
int image_h;
/** progression order */
OPJ_PROG_ORDER prog;
/** tile size in x */
int tile_x;
/** tile size in y */
int tile_y;
/** */
int tile_Ox;
/** */
int tile_Oy;
/** number of tiles in X */
int tw;
/** number of tiles in Y */
int th;
/** component numbers */
int numcomps;
/** number of layer */
int numlayers;
/** number of decomposition for each component */
int *numdecompos;
/* UniPG>> */
/** number of markers */
int marknum;
/** list of markers */
opj_marker_info_t *marker;
/** actual size of markers array */
int maxmarknum;
/* <<UniPG */
/** main header position */
int main_head_start;
/** main header position */
int main_head_end;
/** codestream's size */
int codestream_size;
/** information regarding tiles inside image */
opj_tile_info_t *tile;
} opj_codestream_info_t;
 
#ifdef __cplusplus
extern "C" {
#endif
 
 
/*
==========================================================
openjpeg version
==========================================================
*/
 
OPJ_API const char * OPJ_CALLCONV opj_version(void);
 
/*
==========================================================
image functions definitions
==========================================================
*/
 
/**
Create an image
@param numcmpts number of components
@param cmptparms components parameters
@param clrspc image color space
@return returns a new image structure if successful, returns NULL otherwise
*/
OPJ_API opj_image_t* OPJ_CALLCONV opj_image_create(int numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc);
 
/**
Deallocate any resources associated with an image
@param image image to be destroyed
*/
OPJ_API void OPJ_CALLCONV opj_image_destroy(opj_image_t *image);
 
/*
==========================================================
stream functions definitions
==========================================================
*/
 
/**
Open and allocate a memory stream for read / write.
On reading, the user must provide a buffer containing encoded data. The buffer will be
wrapped by the returned CIO handle.
On writing, buffer parameters must be set to 0: a buffer will be allocated by the library
to contain encoded data.
@param cinfo Codec context info
@param buffer Reading: buffer address. Writing: NULL
@param length Reading: buffer length. Writing: 0
@return Returns a CIO handle if successful, returns NULL otherwise
*/
OPJ_API opj_cio_t* OPJ_CALLCONV opj_cio_open(opj_common_ptr cinfo, unsigned char *buffer, int length);
 
/**
Close and free a CIO handle
@param cio CIO handle to free
*/
OPJ_API void OPJ_CALLCONV opj_cio_close(opj_cio_t *cio);
 
/**
Get position in byte stream
@param cio CIO handle
@return Returns the position in bytes
*/
OPJ_API int OPJ_CALLCONV cio_tell(opj_cio_t *cio);
/**
Set position in byte stream
@param cio CIO handle
@param pos Position, in number of bytes, from the beginning of the stream
*/
OPJ_API void OPJ_CALLCONV cio_seek(opj_cio_t *cio, int pos);
 
/*
==========================================================
event manager functions definitions
==========================================================
*/
 
OPJ_API opj_event_mgr_t* OPJ_CALLCONV opj_set_event_mgr(opj_common_ptr cinfo, opj_event_mgr_t *event_mgr, void *context);
 
/*
==========================================================
codec functions definitions
==========================================================
*/
/**
Creates a J2K/JPT/JP2 decompression structure
@param format Decoder to select
@return Returns a handle to a decompressor if successful, returns NULL otherwise
*/
OPJ_API opj_dinfo_t* OPJ_CALLCONV opj_create_decompress(OPJ_CODEC_FORMAT format);
/**
Destroy a decompressor handle
@param dinfo decompressor handle to destroy
*/
OPJ_API void OPJ_CALLCONV opj_destroy_decompress(opj_dinfo_t *dinfo);
/**
Set decoding parameters to default values
@param parameters Decompression parameters
*/
OPJ_API void OPJ_CALLCONV opj_set_default_decoder_parameters(opj_dparameters_t *parameters);
/**
Setup the decoder decoding parameters using user parameters.
Decoding parameters are returned in j2k->cp.
@param dinfo decompressor handle
@param parameters decompression parameters
*/
OPJ_API void OPJ_CALLCONV opj_setup_decoder(opj_dinfo_t *dinfo, opj_dparameters_t *parameters);
/**
Decode an image from a JPEG-2000 codestream
@param dinfo decompressor handle
@param cio Input buffer stream
@return Returns a decoded image if successful, returns NULL otherwise
*/
OPJ_API opj_image_t* OPJ_CALLCONV opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio);
 
/**
Decode an image from a JPEG-2000 codestream and extract the codestream information
@param dinfo decompressor handle
@param cio Input buffer stream
@param cstr_info Codestream information structure if needed afterwards, NULL otherwise
@return Returns a decoded image if successful, returns NULL otherwise
*/
OPJ_API opj_image_t* OPJ_CALLCONV opj_decode_with_info(opj_dinfo_t *dinfo, opj_cio_t *cio, opj_codestream_info_t *cstr_info);
/**
Creates a J2K/JP2 compression structure
@param format Coder to select
@return Returns a handle to a compressor if successful, returns NULL otherwise
*/
OPJ_API opj_cinfo_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format);
/**
Destroy a compressor handle
@param cinfo compressor handle to destroy
*/
OPJ_API void OPJ_CALLCONV opj_destroy_compress(opj_cinfo_t *cinfo);
/**
Set encoding parameters to default values, that means :
<ul>
<li>Lossless
<li>1 tile
<li>Size of precinct : 2^15 x 2^15 (means 1 precinct)
<li>Size of code-block : 64 x 64
<li>Number of resolutions: 6
<li>No SOP marker in the codestream
<li>No EPH marker in the codestream
<li>No sub-sampling in x or y direction
<li>No mode switch activated
<li>Progression order: LRCP
<li>No index file
<li>No ROI upshifted
<li>No offset of the origin of the image
<li>No offset of the origin of the tiles
<li>Reversible DWT 5-3
</ul>
@param parameters Compression parameters
*/
OPJ_API void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t *parameters);
/**
Setup the encoder parameters using the current image and using user parameters.
@param cinfo Compressor handle
@param parameters Compression parameters
@param image Input filled image
*/
OPJ_API void OPJ_CALLCONV opj_setup_encoder(opj_cinfo_t *cinfo, opj_cparameters_t *parameters, opj_image_t *image);
/**
Encode an image into a JPEG-2000 codestream
@param cinfo compressor handle
@param cio Output buffer stream
@param image Image to encode
@param index Depreacted -> Set to NULL. To extract index, used opj_encode_wci()
@return Returns true if successful, returns false otherwise
*/
OPJ_API bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index);
/**
Encode an image into a JPEG-2000 codestream and extract the codestream information
@param cinfo compressor handle
@param cio Output buffer stream
@param image Image to encode
@param cstr_info Codestream information structure if needed afterwards, NULL otherwise
@return Returns true if successful, returns false otherwise
*/
OPJ_API bool OPJ_CALLCONV opj_encode_with_info(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info);
/**
Destroy Codestream information after compression or decompression
@param cstr_info Codestream information structure
*/
OPJ_API void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_t *cstr_info);
 
#ifdef __cplusplus
}
#endif
 
#endif /* OPENJPEG_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/opj_includes.h
0,0 → 1,136
/*
* Copyright (c) 2005, Hervé Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef OPJ_INCLUDES_H
#define OPJ_INCLUDES_H
 
/*
==========================================================
Standard includes used by the library
==========================================================
*/
// #include <memory.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <float.h>
#include <time.h>
#include <stdio.h>
#include <stdarg.h>
#include <ctype.h>
 
/*
==========================================================
OpenJPEG interface
==========================================================
*/
#include "openjpeg.h"
 
/*
==========================================================
OpenJPEG modules
==========================================================
*/
 
/* Ignore GCC attributes if this is not GCC */
#ifndef __GNUC__
#define __attribute__(x) /* __attribute__(x) */
#endif
 
/*
The inline keyword is supported by C99 but not by C90.
Most compilers implement their own version of this keyword ...
*/
#ifndef INLINE
#if defined(_MSC_VER)
#define INLINE __forceinline
#elif defined(__GNUC__)
#define INLINE __inline__
#elif defined(__MWERKS__)
#define INLINE inline
#else
/* add other compilers here ... */
#define INLINE
#endif /* defined(<Compiler>) */
#endif /* INLINE */
 
/* Are restricted pointers available? (C99) */
#if (__STDC_VERSION__ != 199901L)
/* Not a C99 compiler */
#ifdef __GNUC__
#define restrict __restrict__
#else
#define restrict /* restrict */
#endif
#endif
 
/* MSVC and Borland C do not have lrintf */
#if defined(_MSC_VER) || defined(__BORLANDC__)
static INLINE long lrintf(float f){
#ifdef _M_X64
return (long)((f>0.0f) ? (f + 0.5f):(f -0.5f));
#else
int i;
_asm{
fld f
fistp i
};
return i;
#endif
}
#endif
 
#include "j2k_lib.h"
#include "opj_malloc.h"
#include "event.h"
#include "cio.h"
 
#include "image.h"
#include "j2k.h"
#include "jp2.h"
#include "jpt.h"
 
#include "mqc.h"
#include "raw.h"
#include "bio.h"
#include "tgt.h"
#include "pi.h"
#include "tcd.h"
#include "t1.h"
#include "dwt.h"
#include "t2.h"
#include "mct.h"
#include "int.h"
#include "fix.h"
 
/* JPWL>> */
#ifdef USE_JPWL
#include "../jpwl/jpwl.h"
#endif /* USE_JPWL */
/* <<JPWL */
 
#endif /* OPJ_INCLUDES_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/opj_malloc.h
0,0 → 1,166
/*
* Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __OPJ_MALLOC_H
#define __OPJ_MALLOC_H
/**
@file opj_malloc.h
@brief Internal functions
 
The functions in opj_malloc.h are internal utilities used for memory management.
*/
 
/** @defgroup MISC MISC - Miscellaneous internal functions */
/*@{*/
 
/** @name Exported functions */
/*@{*/
/* ----------------------------------------------------------------------- */
 
/**
Allocate an uninitialized memory block
@param size Bytes to allocate
@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
*/
#ifdef ALLOC_PERF_OPT
void * OPJ_CALLCONV opj_malloc(size_t size);
#else
#define opj_malloc(size) malloc(size)
#endif
 
/**
Allocate a memory block with elements initialized to 0
@param num Blocks to allocate
@param size Bytes per block to allocate
@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
*/
#ifdef ALLOC_PERF_OPT
void * OPJ_CALLCONV opj_calloc(size_t _NumOfElements, size_t _SizeOfElements);
#else
#define opj_calloc(num, size) calloc(num, size)
#endif
 
/**
Allocate memory aligned to a 16 byte boundry
@param size Bytes to allocate
@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
*/
/* FIXME: These should be set with cmake tests, but we're currently not requiring use of cmake */
#ifdef _WIN32
/* Someone should tell the mingw people that their malloc.h ought to provide _mm_malloc() */
#ifdef __GNUC__
#include <mm_malloc.h>
#define HAVE_MM_MALLOC
#else /* MSVC, Intel C++ */
#include <malloc.h>
#ifdef _mm_malloc
#define HAVE_MM_MALLOC
#endif
#endif
#else /* Not _WIN32 */
 
#if defined(__sun)
#define HAVE_MEMALIGN
/* Linux x86_64 and OSX always align allocations to 16 bytes */
#elif !defined(__amd64__) && !defined(__APPLE__)
// #define HAVE_MEMALIGN
#include <malloc.h>
#endif
#endif
 
#define opj_aligned_malloc(size) malloc(size)
#define opj_aligned_free(m) free(m)
 
#ifdef HAVE_MM_MALLOC
#undef opj_aligned_malloc
#define opj_aligned_malloc(size) _mm_malloc(size, 16)
#undef opj_aligned_free
#define opj_aligned_free(m) _mm_free(m)
#endif
 
#undef HAVE_MEMALIGN
#ifdef HAVE_MEMALIGN
extern void* memalign(size_t, size_t);
#undef opj_aligned_malloc
#define opj_aligned_malloc(size) memalign(16, (size))
#undef opj_aligned_free
#define opj_aligned_free(m) free(m)
#endif
 
#undef HAVE_POSIX_MEMALIGN
#ifdef HAVE_POSIX_MEMALIGN
#undef opj_aligned_malloc
extern int posix_memalign(void**, size_t, size_t);
 
static INLINE void* __attribute__ ((malloc)) opj_aligned_malloc(size_t size){
void* mem = NULL;
posix_memalign(&mem, 16, size);
return mem;
}
#undef opj_aligned_free
#define opj_aligned_free(m) free(m)
#endif
 
#ifdef ALLOC_PERF_OPT
#undef opj_aligned_malloc
#define opj_aligned_malloc(size) opj_malloc(size)
#undef opj_aligned_free
#define opj_aligned_free(m) opj_free(m)
#endif
 
/**
Reallocate memory blocks.
@param m Pointer to previously allocated memory block
@param s New size in bytes
@return Returns a void pointer to the reallocated (and possibly moved) memory block
*/
#ifdef ALLOC_PERF_OPT
void * OPJ_CALLCONV opj_realloc(void * m, size_t s);
#else
#define opj_realloc(m, s) realloc(m, s)
#endif
 
/**
Deallocates or frees a memory block.
@param m Previously allocated memory block to be freed
*/
#ifdef ALLOC_PERF_OPT
void OPJ_CALLCONV opj_free(void * m);
#else
#define opj_free(m) free(m)
#endif
 
#ifdef __GNUC__
#pragma GCC poison malloc calloc realloc free
#endif
 
/* ----------------------------------------------------------------------- */
/*@}*/
 
/*@}*/
 
#endif /* __OPJ_MALLOC_H */
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/pi.c
0,0 → 1,963
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* Copyright (c) 2006-2007, Parvatha Elangovan
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#include "opj_includes.h"
 
/** @defgroup PI PI - Implementation of a packet iterator */
/*@{*/
 
/** @name Local static functions */
/*@{*/
 
/**
Get next packet in layer-resolution-component-precinct order.
@param pi packet iterator to modify
@return returns false if pi pointed to the last packet or else returns true
*/
static bool pi_next_lrcp(opj_pi_iterator_t * pi);
/**
Get next packet in resolution-layer-component-precinct order.
@param pi packet iterator to modify
@return returns false if pi pointed to the last packet or else returns true
*/
static bool pi_next_rlcp(opj_pi_iterator_t * pi);
/**
Get next packet in resolution-precinct-component-layer order.
@param pi packet iterator to modify
@return returns false if pi pointed to the last packet or else returns true
*/
static bool pi_next_rpcl(opj_pi_iterator_t * pi);
/**
Get next packet in precinct-component-resolution-layer order.
@param pi packet iterator to modify
@return returns false if pi pointed to the last packet or else returns true
*/
static bool pi_next_pcrl(opj_pi_iterator_t * pi);
/**
Get next packet in component-precinct-resolution-layer order.
@param pi packet iterator to modify
@return returns false if pi pointed to the last packet or else returns true
*/
static bool pi_next_cprl(opj_pi_iterator_t * pi);
 
/*@}*/
 
/*@}*/
 
/*
==========================================================
local functions
==========================================================
*/
 
static bool pi_next_lrcp(opj_pi_iterator_t * pi) {
opj_pi_comp_t *comp = NULL;
opj_pi_resolution_t *res = NULL;
long index = 0;
if (!pi->first) {
comp = &pi->comps[pi->compno];
res = &comp->resolutions[pi->resno];
goto LABEL_SKIP;
} else {
pi->first = 0;
}
 
for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1;
pi->resno++) {
for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
comp = &pi->comps[pi->compno];
if (pi->resno >= comp->numresolutions) {
continue;
}
res = &comp->resolutions[pi->resno];
if (!pi->tp_on){
pi->poc.precno1 = res->pw * res->ph;
}
for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) {
index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
if (!pi->include[index]) {
pi->include[index] = 1;
return true;
}
LABEL_SKIP:;
}
}
}
}
return false;
}
 
static bool pi_next_rlcp(opj_pi_iterator_t * pi) {
opj_pi_comp_t *comp = NULL;
opj_pi_resolution_t *res = NULL;
long index = 0;
 
if (!pi->first) {
comp = &pi->comps[pi->compno];
res = &comp->resolutions[pi->resno];
goto LABEL_SKIP;
} else {
pi->first = 0;
}
 
for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {
for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
comp = &pi->comps[pi->compno];
if (pi->resno >= comp->numresolutions) {
continue;
}
res = &comp->resolutions[pi->resno];
if(!pi->tp_on){
pi->poc.precno1 = res->pw * res->ph;
}
for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) {
index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
if (!pi->include[index]) {
pi->include[index] = 1;
return true;
}
LABEL_SKIP:;
}
}
}
}
return false;
}
 
static bool pi_next_rpcl(opj_pi_iterator_t * pi) {
opj_pi_comp_t *comp = NULL;
opj_pi_resolution_t *res = NULL;
long index = 0;
 
if (!pi->first) {
goto LABEL_SKIP;
} else {
int compno, resno;
pi->first = 0;
pi->dx = 0;
pi->dy = 0;
for (compno = 0; compno < pi->numcomps; compno++) {
comp = &pi->comps[compno];
for (resno = 0; resno < comp->numresolutions; resno++) {
int dx, dy;
res = &comp->resolutions[resno];
dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno));
dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno));
pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
}
}
}
if (!pi->tp_on){
pi->poc.ty0 = pi->ty0;
pi->poc.tx0 = pi->tx0;
pi->poc.ty1 = pi->ty1;
pi->poc.tx1 = pi->tx1;
}
for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {
for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += pi->dy - (pi->y % pi->dy)) {
for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += pi->dx - (pi->x % pi->dx)) {
for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
int levelno;
int trx0, try0;
int trx1, try1;
int rpx, rpy;
int prci, prcj;
comp = &pi->comps[pi->compno];
if (pi->resno >= comp->numresolutions) {
continue;
}
res = &comp->resolutions[pi->resno];
levelno = comp->numresolutions - 1 - pi->resno;
trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);
try1 = int_ceildiv(pi->ty1, comp->dy << levelno);
rpx = res->pdx + levelno;
rpy = res->pdy + levelno;
if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){
continue;
}
if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){
continue;
}
if ((res->pw==0)||(res->ph==0)) continue;
if ((trx0==trx1)||(try0==try1)) continue;
prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx)
- int_floordivpow2(trx0, res->pdx);
prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy)
- int_floordivpow2(try0, res->pdy);
pi->precno = prci + prcj * res->pw;
for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
if (!pi->include[index]) {
pi->include[index] = 1;
return true;
}
LABEL_SKIP:;
}
}
}
}
}
return false;
}
 
static bool pi_next_pcrl(opj_pi_iterator_t * pi) {
opj_pi_comp_t *comp = NULL;
opj_pi_resolution_t *res = NULL;
long index = 0;
 
if (!pi->first) {
comp = &pi->comps[pi->compno];
goto LABEL_SKIP;
} else {
int compno, resno;
pi->first = 0;
pi->dx = 0;
pi->dy = 0;
for (compno = 0; compno < pi->numcomps; compno++) {
comp = &pi->comps[compno];
for (resno = 0; resno < comp->numresolutions; resno++) {
int dx, dy;
res = &comp->resolutions[resno];
dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno));
dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno));
pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
}
}
}
if (!pi->tp_on){
pi->poc.ty0 = pi->ty0;
pi->poc.tx0 = pi->tx0;
pi->poc.ty1 = pi->ty1;
pi->poc.tx1 = pi->tx1;
}
for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += pi->dy - (pi->y % pi->dy)) {
for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += pi->dx - (pi->x % pi->dx)) {
for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
comp = &pi->comps[pi->compno];
for (pi->resno = pi->poc.resno0; pi->resno < int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) {
int levelno;
int trx0, try0;
int trx1, try1;
int rpx, rpy;
int prci, prcj;
res = &comp->resolutions[pi->resno];
levelno = comp->numresolutions - 1 - pi->resno;
trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);
try1 = int_ceildiv(pi->ty1, comp->dy << levelno);
rpx = res->pdx + levelno;
rpy = res->pdy + levelno;
if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){
continue;
}
if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){
continue;
}
if ((res->pw==0)||(res->ph==0)) continue;
if ((trx0==trx1)||(try0==try1)) continue;
prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx)
- int_floordivpow2(trx0, res->pdx);
prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy)
- int_floordivpow2(try0, res->pdy);
pi->precno = prci + prcj * res->pw;
for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
if (!pi->include[index]) {
pi->include[index] = 1;
return true;
}
LABEL_SKIP:;
}
}
}
}
}
return false;
}
 
static bool pi_next_cprl(opj_pi_iterator_t * pi) {
opj_pi_comp_t *comp = NULL;
opj_pi_resolution_t *res = NULL;
long index = 0;
 
if (!pi->first) {
comp = &pi->comps[pi->compno];
goto LABEL_SKIP;
} else {
pi->first = 0;
}
 
for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
int resno;
comp = &pi->comps[pi->compno];
pi->dx = 0;
pi->dy = 0;
for (resno = 0; resno < comp->numresolutions; resno++) {
int dx, dy;
res = &comp->resolutions[resno];
dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno));
dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno));
pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
}
if (!pi->tp_on){
pi->poc.ty0 = pi->ty0;
pi->poc.tx0 = pi->tx0;
pi->poc.ty1 = pi->ty1;
pi->poc.tx1 = pi->tx1;
}
for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += pi->dy - (pi->y % pi->dy)) {
for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += pi->dx - (pi->x % pi->dx)) {
for (pi->resno = pi->poc.resno0; pi->resno < int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) {
int levelno;
int trx0, try0;
int trx1, try1;
int rpx, rpy;
int prci, prcj;
res = &comp->resolutions[pi->resno];
levelno = comp->numresolutions - 1 - pi->resno;
trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);
try1 = int_ceildiv(pi->ty1, comp->dy << levelno);
rpx = res->pdx + levelno;
rpy = res->pdy + levelno;
if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){
continue;
}
if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){
continue;
}
if ((res->pw==0)||(res->ph==0)) continue;
if ((trx0==trx1)||(try0==try1)) continue;
prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx)
- int_floordivpow2(trx0, res->pdx);
prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy)
- int_floordivpow2(try0, res->pdy);
pi->precno = prci + prcj * res->pw;
for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
if (!pi->include[index]) {
pi->include[index] = 1;
return true;
}
LABEL_SKIP:;
}
}
}
}
}
return false;
}
 
/*
==========================================================
Packet iterator interface
==========================================================
*/
 
opj_pi_iterator_t *pi_create_decode(opj_image_t *image, opj_cp_t *cp, int tileno) {
int p, q;
int compno, resno, pino;
opj_pi_iterator_t *pi = NULL;
opj_tcp_t *tcp = NULL;
opj_tccp_t *tccp = NULL;
 
tcp = &cp->tcps[tileno];
 
pi = (opj_pi_iterator_t*) opj_calloc((tcp->numpocs + 1), sizeof(opj_pi_iterator_t));
if(!pi) {
/* TODO: throw an error */
return NULL;
}
 
for (pino = 0; pino < tcp->numpocs + 1; pino++) { /* change */
int maxres = 0;
int maxprec = 0;
p = tileno % cp->tw;
q = tileno / cp->tw;
 
pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, image->x0);
pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, image->y0);
pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1);
pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1);
pi[pino].numcomps = image->numcomps;
 
pi[pino].comps = (opj_pi_comp_t*) opj_calloc(image->numcomps, sizeof(opj_pi_comp_t));
if(!pi[pino].comps) {
/* TODO: throw an error */
pi_destroy(pi, cp, tileno);
return NULL;
}
for (compno = 0; compno < pi->numcomps; compno++) {
int tcx0, tcy0, tcx1, tcy1;
opj_pi_comp_t *comp = &pi[pino].comps[compno];
tccp = &tcp->tccps[compno];
comp->dx = image->comps[compno].dx;
comp->dy = image->comps[compno].dy;
comp->numresolutions = tccp->numresolutions;
 
comp->resolutions = (opj_pi_resolution_t*) opj_calloc(comp->numresolutions, sizeof(opj_pi_resolution_t));
if(!comp->resolutions) {
/* TODO: throw an error */
pi_destroy(pi, cp, tileno);
return NULL;
}
 
tcx0 = int_ceildiv(pi->tx0, comp->dx);
tcy0 = int_ceildiv(pi->ty0, comp->dy);
tcx1 = int_ceildiv(pi->tx1, comp->dx);
tcy1 = int_ceildiv(pi->ty1, comp->dy);
if (comp->numresolutions > maxres) {
maxres = comp->numresolutions;
}
 
for (resno = 0; resno < comp->numresolutions; resno++) {
int levelno;
int rx0, ry0, rx1, ry1;
int px0, py0, px1, py1;
opj_pi_resolution_t *res = &comp->resolutions[resno];
if (tccp->csty & J2K_CCP_CSTY_PRT) {
res->pdx = tccp->prcw[resno];
res->pdy = tccp->prch[resno];
} else {
res->pdx = 15;
res->pdy = 15;
}
levelno = comp->numresolutions - 1 - resno;
rx0 = int_ceildivpow2(tcx0, levelno);
ry0 = int_ceildivpow2(tcy0, levelno);
rx1 = int_ceildivpow2(tcx1, levelno);
ry1 = int_ceildivpow2(tcy1, levelno);
px0 = int_floordivpow2(rx0, res->pdx) << res->pdx;
py0 = int_floordivpow2(ry0, res->pdy) << res->pdy;
px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx;
py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy;
res->pw = (rx0==rx1)?0:((px1 - px0) >> res->pdx);
res->ph = (ry0==ry1)?0:((py1 - py0) >> res->pdy);
if (res->pw*res->ph > maxprec) {
maxprec = res->pw*res->ph;
}
}
}
tccp = &tcp->tccps[0];
pi[pino].step_p = 1;
pi[pino].step_c = maxprec * pi[pino].step_p;
pi[pino].step_r = image->numcomps * pi[pino].step_c;
pi[pino].step_l = maxres * pi[pino].step_r;
if (pino == 0) {
pi[pino].include = (short int*) opj_calloc(image->numcomps * maxres * tcp->numlayers * maxprec, sizeof(short int));
if(!pi[pino].include) {
/* TODO: throw an error */
pi_destroy(pi, cp, tileno);
return NULL;
}
}
else {
pi[pino].include = pi[pino - 1].include;
}
if (tcp->POC == 0) {
pi[pino].first = 1;
pi[pino].poc.resno0 = 0;
pi[pino].poc.compno0 = 0;
pi[pino].poc.layno1 = tcp->numlayers;
pi[pino].poc.resno1 = maxres;
pi[pino].poc.compno1 = image->numcomps;
pi[pino].poc.prg = tcp->prg;
} else {
pi[pino].first = 1;
pi[pino].poc.resno0 = tcp->pocs[pino].resno0;
pi[pino].poc.compno0 = tcp->pocs[pino].compno0;
pi[pino].poc.layno1 = tcp->pocs[pino].layno1;
pi[pino].poc.resno1 = tcp->pocs[pino].resno1;
pi[pino].poc.compno1 = tcp->pocs[pino].compno1;
pi[pino].poc.prg = tcp->pocs[pino].prg;
}
pi[pino].poc.layno0 = 0;
pi[pino].poc.precno0 = 0;
pi[pino].poc.precno1 = maxprec;
}
return pi;
}
 
 
opj_pi_iterator_t *pi_initialise_encode(opj_image_t *image, opj_cp_t *cp, int tileno, J2K_T2_MODE t2_mode){
int p, q, pino;
int compno, resno;
int maxres = 0;
int maxprec = 0;
opj_pi_iterator_t *pi = NULL;
opj_tcp_t *tcp = NULL;
opj_tccp_t *tccp = NULL;
tcp = &cp->tcps[tileno];
 
pi = (opj_pi_iterator_t*) opj_calloc((tcp->numpocs + 1), sizeof(opj_pi_iterator_t));
if(!pi) { return NULL;}
pi->tp_on = cp->tp_on;
 
for(pino = 0;pino < tcp->numpocs+1 ; pino ++){
p = tileno % cp->tw;
q = tileno / cp->tw;
 
pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, image->x0);
pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, image->y0);
pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1);
pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1);
pi[pino].numcomps = image->numcomps;
pi[pino].comps = (opj_pi_comp_t*) opj_calloc(image->numcomps, sizeof(opj_pi_comp_t));
if(!pi[pino].comps) {
pi_destroy(pi, cp, tileno);
return NULL;
}
for (compno = 0; compno < pi[pino].numcomps; compno++) {
int tcx0, tcy0, tcx1, tcy1;
opj_pi_comp_t *comp = &pi[pino].comps[compno];
tccp = &tcp->tccps[compno];
comp->dx = image->comps[compno].dx;
comp->dy = image->comps[compno].dy;
comp->numresolutions = tccp->numresolutions;
 
comp->resolutions = (opj_pi_resolution_t*) opj_malloc(comp->numresolutions * sizeof(opj_pi_resolution_t));
if(!comp->resolutions) {
pi_destroy(pi, cp, tileno);
return NULL;
}
 
tcx0 = int_ceildiv(pi[pino].tx0, comp->dx);
tcy0 = int_ceildiv(pi[pino].ty0, comp->dy);
tcx1 = int_ceildiv(pi[pino].tx1, comp->dx);
tcy1 = int_ceildiv(pi[pino].ty1, comp->dy);
if (comp->numresolutions > maxres) {
maxres = comp->numresolutions;
}
 
for (resno = 0; resno < comp->numresolutions; resno++) {
int levelno;
int rx0, ry0, rx1, ry1;
int px0, py0, px1, py1;
opj_pi_resolution_t *res = &comp->resolutions[resno];
if (tccp->csty & J2K_CCP_CSTY_PRT) {
res->pdx = tccp->prcw[resno];
res->pdy = tccp->prch[resno];
} else {
res->pdx = 15;
res->pdy = 15;
}
levelno = comp->numresolutions - 1 - resno;
rx0 = int_ceildivpow2(tcx0, levelno);
ry0 = int_ceildivpow2(tcy0, levelno);
rx1 = int_ceildivpow2(tcx1, levelno);
ry1 = int_ceildivpow2(tcy1, levelno);
px0 = int_floordivpow2(rx0, res->pdx) << res->pdx;
py0 = int_floordivpow2(ry0, res->pdy) << res->pdy;
px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx;
py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy;
res->pw = (rx0==rx1)?0:((px1 - px0) >> res->pdx);
res->ph = (ry0==ry1)?0:((py1 - py0) >> res->pdy);
 
if (res->pw*res->ph > maxprec) {
maxprec = res->pw * res->ph;
}
}
}
tccp = &tcp->tccps[0];
pi[pino].step_p = 1;
pi[pino].step_c = maxprec * pi[pino].step_p;
pi[pino].step_r = image->numcomps * pi[pino].step_c;
pi[pino].step_l = maxres * pi[pino].step_r;
for (compno = 0; compno < pi->numcomps; compno++) {
opj_pi_comp_t *comp = &pi->comps[compno];
for (resno = 0; resno < comp->numresolutions; resno++) {
int dx, dy;
opj_pi_resolution_t *res = &comp->resolutions[resno];
dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno));
dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno));
pi[pino].dx = !pi->dx ? dx : int_min(pi->dx, dx);
pi[pino].dy = !pi->dy ? dy : int_min(pi->dy, dy);
}
}
 
if (pino == 0) {
pi[pino].include = (short int*) opj_calloc(tcp->numlayers * pi[pino].step_l, sizeof(short int));
if(!pi[pino].include) {
pi_destroy(pi, cp, tileno);
return NULL;
}
}
else {
pi[pino].include = pi[pino - 1].include;
}
/* Generation of boundaries for each prog flag*/
if(tcp->POC && ( cp->cinema || ((!cp->cinema) && (t2_mode == FINAL_PASS)))){
tcp->pocs[pino].compS= tcp->pocs[pino].compno0;
tcp->pocs[pino].compE= tcp->pocs[pino].compno1;
tcp->pocs[pino].resS = tcp->pocs[pino].resno0;
tcp->pocs[pino].resE = tcp->pocs[pino].resno1;
tcp->pocs[pino].layE = tcp->pocs[pino].layno1;
tcp->pocs[pino].prg = tcp->pocs[pino].prg1;
if (pino > 0)
tcp->pocs[pino].layS = (tcp->pocs[pino].layE > tcp->pocs[pino - 1].layE) ? tcp->pocs[pino - 1].layE : 0;
}else {
tcp->pocs[pino].compS= 0;
tcp->pocs[pino].compE= image->numcomps;
tcp->pocs[pino].resS = 0;
tcp->pocs[pino].resE = maxres;
tcp->pocs[pino].layS = 0;
tcp->pocs[pino].layE = tcp->numlayers;
tcp->pocs[pino].prg = tcp->prg;
}
tcp->pocs[pino].prcS = 0;
tcp->pocs[pino].prcE = maxprec;;
tcp->pocs[pino].txS = pi[pino].tx0;
tcp->pocs[pino].txE = pi[pino].tx1;
tcp->pocs[pino].tyS = pi[pino].ty0;
tcp->pocs[pino].tyE = pi[pino].ty1;
tcp->pocs[pino].dx = pi[pino].dx;
tcp->pocs[pino].dy = pi[pino].dy;
}
return pi;
}
 
 
 
void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno) {
int compno, pino;
opj_tcp_t *tcp = &cp->tcps[tileno];
if(pi) {
for (pino = 0; pino < tcp->numpocs + 1; pino++) {
if(pi[pino].comps) {
for (compno = 0; compno < pi->numcomps; compno++) {
opj_pi_comp_t *comp = &pi[pino].comps[compno];
if(comp->resolutions) {
opj_free(comp->resolutions);
}
}
opj_free(pi[pino].comps);
}
}
if(pi->include) {
opj_free(pi->include);
}
opj_free(pi);
}
}
 
bool pi_next(opj_pi_iterator_t * pi) {
switch (pi->poc.prg) {
case LRCP:
return pi_next_lrcp(pi);
case RLCP:
return pi_next_rlcp(pi);
case RPCL:
return pi_next_rpcl(pi);
case PCRL:
return pi_next_pcrl(pi);
case CPRL:
return pi_next_cprl(pi);
case PROG_UNKNOWN:
return false;
}
return false;
}
 
bool pi_create_encode( opj_pi_iterator_t *pi, opj_cp_t *cp,int tileno, int pino,int tpnum, int tppos, J2K_T2_MODE t2_mode,int cur_totnum_tp){
char prog[4];
int i;
int incr_top=1,resetX=0;
opj_tcp_t *tcps =&cp->tcps[tileno];
opj_poc_t *tcp= &tcps->pocs[pino];
 
pi[pino].first = 1;
pi[pino].poc.prg = tcp->prg;
 
switch(tcp->prg){
case CPRL: strncpy(prog, "CPRL",4);
break;
case LRCP: strncpy(prog, "LRCP",4);
break;
case PCRL: strncpy(prog, "PCRL",4);
break;
case RLCP: strncpy(prog, "RLCP",4);
break;
case RPCL: strncpy(prog, "RPCL",4);
break;
case PROG_UNKNOWN:
return true;
}
 
if(!(cp->tp_on && ((!cp->cinema && (t2_mode == FINAL_PASS)) || cp->cinema))){
pi[pino].poc.resno0 = tcp->resS;
pi[pino].poc.resno1 = tcp->resE;
pi[pino].poc.compno0 = tcp->compS;
pi[pino].poc.compno1 = tcp->compE;
pi[pino].poc.layno0 = tcp->layS;
pi[pino].poc.layno1 = tcp->layE;
pi[pino].poc.precno0 = tcp->prcS;
pi[pino].poc.precno1 = tcp->prcE;
pi[pino].poc.tx0 = tcp->txS;
pi[pino].poc.ty0 = tcp->tyS;
pi[pino].poc.tx1 = tcp->txE;
pi[pino].poc.ty1 = tcp->tyE;
}else {
if( tpnum < cur_totnum_tp){
for(i=3;i>=0;i--){
switch(prog[i]){
case 'C':
if (i > tppos){
pi[pino].poc.compno0 = tcp->compS;
pi[pino].poc.compno1 = tcp->compE;
}else{
if (tpnum == 0){
tcp->comp_t = tcp->compS;
pi[pino].poc.compno0 = tcp->comp_t;
pi[pino].poc.compno1 = tcp->comp_t+1;
tcp->comp_t+=1;
}else{
if (incr_top == 1){
if(tcp->comp_t ==tcp->compE){
tcp->comp_t = tcp->compS;
pi[pino].poc.compno0 = tcp->comp_t;
pi[pino].poc.compno1 = tcp->comp_t+1;
tcp->comp_t+=1;
incr_top=1;
}else{
pi[pino].poc.compno0 = tcp->comp_t;
pi[pino].poc.compno1 = tcp->comp_t+1;
tcp->comp_t+=1;
incr_top=0;
}
}else{
pi[pino].poc.compno0 = tcp->comp_t-1;
pi[pino].poc.compno1 = tcp->comp_t;
}
}
}
break;
 
case 'R':
if (i > tppos){
pi[pino].poc.resno0 = tcp->resS;
pi[pino].poc.resno1 = tcp->resE;
}else{
if (tpnum == 0){
tcp->res_t = tcp->resS;
pi[pino].poc.resno0 = tcp->res_t;
pi[pino].poc.resno1 = tcp->res_t+1;
tcp->res_t+=1;
}else{
if (incr_top == 1){
if(tcp->res_t==tcp->resE){
tcp->res_t = tcp->resS;
pi[pino].poc.resno0 = tcp->res_t;
pi[pino].poc.resno1 = tcp->res_t+1;
tcp->res_t+=1;
incr_top=1;
}else{
pi[pino].poc.resno0 = tcp->res_t;
pi[pino].poc.resno1 = tcp->res_t+1;
tcp->res_t+=1;
incr_top=0;
}
}else{
pi[pino].poc.resno0 = tcp->res_t - 1;
pi[pino].poc.resno1 = tcp->res_t;
}
}
}
break;
 
case 'L':
if (i > tppos){
pi[pino].poc.layno0 = tcp->layS;
pi[pino].poc.layno1 = tcp->layE;
}else{
if (tpnum == 0){
tcp->lay_t = tcp->layS;
pi[pino].poc.layno0 = tcp->lay_t;
pi[pino].poc.layno1 = tcp->lay_t+1;
tcp->lay_t+=1;
}else{
if (incr_top == 1){
if(tcp->lay_t == tcp->layE){
tcp->lay_t = tcp->layS;
pi[pino].poc.layno0 = tcp->lay_t;
pi[pino].poc.layno1 = tcp->lay_t+1;
tcp->lay_t+=1;
incr_top=1;
}else{
pi[pino].poc.layno0 = tcp->lay_t;
pi[pino].poc.layno1 = tcp->lay_t+1;
tcp->lay_t+=1;
incr_top=0;
}
}else{
pi[pino].poc.layno0 = tcp->lay_t - 1;
pi[pino].poc.layno1 = tcp->lay_t;
}
}
}
break;
 
case 'P':
switch(tcp->prg){
case LRCP:
case RLCP:
if (i > tppos){
pi[pino].poc.precno0 = tcp->prcS;
pi[pino].poc.precno1 = tcp->prcE;
}else{
if (tpnum == 0){
tcp->prc_t = tcp->prcS;
pi[pino].poc.precno0 = tcp->prc_t;
pi[pino].poc.precno1 = tcp->prc_t+1;
tcp->prc_t+=1;
}else{
if (incr_top == 1){
if(tcp->prc_t == tcp->prcE){
tcp->prc_t = tcp->prcS;
pi[pino].poc.precno0 = tcp->prc_t;
pi[pino].poc.precno1 = tcp->prc_t+1;
tcp->prc_t+=1;
incr_top=1;
}else{
pi[pino].poc.precno0 = tcp->prc_t;
pi[pino].poc.precno1 = tcp->prc_t+1;
tcp->prc_t+=1;
incr_top=0;
}
}else{
pi[pino].poc.precno0 = tcp->prc_t - 1;
pi[pino].poc.precno1 = tcp->prc_t;
}
}
}
break;
default:
if (i > tppos){
pi[pino].poc.tx0 = tcp->txS;
pi[pino].poc.ty0 = tcp->tyS;
pi[pino].poc.tx1 = tcp->txE;
pi[pino].poc.ty1 = tcp->tyE;
}else{
if (tpnum == 0){
tcp->tx0_t = tcp->txS;
tcp->ty0_t = tcp->tyS;
pi[pino].poc.tx0 = tcp->tx0_t;
pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx - (tcp->tx0_t % tcp->dx);
pi[pino].poc.ty0 = tcp->ty0_t;
pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy);
tcp->tx0_t = pi[pino].poc.tx1;
tcp->ty0_t = pi[pino].poc.ty1;
}else{
if (incr_top == 1){
if(tcp->tx0_t >= tcp->txE){
if(tcp->ty0_t >= tcp->tyE){
tcp->ty0_t = tcp->tyS;
pi[pino].poc.ty0 = tcp->ty0_t;
pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy);
tcp->ty0_t = pi[pino].poc.ty1;
incr_top=1;resetX=1;
}else{
pi[pino].poc.ty0 = tcp->ty0_t;
pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy);
tcp->ty0_t = pi[pino].poc.ty1;
incr_top=0;resetX=1;
}
if(resetX==1){
tcp->tx0_t = tcp->txS;
pi[pino].poc.tx0 = tcp->tx0_t;
pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx- (tcp->tx0_t % tcp->dx);
tcp->tx0_t = pi[pino].poc.tx1;
}
}else{
pi[pino].poc.tx0 = tcp->tx0_t;
pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx- (tcp->tx0_t % tcp->dx);
tcp->tx0_t = pi[pino].poc.tx1;
pi[pino].poc.ty0 = tcp->ty0_t - tcp->dy - (tcp->ty0_t % tcp->dy);
pi[pino].poc.ty1 = tcp->ty0_t ;
incr_top=0;
}
}else{
pi[pino].poc.tx0 = tcp->tx0_t - tcp->dx - (tcp->tx0_t % tcp->dx);
pi[pino].poc.tx1 = tcp->tx0_t ;
pi[pino].poc.ty0 = tcp->ty0_t - tcp->dy - (tcp->ty0_t % tcp->dy);
pi[pino].poc.ty1 = tcp->ty0_t ;
}
}
}
break;
}
break;
}
}
}
}
return false;
}
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/pi.h
0,0 → 1,156
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#ifndef __PI_H
#define __PI_H
/**
@file pi.h
@brief Implementation of a packet iterator (PI)
 
The functions in PI.C have for goal to realize a packet iterator that permits to get the next
packet following the progression order and change of it. The functions in PI.C are used
by some function in T2.C.
*/
 
/** @defgroup PI PI - Implementation of a packet iterator */
/*@{*/
 
/**
FIXME: documentation
*/
typedef struct opj_pi_resolution {
int pdx, pdy;
int pw, ph;
} opj_pi_resolution_t;
 
/**
FIXME: documentation
*/
typedef struct opj_pi_comp {
int dx, dy;
/** number of resolution levels */
int numresolutions;
opj_pi_resolution_t *resolutions;
} opj_pi_comp_t;
 
/**
Packet iterator
*/
typedef struct opj_pi_iterator {
/** Enabling Tile part generation*/
char tp_on;
/** precise if the packet has been already used (usefull for progression order change) */
short int *include;
/** layer step used to localize the packet in the include vector */
int step_l;
/** resolution step used to localize the packet in the include vector */
int step_r;
/** component step used to localize the packet in the include vector */
int step_c;
/** precinct step used to localize the packet in the include vector */
int step_p;
/** component that identify the packet */
int compno;
/** resolution that identify the packet */
int resno;
/** precinct that identify the packet */
int precno;
/** layer that identify the packet */
int layno;
/** 0 if the first packet */
int first;
/** progression order change information */
opj_poc_t poc;
/** number of components in the image */
int numcomps;
/** Components*/
opj_pi_comp_t *comps;
int tx0, ty0, tx1, ty1;
int x, y, dx, dy;
} opj_pi_iterator_t;
 
/** @name Exported functions */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Create a packet iterator for Encoder
@param image Raw image for which the packets will be listed
@param cp Coding parameters
@param tileno Number that identifies the tile for which to list the packets
@param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass
@return Returns a packet iterator that points to the first packet of the tile
@see pi_destroy
*/
opj_pi_iterator_t *pi_initialise_encode(opj_image_t *image, opj_cp_t *cp, int tileno,J2K_T2_MODE t2_mode);
/**
Modify the packet iterator for enabling tile part generation
@param pi Handle to the packet iterator generated in pi_initialise_encode
@param cp Coding parameters
@param tileno Number that identifies the tile for which to list the packets
@param pino Iterator index for pi
@param tpnum Tile part number of the current tile
@param tppos The position of the tile part flag in the progression order
@param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass
@param cur_totnum_tp The total number of tile parts in the current tile
@return Returns true if an error is detected
*/
bool pi_create_encode(opj_pi_iterator_t *pi, opj_cp_t *cp,int tileno, int pino,int tpnum, int tppos, J2K_T2_MODE t2_mode,int cur_totnum_tp);
/**
Create a packet iterator for Decoder
@param image Raw image for which the packets will be listed
@param cp Coding parameters
@param tileno Number that identifies the tile for which to list the packets
@return Returns a packet iterator that points to the first packet of the tile
@see pi_destroy
*/
opj_pi_iterator_t *pi_create_decode(opj_image_t * image, opj_cp_t * cp, int tileno);
 
/**
Destroy a packet iterator
@param pi Previously created packet iterator
@param cp Coding parameters
@param tileno Number that identifies the tile for which the packets were listed
@see pi_create
*/
void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno);
 
/**
Modify the packet iterator to point to the next packet
@param pi Packet iterator to modify
@return Returns false if pi pointed to the last packet or else returns true
*/
bool pi_next(opj_pi_iterator_t * pi);
/* ----------------------------------------------------------------------- */
/*@}*/
 
/*@}*/
 
#endif /* __PI_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/raw.c
0,0 → 1,87
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#include "opj_includes.h"
 
/*
==========================================================
local functions
==========================================================
*/
 
 
/*
==========================================================
RAW encoding interface
==========================================================
*/
 
opj_raw_t* raw_create(void) {
opj_raw_t *raw = (opj_raw_t*)opj_malloc(sizeof(opj_raw_t));
return raw;
}
 
void raw_destroy(opj_raw_t *raw) {
if(raw) {
opj_free(raw);
}
}
 
int raw_numbytes(opj_raw_t *raw) {
return raw->bp - raw->start;
}
 
void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len) {
raw->start = bp;
raw->lenmax = len;
raw->len = 0;
raw->c = 0;
raw->ct = 0;
}
 
int raw_decode(opj_raw_t *raw) {
int d;
if (raw->ct == 0) {
raw->ct = 8;
if (raw->len == raw->lenmax) {
raw->c = 0xff;
} else {
if (raw->c == 0xff) {
raw->ct = 7;
}
raw->c = *(raw->start + raw->len);
raw->len++;
}
}
raw->ct--;
d = (raw->c >> raw->ct) & 0x01;
return d;
}
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/raw.h
0,0 → 1,100
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#ifndef __RAW_H
#define __RAW_H
/**
@file raw.h
@brief Implementation of operations for raw encoding (RAW)
 
The functions in RAW.C have for goal to realize the operation of raw encoding linked
with the corresponding mode switch.
*/
 
/** @defgroup RAW RAW - Implementation of operations for raw encoding */
/*@{*/
 
/**
RAW encoding operations
*/
typedef struct opj_raw {
/** temporary buffer where bits are coded or decoded */
unsigned char c;
/** number of bits already read or free to write */
unsigned int ct;
/** maximum length to decode */
unsigned int lenmax;
/** length decoded */
unsigned int len;
/** pointer to the current position in the buffer */
unsigned char *bp;
/** pointer to the start of the buffer */
unsigned char *start;
/** pointer to the end of the buffer */
unsigned char *end;
} opj_raw_t;
 
/** @name Exported functions */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Create a new RAW handle
@return Returns a new RAW handle if successful, returns NULL otherwise
*/
opj_raw_t* raw_create(void);
/**
Destroy a previously created RAW handle
@param raw RAW handle to destroy
*/
void raw_destroy(opj_raw_t *raw);
/**
Return the number of bytes written/read since initialisation
@param raw RAW handle to destroy
@return Returns the number of bytes already encoded
*/
int raw_numbytes(opj_raw_t *raw);
/**
Initialize the decoder
@param raw RAW handle
@param bp Pointer to the start of the buffer from which the bytes will be read
@param len Length of the input buffer
*/
void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len);
/**
Decode a symbol using raw-decoder. Cfr p.506 TAUBMAN
@param raw RAW handle
@return Returns the decoded symbol (0 or 1)
*/
int raw_decode(opj_raw_t *raw);
/* ----------------------------------------------------------------------- */
/*@}*/
 
/*@}*/
 
#endif /* __RAW_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/t1.c
0,0 → 1,1581
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#include "opj_includes.h"
#include "t1_luts.h"
 
/** @defgroup T1 T1 - Implementation of the tier-1 coding */
/*@{*/
 
/** @name Local static functions */
/*@{*/
 
static INLINE char t1_getctxno_zc(int f, int orient);
static char t1_getctxno_sc(int f);
static INLINE int t1_getctxno_mag(int f);
static char t1_getspb(int f);
static short t1_getnmsedec_sig(int x, int bitpos);
static short t1_getnmsedec_ref(int x, int bitpos);
static void t1_updateflags(flag_t *flagsp, int s, int stride);
/**
Encode significant pass
*/
static void t1_enc_sigpass_step(
opj_t1_t *t1,
flag_t *flagsp,
int *datap,
int orient,
int bpno,
int one,
int *nmsedec,
char type,
int vsc);
/**
Decode significant pass
*/
static INLINE void t1_dec_sigpass_step_raw(
opj_t1_t *t1,
flag_t *flagsp,
int *datap,
int orient,
int oneplushalf,
int vsc);
static INLINE void t1_dec_sigpass_step_mqc(
opj_t1_t *t1,
flag_t *flagsp,
int *datap,
int orient,
int oneplushalf);
static INLINE void t1_dec_sigpass_step_mqc_vsc(
opj_t1_t *t1,
flag_t *flagsp,
int *datap,
int orient,
int oneplushalf,
int vsc);
/**
Encode significant pass
*/
static void t1_enc_sigpass(
opj_t1_t *t1,
int bpno,
int orient,
int *nmsedec,
char type,
int cblksty);
/**
Decode significant pass
*/
static void t1_dec_sigpass_raw(
opj_t1_t *t1,
int bpno,
int orient,
int cblksty);
static void t1_dec_sigpass_mqc(
opj_t1_t *t1,
int bpno,
int orient);
static void t1_dec_sigpass_mqc_vsc(
opj_t1_t *t1,
int bpno,
int orient);
/**
Encode refinement pass
*/
static void t1_enc_refpass_step(
opj_t1_t *t1,
flag_t *flagsp,
int *datap,
int bpno,
int one,
int *nmsedec,
char type,
int vsc);
/**
Decode refinement pass
*/
static void INLINE t1_dec_refpass_step_raw(
opj_t1_t *t1,
flag_t *flagsp,
int *datap,
int poshalf,
int neghalf,
int vsc);
static void INLINE t1_dec_refpass_step_mqc(
opj_t1_t *t1,
flag_t *flagsp,
int *datap,
int poshalf,
int neghalf);
static void INLINE t1_dec_refpass_step_mqc_vsc(
opj_t1_t *t1,
flag_t *flagsp,
int *datap,
int poshalf,
int neghalf,
int vsc);
 
/**
Encode refinement pass
*/
static void t1_enc_refpass(
opj_t1_t *t1,
int bpno,
int *nmsedec,
char type,
int cblksty);
/**
Decode refinement pass
*/
static void t1_dec_refpass_raw(
opj_t1_t *t1,
int bpno,
int cblksty);
static void t1_dec_refpass_mqc(
opj_t1_t *t1,
int bpno);
static void t1_dec_refpass_mqc_vsc(
opj_t1_t *t1,
int bpno);
/**
Encode clean-up pass
*/
static void t1_enc_clnpass_step(
opj_t1_t *t1,
flag_t *flagsp,
int *datap,
int orient,
int bpno,
int one,
int *nmsedec,
int partial,
int vsc);
/**
Decode clean-up pass
*/
static void t1_dec_clnpass_step_partial(
opj_t1_t *t1,
flag_t *flagsp,
int *datap,
int orient,
int oneplushalf);
static void t1_dec_clnpass_step(
opj_t1_t *t1,
flag_t *flagsp,
int *datap,
int orient,
int oneplushalf);
static void t1_dec_clnpass_step_vsc(
opj_t1_t *t1,
flag_t *flagsp,
int *datap,
int orient,
int oneplushalf,
int partial,
int vsc);
/**
Encode clean-up pass
*/
static void t1_enc_clnpass(
opj_t1_t *t1,
int bpno,
int orient,
int *nmsedec,
int cblksty);
/**
Decode clean-up pass
*/
static void t1_dec_clnpass(
opj_t1_t *t1,
int bpno,
int orient,
int cblksty);
static double t1_getwmsedec(
int nmsedec,
int compno,
int level,
int orient,
int bpno,
int qmfbid,
double stepsize,
int numcomps,
int mct);
/**
Encode 1 code-block
@param t1 T1 handle
@param cblk Code-block coding parameters
@param orient
@param compno Component number
@param level
@param qmfbid
@param stepsize
@param cblksty Code-block style
@param numcomps
@param mct
@param tile
*/
static void t1_encode_cblk(
opj_t1_t *t1,
opj_tcd_cblk_enc_t* cblk,
int orient,
int compno,
int level,
int qmfbid,
double stepsize,
int cblksty,
int numcomps,
int mct,
opj_tcd_tile_t * tile);
/**
Decode 1 code-block
@param t1 T1 handle
@param cblk Code-block coding parameters
@param orient
@param roishift Region of interest shifting value
@param cblksty Code-block style
*/
static void t1_decode_cblk(
opj_t1_t *t1,
opj_tcd_cblk_dec_t* cblk,
int orient,
int roishift,
int cblksty);
 
/*@}*/
 
/*@}*/
 
/* ----------------------------------------------------------------------- */
 
static char t1_getctxno_zc(int f, int orient) {
return lut_ctxno_zc[(orient << 8) | (f & T1_SIG_OTH)];
}
 
static char t1_getctxno_sc(int f) {
return lut_ctxno_sc[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
}
 
static int t1_getctxno_mag(int f) {
int tmp1 = (f & T1_SIG_OTH) ? T1_CTXNO_MAG + 1 : T1_CTXNO_MAG;
int tmp2 = (f & T1_REFINE) ? T1_CTXNO_MAG + 2 : tmp1;
return (tmp2);
}
 
static char t1_getspb(int f) {
return lut_spb[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
}
 
static short t1_getnmsedec_sig(int x, int bitpos) {
if (bitpos > T1_NMSEDEC_FRACBITS) {
return lut_nmsedec_sig[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)];
}
return lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
}
 
static short t1_getnmsedec_ref(int x, int bitpos) {
if (bitpos > T1_NMSEDEC_FRACBITS) {
return lut_nmsedec_ref[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)];
}
 
return lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
}
 
static void t1_updateflags(flag_t *flagsp, int s, int stride) {
flag_t *np = flagsp - stride;
flag_t *sp = flagsp + stride;
 
static const flag_t mod[] = {
T1_SIG_S, T1_SIG_S|T1_SGN_S,
T1_SIG_E, T1_SIG_E|T1_SGN_E,
T1_SIG_W, T1_SIG_W|T1_SGN_W,
T1_SIG_N, T1_SIG_N|T1_SGN_N
};
 
np[-1] |= T1_SIG_SE;
np[0] |= mod[s];
np[1] |= T1_SIG_SW;
 
flagsp[-1] |= mod[s+2];
flagsp[0] |= T1_SIG;
flagsp[1] |= mod[s+4];
 
sp[-1] |= T1_SIG_NE;
sp[0] |= mod[s+6];
sp[1] |= T1_SIG_NW;
}
 
static void t1_enc_sigpass_step(
opj_t1_t *t1,
flag_t *flagsp,
int *datap,
int orient,
int bpno,
int one,
int *nmsedec,
char type,
int vsc)
{
int v, flag;
opj_mqc_t *mqc = t1->mqc; /* MQC component */
flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
v = int_abs(*datap) & one ? 1 : 0;
mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); /* ESSAI */
if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
mqc_bypass_enc(mqc, v);
} else {
mqc_encode(mqc, v);
}
if (v) {
v = *datap < 0 ? 1 : 0;
*nmsedec += t1_getnmsedec_sig(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS);
mqc_setcurctx(mqc, t1_getctxno_sc(flag)); /* ESSAI */
if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
mqc_bypass_enc(mqc, v);
} else {
mqc_encode(mqc, v ^ t1_getspb(flag));
}
t1_updateflags(flagsp, v, t1->flags_stride);
}
*flagsp |= T1_VISIT;
}
}
 
static INLINE void t1_dec_sigpass_step_raw(
opj_t1_t *t1,
flag_t *flagsp,
int *datap,
int orient,
int oneplushalf,
int vsc)
{
int v, flag;
opj_raw_t *raw = t1->raw; /* RAW component */
flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
if (raw_decode(raw)) {
v = raw_decode(raw); /* ESSAI */
*datap = v ? -oneplushalf : oneplushalf;
t1_updateflags(flagsp, v, t1->flags_stride);
}
*flagsp |= T1_VISIT;
}
} /* VSC and BYPASS by Antonin */
 
static INLINE void t1_dec_sigpass_step_mqc(
opj_t1_t *t1,
flag_t *flagsp,
int *datap,
int orient,
int oneplushalf)
{
int v, flag;
opj_mqc_t *mqc = t1->mqc; /* MQC component */
flag = *flagsp;
if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
if (mqc_decode(mqc)) {
mqc_setcurctx(mqc, t1_getctxno_sc(flag));
v = mqc_decode(mqc) ^ t1_getspb(flag);
*datap = v ? -oneplushalf : oneplushalf;
t1_updateflags(flagsp, v, t1->flags_stride);
}
*flagsp |= T1_VISIT;
}
} /* VSC and BYPASS by Antonin */
 
static INLINE void t1_dec_sigpass_step_mqc_vsc(
opj_t1_t *t1,
flag_t *flagsp,
int *datap,
int orient,
int oneplushalf,
int vsc)
{
int v, flag;
opj_mqc_t *mqc = t1->mqc; /* MQC component */
flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
if (mqc_decode(mqc)) {
mqc_setcurctx(mqc, t1_getctxno_sc(flag));
v = mqc_decode(mqc) ^ t1_getspb(flag);
*datap = v ? -oneplushalf : oneplushalf;
t1_updateflags(flagsp, v, t1->flags_stride);
}
*flagsp |= T1_VISIT;
}
} /* VSC and BYPASS by Antonin */
 
static void t1_enc_sigpass(
opj_t1_t *t1,
int bpno,
int orient,
int *nmsedec,
char type,
int cblksty)
{
int i, j, k, one, vsc;
*nmsedec = 0;
one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
for (k = 0; k < t1->h; k += 4) {
for (i = 0; i < t1->w; ++i) {
for (j = k; j < k + 4 && j < t1->h; ++j) {
vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
t1_enc_sigpass_step(
t1,
&t1->flags[((j+1) * t1->flags_stride) + i + 1],
&t1->data[(j * t1->w) + i],
orient,
bpno,
one,
nmsedec,
type,
vsc);
}
}
}
}
 
static void t1_dec_sigpass_raw(
opj_t1_t *t1,
int bpno,
int orient,
int cblksty)
{
int i, j, k, one, half, oneplushalf, vsc;
one = 1 << bpno;
half = one >> 1;
oneplushalf = one | half;
for (k = 0; k < t1->h; k += 4) {
for (i = 0; i < t1->w; ++i) {
for (j = k; j < k + 4 && j < t1->h; ++j) {
vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
t1_dec_sigpass_step_raw(
t1,
&t1->flags[((j+1) * t1->flags_stride) + i + 1],
&t1->data[(j * t1->w) + i],
orient,
oneplushalf,
vsc);
}
}
}
} /* VSC and BYPASS by Antonin */
 
static void t1_dec_sigpass_mqc(
opj_t1_t *t1,
int bpno,
int orient)
{
int i, j, k, one, half, oneplushalf;
int *data1 = t1->data;
flag_t *flags1 = &t1->flags[1];
one = 1 << bpno;
half = one >> 1;
oneplushalf = one | half;
for (k = 0; k < (t1->h & ~3); k += 4) {
for (i = 0; i < t1->w; ++i) {
int *data2 = data1 + i;
flag_t *flags2 = flags1 + i;
flags2 += t1->flags_stride;
t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
data2 += t1->w;
flags2 += t1->flags_stride;
t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
data2 += t1->w;
flags2 += t1->flags_stride;
t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
data2 += t1->w;
flags2 += t1->flags_stride;
t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
data2 += t1->w;
}
data1 += t1->w << 2;
flags1 += t1->flags_stride << 2;
}
for (i = 0; i < t1->w; ++i) {
int *data2 = data1 + i;
flag_t *flags2 = flags1 + i;
for (j = k; j < t1->h; ++j) {
flags2 += t1->flags_stride;
t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
data2 += t1->w;
}
}
} /* VSC and BYPASS by Antonin */
 
static void t1_dec_sigpass_mqc_vsc(
opj_t1_t *t1,
int bpno,
int orient)
{
int i, j, k, one, half, oneplushalf, vsc;
one = 1 << bpno;
half = one >> 1;
oneplushalf = one | half;
for (k = 0; k < t1->h; k += 4) {
for (i = 0; i < t1->w; ++i) {
for (j = k; j < k + 4 && j < t1->h; ++j) {
vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0;
t1_dec_sigpass_step_mqc_vsc(
t1,
&t1->flags[((j+1) * t1->flags_stride) + i + 1],
&t1->data[(j * t1->w) + i],
orient,
oneplushalf,
vsc);
}
}
}
} /* VSC and BYPASS by Antonin */
 
static void t1_enc_refpass_step(
opj_t1_t *t1,
flag_t *flagsp,
int *datap,
int bpno,
int one,
int *nmsedec,
char type,
int vsc)
{
int v, flag;
opj_mqc_t *mqc = t1->mqc; /* MQC component */
flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
*nmsedec += t1_getnmsedec_ref(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS);
v = int_abs(*datap) & one ? 1 : 0;
mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */
if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
mqc_bypass_enc(mqc, v);
} else {
mqc_encode(mqc, v);
}
*flagsp |= T1_REFINE;
}
}
 
static INLINE void t1_dec_refpass_step_raw(
opj_t1_t *t1,
flag_t *flagsp,
int *datap,
int poshalf,
int neghalf,
int vsc)
{
int v, t, flag;
opj_raw_t *raw = t1->raw; /* RAW component */
flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
v = raw_decode(raw);
t = v ? poshalf : neghalf;
*datap += *datap < 0 ? -t : t;
*flagsp |= T1_REFINE;
}
} /* VSC and BYPASS by Antonin */
 
static INLINE void t1_dec_refpass_step_mqc(
opj_t1_t *t1,
flag_t *flagsp,
int *datap,
int poshalf,
int neghalf)
{
int v, t, flag;
opj_mqc_t *mqc = t1->mqc; /* MQC component */
flag = *flagsp;
if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */
v = mqc_decode(mqc);
t = v ? poshalf : neghalf;
*datap += *datap < 0 ? -t : t;
*flagsp |= T1_REFINE;
}
} /* VSC and BYPASS by Antonin */
 
static INLINE void t1_dec_refpass_step_mqc_vsc(
opj_t1_t *t1,
flag_t *flagsp,
int *datap,
int poshalf,
int neghalf,
int vsc)
{
int v, t, flag;
opj_mqc_t *mqc = t1->mqc; /* MQC component */
flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */
v = mqc_decode(mqc);
t = v ? poshalf : neghalf;
*datap += *datap < 0 ? -t : t;
*flagsp |= T1_REFINE;
}
} /* VSC and BYPASS by Antonin */
 
static void t1_enc_refpass(
opj_t1_t *t1,
int bpno,
int *nmsedec,
char type,
int cblksty)
{
int i, j, k, one, vsc;
*nmsedec = 0;
one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
for (k = 0; k < t1->h; k += 4) {
for (i = 0; i < t1->w; ++i) {
for (j = k; j < k + 4 && j < t1->h; ++j) {
vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
t1_enc_refpass_step(
t1,
&t1->flags[((j+1) * t1->flags_stride) + i + 1],
&t1->data[(j * t1->w) + i],
bpno,
one,
nmsedec,
type,
vsc);
}
}
}
}
 
static void t1_dec_refpass_raw(
opj_t1_t *t1,
int bpno,
int cblksty)
{
int i, j, k, one, poshalf, neghalf;
int vsc;
one = 1 << bpno;
poshalf = one >> 1;
neghalf = bpno > 0 ? -poshalf : -1;
for (k = 0; k < t1->h; k += 4) {
for (i = 0; i < t1->w; ++i) {
for (j = k; j < k + 4 && j < t1->h; ++j) {
vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
t1_dec_refpass_step_raw(
t1,
&t1->flags[((j+1) * t1->flags_stride) + i + 1],
&t1->data[(j * t1->w) + i],
poshalf,
neghalf,
vsc);
}
}
}
} /* VSC and BYPASS by Antonin */
 
static void t1_dec_refpass_mqc(
opj_t1_t *t1,
int bpno)
{
int i, j, k, one, poshalf, neghalf;
int *data1 = t1->data;
flag_t *flags1 = &t1->flags[1];
one = 1 << bpno;
poshalf = one >> 1;
neghalf = bpno > 0 ? -poshalf : -1;
for (k = 0; k < (t1->h & ~3); k += 4) {
for (i = 0; i < t1->w; ++i) {
int *data2 = data1 + i;
flag_t *flags2 = flags1 + i;
flags2 += t1->flags_stride;
t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
data2 += t1->w;
flags2 += t1->flags_stride;
t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
data2 += t1->w;
flags2 += t1->flags_stride;
t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
data2 += t1->w;
flags2 += t1->flags_stride;
t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
data2 += t1->w;
}
data1 += t1->w << 2;
flags1 += t1->flags_stride << 2;
}
for (i = 0; i < t1->w; ++i) {
int *data2 = data1 + i;
flag_t *flags2 = flags1 + i;
for (j = k; j < t1->h; ++j) {
flags2 += t1->flags_stride;
t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
data2 += t1->w;
}
}
} /* VSC and BYPASS by Antonin */
 
static void t1_dec_refpass_mqc_vsc(
opj_t1_t *t1,
int bpno)
{
int i, j, k, one, poshalf, neghalf;
int vsc;
one = 1 << bpno;
poshalf = one >> 1;
neghalf = bpno > 0 ? -poshalf : -1;
for (k = 0; k < t1->h; k += 4) {
for (i = 0; i < t1->w; ++i) {
for (j = k; j < k + 4 && j < t1->h; ++j) {
vsc = ((j == k + 3 || j == t1->h - 1)) ? 1 : 0;
t1_dec_refpass_step_mqc_vsc(
t1,
&t1->flags[((j+1) * t1->flags_stride) + i + 1],
&t1->data[(j * t1->w) + i],
poshalf,
neghalf,
vsc);
}
}
}
} /* VSC and BYPASS by Antonin */
 
static void t1_enc_clnpass_step(
opj_t1_t *t1,
flag_t *flagsp,
int *datap,
int orient,
int bpno,
int one,
int *nmsedec,
int partial,
int vsc)
{
int v, flag;
opj_mqc_t *mqc = t1->mqc; /* MQC component */
flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
if (partial) {
goto LABEL_PARTIAL;
}
if (!(*flagsp & (T1_SIG | T1_VISIT))) {
mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
v = int_abs(*datap) & one ? 1 : 0;
mqc_encode(mqc, v);
if (v) {
LABEL_PARTIAL:
*nmsedec += t1_getnmsedec_sig(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS);
mqc_setcurctx(mqc, t1_getctxno_sc(flag));
v = *datap < 0 ? 1 : 0;
mqc_encode(mqc, v ^ t1_getspb(flag));
t1_updateflags(flagsp, v, t1->flags_stride);
}
}
*flagsp &= ~T1_VISIT;
}
 
static void t1_dec_clnpass_step_partial(
opj_t1_t *t1,
flag_t *flagsp,
int *datap,
int orient,
int oneplushalf)
{
int v, flag;
opj_mqc_t *mqc = t1->mqc; /* MQC component */
flag = *flagsp;
mqc_setcurctx(mqc, t1_getctxno_sc(flag));
v = mqc_decode(mqc) ^ t1_getspb(flag);
*datap = v ? -oneplushalf : oneplushalf;
t1_updateflags(flagsp, v, t1->flags_stride);
*flagsp &= ~T1_VISIT;
} /* VSC and BYPASS by Antonin */
 
static void t1_dec_clnpass_step(
opj_t1_t *t1,
flag_t *flagsp,
int *datap,
int orient,
int oneplushalf)
{
int v, flag;
opj_mqc_t *mqc = t1->mqc; /* MQC component */
flag = *flagsp;
if (!(flag & (T1_SIG | T1_VISIT))) {
mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
if (mqc_decode(mqc)) {
mqc_setcurctx(mqc, t1_getctxno_sc(flag));
v = mqc_decode(mqc) ^ t1_getspb(flag);
*datap = v ? -oneplushalf : oneplushalf;
t1_updateflags(flagsp, v, t1->flags_stride);
}
}
*flagsp &= ~T1_VISIT;
} /* VSC and BYPASS by Antonin */
 
static void t1_dec_clnpass_step_vsc(
opj_t1_t *t1,
flag_t *flagsp,
int *datap,
int orient,
int oneplushalf,
int partial,
int vsc)
{
int v, flag;
opj_mqc_t *mqc = t1->mqc; /* MQC component */
flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
if (partial) {
goto LABEL_PARTIAL;
}
if (!(flag & (T1_SIG | T1_VISIT))) {
mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
if (mqc_decode(mqc)) {
LABEL_PARTIAL:
mqc_setcurctx(mqc, t1_getctxno_sc(flag));
v = mqc_decode(mqc) ^ t1_getspb(flag);
*datap = v ? -oneplushalf : oneplushalf;
t1_updateflags(flagsp, v, t1->flags_stride);
}
}
*flagsp &= ~T1_VISIT;
}
 
static void t1_enc_clnpass(
opj_t1_t *t1,
int bpno,
int orient,
int *nmsedec,
int cblksty)
{
int i, j, k, one, agg, runlen, vsc;
opj_mqc_t *mqc = t1->mqc; /* MQC component */
*nmsedec = 0;
one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
for (k = 0; k < t1->h; k += 4) {
for (i = 0; i < t1->w; ++i) {
if (k + 3 < t1->h) {
if (cblksty & J2K_CCP_CBLKSTY_VSC) {
agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
|| MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
|| MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
|| (MACRO_t1_flags(1 + k + 3,1 + i)
& (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
} else {
agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
|| MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
|| MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
|| MACRO_t1_flags(1 + k + 3,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
}
} else {
agg = 0;
}
if (agg) {
for (runlen = 0; runlen < 4; ++runlen) {
if (int_abs(t1->data[((k + runlen)*t1->w) + i]) & one)
break;
}
mqc_setcurctx(mqc, T1_CTXNO_AGG);
mqc_encode(mqc, runlen != 4);
if (runlen == 4) {
continue;
}
mqc_setcurctx(mqc, T1_CTXNO_UNI);
mqc_encode(mqc, runlen >> 1);
mqc_encode(mqc, runlen & 1);
} else {
runlen = 0;
}
for (j = k + runlen; j < k + 4 && j < t1->h; ++j) {
vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
t1_enc_clnpass_step(
t1,
&t1->flags[((j+1) * t1->flags_stride) + i + 1],
&t1->data[(j * t1->w) + i],
orient,
bpno,
one,
nmsedec,
agg && (j == k + runlen),
vsc);
}
}
}
}
 
static void t1_dec_clnpass(
opj_t1_t *t1,
int bpno,
int orient,
int cblksty)
{
int i, j, k, one, half, oneplushalf, agg, runlen, vsc;
int segsym = cblksty & J2K_CCP_CBLKSTY_SEGSYM;
opj_mqc_t *mqc = t1->mqc; /* MQC component */
one = 1 << bpno;
half = one >> 1;
oneplushalf = one | half;
if (cblksty & J2K_CCP_CBLKSTY_VSC) {
for (k = 0; k < t1->h; k += 4) {
for (i = 0; i < t1->w; ++i) {
if (k + 3 < t1->h) {
agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
|| MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
|| MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
|| (MACRO_t1_flags(1 + k + 3,1 + i)
& (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
} else {
agg = 0;
}
if (agg) {
mqc_setcurctx(mqc, T1_CTXNO_AGG);
if (!mqc_decode(mqc)) {
continue;
}
mqc_setcurctx(mqc, T1_CTXNO_UNI);
runlen = mqc_decode(mqc);
runlen = (runlen << 1) | mqc_decode(mqc);
} else {
runlen = 0;
}
for (j = k + runlen; j < k + 4 && j < t1->h; ++j) {
vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0;
t1_dec_clnpass_step_vsc(
t1,
&t1->flags[((j+1) * t1->flags_stride) + i + 1],
&t1->data[(j * t1->w) + i],
orient,
oneplushalf,
agg && (j == k + runlen),
vsc);
}
}
}
} else {
int *data1 = t1->data;
flag_t *flags1 = &t1->flags[1];
for (k = 0; k < (t1->h & ~3); k += 4) {
for (i = 0; i < t1->w; ++i) {
int *data2 = data1 + i;
flag_t *flags2 = flags1 + i;
agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
|| MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
|| MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
|| MACRO_t1_flags(1 + k + 3,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
if (agg) {
mqc_setcurctx(mqc, T1_CTXNO_AGG);
if (!mqc_decode(mqc)) {
continue;
}
mqc_setcurctx(mqc, T1_CTXNO_UNI);
runlen = mqc_decode(mqc);
runlen = (runlen << 1) | mqc_decode(mqc);
flags2 += runlen * t1->flags_stride;
data2 += runlen * t1->w;
for (j = k + runlen; j < k + 4 && j < t1->h; ++j) {
flags2 += t1->flags_stride;
if (agg && (j == k + runlen)) {
t1_dec_clnpass_step_partial(t1, flags2, data2, orient, oneplushalf);
} else {
t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
}
data2 += t1->w;
}
} else {
flags2 += t1->flags_stride;
t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
data2 += t1->w;
flags2 += t1->flags_stride;
t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
data2 += t1->w;
flags2 += t1->flags_stride;
t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
data2 += t1->w;
flags2 += t1->flags_stride;
t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
data2 += t1->w;
}
}
data1 += t1->w << 2;
flags1 += t1->flags_stride << 2;
}
for (i = 0; i < t1->w; ++i) {
int *data2 = data1 + i;
flag_t *flags2 = flags1 + i;
for (j = k; j < t1->h; ++j) {
flags2 += t1->flags_stride;
t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
data2 += t1->w;
}
}
}
 
if (segsym) {
int v = 0;
mqc_setcurctx(mqc, T1_CTXNO_UNI);
v = mqc_decode(mqc);
v = (v << 1) | mqc_decode(mqc);
v = (v << 1) | mqc_decode(mqc);
v = (v << 1) | mqc_decode(mqc);
/*
if (v!=0xa) {
opj_event_msg(t1->cinfo, EVT_WARNING, "Bad segmentation symbol %x\n", v);
}
*/
}
} /* VSC and BYPASS by Antonin */
 
 
/** mod fixed_quality */
static double t1_getwmsedec(
int nmsedec,
int compno,
int level,
int orient,
int bpno,
int qmfbid,
double stepsize,
int numcomps,
int mct)
{
double w1, w2, wmsedec;
if (qmfbid == 1) {
w1 = (mct && numcomps==3) ? mct_getnorm(compno) : 1.0;
w2 = dwt_getnorm(level, orient);
} else { /* if (qmfbid == 0) */
w1 = (mct && numcomps==3) ? mct_getnorm_real(compno) : 1.0;
w2 = dwt_getnorm_real(level, orient);
}
wmsedec = w1 * w2 * stepsize * (1 << bpno);
wmsedec *= wmsedec * nmsedec / 8192.0;
return wmsedec;
}
 
static bool allocate_buffers(
opj_t1_t *t1,
int w,
int h)
{
int datasize=w * h;
int flagssize;
 
if(datasize > t1->datasize){
opj_aligned_free(t1->data);
t1->data = (int*) opj_aligned_malloc(datasize * sizeof(int));
if(!t1->data){
return false;
}
t1->datasize=datasize;
}
memset(t1->data,0,datasize * sizeof(int));
 
t1->flags_stride=w+2;
flagssize=t1->flags_stride * (h+2);
 
if(flagssize > t1->flagssize){
opj_aligned_free(t1->flags);
t1->flags = (flag_t*) opj_aligned_malloc(flagssize * sizeof(flag_t));
if(!t1->flags){
return false;
}
t1->flagssize=flagssize;
}
memset(t1->flags,0,flagssize * sizeof(flag_t));
 
t1->w=w;
t1->h=h;
 
return true;
}
 
/** mod fixed_quality */
static void t1_encode_cblk(
opj_t1_t *t1,
opj_tcd_cblk_enc_t* cblk,
int orient,
int compno,
int level,
int qmfbid,
double stepsize,
int cblksty,
int numcomps,
int mct,
opj_tcd_tile_t * tile)
{
double cumwmsedec = 0.0;
 
opj_mqc_t *mqc = t1->mqc; /* MQC component */
 
int passno, bpno, passtype;
int nmsedec = 0;
int i, max;
char type = T1_TYPE_MQ;
double tempwmsedec;
 
max = 0;
for (i = 0; i < t1->w * t1->h; ++i) {
int tmp = abs(t1->data[i]);
max = int_max(max, tmp);
}
 
cblk->numbps = max ? (int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS : 0;
bpno = cblk->numbps - 1;
passtype = 2;
mqc_resetstates(mqc);
mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
mqc_init_enc(mqc, cblk->data);
for (passno = 0; bpno >= 0; ++passno) {
opj_tcd_pass_t *pass = &cblk->passes[passno];
int correction = 3;
type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
switch (passtype) {
case 0:
t1_enc_sigpass(t1, bpno, orient, &nmsedec, type, cblksty);
break;
case 1:
t1_enc_refpass(t1, bpno, &nmsedec, type, cblksty);
break;
case 2:
t1_enc_clnpass(t1, bpno, orient, &nmsedec, cblksty);
/* code switch SEGMARK (i.e. SEGSYM) */
if (cblksty & J2K_CCP_CBLKSTY_SEGSYM)
mqc_segmark_enc(mqc);
break;
}
/* fixed_quality */
tempwmsedec = t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps, mct);
cumwmsedec += tempwmsedec;
tile->distotile += tempwmsedec;
/* Code switch "RESTART" (i.e. TERMALL) */
if ((cblksty & J2K_CCP_CBLKSTY_TERMALL) && !((passtype == 2) && (bpno - 1 < 0))) {
if (type == T1_TYPE_RAW) {
mqc_flush(mqc);
correction = 1;
/* correction = mqc_bypass_flush_enc(); */
} else { /* correction = mqc_restart_enc(); */
mqc_flush(mqc);
correction = 1;
}
pass->term = 1;
} else {
if (((bpno < (cblk->numbps - 4) && (passtype > 0))
|| ((bpno == (cblk->numbps - 4)) && (passtype == 2))) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) {
if (type == T1_TYPE_RAW) {
mqc_flush(mqc);
correction = 1;
/* correction = mqc_bypass_flush_enc(); */
} else { /* correction = mqc_restart_enc(); */
mqc_flush(mqc);
correction = 1;
}
pass->term = 1;
} else {
pass->term = 0;
}
}
if (++passtype == 3) {
passtype = 0;
bpno--;
}
if (pass->term && bpno > 0) {
type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
if (type == T1_TYPE_RAW)
mqc_bypass_init_enc(mqc);
else
mqc_restart_init_enc(mqc);
}
pass->distortiondec = cumwmsedec;
pass->rate = mqc_numbytes(mqc) + correction; /* FIXME */
/* Code-switch "RESET" */
if (cblksty & J2K_CCP_CBLKSTY_RESET)
mqc_reset_enc(mqc);
}
/* Code switch "ERTERM" (i.e. PTERM) */
if (cblksty & J2K_CCP_CBLKSTY_PTERM)
mqc_erterm_enc(mqc);
else /* Default coding */ if (!(cblksty & J2K_CCP_CBLKSTY_LAZY))
mqc_flush(mqc);
cblk->totalpasses = passno;
 
for (passno = 0; passno<cblk->totalpasses; passno++) {
opj_tcd_pass_t *pass = &cblk->passes[passno];
if (pass->rate > mqc_numbytes(mqc))
pass->rate = mqc_numbytes(mqc);
/*Preventing generation of FF as last data byte of a pass*/
if((pass->rate>1) && (cblk->data[pass->rate - 1] == 0xFF)){
pass->rate--;
}
pass->len = pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate);
}
}
 
static void t1_decode_cblk(
opj_t1_t *t1,
opj_tcd_cblk_dec_t* cblk,
int orient,
int roishift,
int cblksty)
{
opj_raw_t *raw = t1->raw; /* RAW component */
opj_mqc_t *mqc = t1->mqc; /* MQC component */
 
int bpno, passtype;
int segno, passno;
char type = T1_TYPE_MQ; /* BYPASS mode */
 
if(!allocate_buffers(
t1,
cblk->x1 - cblk->x0,
cblk->y1 - cblk->y0))
{
return;
}
 
bpno = roishift + cblk->numbps - 1;
passtype = 2;
mqc_resetstates(mqc);
mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
for (segno = 0; segno < cblk->numsegs; ++segno) {
opj_tcd_seg_t *seg = &cblk->segs[segno];
/* BYPASS mode */
type = ((bpno <= (cblk->numbps - 1) - 4) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
/* FIXME: slviewer gets here with a null pointer. Why? Partially downloaded and/or corrupt textures? */
if(seg->data == NULL){
continue;
}
if (type == T1_TYPE_RAW) {
raw_init_dec(raw, (*seg->data) + seg->dataindex, seg->len);
} else {
mqc_init_dec(mqc, (*seg->data) + seg->dataindex, seg->len);
}
for (passno = 0; passno < seg->numpasses; ++passno) {
switch (passtype) {
case 0:
if (type == T1_TYPE_RAW) {
t1_dec_sigpass_raw(t1, bpno+1, orient, cblksty);
} else {
if (cblksty & J2K_CCP_CBLKSTY_VSC) {
t1_dec_sigpass_mqc_vsc(t1, bpno+1, orient);
} else {
t1_dec_sigpass_mqc(t1, bpno+1, orient);
}
}
break;
case 1:
if (type == T1_TYPE_RAW) {
t1_dec_refpass_raw(t1, bpno+1, cblksty);
} else {
if (cblksty & J2K_CCP_CBLKSTY_VSC) {
t1_dec_refpass_mqc_vsc(t1, bpno+1);
} else {
t1_dec_refpass_mqc(t1, bpno+1);
}
}
break;
case 2:
t1_dec_clnpass(t1, bpno+1, orient, cblksty);
break;
}
if ((cblksty & J2K_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) {
mqc_resetstates(mqc);
mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
}
if (++passtype == 3) {
passtype = 0;
bpno--;
}
}
}
}
 
/* ----------------------------------------------------------------------- */
 
opj_t1_t* t1_create(opj_common_ptr cinfo) {
opj_t1_t *t1 = (opj_t1_t*) opj_malloc(sizeof(opj_t1_t));
if(!t1)
return NULL;
 
t1->cinfo = cinfo;
/* create MQC and RAW handles */
t1->mqc = mqc_create();
t1->raw = raw_create();
 
t1->data=NULL;
t1->flags=NULL;
t1->datasize=0;
t1->flagssize=0;
 
return t1;
}
 
void t1_destroy(opj_t1_t *t1) {
if(t1) {
/* destroy MQC and RAW handles */
mqc_destroy(t1->mqc);
raw_destroy(t1->raw);
opj_aligned_free(t1->data);
opj_aligned_free(t1->flags);
opj_free(t1);
}
}
 
void t1_encode_cblks(
opj_t1_t *t1,
opj_tcd_tile_t *tile,
opj_tcp_t *tcp)
{
int compno, resno, bandno, precno, cblkno;
 
tile->distotile = 0; /* fixed_quality */
 
for (compno = 0; compno < tile->numcomps; ++compno) {
opj_tcd_tilecomp_t* tilec = &tile->comps[compno];
opj_tccp_t* tccp = &tcp->tccps[compno];
int tile_w = tilec->x1 - tilec->x0;
 
for (resno = 0; resno < tilec->numresolutions; ++resno) {
opj_tcd_resolution_t *res = &tilec->resolutions[resno];
 
for (bandno = 0; bandno < res->numbands; ++bandno) {
opj_tcd_band_t* restrict band = &res->bands[bandno];
 
for (precno = 0; precno < res->pw * res->ph; ++precno) {
opj_tcd_precinct_t *prc = &band->precincts[precno];
 
for (cblkno = 0; cblkno < prc->cw * prc->ch; ++cblkno) {
opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
int* restrict datap;
int* restrict tiledp;
int cblk_w;
int cblk_h;
int i, j;
 
int x = cblk->x0 - band->x0;
int y = cblk->y0 - band->y0;
if (band->bandno & 1) {
opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
x += pres->x1 - pres->x0;
}
if (band->bandno & 2) {
opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
y += pres->y1 - pres->y0;
}
 
if(!allocate_buffers(
t1,
cblk->x1 - cblk->x0,
cblk->y1 - cblk->y0))
{
return;
}
 
datap=t1->data;
cblk_w = t1->w;
cblk_h = t1->h;
 
tiledp=&tilec->data[(y * tile_w) + x];
if (tccp->qmfbid == 1) {
for (j = 0; j < cblk_h; ++j) {
for (i = 0; i < cblk_w; ++i) {
int tmp = tiledp[(j * tile_w) + i];
datap[(j * cblk_w) + i] = tmp << T1_NMSEDEC_FRACBITS;
}
}
} else { /* if (tccp->qmfbid == 0) */
for (j = 0; j < cblk_h; ++j) {
for (i = 0; i < cblk_w; ++i) {
int tmp = tiledp[(j * tile_w) + i];
datap[(j * cblk_w) + i] =
fix_mul(
tmp,
8192 * 8192 / ((int) floor(band->stepsize * 8192))) >> (11 - T1_NMSEDEC_FRACBITS);
}
}
}
 
t1_encode_cblk(
t1,
cblk,
band->bandno,
compno,
tilec->numresolutions - 1 - resno,
tccp->qmfbid,
band->stepsize,
tccp->cblksty,
tile->numcomps,
tcp->mct,
tile);
 
} /* cblkno */
} /* precno */
} /* bandno */
} /* resno */
} /* compno */
}
 
void t1_decode_cblks(
opj_t1_t* t1,
opj_tcd_tilecomp_t* tilec,
opj_tccp_t* tccp)
{
int resno, bandno, precno, cblkno;
 
int tile_w = tilec->x1 - tilec->x0;
 
for (resno = 0; resno < tilec->numresolutions; ++resno) {
opj_tcd_resolution_t* res = &tilec->resolutions[resno];
 
for (bandno = 0; bandno < res->numbands; ++bandno) {
opj_tcd_band_t* restrict band = &res->bands[bandno];
 
for (precno = 0; precno < res->pw * res->ph; ++precno) {
opj_tcd_precinct_t* precinct = &band->precincts[precno];
 
for (cblkno = 0; cblkno < precinct->cw * precinct->ch; ++cblkno) {
opj_tcd_cblk_dec_t* cblk = &precinct->cblks.dec[cblkno];
int* restrict datap;
int cblk_w, cblk_h;
int x, y;
int i, j;
 
t1_decode_cblk(
t1,
cblk,
band->bandno,
tccp->roishift,
tccp->cblksty);
 
x = cblk->x0 - band->x0;
y = cblk->y0 - band->y0;
if (band->bandno & 1) {
opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1];
x += pres->x1 - pres->x0;
}
if (band->bandno & 2) {
opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1];
y += pres->y1 - pres->y0;
}
 
datap=t1->data;
cblk_w = t1->w;
cblk_h = t1->h;
 
if (tccp->roishift) {
int thresh = 1 << tccp->roishift;
for (j = 0; j < cblk_h; ++j) {
for (i = 0; i < cblk_w; ++i) {
int val = datap[(j * cblk_w) + i];
int mag = abs(val);
if (mag >= thresh) {
mag >>= tccp->roishift;
datap[(j * cblk_w) + i] = val < 0 ? -mag : mag;
}
}
}
}
 
if (tccp->qmfbid == 1) {
int* restrict tiledp = &tilec->data[(y * tile_w) + x];
for (j = 0; j < cblk_h; ++j) {
for (i = 0; i < cblk_w; ++i) {
int tmp = datap[(j * cblk_w) + i];
((int*)tiledp)[(j * tile_w) + i] = tmp / 2;
}
}
} else { /* if (tccp->qmfbid == 0) */
float* restrict tiledp = (float*) &tilec->data[(y * tile_w) + x];
for (j = 0; j < cblk_h; ++j) {
float* restrict tiledp2 = tiledp;
for (i = 0; i < cblk_w; ++i) {
float tmp = *datap * band->stepsize;
*tiledp2 = tmp;
datap++;
tiledp2++;
}
tiledp += tile_w;
}
}
opj_free(cblk->data);
opj_free(cblk->segs);
} /* cblkno */
opj_free(precinct->cblks.dec);
} /* precno */
} /* bandno */
} /* resno */
}
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/t1.h
0,0 → 1,147
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __T1_H
#define __T1_H
/**
@file t1.h
@brief Implementation of the tier-1 coding (coding of code-block coefficients) (T1)
 
The functions in T1.C have for goal to realize the tier-1 coding operation. The functions
in T1.C are used by some function in TCD.C.
*/
 
/** @defgroup T1 T1 - Implementation of the tier-1 coding */
/*@{*/
 
/* ----------------------------------------------------------------------- */
#define T1_NMSEDEC_BITS 7
 
#define T1_SIG_NE 0x0001 /**< Context orientation : North-East direction */
#define T1_SIG_SE 0x0002 /**< Context orientation : South-East direction */
#define T1_SIG_SW 0x0004 /**< Context orientation : South-West direction */
#define T1_SIG_NW 0x0008 /**< Context orientation : North-West direction */
#define T1_SIG_N 0x0010 /**< Context orientation : North direction */
#define T1_SIG_E 0x0020 /**< Context orientation : East direction */
#define T1_SIG_S 0x0040 /**< Context orientation : South direction */
#define T1_SIG_W 0x0080 /**< Context orientation : West direction */
#define T1_SIG_OTH (T1_SIG_N|T1_SIG_NE|T1_SIG_E|T1_SIG_SE|T1_SIG_S|T1_SIG_SW|T1_SIG_W|T1_SIG_NW)
#define T1_SIG_PRIM (T1_SIG_N|T1_SIG_E|T1_SIG_S|T1_SIG_W)
 
#define T1_SGN_N 0x0100
#define T1_SGN_E 0x0200
#define T1_SGN_S 0x0400
#define T1_SGN_W 0x0800
#define T1_SGN (T1_SGN_N|T1_SGN_E|T1_SGN_S|T1_SGN_W)
 
#define T1_SIG 0x1000
#define T1_REFINE 0x2000
#define T1_VISIT 0x4000
 
#define T1_NUMCTXS_ZC 9
#define T1_NUMCTXS_SC 5
#define T1_NUMCTXS_MAG 3
#define T1_NUMCTXS_AGG 1
#define T1_NUMCTXS_UNI 1
 
#define T1_CTXNO_ZC 0
#define T1_CTXNO_SC (T1_CTXNO_ZC+T1_NUMCTXS_ZC)
#define T1_CTXNO_MAG (T1_CTXNO_SC+T1_NUMCTXS_SC)
#define T1_CTXNO_AGG (T1_CTXNO_MAG+T1_NUMCTXS_MAG)
#define T1_CTXNO_UNI (T1_CTXNO_AGG+T1_NUMCTXS_AGG)
#define T1_NUMCTXS (T1_CTXNO_UNI+T1_NUMCTXS_UNI)
 
#define T1_NMSEDEC_FRACBITS (T1_NMSEDEC_BITS-1)
 
#define T1_TYPE_MQ 0 /**< Normal coding using entropy coder */
#define T1_TYPE_RAW 1 /**< No encoding the information is store under raw format in codestream (mode switch RAW)*/
 
/* ----------------------------------------------------------------------- */
 
typedef short flag_t;
 
/**
Tier-1 coding (coding of code-block coefficients)
*/
typedef struct opj_t1 {
/** codec context */
opj_common_ptr cinfo;
 
/** MQC component */
opj_mqc_t *mqc;
/** RAW component */
opj_raw_t *raw;
 
int *data;
flag_t *flags;
int w;
int h;
int datasize;
int flagssize;
int flags_stride;
} opj_t1_t;
 
#define MACRO_t1_flags(x,y) t1->flags[((x)*(t1->flags_stride))+(y)]
 
/** @name Exported functions */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Create a new T1 handle
and initialize the look-up tables of the Tier-1 coder/decoder
@return Returns a new T1 handle if successful, returns NULL otherwise
@see t1_init_luts
*/
opj_t1_t* t1_create(opj_common_ptr cinfo);
/**
Destroy a previously created T1 handle
@param t1 T1 handle to destroy
*/
void t1_destroy(opj_t1_t *t1);
/**
Encode the code-blocks of a tile
@param t1 T1 handle
@param tile The tile to encode
@param tcp Tile coding parameters
*/
void t1_encode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp);
/**
Decode the code-blocks of a tile
@param t1 T1 handle
@param tilec The tile to decode
@param tccp Tile coding parameters
*/
void t1_decode_cblks(opj_t1_t* t1, opj_tcd_tilecomp_t* tilec, opj_tccp_t* tccp);
/* ----------------------------------------------------------------------- */
/*@}*/
 
/*@}*/
 
#endif /* __T1_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/t1_generate_luts.c
0,0 → 1,275
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#include "opj_includes.h"
#include <math.h>
 
static int t1_init_ctxno_zc(int f, int orient) {
int h, v, d, n, t, hv;
n = 0;
h = ((f & T1_SIG_W) != 0) + ((f & T1_SIG_E) != 0);
v = ((f & T1_SIG_N) != 0) + ((f & T1_SIG_S) != 0);
d = ((f & T1_SIG_NW) != 0) + ((f & T1_SIG_NE) != 0) + ((f & T1_SIG_SE) != 0) + ((f & T1_SIG_SW) != 0);
 
switch (orient) {
case 2:
t = h;
h = v;
v = t;
case 0:
case 1:
if (!h) {
if (!v) {
if (!d)
n = 0;
else if (d == 1)
n = 1;
else
n = 2;
} else if (v == 1) {
n = 3;
} else {
n = 4;
}
} else if (h == 1) {
if (!v) {
if (!d)
n = 5;
else
n = 6;
} else {
n = 7;
}
} else
n = 8;
break;
case 3:
hv = h + v;
if (!d) {
if (!hv) {
n = 0;
} else if (hv == 1) {
n = 1;
} else {
n = 2;
}
} else if (d == 1) {
if (!hv) {
n = 3;
} else if (hv == 1) {
n = 4;
} else {
n = 5;
}
} else if (d == 2) {
if (!hv) {
n = 6;
} else {
n = 7;
}
} else {
n = 8;
}
break;
}
 
return (T1_CTXNO_ZC + n);
}
 
static int t1_init_ctxno_sc(int f) {
int hc, vc, n;
n = 0;
 
hc = int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
T1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W),
1) - int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
(T1_SIG_E | T1_SGN_E)) +
((f & (T1_SIG_W | T1_SGN_W)) ==
(T1_SIG_W | T1_SGN_W)), 1);
 
vc = int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
T1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S),
1) - int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
(T1_SIG_N | T1_SGN_N)) +
((f & (T1_SIG_S | T1_SGN_S)) ==
(T1_SIG_S | T1_SGN_S)), 1);
 
if (hc < 0) {
hc = -hc;
vc = -vc;
}
if (!hc) {
if (vc == -1)
n = 1;
else if (!vc)
n = 0;
else
n = 1;
} else if (hc == 1) {
if (vc == -1)
n = 2;
else if (!vc)
n = 3;
else
n = 4;
}
 
return (T1_CTXNO_SC + n);
}
 
static int t1_init_spb(int f) {
int hc, vc, n;
 
hc = int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
T1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W),
1) - int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
(T1_SIG_E | T1_SGN_E)) +
((f & (T1_SIG_W | T1_SGN_W)) ==
(T1_SIG_W | T1_SGN_W)), 1);
 
vc = int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
T1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S),
1) - int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
(T1_SIG_N | T1_SGN_N)) +
((f & (T1_SIG_S | T1_SGN_S)) ==
(T1_SIG_S | T1_SGN_S)), 1);
 
if (!hc && !vc)
n = 0;
else
n = (!(hc > 0 || (!hc && vc > 0)));
 
return n;
}
 
void dump_array16(int array[],int size){
int i;
--size;
for (i = 0; i < size; ++i) {
printf("0x%04x, ", array[i]);
if(!((i+1)&0x7))
printf("\n ");
}
printf("0x%04x\n};\n\n", array[size]);
}
 
int main(){
int i, j;
double u, v, t;
 
int lut_ctxno_zc[1024];
int lut_nmsedec_sig[1 << T1_NMSEDEC_BITS];
int lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS];
int lut_nmsedec_ref[1 << T1_NMSEDEC_BITS];
int lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS];
 
printf("/* This file was automatically generated by t1_generate_luts.c */\n\n");
 
// lut_ctxno_zc
for (j = 0; j < 4; ++j) {
for (i = 0; i < 256; ++i) {
int orient = j;
if (orient == 2) {
orient = 1;
} else if (orient == 1) {
orient = 2;
}
lut_ctxno_zc[(orient << 8) | i] = t1_init_ctxno_zc(i, j);
}
}
 
printf("static char lut_ctxno_zc[1024] = {\n ");
for (i = 0; i < 1023; ++i) {
printf("%i, ", lut_ctxno_zc[i]);
if(!((i+1)&0x1f))
printf("\n ");
}
printf("%i\n};\n\n", lut_ctxno_zc[1023]);
 
// lut_ctxno_sc
printf("static char lut_ctxno_sc[256] = {\n ");
for (i = 0; i < 255; ++i) {
printf("0x%x, ", t1_init_ctxno_sc(i << 4));
if(!((i+1)&0xf))
printf("\n ");
}
printf("0x%x\n};\n\n", t1_init_ctxno_sc(255 << 4));
 
// lut_spb
printf("static char lut_spb[256] = {\n ");
for (i = 0; i < 255; ++i) {
printf("%i, ", t1_init_spb(i << 4));
if(!((i+1)&0x1f))
printf("\n ");
}
printf("%i\n};\n\n", t1_init_spb(255 << 4));
 
/* FIXME FIXME FIXME */
/* fprintf(stdout,"nmsedec luts:\n"); */
for (i = 0; i < (1 << T1_NMSEDEC_BITS); ++i) {
t = i / pow(2, T1_NMSEDEC_FRACBITS);
u = t;
v = t - 1.5;
lut_nmsedec_sig[i] =
int_max(0,
(int) (floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
lut_nmsedec_sig0[i] =
int_max(0,
(int) (floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
u = t - 1.0;
if (i & (1 << (T1_NMSEDEC_BITS - 1))) {
v = t - 1.5;
} else {
v = t - 0.5;
}
lut_nmsedec_ref[i] =
int_max(0,
(int) (floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
lut_nmsedec_ref0[i] =
int_max(0,
(int) (floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
}
 
printf("static short lut_nmsedec_sig[1 << T1_NMSEDEC_BITS] = {\n ");
dump_array16(lut_nmsedec_sig, 1 << T1_NMSEDEC_BITS);
 
printf("static short lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS] = {\n ");
dump_array16(lut_nmsedec_sig0, 1 << T1_NMSEDEC_BITS);
 
printf("static short lut_nmsedec_ref[1 << T1_NMSEDEC_BITS] = {\n ");
dump_array16(lut_nmsedec_ref, 1 << T1_NMSEDEC_BITS);
 
printf("static short lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS] = {\n ");
dump_array16(lut_nmsedec_ref0, 1 << T1_NMSEDEC_BITS);
 
return 0;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/t1_luts.h
0,0 → 1,143
/* This file was automatically generated by t1_generate_luts.c */
 
static char lut_ctxno_zc[1024] = {
0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
0, 3, 3, 6, 3, 6, 6, 8, 3, 6, 6, 8, 6, 8, 8, 8, 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8,
1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8,
1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8,
2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8,
1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8,
2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8,
2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8,
2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8
};
 
static char lut_ctxno_sc[256] = {
0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd,
0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xb, 0xc, 0xb, 0xd, 0xc, 0xd, 0xc,
0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0x9, 0xa, 0xd, 0xd, 0xa, 0xa,
0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xb, 0x9, 0xa, 0xd, 0xc, 0xa, 0x9,
0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xd, 0xc, 0xd, 0xb, 0xc, 0xb, 0xc,
0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xb, 0xc, 0xb, 0xb, 0xb, 0xb, 0xb,
0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xd, 0x9, 0xa, 0xb, 0xc, 0xa, 0x9,
0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xb, 0x9, 0xa, 0xb, 0xb, 0xa, 0xa,
0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xb, 0x9, 0xa, 0xb, 0xb, 0xa, 0xa,
0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xd, 0x9, 0xa, 0xb, 0xc, 0xa, 0x9,
0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xb, 0xc, 0xb, 0xb, 0xb, 0xb, 0xb,
0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xd, 0xc, 0xd, 0xb, 0xc, 0xb, 0xc,
0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xb, 0x9, 0xa, 0xd, 0xc, 0xa, 0x9,
0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0x9, 0xa, 0xd, 0xd, 0xa, 0xa,
0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xb, 0xc, 0xb, 0xd, 0xc, 0xd, 0xc,
0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd
};
 
static char lut_spb[256] = {
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, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0,
0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1,
0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
};
 
static short lut_nmsedec_sig[1 << T1_NMSEDEC_BITS] = {
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0180, 0x0300, 0x0480, 0x0600, 0x0780, 0x0900, 0x0a80,
0x0c00, 0x0d80, 0x0f00, 0x1080, 0x1200, 0x1380, 0x1500, 0x1680,
0x1800, 0x1980, 0x1b00, 0x1c80, 0x1e00, 0x1f80, 0x2100, 0x2280,
0x2400, 0x2580, 0x2700, 0x2880, 0x2a00, 0x2b80, 0x2d00, 0x2e80,
0x3000, 0x3180, 0x3300, 0x3480, 0x3600, 0x3780, 0x3900, 0x3a80,
0x3c00, 0x3d80, 0x3f00, 0x4080, 0x4200, 0x4380, 0x4500, 0x4680,
0x4800, 0x4980, 0x4b00, 0x4c80, 0x4e00, 0x4f80, 0x5100, 0x5280,
0x5400, 0x5580, 0x5700, 0x5880, 0x5a00, 0x5b80, 0x5d00, 0x5e80,
0x6000, 0x6180, 0x6300, 0x6480, 0x6600, 0x6780, 0x6900, 0x6a80,
0x6c00, 0x6d80, 0x6f00, 0x7080, 0x7200, 0x7380, 0x7500, 0x7680
};
 
static short lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS] = {
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0080,
0x0080, 0x0080, 0x0100, 0x0100, 0x0100, 0x0180, 0x0180, 0x0200,
0x0200, 0x0280, 0x0280, 0x0300, 0x0300, 0x0380, 0x0400, 0x0400,
0x0480, 0x0500, 0x0580, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780,
0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b80, 0x0c00,
0x0c80, 0x0d00, 0x0e00, 0x0e80, 0x0f00, 0x1000, 0x1080, 0x1180,
0x1200, 0x1300, 0x1380, 0x1480, 0x1500, 0x1600, 0x1700, 0x1780,
0x1880, 0x1980, 0x1a80, 0x1b00, 0x1c00, 0x1d00, 0x1e00, 0x1f00,
0x2000, 0x2100, 0x2200, 0x2300, 0x2400, 0x2500, 0x2680, 0x2780,
0x2880, 0x2980, 0x2b00, 0x2c00, 0x2d00, 0x2e80, 0x2f80, 0x3100,
0x3200, 0x3380, 0x3480, 0x3600, 0x3700, 0x3880, 0x3a00, 0x3b00,
0x3c80, 0x3e00, 0x3f80, 0x4080, 0x4200, 0x4380, 0x4500, 0x4680,
0x4800, 0x4980, 0x4b00, 0x4c80, 0x4e00, 0x4f80, 0x5180, 0x5300,
0x5480, 0x5600, 0x5800, 0x5980, 0x5b00, 0x5d00, 0x5e80, 0x6080,
0x6200, 0x6400, 0x6580, 0x6780, 0x6900, 0x6b00, 0x6d00, 0x6e80,
0x7080, 0x7280, 0x7480, 0x7600, 0x7800, 0x7a00, 0x7c00, 0x7e00
};
 
static short lut_nmsedec_ref[1 << T1_NMSEDEC_BITS] = {
0x1800, 0x1780, 0x1700, 0x1680, 0x1600, 0x1580, 0x1500, 0x1480,
0x1400, 0x1380, 0x1300, 0x1280, 0x1200, 0x1180, 0x1100, 0x1080,
0x1000, 0x0f80, 0x0f00, 0x0e80, 0x0e00, 0x0d80, 0x0d00, 0x0c80,
0x0c00, 0x0b80, 0x0b00, 0x0a80, 0x0a00, 0x0980, 0x0900, 0x0880,
0x0800, 0x0780, 0x0700, 0x0680, 0x0600, 0x0580, 0x0500, 0x0480,
0x0400, 0x0380, 0x0300, 0x0280, 0x0200, 0x0180, 0x0100, 0x0080,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0080, 0x0100, 0x0180, 0x0200, 0x0280, 0x0300, 0x0380,
0x0400, 0x0480, 0x0500, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780,
0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b00, 0x0b80,
0x0c00, 0x0c80, 0x0d00, 0x0d80, 0x0e00, 0x0e80, 0x0f00, 0x0f80,
0x1000, 0x1080, 0x1100, 0x1180, 0x1200, 0x1280, 0x1300, 0x1380,
0x1400, 0x1480, 0x1500, 0x1580, 0x1600, 0x1680, 0x1700, 0x1780
};
 
static short lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS] = {
0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x1b00, 0x1a80, 0x1980,
0x1880, 0x1780, 0x1700, 0x1600, 0x1500, 0x1480, 0x1380, 0x1300,
0x1200, 0x1180, 0x1080, 0x1000, 0x0f00, 0x0e80, 0x0e00, 0x0d00,
0x0c80, 0x0c00, 0x0b80, 0x0a80, 0x0a00, 0x0980, 0x0900, 0x0880,
0x0800, 0x0780, 0x0700, 0x0680, 0x0600, 0x0580, 0x0580, 0x0500,
0x0480, 0x0400, 0x0400, 0x0380, 0x0300, 0x0300, 0x0280, 0x0280,
0x0200, 0x0200, 0x0180, 0x0180, 0x0100, 0x0100, 0x0100, 0x0080,
0x0080, 0x0080, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0080,
0x0080, 0x0080, 0x0100, 0x0100, 0x0100, 0x0180, 0x0180, 0x0200,
0x0200, 0x0280, 0x0280, 0x0300, 0x0300, 0x0380, 0x0400, 0x0400,
0x0480, 0x0500, 0x0580, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780,
0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b80, 0x0c00,
0x0c80, 0x0d00, 0x0e00, 0x0e80, 0x0f00, 0x1000, 0x1080, 0x1180,
0x1200, 0x1300, 0x1380, 0x1480, 0x1500, 0x1600, 0x1700, 0x1780,
0x1880, 0x1980, 0x1a80, 0x1b00, 0x1c00, 0x1d00, 0x1e00, 0x1f00
};
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/t2.c
0,0 → 1,791
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#include "opj_includes.h"
 
/** @defgroup T2 T2 - Implementation of a tier-2 coding */
/*@{*/
 
/** @name Local static functions */
/*@{*/
 
static void t2_putcommacode(opj_bio_t *bio, int n);
static int t2_getcommacode(opj_bio_t *bio);
/**
Variable length code for signalling delta Zil (truncation point)
@param bio Bit Input/Output component
@param n delta Zil
*/
static void t2_putnumpasses(opj_bio_t *bio, int n);
static int t2_getnumpasses(opj_bio_t *bio);
/**
Encode a packet of a tile to a destination buffer
@param tile Tile for which to write the packets
@param tcp Tile coding parameters
@param pi Packet identity
@param dest Destination buffer
@param len Length of the destination buffer
@param cstr_info Codestream information structure
@param tileno Number of the tile encoded
@return
*/
static int t2_encode_packet(opj_tcd_tile_t *tile, opj_tcp_t *tcp, opj_pi_iterator_t *pi, unsigned char *dest, int len, opj_codestream_info_t *cstr_info, int tileno);
/**
@param cblk
@param index
@param cblksty
@param first
*/
static void t2_init_seg(opj_tcd_cblk_dec_t* cblk, int index, int cblksty, int first);
/**
Decode a packet of a tile from a source buffer
@param t2 T2 handle
@param src Source buffer
@param len Length of the source buffer
@param tile Tile for which to write the packets
@param tcp Tile coding parameters
@param pi Packet identity
@param pack_info Packet information
@return
*/
static int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len, opj_tcd_tile_t *tile,
opj_tcp_t *tcp, opj_pi_iterator_t *pi, opj_packet_info_t *pack_info);
 
/*@}*/
 
/*@}*/
 
/* ----------------------------------------------------------------------- */
 
/* #define RESTART 0x04 */
 
static void t2_putcommacode(opj_bio_t *bio, int n) {
while (--n >= 0) {
bio_write(bio, 1, 1);
}
bio_write(bio, 0, 1);
}
 
static int t2_getcommacode(opj_bio_t *bio) {
int n;
for (n = 0; bio_read(bio, 1); n++) {
;
}
return n;
}
 
static void t2_putnumpasses(opj_bio_t *bio, int n) {
if (n == 1) {
bio_write(bio, 0, 1);
} else if (n == 2) {
bio_write(bio, 2, 2);
} else if (n <= 5) {
bio_write(bio, 0xc | (n - 3), 4);
} else if (n <= 36) {
bio_write(bio, 0x1e0 | (n - 6), 9);
} else if (n <= 164) {
bio_write(bio, 0xff80 | (n - 37), 16);
}
}
 
static int t2_getnumpasses(opj_bio_t *bio) {
int n;
if (!bio_read(bio, 1))
return 1;
if (!bio_read(bio, 1))
return 2;
if ((n = bio_read(bio, 2)) != 3)
return (3 + n);
if ((n = bio_read(bio, 5)) != 31)
return (6 + n);
return (37 + bio_read(bio, 7));
}
 
static int t2_encode_packet(opj_tcd_tile_t * tile, opj_tcp_t * tcp, opj_pi_iterator_t *pi, unsigned char *dest, int length, opj_codestream_info_t *cstr_info, int tileno) {
int bandno, cblkno;
unsigned char *c = dest;
 
int compno = pi->compno; /* component value */
int resno = pi->resno; /* resolution level value */
int precno = pi->precno; /* precinct value */
int layno = pi->layno; /* quality layer value */
 
opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
opj_tcd_resolution_t *res = &tilec->resolutions[resno];
opj_bio_t *bio = NULL; /* BIO component */
/* <SOP 0xff91> */
if (tcp->csty & J2K_CP_CSTY_SOP) {
c[0] = 255;
c[1] = 145;
c[2] = 0;
c[3] = 4;
c[4] = (tile->packno % 65536) / 256;
c[5] = (tile->packno % 65536) % 256;
c += 6;
}
/* </SOP> */
if (!layno) {
for (bandno = 0; bandno < res->numbands; bandno++) {
opj_tcd_band_t *band = &res->bands[bandno];
opj_tcd_precinct_t *prc = &band->precincts[precno];
tgt_reset(prc->incltree);
tgt_reset(prc->imsbtree);
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
cblk->numpasses = 0;
tgt_setvalue(prc->imsbtree, cblkno, band->numbps - cblk->numbps);
}
}
}
bio = bio_create();
bio_init_enc(bio, c, length);
bio_write(bio, 1, 1); /* Empty header bit */
/* Writing Packet header */
for (bandno = 0; bandno < res->numbands; bandno++) {
opj_tcd_band_t *band = &res->bands[bandno];
opj_tcd_precinct_t *prc = &band->precincts[precno];
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
opj_tcd_layer_t *layer = &cblk->layers[layno];
if (!cblk->numpasses && layer->numpasses) {
tgt_setvalue(prc->incltree, cblkno, layno);
}
}
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
opj_tcd_layer_t *layer = &cblk->layers[layno];
int increment = 0;
int nump = 0;
int len = 0, passno;
/* cblk inclusion bits */
if (!cblk->numpasses) {
tgt_encode(bio, prc->incltree, cblkno, layno + 1);
} else {
bio_write(bio, layer->numpasses != 0, 1);
}
/* if cblk not included, go to the next cblk */
if (!layer->numpasses) {
continue;
}
/* if first instance of cblk --> zero bit-planes information */
if (!cblk->numpasses) {
cblk->numlenbits = 3;
tgt_encode(bio, prc->imsbtree, cblkno, 999);
}
/* number of coding passes included */
t2_putnumpasses(bio, layer->numpasses);
/* computation of the increase of the length indicator and insertion in the header */
for (passno = cblk->numpasses; passno < cblk->numpasses + layer->numpasses; passno++) {
opj_tcd_pass_t *pass = &cblk->passes[passno];
nump++;
len += pass->len;
if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
increment = int_max(increment, int_floorlog2(len) + 1 - (cblk->numlenbits + int_floorlog2(nump)));
len = 0;
nump = 0;
}
}
t2_putcommacode(bio, increment);
 
/* computation of the new Length indicator */
cblk->numlenbits += increment;
 
/* insertion of the codeword segment length */
for (passno = cblk->numpasses; passno < cblk->numpasses + layer->numpasses; passno++) {
opj_tcd_pass_t *pass = &cblk->passes[passno];
nump++;
len += pass->len;
if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
bio_write(bio, len, cblk->numlenbits + int_floorlog2(nump));
len = 0;
nump = 0;
}
}
}
}
 
if (bio_flush(bio)) {
bio_destroy(bio);
return -999; /* modified to eliminate longjmp !! */
}
 
c += bio_numbytes(bio);
bio_destroy(bio);
/* <EPH 0xff92> */
if (tcp->csty & J2K_CP_CSTY_EPH) {
c[0] = 255;
c[1] = 146;
c += 2;
}
/* </EPH> */
 
/* << INDEX */
// End of packet header position. Currently only represents the distance to start of packet
// Will be updated later by incrementing with packet start value
if(cstr_info && cstr_info->index_write) {
opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];
info_PK->end_ph_pos = (int)(c - dest);
}
/* INDEX >> */
/* Writing the packet body */
for (bandno = 0; bandno < res->numbands; bandno++) {
opj_tcd_band_t *band = &res->bands[bandno];
opj_tcd_precinct_t *prc = &band->precincts[precno];
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
opj_tcd_layer_t *layer = &cblk->layers[layno];
if (!layer->numpasses) {
continue;
}
if (c + layer->len > dest + length) {
return -999;
}
memcpy(c, layer->data, layer->len);
cblk->numpasses += layer->numpasses;
c += layer->len;
/* << INDEX */
if(cstr_info && cstr_info->index_write) {
opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];
info_PK->disto += layer->disto;
if (cstr_info->D_max < info_PK->disto) {
cstr_info->D_max = info_PK->disto;
}
}
/* INDEX >> */
}
}
return (c - dest);
}
 
static void t2_init_seg(opj_tcd_cblk_dec_t* cblk, int index, int cblksty, int first) {
opj_tcd_seg_t* seg;
cblk->segs = (opj_tcd_seg_t*) opj_realloc(cblk->segs, (index + 1) * sizeof(opj_tcd_seg_t));
seg = &cblk->segs[index];
seg->data = NULL;
seg->dataindex = 0;
seg->numpasses = 0;
seg->len = 0;
if (cblksty & J2K_CCP_CBLKSTY_TERMALL) {
seg->maxpasses = 1;
}
else if (cblksty & J2K_CCP_CBLKSTY_LAZY) {
if (first) {
seg->maxpasses = 10;
} else {
seg->maxpasses = (((seg - 1)->maxpasses == 1) || ((seg - 1)->maxpasses == 10)) ? 2 : 1;
}
} else {
seg->maxpasses = 109;
}
}
 
static int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len, opj_tcd_tile_t *tile,
opj_tcp_t *tcp, opj_pi_iterator_t *pi, opj_packet_info_t *pack_info) {
int bandno, cblkno;
unsigned char *c = src;
 
opj_cp_t *cp = t2->cp;
 
int compno = pi->compno; /* component value */
int resno = pi->resno; /* resolution level value */
int precno = pi->precno; /* precinct value */
int layno = pi->layno; /* quality layer value */
 
opj_tcd_resolution_t* res = &tile->comps[compno].resolutions[resno];
 
unsigned char *hd = NULL;
int present;
opj_bio_t *bio = NULL; /* BIO component */
if (layno == 0) {
for (bandno = 0; bandno < res->numbands; bandno++) {
opj_tcd_band_t *band = &res->bands[bandno];
opj_tcd_precinct_t *prc = &band->precincts[precno];
if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue;
tgt_reset(prc->incltree);
tgt_reset(prc->imsbtree);
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno];
cblk->numsegs = 0;
}
}
}
/* SOP markers */
if (tcp->csty & J2K_CP_CSTY_SOP) {
if ((*c) != 0xff || (*(c + 1) != 0x91)) {
opj_event_msg(t2->cinfo, EVT_WARNING, "Expected SOP marker\n");
} else {
c += 6;
}
/** TODO : check the Nsop value */
}
/*
When the marker PPT/PPM is used the packet header are store in PPT/PPM marker
This part deal with this caracteristic
step 1: Read packet header in the saved structure
step 2: Return to codestream for decoding
*/
 
bio = bio_create();
if (cp->ppm == 1) { /* PPM */
hd = cp->ppm_data;
bio_init_dec(bio, hd, cp->ppm_len);
} else if (tcp->ppt == 1) { /* PPT */
hd = tcp->ppt_data;
bio_init_dec(bio, hd, tcp->ppt_len);
} else { /* Normal Case */
hd = c;
bio_init_dec(bio, hd, src+len-hd);
}
present = bio_read(bio, 1);
if (!present) {
bio_inalign(bio);
hd += bio_numbytes(bio);
bio_destroy(bio);
/* EPH markers */
if (tcp->csty & J2K_CP_CSTY_EPH) {
if ((*hd) != 0xff || (*(hd + 1) != 0x92)) {
printf("Error : expected EPH marker\n");
} else {
hd += 2;
}
}
 
/* << INDEX */
// End of packet header position. Currently only represents the distance to start of packet
// Will be updated later by incrementing with packet start value
if(pack_info) {
pack_info->end_ph_pos = (int)(c - src);
}
/* INDEX >> */
if (cp->ppm == 1) { /* PPM case */
cp->ppm_len += cp->ppm_data-hd;
cp->ppm_data = hd;
return (c - src);
}
if (tcp->ppt == 1) { /* PPT case */
tcp->ppt_len+=tcp->ppt_data-hd;
tcp->ppt_data = hd;
return (c - src);
}
return (hd - src);
}
for (bandno = 0; bandno < res->numbands; bandno++) {
opj_tcd_band_t *band = &res->bands[bandno];
opj_tcd_precinct_t *prc = &band->precincts[precno];
if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue;
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
int included, increment, n, segno;
opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno];
/* if cblk not yet included before --> inclusion tagtree */
if (!cblk->numsegs) {
included = tgt_decode(bio, prc->incltree, cblkno, layno + 1);
/* else one bit */
} else {
included = bio_read(bio, 1);
}
/* if cblk not included */
if (!included) {
cblk->numnewpasses = 0;
continue;
}
/* if cblk not yet included --> zero-bitplane tagtree */
if (!cblk->numsegs) {
int i, numimsbs;
for (i = 0; !tgt_decode(bio, prc->imsbtree, cblkno, i); i++) {
;
}
numimsbs = i - 1;
cblk->numbps = band->numbps - numimsbs;
cblk->numlenbits = 3;
}
/* number of coding passes */
cblk->numnewpasses = t2_getnumpasses(bio);
increment = t2_getcommacode(bio);
/* length indicator increment */
cblk->numlenbits += increment;
segno = 0;
if (!cblk->numsegs) {
t2_init_seg(cblk, segno, tcp->tccps[compno].cblksty, 1);
} else {
segno = cblk->numsegs - 1;
if (cblk->segs[segno].numpasses == cblk->segs[segno].maxpasses) {
++segno;
t2_init_seg(cblk, segno, tcp->tccps[compno].cblksty, 0);
}
}
n = cblk->numnewpasses;
do {
cblk->segs[segno].numnewpasses = int_min(cblk->segs[segno].maxpasses - cblk->segs[segno].numpasses, n);
cblk->segs[segno].newlen = bio_read(bio, cblk->numlenbits + int_floorlog2(cblk->segs[segno].numnewpasses));
n -= cblk->segs[segno].numnewpasses;
if (n > 0) {
++segno;
t2_init_seg(cblk, segno, tcp->tccps[compno].cblksty, 0);
}
} while (n > 0);
}
}
if (bio_inalign(bio)) {
bio_destroy(bio);
return -999;
}
hd += bio_numbytes(bio);
bio_destroy(bio);
/* EPH markers */
if (tcp->csty & J2K_CP_CSTY_EPH) {
if ((*hd) != 0xff || (*(hd + 1) != 0x92)) {
opj_event_msg(t2->cinfo, EVT_ERROR, "Expected EPH marker\n");
return -999;
} else {
hd += 2;
}
}
 
/* << INDEX */
// End of packet header position. Currently only represents the distance to start of packet
// Will be updated later by incrementing with packet start value
if(pack_info) {
pack_info->end_ph_pos = (int)(hd - src);
}
/* INDEX >> */
if (cp->ppm==1) {
cp->ppm_len+=cp->ppm_data-hd;
cp->ppm_data = hd;
} else if (tcp->ppt == 1) {
tcp->ppt_len+=tcp->ppt_data-hd;
tcp->ppt_data = hd;
} else {
c=hd;
}
for (bandno = 0; bandno < res->numbands; bandno++) {
opj_tcd_band_t *band = &res->bands[bandno];
opj_tcd_precinct_t *prc = &band->precincts[precno];
if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue;
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno];
opj_tcd_seg_t *seg = NULL;
if (!cblk->numnewpasses)
continue;
if (!cblk->numsegs) {
seg = &cblk->segs[0];
cblk->numsegs++;
cblk->len = 0;
} else {
seg = &cblk->segs[cblk->numsegs - 1];
if (seg->numpasses == seg->maxpasses) {
seg++;
cblk->numsegs++;
}
}
do {
if (c + seg->newlen > src + len) {
return -999;
}
 
#ifdef USE_JPWL
/* we need here a j2k handle to verify if making a check to
the validity of cblocks parameters is selected from user (-W) */
 
/* let's check that we are not exceeding */
if ((cblk->len + seg->newlen) > 8192) {
opj_event_msg(t2->cinfo, EVT_WARNING,
"JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
seg->newlen, cblkno, precno, bandno, resno, compno);
if (!JPWL_ASSUME) {
opj_event_msg(t2->cinfo, EVT_ERROR, "JPWL: giving up\n");
return -999;
}
seg->newlen = 8192 - cblk->len;
opj_event_msg(t2->cinfo, EVT_WARNING, " - truncating segment to %d\n", seg->newlen);
break;
};
 
#endif /* USE_JPWL */
cblk->data = (unsigned char*) opj_realloc(cblk->data, (cblk->len + seg->newlen) * sizeof(unsigned char*));
memcpy(cblk->data + cblk->len, c, seg->newlen);
if (seg->numpasses == 0) {
seg->data = &cblk->data;
seg->dataindex = cblk->len;
}
c += seg->newlen;
cblk->len += seg->newlen;
seg->len += seg->newlen;
seg->numpasses += seg->numnewpasses;
cblk->numnewpasses -= seg->numnewpasses;
if (cblk->numnewpasses > 0) {
seg++;
cblk->numsegs++;
}
} while (cblk->numnewpasses > 0);
}
}
return (c - src);
}
 
/* ----------------------------------------------------------------------- */
 
int t2_encode_packets(opj_t2_t* t2,int tileno, opj_tcd_tile_t *tile, int maxlayers, unsigned char *dest, int len, opj_codestream_info_t *cstr_info,int tpnum, int tppos,int pino, J2K_T2_MODE t2_mode, int cur_totnum_tp){
unsigned char *c = dest;
int e = 0;
int compno;
opj_pi_iterator_t *pi = NULL;
int poc;
opj_image_t *image = t2->image;
opj_cp_t *cp = t2->cp;
opj_tcp_t *tcp = &cp->tcps[tileno];
int pocno = cp->cinema == CINEMA4K_24? 2: 1;
int maxcomp = cp->max_comp_size > 0 ? image->numcomps : 1;
pi = pi_initialise_encode(image, cp, tileno, t2_mode);
if(!pi) {
/* TODO: throw an error */
return -999;
}
if(t2_mode == THRESH_CALC ){ /* Calculating threshold */
for(compno = 0; compno < maxcomp; compno++ ){
for(poc = 0; poc < pocno ; poc++){
int comp_len = 0;
int tpnum = compno;
if (pi_create_encode(pi, cp,tileno,poc,tpnum,tppos,t2_mode,cur_totnum_tp)) {
opj_event_msg(t2->cinfo, EVT_ERROR, "Error initializing Packet Iterator\n");
pi_destroy(pi, cp, tileno);
return -999;
}
while (pi_next(&pi[poc])) {
if (pi[poc].layno < maxlayers) {
e = t2_encode_packet(tile, &cp->tcps[tileno], &pi[poc], c, dest + len - c, cstr_info, tileno);
comp_len = comp_len + e;
if (e == -999) {
break;
} else {
c += e;
}
}
}
if (e == -999) break;
if (cp->max_comp_size){
if (comp_len > cp->max_comp_size){
e = -999;
break;
}
}
}
if (e == -999) break;
}
}else{ /* t2_mode == FINAL_PASS */
pi_create_encode(pi, cp,tileno,pino,tpnum,tppos,t2_mode,cur_totnum_tp);
while (pi_next(&pi[pino])) {
if (pi[pino].layno < maxlayers) {
e = t2_encode_packet(tile, &cp->tcps[tileno], &pi[pino], c, dest + len - c, cstr_info, tileno);
if (e == -999) {
break;
} else {
c += e;
}
/* INDEX >> */
if(cstr_info) {
if(cstr_info->index_write) {
opj_tile_info_t *info_TL = &cstr_info->tile[tileno];
opj_packet_info_t *info_PK = &info_TL->packet[cstr_info->packno];
if (!cstr_info->packno) {
info_PK->start_pos = info_TL->end_header + 1;
} else {
info_PK->start_pos = ((cp->tp_on | tcp->POC)&& info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[cstr_info->packno - 1].end_pos + 1;
}
info_PK->end_pos = info_PK->start_pos + e - 1;
info_PK->end_ph_pos += info_PK->start_pos - 1; // End of packet header which now only represents the distance
// to start of packet is incremented by value of start of packet
}
cstr_info->packno++;
}
/* << INDEX */
tile->packno++;
}
}
}
pi_destroy(pi, cp, tileno);
if (e == -999) {
return e;
}
return (c - dest);
}
 
int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, opj_tcd_tile_t *tile, opj_codestream_info_t *cstr_info) {
unsigned char *c = src;
opj_pi_iterator_t *pi;
int pino, e = 0;
int n = 0, curtp = 0;
int tp_start_packno;
 
opj_image_t *image = t2->image;
opj_cp_t *cp = t2->cp;
/* create a packet iterator */
pi = pi_create_decode(image, cp, tileno);
if(!pi) {
/* TODO: throw an error */
return -999;
}
 
tp_start_packno = 0;
for (pino = 0; pino <= cp->tcps[tileno].numpocs; pino++) {
while (pi_next(&pi[pino])) {
if ((cp->layer==0) || (cp->layer>=((pi[pino].layno)+1))) {
opj_packet_info_t *pack_info;
if (cstr_info)
pack_info = &cstr_info->tile[tileno].packet[cstr_info->packno];
else
pack_info = NULL;
e = t2_decode_packet(t2, c, src + len - c, tile, &cp->tcps[tileno], &pi[pino], pack_info);
} else {
e = 0;
}
if(e == -999) return -999;
/* progression in resolution */
image->comps[pi[pino].compno].resno_decoded =
(e > 0) ?
int_max(pi[pino].resno, image->comps[pi[pino].compno].resno_decoded)
: image->comps[pi[pino].compno].resno_decoded;
n++;
 
/* INDEX >> */
if(cstr_info) {
opj_tile_info_t *info_TL = &cstr_info->tile[tileno];
opj_packet_info_t *info_PK = &info_TL->packet[cstr_info->packno];
if (!cstr_info->packno) {
info_PK->start_pos = info_TL->end_header + 1;
} else if (info_TL->packet[cstr_info->packno-1].end_pos >= (int)cstr_info->tile[tileno].tp[curtp].tp_end_pos){ // New tile part
info_TL->tp[curtp].tp_numpacks = cstr_info->packno - tp_start_packno; // Number of packets in previous tile-part
tp_start_packno = cstr_info->packno;
curtp++;
info_PK->start_pos = cstr_info->tile[tileno].tp[curtp].tp_end_header+1;
} else {
info_PK->start_pos = (cp->tp_on && info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[cstr_info->packno - 1].end_pos + 1;
}
info_PK->end_pos = info_PK->start_pos + e - 1;
info_PK->end_ph_pos += info_PK->start_pos - 1; // End of packet header which now only represents the distance
// to start of packet is incremented by value of start of packet
cstr_info->packno++;
}
/* << INDEX */
if (e == -999) { /* ADD */
break;
} else {
c += e;
}
}
}
/* INDEX >> */
if(cstr_info) {
cstr_info->tile[tileno].tp[curtp].tp_numpacks = cstr_info->packno - tp_start_packno; // Number of packets in last tile-part
}
/* << INDEX */
 
/* don't forget to release pi */
pi_destroy(pi, cp, tileno);
if (e == -999) {
return e;
}
return (c - src);
}
 
/* ----------------------------------------------------------------------- */
 
opj_t2_t* t2_create(opj_common_ptr cinfo, opj_image_t *image, opj_cp_t *cp) {
/* create the tcd structure */
opj_t2_t *t2 = (opj_t2_t*)opj_malloc(sizeof(opj_t2_t));
if(!t2) return NULL;
t2->cinfo = cinfo;
t2->image = image;
t2->cp = cp;
 
return t2;
}
 
void t2_destroy(opj_t2_t *t2) {
if(t2) {
opj_free(t2);
}
}
 
 
 
 
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/t2.h
0,0 → 1,105
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __T2_H
#define __T2_H
/**
@file t2.h
@brief Implementation of a tier-2 coding (packetization of code-block data) (T2)
 
*/
 
/** @defgroup T2 T2 - Implementation of a tier-2 coding */
/*@{*/
 
/**
Tier-2 coding
*/
typedef struct opj_t2 {
/** codec context */
opj_common_ptr cinfo;
 
/** Encoding: pointer to the src image. Decoding: pointer to the dst image. */
opj_image_t *image;
/** pointer to the image coding parameters */
opj_cp_t *cp;
} opj_t2_t;
 
/** @name Exported functions */
/*@{*/
/* ----------------------------------------------------------------------- */
 
/**
Encode the packets of a tile to a destination buffer
@param t2 T2 handle
@param tileno number of the tile encoded
@param tile the tile for which to write the packets
@param maxlayers maximum number of layers
@param dest the destination buffer
@param len the length of the destination buffer
@param cstr_info Codestream information structure
@param tpnum Tile part number of the current tile
@param tppos The position of the tile part flag in the progression order
@param pino
@param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass
@param cur_totnum_tp The total number of tile parts in the current tile
*/
int t2_encode_packets(opj_t2_t* t2,int tileno, opj_tcd_tile_t *tile, int maxlayers, unsigned char *dest, int len, opj_codestream_info_t *cstr_info,int tpnum, int tppos,int pino,J2K_T2_MODE t2_mode,int cur_totnum_tp);
/**
Decode the packets of a tile from a source buffer
@param t2 T2 handle
@param src the source buffer
@param len length of the source buffer
@param tileno number that identifies the tile for which to decode the packets
@param tile tile for which to decode the packets
@param cstr_info Codestream information structure
*/
int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, opj_tcd_tile_t *tile, opj_codestream_info_t *cstr_info);
 
/**
Create a T2 handle
@param cinfo Codec context info
@param image Source or destination image
@param cp Image coding parameters
@return Returns a new T2 handle if successful, returns NULL otherwise
*/
opj_t2_t* t2_create(opj_common_ptr cinfo, opj_image_t *image, opj_cp_t *cp);
/**
Destroy a T2 handle
@param t2 T2 handle to destroy
*/
void t2_destroy(opj_t2_t *t2);
 
/* ----------------------------------------------------------------------- */
/*@}*/
 
/*@}*/
 
#endif /* __T2_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/tcd.c
0,0 → 1,1516
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* Copyright (c) 2006-2007, Parvatha Elangovan
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#include "opj_includes.h"
 
void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t * img) {
int tileno, compno, resno, bandno, precno;//, cblkno;
 
fprintf(fd, "image {\n");
fprintf(fd, " tw=%d, th=%d x0=%d x1=%d y0=%d y1=%d\n",
img->tw, img->th, tcd->image->x0, tcd->image->x1, tcd->image->y0, tcd->image->y1);
 
for (tileno = 0; tileno < img->th * img->tw; tileno++) {
opj_tcd_tile_t *tile = &tcd->tcd_image->tiles[tileno];
fprintf(fd, " tile {\n");
fprintf(fd, " x0=%d, y0=%d, x1=%d, y1=%d, numcomps=%d\n",
tile->x0, tile->y0, tile->x1, tile->y1, tile->numcomps);
for (compno = 0; compno < tile->numcomps; compno++) {
opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
fprintf(fd, " tilec {\n");
fprintf(fd,
" x0=%d, y0=%d, x1=%d, y1=%d, numresolutions=%d\n",
tilec->x0, tilec->y0, tilec->x1, tilec->y1, tilec->numresolutions);
for (resno = 0; resno < tilec->numresolutions; resno++) {
opj_tcd_resolution_t *res = &tilec->resolutions[resno];
fprintf(fd, "\n res {\n");
fprintf(fd,
" x0=%d, y0=%d, x1=%d, y1=%d, pw=%d, ph=%d, numbands=%d\n",
res->x0, res->y0, res->x1, res->y1, res->pw, res->ph, res->numbands);
for (bandno = 0; bandno < res->numbands; bandno++) {
opj_tcd_band_t *band = &res->bands[bandno];
fprintf(fd, " band {\n");
fprintf(fd,
" x0=%d, y0=%d, x1=%d, y1=%d, stepsize=%f, numbps=%d\n",
band->x0, band->y0, band->x1, band->y1, band->stepsize, band->numbps);
for (precno = 0; precno < res->pw * res->ph; precno++) {
opj_tcd_precinct_t *prec = &band->precincts[precno];
fprintf(fd, " prec {\n");
fprintf(fd,
" x0=%d, y0=%d, x1=%d, y1=%d, cw=%d, ch=%d\n",
prec->x0, prec->y0, prec->x1, prec->y1, prec->cw, prec->ch);
/*
for (cblkno = 0; cblkno < prec->cw * prec->ch; cblkno++) {
opj_tcd_cblk_t *cblk = &prec->cblks[cblkno];
fprintf(fd, " cblk {\n");
fprintf(fd,
" x0=%d, y0=%d, x1=%d, y1=%d\n",
cblk->x0, cblk->y0, cblk->x1, cblk->y1);
fprintf(fd, " }\n");
}
*/
fprintf(fd, " }\n");
}
fprintf(fd, " }\n");
}
fprintf(fd, " }\n");
}
fprintf(fd, " }\n");
}
fprintf(fd, " }\n");
}
fprintf(fd, "}\n");
}
 
/* ----------------------------------------------------------------------- */
 
/**
Create a new TCD handle
*/
opj_tcd_t* tcd_create(opj_common_ptr cinfo) {
/* create the tcd structure */
opj_tcd_t *tcd = (opj_tcd_t*)opj_malloc(sizeof(opj_tcd_t));
if(!tcd) return NULL;
tcd->cinfo = cinfo;
tcd->tcd_image = (opj_tcd_image_t*)opj_malloc(sizeof(opj_tcd_image_t));
if(!tcd->tcd_image) {
opj_free(tcd);
return NULL;
}
 
return tcd;
}
 
/**
Destroy a previously created TCD handle
*/
void tcd_destroy(opj_tcd_t *tcd) {
if(tcd) {
opj_free(tcd->tcd_image);
opj_free(tcd);
}
}
 
/* ----------------------------------------------------------------------- */
 
void tcd_malloc_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno) {
int tileno, compno, resno, bandno, precno, cblkno;
 
tcd->image = image;
tcd->cp = cp;
tcd->tcd_image->tw = cp->tw;
tcd->tcd_image->th = cp->th;
tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_malloc(sizeof(opj_tcd_tile_t));
for (tileno = 0; tileno < 1; tileno++) {
opj_tcp_t *tcp = &cp->tcps[curtileno];
int j;
 
/* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */
int p = curtileno % cp->tw; /* si numerotation matricielle .. */
int q = curtileno / cp->tw; /* .. coordonnees de la tile (q,p) q pour ligne et p pour colonne */
 
/* opj_tcd_tile_t *tile=&tcd->tcd_image->tiles[tileno]; */
opj_tcd_tile_t *tile = tcd->tcd_image->tiles;
 
/* 4 borders of the tile rescale on the image if necessary */
tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0);
tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0);
tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1);
tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1);
tile->numcomps = image->numcomps;
/* tile->PPT=image->PPT; */
 
/* Modification of the RATE >> */
for (j = 0; j < tcp->numlayers; j++) {
tcp->rates[j] = tcp->rates[j] ?
cp->tp_on ?
(((float) (tile->numcomps
* (tile->x1 - tile->x0)
* (tile->y1 - tile->y0)
* image->comps[0].prec))
/(tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)) - (((tcd->cur_totnum_tp - 1) * 14 )/ tcp->numlayers)
:
((float) (tile->numcomps
* (tile->x1 - tile->x0)
* (tile->y1 - tile->y0)
* image->comps[0].prec))/
(tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)
: 0;
 
if (tcp->rates[j]) {
if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) {
tcp->rates[j] = tcp->rates[j - 1] + 20;
} else {
if (!j && tcp->rates[j] < 30)
tcp->rates[j] = 30;
}
if(j == (tcp->numlayers-1)){
tcp->rates[j] = tcp->rates[j]- 2;
}
}
}
/* << Modification of the RATE */
tile->comps = (opj_tcd_tilecomp_t *) opj_malloc(image->numcomps * sizeof(opj_tcd_tilecomp_t));
for (compno = 0; compno < tile->numcomps; compno++) {
opj_tccp_t *tccp = &tcp->tccps[compno];
 
opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
 
/* border of each tile component (global) */
tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx);
tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy);
tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx);
tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy);
tilec->data = (int *) opj_aligned_malloc((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0) * sizeof(int));
tilec->numresolutions = tccp->numresolutions;
 
tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(tilec->numresolutions * sizeof(opj_tcd_resolution_t));
for (resno = 0; resno < tilec->numresolutions; resno++) {
int pdx, pdy;
int levelno = tilec->numresolutions - 1 - resno;
int tlprcxstart, tlprcystart, brprcxend, brprcyend;
int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend;
int cbgwidthexpn, cbgheightexpn;
int cblkwidthexpn, cblkheightexpn;
 
opj_tcd_resolution_t *res = &tilec->resolutions[resno];
/* border for each resolution level (global) */
res->x0 = int_ceildivpow2(tilec->x0, levelno);
res->y0 = int_ceildivpow2(tilec->y0, levelno);
res->x1 = int_ceildivpow2(tilec->x1, levelno);
res->y1 = int_ceildivpow2(tilec->y1, levelno);
res->numbands = resno == 0 ? 1 : 3;
/* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */
if (tccp->csty & J2K_CCP_CSTY_PRT) {
pdx = tccp->prcw[resno];
pdy = tccp->prch[resno];
} else {
pdx = 15;
pdy = 15;
}
/* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */
tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx;
tlprcystart = int_floordivpow2(res->y0, pdy) << pdy;
brprcxend = int_ceildivpow2(res->x1, pdx) << pdx;
brprcyend = int_ceildivpow2(res->y1, pdy) << pdy;
res->pw = (brprcxend - tlprcxstart) >> pdx;
res->ph = (brprcyend - tlprcystart) >> pdy;
if (resno == 0) {
tlcbgxstart = tlprcxstart;
tlcbgystart = tlprcystart;
brcbgxend = brprcxend;
brcbgyend = brprcyend;
cbgwidthexpn = pdx;
cbgheightexpn = pdy;
} else {
tlcbgxstart = int_ceildivpow2(tlprcxstart, 1);
tlcbgystart = int_ceildivpow2(tlprcystart, 1);
brcbgxend = int_ceildivpow2(brprcxend, 1);
brcbgyend = int_ceildivpow2(brprcyend, 1);
cbgwidthexpn = pdx - 1;
cbgheightexpn = pdy - 1;
}
cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn);
cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn);
for (bandno = 0; bandno < res->numbands; bandno++) {
int x0b, y0b, i;
int gain, numbps;
opj_stepsize_t *ss = NULL;
 
opj_tcd_band_t *band = &res->bands[bandno];
 
band->bandno = resno == 0 ? 0 : bandno + 1;
x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0;
y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0;
if (band->bandno == 0) {
/* band border (global) */
band->x0 = int_ceildivpow2(tilec->x0, levelno);
band->y0 = int_ceildivpow2(tilec->y0, levelno);
band->x1 = int_ceildivpow2(tilec->x1, levelno);
band->y1 = int_ceildivpow2(tilec->y1, levelno);
} else {
/* band border (global) */
band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1);
band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1);
band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1);
band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1);
}
ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1];
gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno);
numbps = image->comps[compno].prec + gain;
band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn));
band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */
band->precincts = (opj_tcd_precinct_t *) opj_malloc(3 * res->pw * res->ph * sizeof(opj_tcd_precinct_t));
for (i = 0; i < res->pw * res->ph * 3; i++) {
band->precincts[i].imsbtree = NULL;
band->precincts[i].incltree = NULL;
}
for (precno = 0; precno < res->pw * res->ph; precno++) {
int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend;
 
int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn);
int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn);
int cbgxend = cbgxstart + (1 << cbgwidthexpn);
int cbgyend = cbgystart + (1 << cbgheightexpn);
 
opj_tcd_precinct_t *prc = &band->precincts[precno];
 
/* precinct size (global) */
prc->x0 = int_max(cbgxstart, band->x0);
prc->y0 = int_max(cbgystart, band->y0);
prc->x1 = int_min(cbgxend, band->x1);
prc->y1 = int_min(cbgyend, band->y1);
 
tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn;
tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn;
brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn;
brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn;
prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn;
prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn;
 
prc->cblks.enc = (opj_tcd_cblk_enc_t*) opj_calloc((prc->cw * prc->ch), sizeof(opj_tcd_cblk_enc_t));
prc->incltree = tgt_create(prc->cw, prc->ch);
prc->imsbtree = tgt_create(prc->cw, prc->ch);
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn);
int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn);
int cblkxend = cblkxstart + (1 << cblkwidthexpn);
int cblkyend = cblkystart + (1 << cblkheightexpn);
opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
 
/* code-block size (global) */
cblk->x0 = int_max(cblkxstart, prc->x0);
cblk->y0 = int_max(cblkystart, prc->y0);
cblk->x1 = int_min(cblkxend, prc->x1);
cblk->y1 = int_min(cblkyend, prc->y1);
cblk->data = (unsigned char*) opj_calloc(8192+2, sizeof(unsigned char));
/* FIXME: mqc_init_enc and mqc_byteout underrun the buffer if we don't do this. Why? */
cblk->data += 2;
cblk->layers = (opj_tcd_layer_t*) opj_calloc(100, sizeof(opj_tcd_layer_t));
cblk->passes = (opj_tcd_pass_t*) opj_calloc(100, sizeof(opj_tcd_pass_t));
}
}
}
}
}
}
/* tcd_dump(stdout, tcd, &tcd->tcd_image); */
}
 
void tcd_free_encode(opj_tcd_t *tcd) {
int tileno, compno, resno, bandno, precno, cblkno;
 
for (tileno = 0; tileno < 1; tileno++) {
opj_tcd_tile_t *tile = tcd->tcd_image->tiles;
 
for (compno = 0; compno < tile->numcomps; compno++) {
opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
 
for (resno = 0; resno < tilec->numresolutions; resno++) {
opj_tcd_resolution_t *res = &tilec->resolutions[resno];
 
for (bandno = 0; bandno < res->numbands; bandno++) {
opj_tcd_band_t *band = &res->bands[bandno];
 
for (precno = 0; precno < res->pw * res->ph; precno++) {
opj_tcd_precinct_t *prc = &band->precincts[precno];
 
if (prc->incltree != NULL) {
tgt_destroy(prc->incltree);
prc->incltree = NULL;
}
if (prc->imsbtree != NULL) {
tgt_destroy(prc->imsbtree);
prc->imsbtree = NULL;
}
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
opj_free(prc->cblks.enc[cblkno].data - 2);
opj_free(prc->cblks.enc[cblkno].layers);
opj_free(prc->cblks.enc[cblkno].passes);
}
opj_free(prc->cblks.enc);
} /* for (precno */
opj_free(band->precincts);
band->precincts = NULL;
} /* for (bandno */
} /* for (resno */
opj_free(tilec->resolutions);
tilec->resolutions = NULL;
} /* for (compno */
opj_free(tile->comps);
tile->comps = NULL;
} /* for (tileno */
opj_free(tcd->tcd_image->tiles);
tcd->tcd_image->tiles = NULL;
}
 
void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno) {
int tileno, compno, resno, bandno, precno, cblkno;
 
for (tileno = 0; tileno < 1; tileno++) {
opj_tcp_t *tcp = &cp->tcps[curtileno];
int j;
/* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */
int p = curtileno % cp->tw;
int q = curtileno / cp->tw;
 
opj_tcd_tile_t *tile = tcd->tcd_image->tiles;
/* 4 borders of the tile rescale on the image if necessary */
tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0);
tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0);
tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1);
tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1);
tile->numcomps = image->numcomps;
/* tile->PPT=image->PPT; */
 
/* Modification of the RATE >> */
for (j = 0; j < tcp->numlayers; j++) {
tcp->rates[j] = tcp->rates[j] ?
cp->tp_on ?
(((float) (tile->numcomps
* (tile->x1 - tile->x0)
* (tile->y1 - tile->y0)
* image->comps[0].prec))
/(tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)) - (((tcd->cur_totnum_tp - 1) * 14 )/ tcp->numlayers)
:
((float) (tile->numcomps
* (tile->x1 - tile->x0)
* (tile->y1 - tile->y0)
* image->comps[0].prec))/
(tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)
: 0;
 
if (tcp->rates[j]) {
if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) {
tcp->rates[j] = tcp->rates[j - 1] + 20;
} else {
if (!j && tcp->rates[j] < 30)
tcp->rates[j] = 30;
}
}
}
/* << Modification of the RATE */
 
/* tile->comps=(opj_tcd_tilecomp_t*)opj_realloc(tile->comps,image->numcomps*sizeof(opj_tcd_tilecomp_t)); */
for (compno = 0; compno < tile->numcomps; compno++) {
opj_tccp_t *tccp = &tcp->tccps[compno];
opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
 
/* border of each tile component (global) */
tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx);
tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy);
tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx);
tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy);
tilec->data = (int *) opj_aligned_malloc((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0) * sizeof(int));
tilec->numresolutions = tccp->numresolutions;
/* tilec->resolutions=(opj_tcd_resolution_t*)opj_realloc(tilec->resolutions,tilec->numresolutions*sizeof(opj_tcd_resolution_t)); */
for (resno = 0; resno < tilec->numresolutions; resno++) {
int pdx, pdy;
 
int levelno = tilec->numresolutions - 1 - resno;
int tlprcxstart, tlprcystart, brprcxend, brprcyend;
int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend;
int cbgwidthexpn, cbgheightexpn;
int cblkwidthexpn, cblkheightexpn;
opj_tcd_resolution_t *res = &tilec->resolutions[resno];
 
/* border for each resolution level (global) */
res->x0 = int_ceildivpow2(tilec->x0, levelno);
res->y0 = int_ceildivpow2(tilec->y0, levelno);
res->x1 = int_ceildivpow2(tilec->x1, levelno);
res->y1 = int_ceildivpow2(tilec->y1, levelno);
res->numbands = resno == 0 ? 1 : 3;
 
/* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */
if (tccp->csty & J2K_CCP_CSTY_PRT) {
pdx = tccp->prcw[resno];
pdy = tccp->prch[resno];
} else {
pdx = 15;
pdy = 15;
}
/* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */
tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx;
tlprcystart = int_floordivpow2(res->y0, pdy) << pdy;
brprcxend = int_ceildivpow2(res->x1, pdx) << pdx;
brprcyend = int_ceildivpow2(res->y1, pdy) << pdy;
res->pw = (brprcxend - tlprcxstart) >> pdx;
res->ph = (brprcyend - tlprcystart) >> pdy;
if (resno == 0) {
tlcbgxstart = tlprcxstart;
tlcbgystart = tlprcystart;
brcbgxend = brprcxend;
brcbgyend = brprcyend;
cbgwidthexpn = pdx;
cbgheightexpn = pdy;
} else {
tlcbgxstart = int_ceildivpow2(tlprcxstart, 1);
tlcbgystart = int_ceildivpow2(tlprcystart, 1);
brcbgxend = int_ceildivpow2(brprcxend, 1);
brcbgyend = int_ceildivpow2(brprcyend, 1);
cbgwidthexpn = pdx - 1;
cbgheightexpn = pdy - 1;
}
cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn);
cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn);
for (bandno = 0; bandno < res->numbands; bandno++) {
int x0b, y0b;
int gain, numbps;
opj_stepsize_t *ss = NULL;
 
opj_tcd_band_t *band = &res->bands[bandno];
 
band->bandno = resno == 0 ? 0 : bandno + 1;
x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0;
y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0;
if (band->bandno == 0) {
/* band border */
band->x0 = int_ceildivpow2(tilec->x0, levelno);
band->y0 = int_ceildivpow2(tilec->y0, levelno);
band->x1 = int_ceildivpow2(tilec->x1, levelno);
band->y1 = int_ceildivpow2(tilec->y1, levelno);
} else {
band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1);
band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1);
band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1);
band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1);
}
ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1];
gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno);
numbps = image->comps[compno].prec + gain;
band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn));
band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */
for (precno = 0; precno < res->pw * res->ph; precno++) {
int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend;
 
int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn);
int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn);
int cbgxend = cbgxstart + (1 << cbgwidthexpn);
int cbgyend = cbgystart + (1 << cbgheightexpn);
opj_tcd_precinct_t *prc = &band->precincts[precno];
 
/* precinct size (global) */
prc->x0 = int_max(cbgxstart, band->x0);
prc->y0 = int_max(cbgystart, band->y0);
prc->x1 = int_min(cbgxend, band->x1);
prc->y1 = int_min(cbgyend, band->y1);
 
tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn;
tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn;
brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn;
brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn;
prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn;
prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn;
 
opj_free(prc->cblks.enc);
prc->cblks.enc = (opj_tcd_cblk_enc_t*) opj_calloc(prc->cw * prc->ch, sizeof(opj_tcd_cblk_enc_t));
 
if (prc->incltree != NULL) {
tgt_destroy(prc->incltree);
}
if (prc->imsbtree != NULL) {
tgt_destroy(prc->imsbtree);
}
prc->incltree = tgt_create(prc->cw, prc->ch);
prc->imsbtree = tgt_create(prc->cw, prc->ch);
 
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn);
int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn);
int cblkxend = cblkxstart + (1 << cblkwidthexpn);
int cblkyend = cblkystart + (1 << cblkheightexpn);
 
opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
 
/* code-block size (global) */
cblk->x0 = int_max(cblkxstart, prc->x0);
cblk->y0 = int_max(cblkystart, prc->y0);
cblk->x1 = int_min(cblkxend, prc->x1);
cblk->y1 = int_min(cblkyend, prc->y1);
cblk->data = (unsigned char*) opj_calloc(8192+2, sizeof(unsigned char));
/* FIXME: mqc_init_enc and mqc_byteout underrun the buffer if we don't do this. Why? */
cblk->data += 2;
cblk->layers = (opj_tcd_layer_t*) opj_calloc(100, sizeof(opj_tcd_layer_t));
cblk->passes = (opj_tcd_pass_t*) opj_calloc(100, sizeof(opj_tcd_pass_t));
}
} /* precno */
} /* bandno */
} /* resno */
} /* compno */
} /* tileno */
 
/* tcd_dump(stdout, tcd, &tcd->tcd_image); */
}
 
void tcd_malloc_decode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp) {
int i, j, tileno, p, q;
unsigned int x0 = 0, y0 = 0, x1 = 0, y1 = 0, w, h;
 
tcd->image = image;
tcd->tcd_image->tw = cp->tw;
tcd->tcd_image->th = cp->th;
tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_malloc(cp->tw * cp->th * sizeof(opj_tcd_tile_t));
 
/*
Allocate place to store the decoded data = final image
Place limited by the tile really present in the codestream
*/
 
for (j = 0; j < cp->tileno_size; j++) {
opj_tcd_tile_t *tile;
tileno = cp->tileno[j];
tile = &(tcd->tcd_image->tiles[cp->tileno[tileno]]);
tile->numcomps = image->numcomps;
tile->comps = (opj_tcd_tilecomp_t*) opj_calloc(image->numcomps, sizeof(opj_tcd_tilecomp_t));
}
 
for (i = 0; i < image->numcomps; i++) {
for (j = 0; j < cp->tileno_size; j++) {
opj_tcd_tile_t *tile;
opj_tcd_tilecomp_t *tilec;
/* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */
tileno = cp->tileno[j];
tile = &(tcd->tcd_image->tiles[cp->tileno[tileno]]);
tilec = &tile->comps[i];
p = tileno % cp->tw; /* si numerotation matricielle .. */
q = tileno / cp->tw; /* .. coordonnees de la tile (q,p) q pour ligne et p pour colonne */
/* 4 borders of the tile rescale on the image if necessary */
tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0);
tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0);
tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1);
tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1);
 
tilec->x0 = int_ceildiv(tile->x0, image->comps[i].dx);
tilec->y0 = int_ceildiv(tile->y0, image->comps[i].dy);
tilec->x1 = int_ceildiv(tile->x1, image->comps[i].dx);
tilec->y1 = int_ceildiv(tile->y1, image->comps[i].dy);
 
x0 = j == 0 ? tilec->x0 : int_min(x0, (unsigned int) tilec->x0);
y0 = j == 0 ? tilec->y0 : int_min(y0, (unsigned int) tilec->x0);
x1 = j == 0 ? tilec->x1 : int_max(x1, (unsigned int) tilec->x1);
y1 = j == 0 ? tilec->y1 : int_max(y1, (unsigned int) tilec->y1);
}
 
w = int_ceildivpow2(x1 - x0, image->comps[i].factor);
h = int_ceildivpow2(y1 - y0, image->comps[i].factor);
 
image->comps[i].w = w;
image->comps[i].h = h;
image->comps[i].x0 = x0;
image->comps[i].y0 = y0;
}
}
 
void tcd_malloc_decode_tile(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int tileno, opj_codestream_info_t *cstr_info) {
int compno, resno, bandno, precno, cblkno;
opj_tcp_t *tcp;
opj_tcd_tile_t *tile;
 
tcd->cp = cp;
tcp = &(cp->tcps[cp->tileno[tileno]]);
tile = &(tcd->tcd_image->tiles[cp->tileno[tileno]]);
tileno = cp->tileno[tileno];
for (compno = 0; compno < tile->numcomps; compno++) {
opj_tccp_t *tccp = &tcp->tccps[compno];
opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
/* border of each tile component (global) */
tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx);
tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy);
tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx);
tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy);
 
tilec->numresolutions = tccp->numresolutions;
tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(tilec->numresolutions * sizeof(opj_tcd_resolution_t));
for (resno = 0; resno < tilec->numresolutions; resno++) {
int pdx, pdy;
int levelno = tilec->numresolutions - 1 - resno;
int tlprcxstart, tlprcystart, brprcxend, brprcyend;
int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend;
int cbgwidthexpn, cbgheightexpn;
int cblkwidthexpn, cblkheightexpn;
opj_tcd_resolution_t *res = &tilec->resolutions[resno];
/* border for each resolution level (global) */
res->x0 = int_ceildivpow2(tilec->x0, levelno);
res->y0 = int_ceildivpow2(tilec->y0, levelno);
res->x1 = int_ceildivpow2(tilec->x1, levelno);
res->y1 = int_ceildivpow2(tilec->y1, levelno);
res->numbands = resno == 0 ? 1 : 3;
/* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */
if (tccp->csty & J2K_CCP_CSTY_PRT) {
pdx = tccp->prcw[resno];
pdy = tccp->prch[resno];
} else {
pdx = 15;
pdy = 15;
}
/* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */
tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx;
tlprcystart = int_floordivpow2(res->y0, pdy) << pdy;
brprcxend = int_ceildivpow2(res->x1, pdx) << pdx;
brprcyend = int_ceildivpow2(res->y1, pdy) << pdy;
res->pw = (res->x0 == res->x1) ? 0 : ((brprcxend - tlprcxstart) >> pdx);
res->ph = (res->y0 == res->y1) ? 0 : ((brprcyend - tlprcystart) >> pdy);
if (resno == 0) {
tlcbgxstart = tlprcxstart;
tlcbgystart = tlprcystart;
brcbgxend = brprcxend;
brcbgyend = brprcyend;
cbgwidthexpn = pdx;
cbgheightexpn = pdy;
} else {
tlcbgxstart = int_ceildivpow2(tlprcxstart, 1);
tlcbgystart = int_ceildivpow2(tlprcystart, 1);
brcbgxend = int_ceildivpow2(brprcxend, 1);
brcbgyend = int_ceildivpow2(brprcyend, 1);
cbgwidthexpn = pdx - 1;
cbgheightexpn = pdy - 1;
}
cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn);
cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn);
for (bandno = 0; bandno < res->numbands; bandno++) {
int x0b, y0b;
int gain, numbps;
opj_stepsize_t *ss = NULL;
opj_tcd_band_t *band = &res->bands[bandno];
band->bandno = resno == 0 ? 0 : bandno + 1;
x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0;
y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0;
if (band->bandno == 0) {
/* band border (global) */
band->x0 = int_ceildivpow2(tilec->x0, levelno);
band->y0 = int_ceildivpow2(tilec->y0, levelno);
band->x1 = int_ceildivpow2(tilec->x1, levelno);
band->y1 = int_ceildivpow2(tilec->y1, levelno);
} else {
/* band border (global) */
band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1);
band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1);
band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1);
band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1);
}
ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1];
gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno);
numbps = image->comps[compno].prec + gain;
band->stepsize = (float)(((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn)) * 0.5);
band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */
band->precincts = (opj_tcd_precinct_t *) opj_malloc(res->pw * res->ph * sizeof(opj_tcd_precinct_t));
for (precno = 0; precno < res->pw * res->ph; precno++) {
int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend;
int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn);
int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn);
int cbgxend = cbgxstart + (1 << cbgwidthexpn);
int cbgyend = cbgystart + (1 << cbgheightexpn);
opj_tcd_precinct_t *prc = &band->precincts[precno];
/* precinct size (global) */
prc->x0 = int_max(cbgxstart, band->x0);
prc->y0 = int_max(cbgystart, band->y0);
prc->x1 = int_min(cbgxend, band->x1);
prc->y1 = int_min(cbgyend, band->y1);
tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn;
tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn;
brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn;
brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn;
prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn;
prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn;
 
prc->cblks.dec = (opj_tcd_cblk_dec_t*) opj_malloc(prc->cw * prc->ch * sizeof(opj_tcd_cblk_dec_t));
 
prc->incltree = tgt_create(prc->cw, prc->ch);
prc->imsbtree = tgt_create(prc->cw, prc->ch);
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn);
int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn);
int cblkxend = cblkxstart + (1 << cblkwidthexpn);
int cblkyend = cblkystart + (1 << cblkheightexpn);
 
opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno];
cblk->data = NULL;
cblk->segs = NULL;
/* code-block size (global) */
cblk->x0 = int_max(cblkxstart, prc->x0);
cblk->y0 = int_max(cblkystart, prc->y0);
cblk->x1 = int_min(cblkxend, prc->x1);
cblk->y1 = int_min(cblkyend, prc->y1);
cblk->numsegs = 0;
}
} /* precno */
} /* bandno */
} /* resno */
} /* compno */
/* tcd_dump(stdout, tcd, &tcd->tcd_image); */
}
 
void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final) {
int compno, resno, bandno, precno, cblkno;
int value; /*, matrice[tcd_tcp->numlayers][tcd_tile->comps[0].numresolutions][3]; */
int matrice[10][10][3];
int i, j, k;
 
opj_cp_t *cp = tcd->cp;
opj_tcd_tile_t *tcd_tile = tcd->tcd_tile;
opj_tcp_t *tcd_tcp = tcd->tcp;
 
/*matrice=(int*)opj_malloc(tcd_tcp->numlayers*tcd_tile->comps[0].numresolutions*3*sizeof(int)); */
for (compno = 0; compno < tcd_tile->numcomps; compno++) {
opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
for (i = 0; i < tcd_tcp->numlayers; i++) {
for (j = 0; j < tilec->numresolutions; j++) {
for (k = 0; k < 3; k++) {
matrice[i][j][k] =
(int) (cp->matrice[i * tilec->numresolutions * 3 + j * 3 + k]
* (float) (tcd->image->comps[compno].prec / 16.0));
}
}
}
for (resno = 0; resno < tilec->numresolutions; resno++) {
opj_tcd_resolution_t *res = &tilec->resolutions[resno];
for (bandno = 0; bandno < res->numbands; bandno++) {
opj_tcd_band_t *band = &res->bands[bandno];
for (precno = 0; precno < res->pw * res->ph; precno++) {
opj_tcd_precinct_t *prc = &band->precincts[precno];
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno];
opj_tcd_layer_t *layer = &cblk->layers[layno];
int n;
int imsb = tcd->image->comps[compno].prec - cblk->numbps; /* number of bit-plan equal to zero */
/* Correction of the matrix of coefficient to include the IMSB information */
if (layno == 0) {
value = matrice[layno][resno][bandno];
if (imsb >= value) {
value = 0;
} else {
value -= imsb;
}
} else {
value = matrice[layno][resno][bandno] - matrice[layno - 1][resno][bandno];
if (imsb >= matrice[layno - 1][resno][bandno]) {
value -= (imsb - matrice[layno - 1][resno][bandno]);
if (value < 0) {
value = 0;
}
}
}
if (layno == 0) {
cblk->numpassesinlayers = 0;
}
n = cblk->numpassesinlayers;
if (cblk->numpassesinlayers == 0) {
if (value != 0) {
n = 3 * value - 2 + cblk->numpassesinlayers;
} else {
n = cblk->numpassesinlayers;
}
} else {
n = 3 * value + cblk->numpassesinlayers;
}
layer->numpasses = n - cblk->numpassesinlayers;
if (!layer->numpasses)
continue;
if (cblk->numpassesinlayers == 0) {
layer->len = cblk->passes[n - 1].rate;
layer->data = cblk->data;
} else {
layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - 1].rate;
layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate;
}
if (final)
cblk->numpassesinlayers = n;
}
}
}
}
}
}
 
void tcd_rateallocate_fixed(opj_tcd_t *tcd) {
int layno;
for (layno = 0; layno < tcd->tcp->numlayers; layno++) {
tcd_makelayer_fixed(tcd, layno, 1);
}
}
 
void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final) {
int compno, resno, bandno, precno, cblkno, passno;
opj_tcd_tile_t *tcd_tile = tcd->tcd_tile;
 
tcd_tile->distolayer[layno] = 0; /* fixed_quality */
for (compno = 0; compno < tcd_tile->numcomps; compno++) {
opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
for (resno = 0; resno < tilec->numresolutions; resno++) {
opj_tcd_resolution_t *res = &tilec->resolutions[resno];
for (bandno = 0; bandno < res->numbands; bandno++) {
opj_tcd_band_t *band = &res->bands[bandno];
for (precno = 0; precno < res->pw * res->ph; precno++) {
opj_tcd_precinct_t *prc = &band->precincts[precno];
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno];
opj_tcd_layer_t *layer = &cblk->layers[layno];
int n;
if (layno == 0) {
cblk->numpassesinlayers = 0;
}
n = cblk->numpassesinlayers;
for (passno = cblk->numpassesinlayers; passno < cblk->totalpasses; passno++) {
int dr;
double dd;
opj_tcd_pass_t *pass = &cblk->passes[passno];
if (n == 0) {
dr = pass->rate;
dd = pass->distortiondec;
} else {
dr = pass->rate - cblk->passes[n - 1].rate;
dd = pass->distortiondec - cblk->passes[n - 1].distortiondec;
}
if (!dr) {
if (dd != 0)
n = passno + 1;
continue;
}
if (dd / dr >= thresh)
n = passno + 1;
}
layer->numpasses = n - cblk->numpassesinlayers;
if (!layer->numpasses) {
layer->disto = 0;
continue;
}
if (cblk->numpassesinlayers == 0) {
layer->len = cblk->passes[n - 1].rate;
layer->data = cblk->data;
layer->disto = cblk->passes[n - 1].distortiondec;
} else {
layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - 1].rate;
layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate;
layer->disto = cblk->passes[n - 1].distortiondec - cblk->passes[cblk->numpassesinlayers - 1].distortiondec;
}
tcd_tile->distolayer[layno] += layer->disto; /* fixed_quality */
if (final)
cblk->numpassesinlayers = n;
}
}
}
}
}
}
 
bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_codestream_info_t *cstr_info) {
int compno, resno, bandno, precno, cblkno, passno, layno;
double min, max;
double cumdisto[100]; /* fixed_quality */
const double K = 1; /* 1.1; fixed_quality */
double maxSE = 0;
 
opj_cp_t *cp = tcd->cp;
opj_tcd_tile_t *tcd_tile = tcd->tcd_tile;
opj_tcp_t *tcd_tcp = tcd->tcp;
 
min = DBL_MAX;
max = 0;
tcd_tile->numpix = 0; /* fixed_quality */
for (compno = 0; compno < tcd_tile->numcomps; compno++) {
opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
tilec->numpix = 0;
 
for (resno = 0; resno < tilec->numresolutions; resno++) {
opj_tcd_resolution_t *res = &tilec->resolutions[resno];
 
for (bandno = 0; bandno < res->numbands; bandno++) {
opj_tcd_band_t *band = &res->bands[bandno];
 
for (precno = 0; precno < res->pw * res->ph; precno++) {
opj_tcd_precinct_t *prc = &band->precincts[precno];
 
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno];
 
for (passno = 0; passno < cblk->totalpasses; passno++) {
opj_tcd_pass_t *pass = &cblk->passes[passno];
int dr;
double dd, rdslope;
if (passno == 0) {
dr = pass->rate;
dd = pass->distortiondec;
} else {
dr = pass->rate - cblk->passes[passno - 1].rate;
dd = pass->distortiondec - cblk->passes[passno - 1].distortiondec;
}
if (dr == 0) {
continue;
}
rdslope = dd / dr;
if (rdslope < min) {
min = rdslope;
}
if (rdslope > max) {
max = rdslope;
}
} /* passno */
/* fixed_quality */
tcd_tile->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0));
tilec->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0));
} /* cbklno */
} /* precno */
} /* bandno */
} /* resno */
maxSE += (((double)(1 << tcd->image->comps[compno].prec) - 1.0)
* ((double)(1 << tcd->image->comps[compno].prec) -1.0))
* ((double)(tilec->numpix));
} /* compno */
/* index file */
if(cstr_info) {
opj_tile_info_t *tile_info = &cstr_info->tile[tcd->tcd_tileno];
tile_info->numpix = tcd_tile->numpix;
tile_info->distotile = tcd_tile->distotile;
tile_info->thresh = (double *) opj_malloc(tcd_tcp->numlayers * sizeof(double));
}
for (layno = 0; layno < tcd_tcp->numlayers; layno++) {
double lo = min;
double hi = max;
int success = 0;
int maxlen = tcd_tcp->rates[layno] ? int_min(((int) ceil(tcd_tcp->rates[layno])), len) : len;
double goodthresh = 0;
double stable_thresh = 0;
int i;
double distotarget; /* fixed_quality */
/* fixed_quality */
distotarget = tcd_tile->distotile - ((K * maxSE) / pow((float)10, tcd_tcp->distoratio[layno] / 10));
/* Don't try to find an optimal threshold but rather take everything not included yet, if
-r xx,yy,zz,0 (disto_alloc == 1 and rates == 0)
-q xx,yy,zz,0 (fixed_quality == 1 and distoratio == 0)
==> possible to have some lossy layers and the last layer for sure lossless */
if ( ((cp->disto_alloc==1) && (tcd_tcp->rates[layno]>0)) || ((cp->fixed_quality==1) && (tcd_tcp->distoratio[layno]>0))) {
opj_t2_t *t2 = t2_create(tcd->cinfo, tcd->image, cp);
double thresh = 0;
 
for (i = 0; i < 128; i++) {
int l = 0;
double distoachieved = 0; /* fixed_quality */
thresh = (lo + hi) / 2;
tcd_makelayer(tcd, layno, thresh, 0);
if (cp->fixed_quality) { /* fixed_quality */
if(cp->cinema){
l = t2_encode_packets(t2,tcd->tcd_tileno, tcd_tile, layno + 1, dest, maxlen, cstr_info,tcd->cur_tp_num,tcd->tp_pos,tcd->cur_pino,THRESH_CALC, tcd->cur_totnum_tp);
if (l == -999) {
lo = thresh;
continue;
}else{
distoachieved = layno == 0 ?
tcd_tile->distolayer[0] : cumdisto[layno - 1] + tcd_tile->distolayer[layno];
if (distoachieved < distotarget) {
hi=thresh;
stable_thresh = thresh;
continue;
}else{
lo=thresh;
}
}
}else{
distoachieved = (layno == 0) ?
tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]);
if (distoachieved < distotarget) {
hi = thresh;
stable_thresh = thresh;
continue;
}
lo = thresh;
}
} else {
l = t2_encode_packets(t2, tcd->tcd_tileno, tcd_tile, layno + 1, dest, maxlen, cstr_info,tcd->cur_tp_num,tcd->tp_pos,tcd->cur_pino,THRESH_CALC, tcd->cur_totnum_tp);
/* TODO: what to do with l ??? seek / tell ??? */
/* opj_event_msg(tcd->cinfo, EVT_INFO, "rate alloc: len=%d, max=%d\n", l, maxlen); */
if (l == -999) {
lo = thresh;
continue;
}
hi = thresh;
stable_thresh = thresh;
}
}
success = 1;
goodthresh = stable_thresh == 0? thresh : stable_thresh;
t2_destroy(t2);
} else {
success = 1;
goodthresh = min;
}
if (!success) {
return false;
}
if(cstr_info) { /* Threshold for Marcela Index */
cstr_info->tile[tcd->tcd_tileno].thresh[layno] = goodthresh;
}
tcd_makelayer(tcd, layno, goodthresh, 1);
/* fixed_quality */
cumdisto[layno] = (layno == 0) ? tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]);
}
 
return true;
}
 
int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_codestream_info_t *cstr_info) {
int compno;
int l, i, numpacks = 0;
opj_tcd_tile_t *tile = NULL;
opj_tcp_t *tcd_tcp = NULL;
opj_cp_t *cp = NULL;
 
opj_tcp_t *tcp = &tcd->cp->tcps[0];
opj_tccp_t *tccp = &tcp->tccps[0];
opj_image_t *image = tcd->image;
opj_t1_t *t1 = NULL; /* T1 component */
opj_t2_t *t2 = NULL; /* T2 component */
 
tcd->tcd_tileno = tileno;
tcd->tcd_tile = tcd->tcd_image->tiles;
tcd->tcp = &tcd->cp->tcps[tileno];
 
tile = tcd->tcd_tile;
tcd_tcp = tcd->tcp;
cp = tcd->cp;
 
if(tcd->cur_tp_num == 0){
tcd->encoding_time = opj_clock(); /* time needed to encode a tile */
/* INDEX >> "Precinct_nb_X et Precinct_nb_Y" */
if(cstr_info) {
opj_tcd_tilecomp_t *tilec_idx = &tile->comps[0]; /* based on component 0 */
for (i = 0; i < tilec_idx->numresolutions; i++) {
opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[i];
cstr_info->tile[tileno].pw[i] = res_idx->pw;
cstr_info->tile[tileno].ph[i] = res_idx->ph;
numpacks += res_idx->pw * res_idx->ph;
cstr_info->tile[tileno].pdx[i] = tccp->prcw[i];
cstr_info->tile[tileno].pdy[i] = tccp->prch[i];
}
cstr_info->tile[tileno].packet = (opj_packet_info_t*) opj_calloc(cstr_info->numcomps * cstr_info->numlayers * numpacks, sizeof(opj_packet_info_t));
}
/* << INDEX */
/*---------------TILE-------------------*/
for (compno = 0; compno < tile->numcomps; compno++) {
int x, y;
int adjust = image->comps[compno].sgnd ? 0 : 1 << (image->comps[compno].prec - 1);
int offset_x = int_ceildiv(image->x0, image->comps[compno].dx);
int offset_y = int_ceildiv(image->y0, image->comps[compno].dy);
opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
int tw = tilec->x1 - tilec->x0;
int w = int_ceildiv(image->x1 - image->x0, image->comps[compno].dx);
/* extract tile data */
if (tcd_tcp->tccps[compno].qmfbid == 1) {
for (y = tilec->y0; y < tilec->y1; y++) {
/* start of the src tile scanline */
int *data = &image->comps[compno].data[(tilec->x0 - offset_x) + (y - offset_y) * w];
/* start of the dst tile scanline */
int *tile_data = &tilec->data[(y - tilec->y0) * tw];
for (x = tilec->x0; x < tilec->x1; x++) {
*tile_data++ = *data++ - adjust;
}
}
} else if (tcd_tcp->tccps[compno].qmfbid == 0) {
for (y = tilec->y0; y < tilec->y1; y++) {
/* start of the src tile scanline */
int *data = &image->comps[compno].data[(tilec->x0 - offset_x) + (y - offset_y) * w];
/* start of the dst tile scanline */
int *tile_data = &tilec->data[(y - tilec->y0) * tw];
for (x = tilec->x0; x < tilec->x1; x++) {
*tile_data++ = (*data++ - adjust) << 11;
}
}
}
}
/*----------------MCT-------------------*/
if (tcd_tcp->mct) {
int samples = (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0);
if (tcd_tcp->tccps[0].qmfbid == 0) {
mct_encode_real(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, samples);
} else {
mct_encode(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, samples);
}
}
/*----------------DWT---------------------*/
for (compno = 0; compno < tile->numcomps; compno++) {
opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
if (tcd_tcp->tccps[compno].qmfbid == 1) {
dwt_encode(tilec);
} else if (tcd_tcp->tccps[compno].qmfbid == 0) {
dwt_encode_real(tilec);
}
}
/*------------------TIER1-----------------*/
t1 = t1_create(tcd->cinfo);
t1_encode_cblks(t1, tile, tcd_tcp);
t1_destroy(t1);
/*-----------RATE-ALLOCATE------------------*/
/* INDEX */
if(cstr_info) {
cstr_info->index_write = 0;
}
if (cp->disto_alloc || cp->fixed_quality) { /* fixed_quality */
/* Normal Rate/distortion allocation */
tcd_rateallocate(tcd, dest, len, cstr_info);
} else {
/* Fixed layer allocation */
tcd_rateallocate_fixed(tcd);
}
}
/*--------------TIER2------------------*/
 
/* INDEX */
if(cstr_info) {
cstr_info->index_write = 1;
}
 
t2 = t2_create(tcd->cinfo, image, cp);
l = t2_encode_packets(t2,tileno, tile, tcd_tcp->numlayers, dest, len, cstr_info,tcd->tp_num,tcd->tp_pos,tcd->cur_pino,FINAL_PASS,tcd->cur_totnum_tp);
t2_destroy(t2);
/*---------------CLEAN-------------------*/
 
if(tcd->cur_tp_num == tcd->cur_totnum_tp - 1){
tcd->encoding_time = opj_clock() - tcd->encoding_time;
opj_event_msg(tcd->cinfo, EVT_INFO, "- tile encoded in %f s\n", tcd->encoding_time);
 
/* cleaning memory */
for (compno = 0; compno < tile->numcomps; compno++) {
opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
opj_aligned_free(tilec->data);
}
}
 
return l;
}
 
bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno, opj_codestream_info_t *cstr_info) {
int l;
int compno;
int eof = 0;
double tile_time, t1_time, dwt_time;
opj_tcd_tile_t *tile = NULL;
 
opj_t1_t *t1 = NULL; /* T1 component */
opj_t2_t *t2 = NULL; /* T2 component */
tcd->tcd_tileno = tileno;
tcd->tcd_tile = &(tcd->tcd_image->tiles[tileno]);
tcd->tcp = &(tcd->cp->tcps[tileno]);
tile = tcd->tcd_tile;
tile_time = opj_clock(); /* time needed to decode a tile */
opj_event_msg(tcd->cinfo, EVT_INFO, "tile %d of %d\n", tileno + 1, tcd->cp->tw * tcd->cp->th);
 
/* INDEX >> */
if(cstr_info) {
int resno, compno, numprec = 0;
for (compno = 0; compno < cstr_info->numcomps; compno++) {
opj_tcp_t *tcp = &tcd->cp->tcps[0];
opj_tccp_t *tccp = &tcp->tccps[compno];
opj_tcd_tilecomp_t *tilec_idx = &tile->comps[compno];
for (resno = 0; resno < tilec_idx->numresolutions; resno++) {
opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[resno];
cstr_info->tile[tileno].pw[resno] = res_idx->pw;
cstr_info->tile[tileno].ph[resno] = res_idx->ph;
numprec += res_idx->pw * res_idx->ph;
if (tccp->csty & J2K_CP_CSTY_PRT) {
cstr_info->tile[tileno].pdx[resno] = tccp->prcw[resno];
cstr_info->tile[tileno].pdy[resno] = tccp->prch[resno];
}
else {
cstr_info->tile[tileno].pdx[resno] = 15;
cstr_info->tile[tileno].pdx[resno] = 15;
}
}
}
cstr_info->tile[tileno].packet = (opj_packet_info_t *) opj_malloc(cstr_info->numlayers * numprec * sizeof(opj_packet_info_t));
cstr_info->packno = 0;
}
/* << INDEX */
/*--------------TIER2------------------*/
t2 = t2_create(tcd->cinfo, tcd->image, tcd->cp);
l = t2_decode_packets(t2, src, len, tileno, tile, cstr_info);
t2_destroy(t2);
 
if (l == -999) {
eof = 1;
opj_event_msg(tcd->cinfo, EVT_ERROR, "tcd_decode: incomplete bistream\n");
}
/*------------------TIER1-----------------*/
t1_time = opj_clock(); /* time needed to decode a tile */
t1 = t1_create(tcd->cinfo);
for (compno = 0; compno < tile->numcomps; ++compno) {
opj_tcd_tilecomp_t* tilec = &tile->comps[compno];
/* The +3 is headroom required by the vectorized DWT */
tilec->data = (int*) opj_aligned_malloc((((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0))+3) * sizeof(int));
t1_decode_cblks(t1, tilec, &tcd->tcp->tccps[compno]);
}
t1_destroy(t1);
t1_time = opj_clock() - t1_time;
opj_event_msg(tcd->cinfo, EVT_INFO, "- tiers-1 took %f s\n", t1_time);
/*----------------DWT---------------------*/
 
dwt_time = opj_clock(); /* time needed to decode a tile */
for (compno = 0; compno < tile->numcomps; compno++) {
opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
int numres2decode;
 
if (tcd->cp->reduce != 0) {
tcd->image->comps[compno].resno_decoded =
tile->comps[compno].numresolutions - tcd->cp->reduce - 1;
if (tcd->image->comps[compno].resno_decoded < 0) {
opj_event_msg(tcd->cinfo, EVT_ERROR, "Error decoding tile. The number of resolutions to remove [%d+1] is higher than the number "
" of resolutions in the original codestream [%d]\nModify the cp_reduce parameter.\n", tcd->cp->reduce, tile->comps[compno].numresolutions);
return false;
}
}
 
numres2decode = tcd->image->comps[compno].resno_decoded + 1;
if(numres2decode > 0){
if (tcd->tcp->tccps[compno].qmfbid == 1) {
dwt_decode(tilec, numres2decode);
} else {
dwt_decode_real(tilec, numres2decode);
}
}
}
dwt_time = opj_clock() - dwt_time;
opj_event_msg(tcd->cinfo, EVT_INFO, "- dwt took %f s\n", dwt_time);
 
/*----------------MCT-------------------*/
 
if (tcd->tcp->mct) {
int n = (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0);
if (tcd->tcp->tccps[0].qmfbid == 1) {
mct_decode(
tile->comps[0].data,
tile->comps[1].data,
tile->comps[2].data,
n);
} else {
mct_decode_real(
(float*)tile->comps[0].data,
(float*)tile->comps[1].data,
(float*)tile->comps[2].data,
n);
}
}
 
/*---------------TILE-------------------*/
 
for (compno = 0; compno < tile->numcomps; ++compno) {
opj_tcd_tilecomp_t* tilec = &tile->comps[compno];
opj_image_comp_t* imagec = &tcd->image->comps[compno];
opj_tcd_resolution_t* res = &tilec->resolutions[imagec->resno_decoded];
int adjust = imagec->sgnd ? 0 : 1 << (imagec->prec - 1);
int min = imagec->sgnd ? -(1 << (imagec->prec - 1)) : 0;
int max = imagec->sgnd ? (1 << (imagec->prec - 1)) - 1 : (1 << imagec->prec) - 1;
 
int tw = tilec->x1 - tilec->x0;
int w = imagec->w;
 
int offset_x = int_ceildivpow2(imagec->x0, imagec->factor);
int offset_y = int_ceildivpow2(imagec->y0, imagec->factor);
 
int i, j;
if(!imagec->data){
imagec->data = (int*) opj_malloc(imagec->w * imagec->h * sizeof(int));
}
if(tcd->tcp->tccps[compno].qmfbid == 1) {
for(j = res->y0; j < res->y1; ++j) {
for(i = res->x0; i < res->x1; ++i) {
int v = tilec->data[i - res->x0 + (j - res->y0) * tw];
v += adjust;
imagec->data[(i - offset_x) + (j - offset_y) * w] = int_clamp(v, min, max);
}
}
}else{
for(j = res->y0; j < res->y1; ++j) {
for(i = res->x0; i < res->x1; ++i) {
float tmp = ((float*)tilec->data)[i - res->x0 + (j - res->y0) * tw];
int v = lrintf(tmp);
v += adjust;
imagec->data[(i - offset_x) + (j - offset_y) * w] = int_clamp(v, min, max);
}
}
}
opj_aligned_free(tilec->data);
}
 
tile_time = opj_clock() - tile_time; /* time needed to decode a tile */
opj_event_msg(tcd->cinfo, EVT_INFO, "- tile decoded in %f s\n", tile_time);
 
if (eof) {
return false;
}
return true;
}
 
void tcd_free_decode(opj_tcd_t *tcd) {
opj_tcd_image_t *tcd_image = tcd->tcd_image;
opj_free(tcd_image->tiles);
}
 
void tcd_free_decode_tile(opj_tcd_t *tcd, int tileno) {
int compno,resno,bandno,precno;
 
opj_tcd_image_t *tcd_image = tcd->tcd_image;
 
opj_tcd_tile_t *tile = &tcd_image->tiles[tileno];
for (compno = 0; compno < tile->numcomps; compno++) {
opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
for (resno = 0; resno < tilec->numresolutions; resno++) {
opj_tcd_resolution_t *res = &tilec->resolutions[resno];
for (bandno = 0; bandno < res->numbands; bandno++) {
opj_tcd_band_t *band = &res->bands[bandno];
for (precno = 0; precno < res->ph * res->pw; precno++) {
opj_tcd_precinct_t *prec = &band->precincts[precno];
if (prec->imsbtree != NULL) tgt_destroy(prec->imsbtree);
if (prec->incltree != NULL) tgt_destroy(prec->incltree);
}
opj_free(band->precincts);
}
}
opj_free(tilec->resolutions);
}
opj_free(tile->comps);
}
 
 
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/tcd.h
0,0 → 1,286
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __TCD_H
#define __TCD_H
/**
@file tcd.h
@brief Implementation of a tile coder/decoder (TCD)
 
The functions in TCD.C have for goal to encode or decode each tile independently from
each other. The functions in TCD.C are used by some function in J2K.C.
*/
 
/** @defgroup TCD TCD - Implementation of a tile coder/decoder */
/*@{*/
 
/**
FIXME: documentation
*/
typedef struct opj_tcd_seg {
unsigned char** data;
int dataindex;
int numpasses;
int len;
int maxpasses;
int numnewpasses;
int newlen;
} opj_tcd_seg_t;
 
/**
FIXME: documentation
*/
typedef struct opj_tcd_pass {
int rate;
double distortiondec;
int term, len;
} opj_tcd_pass_t;
 
/**
FIXME: documentation
*/
typedef struct opj_tcd_layer {
int numpasses; /* Number of passes in the layer */
int len; /* len of information */
double disto; /* add for index (Cfr. Marcela) */
unsigned char *data; /* data */
} opj_tcd_layer_t;
 
/**
FIXME: documentation
*/
typedef struct opj_tcd_cblk_enc {
unsigned char* data; /* Data */
opj_tcd_layer_t* layers; /* layer information */
opj_tcd_pass_t* passes; /* information about the passes */
int x0, y0, x1, y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */
int numbps;
int numlenbits;
int numpasses; /* number of pass already done for the code-blocks */
int numpassesinlayers; /* number of passes in the layer */
int totalpasses; /* total number of passes */
} opj_tcd_cblk_enc_t;
 
typedef struct opj_tcd_cblk_dec {
unsigned char* data; /* Data */
opj_tcd_seg_t* segs; /* segments informations */
int x0, y0, x1, y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */
int numbps;
int numlenbits;
int len; /* length */
int numnewpasses; /* number of pass added to the code-blocks */
int numsegs; /* number of segments */
} opj_tcd_cblk_dec_t;
 
/**
FIXME: documentation
*/
typedef struct opj_tcd_precinct {
int x0, y0, x1, y1; /* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */
int cw, ch; /* number of precinct in width and heigth */
union{ /* code-blocks informations */
opj_tcd_cblk_enc_t* enc;
opj_tcd_cblk_dec_t* dec;
} cblks;
opj_tgt_tree_t *incltree; /* inclusion tree */
opj_tgt_tree_t *imsbtree; /* IMSB tree */
} opj_tcd_precinct_t;
 
/**
FIXME: documentation
*/
typedef struct opj_tcd_band {
int x0, y0, x1, y1; /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */
int bandno;
opj_tcd_precinct_t *precincts; /* precinct information */
int numbps;
float stepsize;
} opj_tcd_band_t;
 
/**
FIXME: documentation
*/
typedef struct opj_tcd_resolution {
int x0, y0, x1, y1; /* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */
int pw, ph;
int numbands; /* number sub-band for the resolution level */
opj_tcd_band_t bands[3]; /* subband information */
} opj_tcd_resolution_t;
 
/**
FIXME: documentation
*/
typedef struct opj_tcd_tilecomp {
int x0, y0, x1, y1; /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */
int numresolutions; /* number of resolutions level */
opj_tcd_resolution_t *resolutions; /* resolutions information */
int *data; /* data of the component */
int numpix; /* add fixed_quality */
} opj_tcd_tilecomp_t;
 
/**
FIXME: documentation
*/
typedef struct opj_tcd_tile {
int x0, y0, x1, y1; /* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */
int numcomps; /* number of components in tile */
opj_tcd_tilecomp_t *comps; /* Components information */
int numpix; /* add fixed_quality */
double distotile; /* add fixed_quality */
double distolayer[100]; /* add fixed_quality */
/** packet number */
int packno;
} opj_tcd_tile_t;
 
/**
FIXME: documentation
*/
typedef struct opj_tcd_image {
int tw, th; /* number of tiles in width and heigth */
opj_tcd_tile_t *tiles; /* Tiles information */
} opj_tcd_image_t;
 
/**
Tile coder/decoder
*/
typedef struct opj_tcd {
/** Position of the tilepart flag in Progression order*/
int tp_pos;
/** Tile part number*/
int tp_num;
/** Current tile part number*/
int cur_tp_num;
/** Total number of tileparts of the current tile*/
int cur_totnum_tp;
/** Current Packet iterator number */
int cur_pino;
/** codec context */
opj_common_ptr cinfo;
 
/** info on each image tile */
opj_tcd_image_t *tcd_image;
/** image */
opj_image_t *image;
/** coding parameters */
opj_cp_t *cp;
/** pointer to the current encoded/decoded tile */
opj_tcd_tile_t *tcd_tile;
/** coding/decoding parameters common to all tiles */
opj_tcp_t *tcp;
/** current encoded/decoded tile */
int tcd_tileno;
/** Time taken to encode a tile*/
double encoding_time;
} opj_tcd_t;
 
/** @name Exported functions */
/*@{*/
/* ----------------------------------------------------------------------- */
 
/**
Dump the content of a tcd structure
*/
void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t *img);
/**
Create a new TCD handle
@param cinfo Codec context info
@return Returns a new TCD handle if successful returns NULL otherwise
*/
opj_tcd_t* tcd_create(opj_common_ptr cinfo);
/**
Destroy a previously created TCD handle
@param tcd TCD handle to destroy
*/
void tcd_destroy(opj_tcd_t *tcd);
/**
Initialize the tile coder (allocate the memory)
@param tcd TCD handle
@param image Raw image
@param cp Coding parameters
@param curtileno Number that identifies the tile that will be encoded
*/
void tcd_malloc_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno);
/**
Free the memory allocated for encoding
@param tcd TCD handle
*/
void tcd_free_encode(opj_tcd_t *tcd);
/**
Initialize the tile coder (reuses the memory allocated by tcd_malloc_encode)
@param tcd TCD handle
@param image Raw image
@param cp Coding parameters
@param curtileno Number that identifies the tile that will be encoded
*/
void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno);
/**
Initialize the tile decoder
@param tcd TCD handle
@param image Raw image
@param cp Coding parameters
*/
void tcd_malloc_decode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp);
void tcd_malloc_decode_tile(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int tileno, opj_codestream_info_t *cstr_info);
void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final);
void tcd_rateallocate_fixed(opj_tcd_t *tcd);
void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final);
bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_codestream_info_t *cstr_info);
/**
Encode a tile from the raw image into a buffer
@param tcd TCD handle
@param tileno Number that identifies one of the tiles to be encoded
@param dest Destination buffer
@param len Length of destination buffer
@param cstr_info Codestream information structure
@return
*/
int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_codestream_info_t *cstr_info);
/**
Decode a tile from a buffer into a raw image
@param tcd TCD handle
@param src Source buffer
@param len Length of source buffer
@param tileno Number that identifies one of the tiles to be decoded
@param cstr_info Codestream information structure
*/
bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno, opj_codestream_info_t *cstr_info);
/**
Free the memory allocated for decoding
@param tcd TCD handle
*/
void tcd_free_decode(opj_tcd_t *tcd);
void tcd_free_decode_tile(opj_tcd_t *tcd, int tileno);
 
/* ----------------------------------------------------------------------- */
/*@}*/
 
/*@}*/
 
#endif /* __TCD_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/tgt.c
0,0 → 1,213
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#include "opj_includes.h"
 
/*
==========================================================
Tag-tree coder interface
==========================================================
*/
 
opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv) {
int nplh[32];
int nplv[32];
opj_tgt_node_t *node = NULL;
opj_tgt_node_t *parentnode = NULL;
opj_tgt_node_t *parentnode0 = NULL;
opj_tgt_tree_t *tree = NULL;
int i, j, k;
int numlvls;
int n;
 
tree = (opj_tgt_tree_t *) opj_malloc(sizeof(opj_tgt_tree_t));
if(!tree) return NULL;
tree->numleafsh = numleafsh;
tree->numleafsv = numleafsv;
 
numlvls = 0;
nplh[0] = numleafsh;
nplv[0] = numleafsv;
tree->numnodes = 0;
do {
n = nplh[numlvls] * nplv[numlvls];
nplh[numlvls + 1] = (nplh[numlvls] + 1) / 2;
nplv[numlvls + 1] = (nplv[numlvls] + 1) / 2;
tree->numnodes += n;
++numlvls;
} while (n > 1);
/* ADD */
if (tree->numnodes == 0) {
opj_free(tree);
return NULL;
}
 
tree->nodes = (opj_tgt_node_t*) opj_calloc(tree->numnodes, sizeof(opj_tgt_node_t));
if(!tree->nodes) {
opj_free(tree);
return NULL;
}
 
node = tree->nodes;
parentnode = &tree->nodes[tree->numleafsh * tree->numleafsv];
parentnode0 = parentnode;
for (i = 0; i < numlvls - 1; ++i) {
for (j = 0; j < nplv[i]; ++j) {
k = nplh[i];
while (--k >= 0) {
node->parent = parentnode;
++node;
if (--k >= 0) {
node->parent = parentnode;
++node;
}
++parentnode;
}
if ((j & 1) || j == nplv[i] - 1) {
parentnode0 = parentnode;
} else {
parentnode = parentnode0;
parentnode0 += nplh[i];
}
}
}
node->parent = 0;
tgt_reset(tree);
return tree;
}
 
void tgt_destroy(opj_tgt_tree_t *tree) {
opj_free(tree->nodes);
opj_free(tree);
}
 
void tgt_reset(opj_tgt_tree_t *tree) {
int i;
 
if (NULL == tree)
return;
for (i = 0; i < tree->numnodes; i++) {
tree->nodes[i].value = 999;
tree->nodes[i].low = 0;
tree->nodes[i].known = 0;
}
}
 
void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value) {
opj_tgt_node_t *node;
node = &tree->nodes[leafno];
while (node && node->value > value) {
node->value = value;
node = node->parent;
}
}
 
void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold) {
opj_tgt_node_t *stk[31];
opj_tgt_node_t **stkptr;
opj_tgt_node_t *node;
int low;
 
stkptr = stk;
node = &tree->nodes[leafno];
while (node->parent) {
*stkptr++ = node;
node = node->parent;
}
low = 0;
for (;;) {
if (low > node->low) {
node->low = low;
} else {
low = node->low;
}
while (low < threshold) {
if (low >= node->value) {
if (!node->known) {
bio_write(bio, 1, 1);
node->known = 1;
}
break;
}
bio_write(bio, 0, 1);
++low;
}
node->low = low;
if (stkptr == stk)
break;
node = *--stkptr;
}
}
 
int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold) {
opj_tgt_node_t *stk[31];
opj_tgt_node_t **stkptr;
opj_tgt_node_t *node;
int low;
 
stkptr = stk;
node = &tree->nodes[leafno];
while (node->parent) {
*stkptr++ = node;
node = node->parent;
}
low = 0;
for (;;) {
if (low > node->low) {
node->low = low;
} else {
low = node->low;
}
while (low < threshold && low < node->value) {
if (bio_read(bio, 1)) {
node->value = low;
} else {
++low;
}
}
node->low = low;
if (stkptr == stk) {
break;
}
node = *--stkptr;
}
return (node->value < threshold) ? 1 : 0;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/libopenjpeg/tgt.h
0,0 → 1,114
/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
 
#ifndef __TGT_H
#define __TGT_H
/**
@file tgt.h
@brief Implementation of a tag-tree coder (TGT)
 
The functions in TGT.C have for goal to realize a tag-tree coder. The functions in TGT.C
are used by some function in T2.C.
*/
 
/** @defgroup TGT TGT - Implementation of a tag-tree coder */
/*@{*/
 
/**
Tag node
*/
typedef struct opj_tgt_node {
struct opj_tgt_node *parent;
int value;
int low;
int known;
} opj_tgt_node_t;
 
/**
Tag tree
*/
typedef struct opj_tgt_tree {
int numleafsh;
int numleafsv;
int numnodes;
opj_tgt_node_t *nodes;
} opj_tgt_tree_t;
 
/** @name Exported functions */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Create a tag-tree
@param numleafsh Width of the array of leafs of the tree
@param numleafsv Height of the array of leafs of the tree
@return Returns a new tag-tree if successful, returns NULL otherwise
*/
opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv);
/**
Destroy a tag-tree, liberating memory
@param tree Tag-tree to destroy
*/
void tgt_destroy(opj_tgt_tree_t *tree);
/**
Reset a tag-tree (set all leaves to 0)
@param tree Tag-tree to reset
*/
void tgt_reset(opj_tgt_tree_t *tree);
/**
Set the value of a leaf of a tag-tree
@param tree Tag-tree to modify
@param leafno Number that identifies the leaf to modify
@param value New value of the leaf
*/
void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value);
/**
Encode the value of a leaf of the tag-tree up to a given threshold
@param bio Pointer to a BIO handle
@param tree Tag-tree to modify
@param leafno Number that identifies the leaf to encode
@param threshold Threshold to use when encoding value of the leaf
*/
void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold);
/**
Decode the value of a leaf of the tag-tree up to a given threshold
@param bio Pointer to a BIO handle
@param tree Tag-tree to decode
@param leafno Number that identifies the leaf to decode
@param threshold Threshold to use when decoding value of the leaf
@return Returns 1 if the node's value < threshold, returns 0 otherwise
*/
int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold);
/* ----------------------------------------------------------------------- */
/*@}*/
 
/*@}*/
 
#endif /* __TGT_H */
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/Makefile
0,0 → 1,21
CC = kos32-gcc
LD = kos32-ld
 
SDK_DIR = $(abspath ../../../sdk)
LDFLAGS = -call_shared -nostdlib -T $(SDK_DIR)/sources/newlib/app-dynamic.lds --image-base 0
 
CFLAGS = -c -fno-ident -O2 -fomit-frame-pointer -fno-ident -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32
 
INCLUDES = -I $(SDK_DIR)/sources/newlib/libc/include -I ../fitz -I $(SDK_DIR)/sources/freetype/include
LIBPATH = -L $(SDK_DIR)/lib -L /home/autobuild/tools/win32/mingw32/lib
 
PDF_SRC := $(notdir $(wildcard *.c))
OBJECTS = $(patsubst %.c, %.o, $(PDF_SRC))
 
default: $(patsubst %.c,%.o,$(PDF_SRC))
ar rcs libmupdf.a *.o
rm *.o
mv libmupdf.a ../lib
 
%.o : %.c Makefile $(PDF_SRC)
$(CC) $(CFLAGS) $(INCLUDES) -o $@ $<
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/data_encodings.h
0,0 → 1,214
#define _notdef NULL
 
const unsigned short pdf_doc_encoding[256] =
{
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0009, 0x000A, 0x0000, 0x0000, 0x000D, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x02d8, 0x02c7, 0x02c6, 0x02d9, 0x02dd, 0x02db, 0x02da, 0x02dc,
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000,
0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x0192, 0x2044,
0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018,
0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x0141, 0x0152, 0x0160,
0x0178, 0x017d, 0x0131, 0x0142, 0x0153, 0x0161, 0x017e, 0x0000,
0x20ac, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x0000, 0x00ae, 0x00af,
0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff
};
 
const char * const pdf_standard[256] = { _notdef, _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, _notdef,
"space", "exclam", "quotedbl", "numbersign", "dollar", "percent",
"ampersand", "quoteright", "parenleft", "parenright", "asterisk",
"plus", "comma", "hyphen", "period", "slash", "zero", "one", "two",
"three", "four", "five", "six", "seven", "eight", "nine", "colon",
"semicolon", "less", "equal", "greater", "question", "at", "A",
"B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N",
"O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
"bracketleft", "backslash", "bracketright", "asciicircum", "underscore",
"quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
"l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x",
"y", "z", "braceleft", "bar", "braceright", "asciitilde", _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, _notdef,
_notdef, _notdef, _notdef, "exclamdown", "cent", "sterling",
"fraction", "yen", "florin", "section", "currency", "quotesingle",
"quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright",
"fi", "fl", _notdef, "endash", "dagger", "daggerdbl", "periodcentered",
_notdef, "paragraph", "bullet", "quotesinglbase", "quotedblbase",
"quotedblright", "guillemotright", "ellipsis", "perthousand",
_notdef, "questiondown", _notdef, "grave", "acute", "circumflex",
"tilde", "macron", "breve", "dotaccent", "dieresis", _notdef,
"ring", "cedilla", _notdef, "hungarumlaut", "ogonek", "caron",
"emdash", _notdef, _notdef, _notdef, _notdef, _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, "AE",
_notdef, "ordfeminine", _notdef, _notdef, _notdef, _notdef,
"Lslash", "Oslash", "OE", "ordmasculine", _notdef, _notdef,
_notdef, _notdef, _notdef, "ae", _notdef, _notdef,
_notdef, "dotlessi", _notdef, _notdef, "lslash", "oslash",
"oe", "germandbls", _notdef, _notdef, _notdef, _notdef
};
 
const char * const pdf_mac_roman[256] = { _notdef, _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, _notdef,
"space", "exclam", "quotedbl", "numbersign", "dollar", "percent",
"ampersand", "quotesingle", "parenleft", "parenright", "asterisk",
"plus", "comma", "hyphen", "period", "slash", "zero", "one", "two",
"three", "four", "five", "six", "seven", "eight", "nine", "colon",
"semicolon", "less", "equal", "greater", "question", "at", "A",
"B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N",
"O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
"bracketleft", "backslash", "bracketright", "asciicircum", "underscore",
"grave", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
"l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x",
"y", "z", "braceleft", "bar", "braceright", "asciitilde", _notdef,
"Adieresis", "Aring", "Ccedilla", "Eacute", "Ntilde", "Odieresis",
"Udieresis", "aacute", "agrave", "acircumflex", "adieresis", "atilde",
"aring", "ccedilla", "eacute", "egrave", "ecircumflex", "edieresis",
"iacute", "igrave", "icircumflex", "idieresis", "ntilde", "oacute",
"ograve", "ocircumflex", "odieresis", "otilde", "uacute", "ugrave",
"ucircumflex", "udieresis", "dagger", "degree", "cent", "sterling",
"section", "bullet", "paragraph", "germandbls", "registered",
"copyright", "trademark", "acute", "dieresis", _notdef, "AE",
"Oslash", _notdef, "plusminus", _notdef, _notdef, "yen", "mu",
_notdef, _notdef, _notdef, _notdef, _notdef, "ordfeminine",
"ordmasculine", _notdef, "ae", "oslash", "questiondown", "exclamdown",
"logicalnot", _notdef, "florin", _notdef, _notdef, "guillemotleft",
"guillemotright", "ellipsis", "space", "Agrave", "Atilde", "Otilde",
"OE", "oe", "endash", "emdash", "quotedblleft", "quotedblright",
"quoteleft", "quoteright", "divide", _notdef, "ydieresis",
"Ydieresis", "fraction", "currency", "guilsinglleft", "guilsinglright",
"fi", "fl", "daggerdbl", "periodcentered", "quotesinglbase",
"quotedblbase", "perthousand", "Acircumflex", "Ecircumflex", "Aacute",
"Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave",
"Oacute", "Ocircumflex", _notdef, "Ograve", "Uacute", "Ucircumflex",
"Ugrave", "dotlessi", "circumflex", "tilde", "macron", "breve",
"dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", "caron"
};
 
const char * const pdf_mac_expert[256] = { _notdef, _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, _notdef,
"space", "exclamsmall", "Hungarumlautsmall", "centoldstyle",
"dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall",
"parenleftsuperior", "parenrightsuperior", "twodotenleader",
"onedotenleader", "comma", "hyphen", "period", "fraction",
"zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle",
"fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle",
"eightoldstyle", "nineoldstyle", "colon", "semicolon", _notdef,
"threequartersemdash", _notdef, "questionsmall", _notdef,
_notdef, _notdef, _notdef, "Ethsmall", _notdef, _notdef,
"onequarter", "onehalf", "threequarters", "oneeighth", "threeeighths",
"fiveeighths", "seveneighths", "onethird", "twothirds", _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, "ff", "fi",
"fl", "ffi", "ffl", "parenleftinferior", _notdef, "parenrightinferior",
"Circumflexsmall", "hypheninferior", "Gravesmall", "Asmall", "Bsmall",
"Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall",
"Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall",
"Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall",
"Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah",
"Tildesmall", _notdef, _notdef, "asuperior", "centsuperior",
_notdef, _notdef, _notdef, _notdef, "Aacutesmall",
"Agravesmall", "Acircumflexsmall", "Adieresissmall", "Atildesmall",
"Aringsmall", "Ccedillasmall", "Eacutesmall", "Egravesmall",
"Ecircumflexsmall", "Edieresissmall", "Iacutesmall", "Igravesmall",
"Icircumflexsmall", "Idieresissmall", "Ntildesmall", "Oacutesmall",
"Ogravesmall", "Ocircumflexsmall", "Odieresissmall", "Otildesmall",
"Uacutesmall", "Ugravesmall", "Ucircumflexsmall", "Udieresissmall",
_notdef, "eightsuperior", "fourinferior", "threeinferior",
"sixinferior", "eightinferior", "seveninferior", "Scaronsmall",
_notdef, "centinferior", "twoinferior", _notdef, "Dieresissmall",
_notdef, "Caronsmall", "osuperior", "fiveinferior", _notdef,
"commainferior", "periodinferior", "Yacutesmall", _notdef,
"dollarinferior", _notdef, _notdef, "Thornsmall", _notdef,
"nineinferior", "zeroinferior", "Zcaronsmall", "AEsmall", "Oslashsmall",
"questiondownsmall", "oneinferior", "Lslashsmall", _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, "Cedillasmall",
_notdef, _notdef, _notdef, _notdef, _notdef, "OEsmall",
"figuredash", "hyphensuperior", _notdef, _notdef, _notdef,
_notdef, "exclamdownsmall", _notdef, "Ydieresissmall", _notdef,
"onesuperior", "twosuperior", "threesuperior", "foursuperior",
"fivesuperior", "sixsuperior", "sevensuperior", "ninesuperior",
"zerosuperior", _notdef, "esuperior", "rsuperior", "tsuperior",
_notdef, _notdef, "isuperior", "ssuperior", "dsuperior",
_notdef, _notdef, _notdef, _notdef, _notdef, "lsuperior",
"Ogoneksmall", "Brevesmall", "Macronsmall", "bsuperior", "nsuperior",
"msuperior", "commasuperior", "periodsuperior", "Dotaccentsmall",
"Ringsmall", _notdef, _notdef, _notdef, _notdef };
 
const char * const pdf_win_ansi[256] = { _notdef, _notdef, _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, _notdef,
_notdef, _notdef, _notdef, _notdef, _notdef, "space",
"exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand",
"quotesingle", "parenleft", "parenright", "asterisk", "plus",
"comma", "hyphen", "period", "slash", "zero", "one", "two", "three",
"four", "five", "six", "seven", "eight", "nine", "colon", "semicolon",
"less", "equal", "greater", "question", "at", "A", "B", "C", "D",
"E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q",
"R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft",
"backslash", "bracketright", "asciicircum", "underscore", "grave",
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
"n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
"braceleft", "bar", "braceright", "asciitilde", "bullet", "Euro",
"bullet", "quotesinglbase", "florin", "quotedblbase", "ellipsis",
"dagger", "daggerdbl", "circumflex", "perthousand", "Scaron",
"guilsinglleft", "OE", "bullet", "Zcaron", "bullet", "bullet",
"quoteleft", "quoteright", "quotedblleft", "quotedblright", "bullet",
"endash", "emdash", "tilde", "trademark", "scaron", "guilsinglright",
"oe", "bullet", "zcaron", "Ydieresis", "space", "exclamdown", "cent",
"sterling", "currency", "yen", "brokenbar", "section", "dieresis",
"copyright", "ordfeminine", "guillemotleft", "logicalnot", "hyphen",
"registered", "macron", "degree", "plusminus", "twosuperior",
"threesuperior", "acute", "mu", "paragraph", "periodcentered",
"cedilla", "onesuperior", "ordmasculine", "guillemotright",
"onequarter", "onehalf", "threequarters", "questiondown", "Agrave",
"Aacute", "Acircumflex", "Atilde", "Adieresis", "Aring", "AE",
"Ccedilla", "Egrave", "Eacute", "Ecircumflex", "Edieresis", "Igrave",
"Iacute", "Icircumflex", "Idieresis", "Eth", "Ntilde", "Ograve",
"Oacute", "Ocircumflex", "Otilde", "Odieresis", "multiply", "Oslash",
"Ugrave", "Uacute", "Ucircumflex", "Udieresis", "Yacute", "Thorn",
"germandbls", "agrave", "aacute", "acircumflex", "atilde", "adieresis",
"aring", "ae", "ccedilla", "egrave", "eacute", "ecircumflex",
"edieresis", "igrave", "iacute", "icircumflex", "idieresis", "eth",
"ntilde", "ograve", "oacute", "ocircumflex", "otilde", "odieresis",
"divide", "oslash", "ugrave", "uacute", "ucircumflex", "udieresis",
"yacute", "thorn", "ydieresis"
};
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/data_glyphlist.h
0,0 → 1,1461
/*
# Name: Adobe Glyph List
# Table version: 2.0
# Date: September 20, 2002
#
# See http://partners.adobe.com/asn/developer/typeforum/unicodegn.html
#
# Format: Semicolon-delimited fields:
# (1) glyph name
# (2) Unicode scalar value
#--end
*/
 
static const char *agl_name_list[] = {
"A","AE","AEacute","AEmacron","AEsmall","Aacute","Aacutesmall","Abreve",
"Abreveacute","Abrevecyrillic","Abrevedotbelow","Abrevegrave",
"Abrevehookabove","Abrevetilde","Acaron","Acircle","Acircumflex",
"Acircumflexacute","Acircumflexdotbelow","Acircumflexgrave",
"Acircumflexhookabove","Acircumflexsmall","Acircumflextilde","Acute",
"Acutesmall","Acyrillic","Adblgrave","Adieresis","Adieresiscyrillic",
"Adieresismacron","Adieresissmall","Adotbelow","Adotmacron","Agrave",
"Agravesmall","Ahookabove","Aiecyrillic","Ainvertedbreve","Alpha",
"Alphatonos","Amacron","Amonospace","Aogonek","Aring","Aringacute",
"Aringbelow","Aringsmall","Asmall","Atilde","Atildesmall","Aybarmenian","B",
"Bcircle","Bdotaccent","Bdotbelow","Becyrillic","Benarmenian","Beta","Bhook",
"Blinebelow","Bmonospace","Brevesmall","Bsmall","Btopbar","C","Caarmenian",
"Cacute","Caron","Caronsmall","Ccaron","Ccedilla","Ccedillaacute",
"Ccedillasmall","Ccircle","Ccircumflex","Cdot","Cdotaccent","Cedillasmall",
"Chaarmenian","Cheabkhasiancyrillic","Checyrillic",
"Chedescenderabkhasiancyrillic","Chedescendercyrillic","Chedieresiscyrillic",
"Cheharmenian","Chekhakassiancyrillic","Cheverticalstrokecyrillic","Chi",
"Chook","Circumflexsmall","Cmonospace","Coarmenian","Csmall","D","DZ",
"DZcaron","Daarmenian","Dafrican","Dcaron","Dcedilla","Dcircle",
"Dcircumflexbelow","Dcroat","Ddotaccent","Ddotbelow","Decyrillic","Deicoptic",
"Delta","Deltagreek","Dhook","Dieresis","DieresisAcute","DieresisGrave",
"Dieresissmall","Digammagreek","Djecyrillic","Dlinebelow","Dmonospace",
"Dotaccentsmall","Dslash","Dsmall","Dtopbar","Dz","Dzcaron",
"Dzeabkhasiancyrillic","Dzecyrillic","Dzhecyrillic","E","Eacute",
"Eacutesmall","Ebreve","Ecaron","Ecedillabreve","Echarmenian","Ecircle",
"Ecircumflex","Ecircumflexacute","Ecircumflexbelow","Ecircumflexdotbelow",
"Ecircumflexgrave","Ecircumflexhookabove","Ecircumflexsmall",
"Ecircumflextilde","Ecyrillic","Edblgrave","Edieresis","Edieresissmall",
"Edot","Edotaccent","Edotbelow","Efcyrillic","Egrave","Egravesmall",
"Eharmenian","Ehookabove","Eightroman","Einvertedbreve","Eiotifiedcyrillic",
"Elcyrillic","Elevenroman","Emacron","Emacronacute","Emacrongrave",
"Emcyrillic","Emonospace","Encyrillic","Endescendercyrillic","Eng",
"Enghecyrillic","Enhookcyrillic","Eogonek","Eopen","Epsilon","Epsilontonos",
"Ercyrillic","Ereversed","Ereversedcyrillic","Escyrillic",
"Esdescendercyrillic","Esh","Esmall","Eta","Etarmenian","Etatonos","Eth",
"Ethsmall","Etilde","Etildebelow","Euro","Ezh","Ezhcaron","Ezhreversed","F",
"Fcircle","Fdotaccent","Feharmenian","Feicoptic","Fhook","Fitacyrillic",
"Fiveroman","Fmonospace","Fourroman","Fsmall","G","GBsquare","Gacute","Gamma",
"Gammaafrican","Gangiacoptic","Gbreve","Gcaron","Gcedilla","Gcircle",
"Gcircumflex","Gcommaaccent","Gdot","Gdotaccent","Gecyrillic","Ghadarmenian",
"Ghemiddlehookcyrillic","Ghestrokecyrillic","Gheupturncyrillic","Ghook",
"Gimarmenian","Gjecyrillic","Gmacron","Gmonospace","Grave","Gravesmall",
"Gsmall","Gsmallhook","Gstroke","H","H18533","H18543","H18551","H22073",
"HPsquare","Haabkhasiancyrillic","Hadescendercyrillic","Hardsigncyrillic",
"Hbar","Hbrevebelow","Hcedilla","Hcircle","Hcircumflex","Hdieresis",
"Hdotaccent","Hdotbelow","Hmonospace","Hoarmenian","Horicoptic","Hsmall",
"Hungarumlaut","Hungarumlautsmall","Hzsquare","I","IAcyrillic","IJ",
"IUcyrillic","Iacute","Iacutesmall","Ibreve","Icaron","Icircle","Icircumflex",
"Icircumflexsmall","Icyrillic","Idblgrave","Idieresis","Idieresisacute",
"Idieresiscyrillic","Idieresissmall","Idot","Idotaccent","Idotbelow",
"Iebrevecyrillic","Iecyrillic","Ifraktur","Igrave","Igravesmall","Ihookabove",
"Iicyrillic","Iinvertedbreve","Iishortcyrillic","Imacron","Imacroncyrillic",
"Imonospace","Iniarmenian","Iocyrillic","Iogonek","Iota","Iotaafrican",
"Iotadieresis","Iotatonos","Ismall","Istroke","Itilde","Itildebelow",
"Izhitsacyrillic","Izhitsadblgravecyrillic","J","Jaarmenian","Jcircle",
"Jcircumflex","Jecyrillic","Jheharmenian","Jmonospace","Jsmall","K",
"KBsquare","KKsquare","Kabashkircyrillic","Kacute","Kacyrillic",
"Kadescendercyrillic","Kahookcyrillic","Kappa","Kastrokecyrillic",
"Kaverticalstrokecyrillic","Kcaron","Kcedilla","Kcircle","Kcommaaccent",
"Kdotbelow","Keharmenian","Kenarmenian","Khacyrillic","Kheicoptic","Khook",
"Kjecyrillic","Klinebelow","Kmonospace","Koppacyrillic","Koppagreek",
"Ksicyrillic","Ksmall","L","LJ","LL","Lacute","Lambda","Lcaron","Lcedilla",
"Lcircle","Lcircumflexbelow","Lcommaaccent","Ldot","Ldotaccent","Ldotbelow",
"Ldotbelowmacron","Liwnarmenian","Lj","Ljecyrillic","Llinebelow","Lmonospace",
"Lslash","Lslashsmall","Lsmall","M","MBsquare","Macron","Macronsmall",
"Macute","Mcircle","Mdotaccent","Mdotbelow","Menarmenian","Mmonospace",
"Msmall","Mturned","Mu","N","NJ","Nacute","Ncaron","Ncedilla","Ncircle",
"Ncircumflexbelow","Ncommaaccent","Ndotaccent","Ndotbelow","Nhookleft",
"Nineroman","Nj","Njecyrillic","Nlinebelow","Nmonospace","Nowarmenian",
"Nsmall","Ntilde","Ntildesmall","Nu","O","OE","OEsmall","Oacute",
"Oacutesmall","Obarredcyrillic","Obarreddieresiscyrillic","Obreve","Ocaron",
"Ocenteredtilde","Ocircle","Ocircumflex","Ocircumflexacute",
"Ocircumflexdotbelow","Ocircumflexgrave","Ocircumflexhookabove",
"Ocircumflexsmall","Ocircumflextilde","Ocyrillic","Odblacute","Odblgrave",
"Odieresis","Odieresiscyrillic","Odieresissmall","Odotbelow","Ogoneksmall",
"Ograve","Ogravesmall","Oharmenian","Ohm","Ohookabove","Ohorn","Ohornacute",
"Ohorndotbelow","Ohorngrave","Ohornhookabove","Ohorntilde","Ohungarumlaut",
"Oi","Oinvertedbreve","Omacron","Omacronacute","Omacrongrave","Omega",
"Omegacyrillic","Omegagreek","Omegaroundcyrillic","Omegatitlocyrillic",
"Omegatonos","Omicron","Omicrontonos","Omonospace","Oneroman","Oogonek",
"Oogonekmacron","Oopen","Oslash","Oslashacute","Oslashsmall","Osmall",
"Ostrokeacute","Otcyrillic","Otilde","Otildeacute","Otildedieresis",
"Otildesmall","P","Pacute","Pcircle","Pdotaccent","Pecyrillic","Peharmenian",
"Pemiddlehookcyrillic","Phi","Phook","Pi","Piwrarmenian","Pmonospace","Psi",
"Psicyrillic","Psmall","Q","Qcircle","Qmonospace","Qsmall","R","Raarmenian",
"Racute","Rcaron","Rcedilla","Rcircle","Rcommaaccent","Rdblgrave",
"Rdotaccent","Rdotbelow","Rdotbelowmacron","Reharmenian","Rfraktur","Rho",
"Ringsmall","Rinvertedbreve","Rlinebelow","Rmonospace","Rsmall",
"Rsmallinverted","Rsmallinvertedsuperior","S","SF010000","SF020000",
"SF030000","SF040000","SF050000","SF060000","SF070000","SF080000","SF090000",
"SF100000","SF110000","SF190000","SF200000","SF210000","SF220000","SF230000",
"SF240000","SF250000","SF260000","SF270000","SF280000","SF360000","SF370000",
"SF380000","SF390000","SF400000","SF410000","SF420000","SF430000","SF440000",
"SF450000","SF460000","SF470000","SF480000","SF490000","SF500000","SF510000",
"SF520000","SF530000","SF540000","Sacute","Sacutedotaccent","Sampigreek",
"Scaron","Scarondotaccent","Scaronsmall","Scedilla","Schwa","Schwacyrillic",
"Schwadieresiscyrillic","Scircle","Scircumflex","Scommaaccent","Sdotaccent",
"Sdotbelow","Sdotbelowdotaccent","Seharmenian","Sevenroman","Shaarmenian",
"Shacyrillic","Shchacyrillic","Sheicoptic","Shhacyrillic","Shimacoptic",
"Sigma","Sixroman","Smonospace","Softsigncyrillic","Ssmall","Stigmagreek","T",
"Tau","Tbar","Tcaron","Tcedilla","Tcircle","Tcircumflexbelow","Tcommaaccent",
"Tdotaccent","Tdotbelow","Tecyrillic","Tedescendercyrillic","Tenroman",
"Tetsecyrillic","Theta","Thook","Thorn","Thornsmall","Threeroman",
"Tildesmall","Tiwnarmenian","Tlinebelow","Tmonospace","Toarmenian","Tonefive",
"Tonesix","Tonetwo","Tretroflexhook","Tsecyrillic","Tshecyrillic","Tsmall",
"Twelveroman","Tworoman","U","Uacute","Uacutesmall","Ubreve","Ucaron",
"Ucircle","Ucircumflex","Ucircumflexbelow","Ucircumflexsmall","Ucyrillic",
"Udblacute","Udblgrave","Udieresis","Udieresisacute","Udieresisbelow",
"Udieresiscaron","Udieresiscyrillic","Udieresisgrave","Udieresismacron",
"Udieresissmall","Udotbelow","Ugrave","Ugravesmall","Uhookabove","Uhorn",
"Uhornacute","Uhorndotbelow","Uhorngrave","Uhornhookabove","Uhorntilde",
"Uhungarumlaut","Uhungarumlautcyrillic","Uinvertedbreve","Ukcyrillic",
"Umacron","Umacroncyrillic","Umacrondieresis","Umonospace","Uogonek",
"Upsilon","Upsilon1","Upsilonacutehooksymbolgreek","Upsilonafrican",
"Upsilondieresis","Upsilondieresishooksymbolgreek","Upsilonhooksymbol",
"Upsilontonos","Uring","Ushortcyrillic","Usmall","Ustraightcyrillic",
"Ustraightstrokecyrillic","Utilde","Utildeacute","Utildebelow","V","Vcircle",
"Vdotbelow","Vecyrillic","Vewarmenian","Vhook","Vmonospace","Voarmenian",
"Vsmall","Vtilde","W","Wacute","Wcircle","Wcircumflex","Wdieresis",
"Wdotaccent","Wdotbelow","Wgrave","Wmonospace","Wsmall","X","Xcircle",
"Xdieresis","Xdotaccent","Xeharmenian","Xi","Xmonospace","Xsmall","Y",
"Yacute","Yacutesmall","Yatcyrillic","Ycircle","Ycircumflex","Ydieresis",
"Ydieresissmall","Ydotaccent","Ydotbelow","Yericyrillic",
"Yerudieresiscyrillic","Ygrave","Yhook","Yhookabove","Yiarmenian",
"Yicyrillic","Yiwnarmenian","Ymonospace","Ysmall","Ytilde","Yusbigcyrillic",
"Yusbigiotifiedcyrillic","Yuslittlecyrillic","Yuslittleiotifiedcyrillic","Z",
"Zaarmenian","Zacute","Zcaron","Zcaronsmall","Zcircle","Zcircumflex","Zdot",
"Zdotaccent","Zdotbelow","Zecyrillic","Zedescendercyrillic",
"Zedieresiscyrillic","Zeta","Zhearmenian","Zhebrevecyrillic","Zhecyrillic",
"Zhedescendercyrillic","Zhedieresiscyrillic","Zlinebelow","Zmonospace",
"Zsmall","Zstroke","a","aabengali","aacute","aadeva","aagujarati",
"aagurmukhi","aamatragurmukhi","aarusquare","aavowelsignbengali",
"aavowelsigndeva","aavowelsigngujarati","abbreviationmarkarmenian",
"abbreviationsigndeva","abengali","abopomofo","abreve","abreveacute",
"abrevecyrillic","abrevedotbelow","abrevegrave","abrevehookabove",
"abrevetilde","acaron","acircle","acircumflex","acircumflexacute",
"acircumflexdotbelow","acircumflexgrave","acircumflexhookabove",
"acircumflextilde","acute","acutebelowcmb","acutecmb","acutecomb","acutedeva",
"acutelowmod","acutetonecmb","acyrillic","adblgrave","addakgurmukhi","adeva",
"adieresis","adieresiscyrillic","adieresismacron","adotbelow","adotmacron",
"ae","aeacute","aekorean","aemacron","afii00208","afii08941","afii10017",
"afii10018","afii10019","afii10020","afii10021","afii10022","afii10023",
"afii10024","afii10025","afii10026","afii10027","afii10028","afii10029",
"afii10030","afii10031","afii10032","afii10033","afii10034","afii10035",
"afii10036","afii10037","afii10038","afii10039","afii10040","afii10041",
"afii10042","afii10043","afii10044","afii10045","afii10046","afii10047",
"afii10048","afii10049","afii10050","afii10051","afii10052","afii10053",
"afii10054","afii10055","afii10056","afii10057","afii10058","afii10059",
"afii10060","afii10061","afii10062","afii10063","afii10064","afii10065",
"afii10066","afii10067","afii10068","afii10069","afii10070","afii10071",
"afii10072","afii10073","afii10074","afii10075","afii10076","afii10077",
"afii10078","afii10079","afii10080","afii10081","afii10082","afii10083",
"afii10084","afii10085","afii10086","afii10087","afii10088","afii10089",
"afii10090","afii10091","afii10092","afii10093","afii10094","afii10095",
"afii10096","afii10097","afii10098","afii10099","afii10100","afii10101",
"afii10102","afii10103","afii10104","afii10105","afii10106","afii10107",
"afii10108","afii10109","afii10110","afii10145","afii10146","afii10147",
"afii10148","afii10192","afii10193","afii10194","afii10195","afii10196",
"afii10831","afii10832","afii10846","afii299","afii300","afii301","afii57381",
"afii57388","afii57392","afii57393","afii57394","afii57395","afii57396",
"afii57397","afii57398","afii57399","afii57400","afii57401","afii57403",
"afii57407","afii57409","afii57410","afii57411","afii57412","afii57413",
"afii57414","afii57415","afii57416","afii57417","afii57418","afii57419",
"afii57420","afii57421","afii57422","afii57423","afii57424","afii57425",
"afii57426","afii57427","afii57428","afii57429","afii57430","afii57431",
"afii57432","afii57433","afii57434","afii57440","afii57441","afii57442",
"afii57443","afii57444","afii57445","afii57446","afii57448","afii57449",
"afii57450","afii57451","afii57452","afii57453","afii57454","afii57455",
"afii57456","afii57457","afii57458","afii57470","afii57505","afii57506",
"afii57507","afii57508","afii57509","afii57511","afii57512","afii57513",
"afii57514","afii57519","afii57534","afii57636","afii57645","afii57658",
"afii57664","afii57665","afii57666","afii57667","afii57668","afii57669",
"afii57670","afii57671","afii57672","afii57673","afii57674","afii57675",
"afii57676","afii57677","afii57678","afii57679","afii57680","afii57681",
"afii57682","afii57683","afii57684","afii57685","afii57686","afii57687",
"afii57688","afii57689","afii57690","afii57694","afii57695","afii57700",
"afii57705","afii57716","afii57717","afii57718","afii57723","afii57793",
"afii57794","afii57795","afii57796","afii57797","afii57798","afii57799",
"afii57800","afii57801","afii57802","afii57803","afii57804","afii57806",
"afii57807","afii57839","afii57841","afii57842","afii57929","afii61248",
"afii61289","afii61352","afii61573","afii61574","afii61575","afii61664",
"afii63167","afii64937","agrave","agujarati","agurmukhi","ahiragana",
"ahookabove","aibengali","aibopomofo","aideva","aiecyrillic","aigujarati",
"aigurmukhi","aimatragurmukhi","ainarabic","ainfinalarabic",
"aininitialarabic","ainmedialarabic","ainvertedbreve","aivowelsignbengali",
"aivowelsigndeva","aivowelsigngujarati","akatakana","akatakanahalfwidth",
"akorean","alef","alefarabic","alefdageshhebrew","aleffinalarabic",
"alefhamzaabovearabic","alefhamzaabovefinalarabic","alefhamzabelowarabic",
"alefhamzabelowfinalarabic","alefhebrew","aleflamedhebrew",
"alefmaddaabovearabic","alefmaddaabovefinalarabic","alefmaksuraarabic",
"alefmaksurafinalarabic","alefmaksurainitialarabic","alefmaksuramedialarabic",
"alefpatahhebrew","alefqamatshebrew","aleph","allequal","alpha","alphatonos",
"amacron","amonospace","ampersand","ampersandmonospace","ampersandsmall",
"amsquare","anbopomofo","angbopomofo","angkhankhuthai","angle",
"anglebracketleft","anglebracketleftvertical","anglebracketright",
"anglebracketrightvertical","angleleft","angleright","angstrom","anoteleia",
"anudattadeva","anusvarabengali","anusvaradeva","anusvaragujarati","aogonek",
"apaatosquare","aparen","apostrophearmenian","apostrophemod","apple",
"approaches","approxequal","approxequalorimage","approximatelyequal",
"araeaekorean","araeakorean","arc","arighthalfring","aring","aringacute",
"aringbelow","arrowboth","arrowdashdown","arrowdashleft","arrowdashright",
"arrowdashup","arrowdblboth","arrowdbldown","arrowdblleft","arrowdblright",
"arrowdblup","arrowdown","arrowdownleft","arrowdownright","arrowdownwhite",
"arrowheaddownmod","arrowheadleftmod","arrowheadrightmod","arrowheadupmod",
"arrowhorizex","arrowleft","arrowleftdbl","arrowleftdblstroke",
"arrowleftoverright","arrowleftwhite","arrowright","arrowrightdblstroke",
"arrowrightheavy","arrowrightoverleft","arrowrightwhite","arrowtableft",
"arrowtabright","arrowup","arrowupdn","arrowupdnbse","arrowupdownbase",
"arrowupleft","arrowupleftofdown","arrowupright","arrowupwhite","arrowvertex",
"asciicircum","asciicircummonospace","asciitilde","asciitildemonospace",
"ascript","ascriptturned","asmallhiragana","asmallkatakana",
"asmallkatakanahalfwidth","asterisk","asteriskaltonearabic","asteriskarabic",
"asteriskmath","asteriskmonospace","asterisksmall","asterism","asuperior",
"asymptoticallyequal","at","atilde","atmonospace","atsmall","aturned",
"aubengali","aubopomofo","audeva","augujarati","augurmukhi",
"aulengthmarkbengali","aumatragurmukhi","auvowelsignbengali",
"auvowelsigndeva","auvowelsigngujarati","avagrahadeva","aybarmenian","ayin",
"ayinaltonehebrew","ayinhebrew","b","babengali","backslash",
"backslashmonospace","badeva","bagujarati","bagurmukhi","bahiragana",
"bahtthai","bakatakana","bar","barmonospace","bbopomofo","bcircle",
"bdotaccent","bdotbelow","beamedsixteenthnotes","because","becyrillic",
"beharabic","behfinalarabic","behinitialarabic","behiragana",
"behmedialarabic","behmeeminitialarabic","behmeemisolatedarabic",
"behnoonfinalarabic","bekatakana","benarmenian","bet","beta",
"betasymbolgreek","betdagesh","betdageshhebrew","bethebrew","betrafehebrew",
"bhabengali","bhadeva","bhagujarati","bhagurmukhi","bhook","bihiragana",
"bikatakana","bilabialclick","bindigurmukhi","birusquare","blackcircle",
"blackdiamond","blackdownpointingtriangle","blackleftpointingpointer",
"blackleftpointingtriangle","blacklenticularbracketleft",
"blacklenticularbracketleftvertical","blacklenticularbracketright",
"blacklenticularbracketrightvertical","blacklowerlefttriangle",
"blacklowerrighttriangle","blackrectangle","blackrightpointingpointer",
"blackrightpointingtriangle","blacksmallsquare","blacksmilingface",
"blacksquare","blackstar","blackupperlefttriangle","blackupperrighttriangle",
"blackuppointingsmalltriangle","blackuppointingtriangle","blank","blinebelow",
"block","bmonospace","bobaimaithai","bohiragana","bokatakana","bparen",
"bqsquare","braceex","braceleft","braceleftbt","braceleftmid",
"braceleftmonospace","braceleftsmall","bracelefttp","braceleftvertical",
"braceright","bracerightbt","bracerightmid","bracerightmonospace",
"bracerightsmall","bracerighttp","bracerightvertical","bracketleft",
"bracketleftbt","bracketleftex","bracketleftmonospace","bracketlefttp",
"bracketright","bracketrightbt","bracketrightex","bracketrightmonospace",
"bracketrighttp","breve","brevebelowcmb","brevecmb","breveinvertedbelowcmb",
"breveinvertedcmb","breveinverteddoublecmb","bridgebelowcmb",
"bridgeinvertedbelowcmb","brokenbar","bstroke","bsuperior","btopbar",
"buhiragana","bukatakana","bullet","bulletinverse","bulletoperator",
"bullseye","c","caarmenian","cabengali","cacute","cadeva","cagujarati",
"cagurmukhi","calsquare","candrabindubengali","candrabinducmb",
"candrabindudeva","candrabindugujarati","capslock","careof","caron",
"caronbelowcmb","caroncmb","carriagereturn","cbopomofo","ccaron","ccedilla",
"ccedillaacute","ccircle","ccircumflex","ccurl","cdot","cdotaccent",
"cdsquare","cedilla","cedillacmb","cent","centigrade","centinferior",
"centmonospace","centoldstyle","centsuperior","chaarmenian","chabengali",
"chadeva","chagujarati","chagurmukhi","chbopomofo","cheabkhasiancyrillic",
"checkmark","checyrillic","chedescenderabkhasiancyrillic",
"chedescendercyrillic","chedieresiscyrillic","cheharmenian",
"chekhakassiancyrillic","cheverticalstrokecyrillic","chi",
"chieuchacirclekorean","chieuchaparenkorean","chieuchcirclekorean",
"chieuchkorean","chieuchparenkorean","chochangthai","chochanthai",
"chochingthai","chochoethai","chook","cieucacirclekorean","cieucaparenkorean",
"cieuccirclekorean","cieuckorean","cieucparenkorean","cieucuparenkorean",
"circle","circlemultiply","circleot","circleplus","circlepostalmark",
"circlewithlefthalfblack","circlewithrighthalfblack","circumflex",
"circumflexbelowcmb","circumflexcmb","clear","clickalveolar","clickdental",
"clicklateral","clickretroflex","club","clubsuitblack","clubsuitwhite",
"cmcubedsquare","cmonospace","cmsquaredsquare","coarmenian","colon",
"colonmonetary","colonmonospace","colonsign","colonsmall",
"colontriangularhalfmod","colontriangularmod","comma","commaabovecmb",
"commaaboverightcmb","commaaccent","commaarabic","commaarmenian",
"commainferior","commamonospace","commareversedabovecmb","commareversedmod",
"commasmall","commasuperior","commaturnedabovecmb","commaturnedmod","compass",
"congruent","contourintegral","control","controlACK","controlBEL","controlBS",
"controlCAN","controlCR","controlDC1","controlDC2","controlDC3","controlDC4",
"controlDEL","controlDLE","controlEM","controlENQ","controlEOT","controlESC",
"controlETB","controlETX","controlFF","controlFS","controlGS","controlHT",
"controlLF","controlNAK","controlRS","controlSI","controlSO","controlSOT",
"controlSTX","controlSUB","controlSYN","controlUS","controlVT","copyright",
"copyrightsans","copyrightserif","cornerbracketleft",
"cornerbracketlefthalfwidth","cornerbracketleftvertical","cornerbracketright",
"cornerbracketrighthalfwidth","cornerbracketrightvertical",
"corporationsquare","cosquare","coverkgsquare","cparen","cruzeiro",
"cstretched","curlyand","curlyor","currency","cyrBreve","cyrFlex","cyrbreve",
"cyrflex","d","daarmenian","dabengali","dadarabic","dadeva","dadfinalarabic",
"dadinitialarabic","dadmedialarabic","dagesh","dageshhebrew","dagger",
"daggerdbl","dagujarati","dagurmukhi","dahiragana","dakatakana","dalarabic",
"dalet","daletdagesh","daletdageshhebrew","dalethatafpatah",
"dalethatafpatahhebrew","dalethatafsegol","dalethatafsegolhebrew",
"dalethebrew","dalethiriq","dalethiriqhebrew","daletholam","daletholamhebrew",
"daletpatah","daletpatahhebrew","daletqamats","daletqamatshebrew",
"daletqubuts","daletqubutshebrew","daletsegol","daletsegolhebrew",
"daletsheva","daletshevahebrew","dalettsere","dalettserehebrew",
"dalfinalarabic","dammaarabic","dammalowarabic","dammatanaltonearabic",
"dammatanarabic","danda","dargahebrew","dargalefthebrew",
"dasiapneumatacyrilliccmb","dblGrave","dblanglebracketleft",
"dblanglebracketleftvertical","dblanglebracketright",
"dblanglebracketrightvertical","dblarchinvertedbelowcmb","dblarrowleft",
"dblarrowright","dbldanda","dblgrave","dblgravecmb","dblintegral",
"dbllowline","dbllowlinecmb","dbloverlinecmb","dblprimemod","dblverticalbar",
"dblverticallineabovecmb","dbopomofo","dbsquare","dcaron","dcedilla",
"dcircle","dcircumflexbelow","dcroat","ddabengali","ddadeva","ddagujarati",
"ddagurmukhi","ddalarabic","ddalfinalarabic","dddhadeva","ddhabengali",
"ddhadeva","ddhagujarati","ddhagurmukhi","ddotaccent","ddotbelow",
"decimalseparatorarabic","decimalseparatorpersian","decyrillic","degree",
"dehihebrew","dehiragana","deicoptic","dekatakana","deleteleft","deleteright",
"delta","deltaturned","denominatorminusonenumeratorbengali","dezh",
"dhabengali","dhadeva","dhagujarati","dhagurmukhi","dhook","dialytikatonos",
"dialytikatonoscmb","diamond","diamondsuitwhite","dieresis","dieresisacute",
"dieresisbelowcmb","dieresiscmb","dieresisgrave","dieresistonos","dihiragana",
"dikatakana","dittomark","divide","divides","divisionslash","djecyrillic",
"dkshade","dlinebelow","dlsquare","dmacron","dmonospace","dnblock",
"dochadathai","dodekthai","dohiragana","dokatakana","dollar","dollarinferior",
"dollarmonospace","dollaroldstyle","dollarsmall","dollarsuperior","dong",
"dorusquare","dotaccent","dotaccentcmb","dotbelowcmb","dotbelowcomb",
"dotkatakana","dotlessi","dotlessj","dotlessjstrokehook","dotmath",
"dottedcircle","doubleyodpatah","doubleyodpatahhebrew","downtackbelowcmb",
"downtackmod","dparen","dsuperior","dtail","dtopbar","duhiragana",
"dukatakana","dz","dzaltone","dzcaron","dzcurl","dzeabkhasiancyrillic",
"dzecyrillic","dzhecyrillic","e","eacute","earth","ebengali","ebopomofo",
"ebreve","ecandradeva","ecandragujarati","ecandravowelsigndeva",
"ecandravowelsigngujarati","ecaron","ecedillabreve","echarmenian",
"echyiwnarmenian","ecircle","ecircumflex","ecircumflexacute",
"ecircumflexbelow","ecircumflexdotbelow","ecircumflexgrave",
"ecircumflexhookabove","ecircumflextilde","ecyrillic","edblgrave","edeva",
"edieresis","edot","edotaccent","edotbelow","eegurmukhi","eematragurmukhi",
"efcyrillic","egrave","egujarati","eharmenian","ehbopomofo","ehiragana",
"ehookabove","eibopomofo","eight","eightarabic","eightbengali","eightcircle",
"eightcircleinversesansserif","eightdeva","eighteencircle","eighteenparen",
"eighteenperiod","eightgujarati","eightgurmukhi","eighthackarabic",
"eighthangzhou","eighthnotebeamed","eightideographicparen","eightinferior",
"eightmonospace","eightoldstyle","eightparen","eightperiod","eightpersian",
"eightroman","eightsuperior","eightthai","einvertedbreve","eiotifiedcyrillic",
"ekatakana","ekatakanahalfwidth","ekonkargurmukhi","ekorean","elcyrillic",
"element","elevencircle","elevenparen","elevenperiod","elevenroman",
"ellipsis","ellipsisvertical","emacron","emacronacute","emacrongrave",
"emcyrillic","emdash","emdashvertical","emonospace","emphasismarkarmenian",
"emptyset","enbopomofo","encyrillic","endash","endashvertical",
"endescendercyrillic","eng","engbopomofo","enghecyrillic","enhookcyrillic",
"enspace","eogonek","eokorean","eopen","eopenclosed","eopenreversed",
"eopenreversedclosed","eopenreversedhook","eparen","epsilon","epsilontonos",
"equal","equalmonospace","equalsmall","equalsuperior","equivalence",
"erbopomofo","ercyrillic","ereversed","ereversedcyrillic","escyrillic",
"esdescendercyrillic","esh","eshcurl","eshortdeva","eshortvowelsigndeva",
"eshreversedloop","eshsquatreversed","esmallhiragana","esmallkatakana",
"esmallkatakanahalfwidth","estimated","esuperior","eta","etarmenian",
"etatonos","eth","etilde","etildebelow","etnahtafoukhhebrew",
"etnahtafoukhlefthebrew","etnahtahebrew","etnahtalefthebrew","eturned",
"eukorean","euro","evowelsignbengali","evowelsigndeva","evowelsigngujarati",
"exclam","exclamarmenian","exclamdbl","exclamdown","exclamdownsmall",
"exclammonospace","exclamsmall","existential","ezh","ezhcaron","ezhcurl",
"ezhreversed","ezhtail","f","fadeva","fagurmukhi","fahrenheit","fathaarabic",
"fathalowarabic","fathatanarabic","fbopomofo","fcircle","fdotaccent",
"feharabic","feharmenian","fehfinalarabic","fehinitialarabic",
"fehmedialarabic","feicoptic","female","ff","ffi","ffl","fi","fifteencircle",
"fifteenparen","fifteenperiod","figuredash","filledbox","filledrect",
"finalkaf","finalkafdagesh","finalkafdageshhebrew","finalkafhebrew",
"finalkafqamats","finalkafqamatshebrew","finalkafsheva","finalkafshevahebrew",
"finalmem","finalmemhebrew","finalnun","finalnunhebrew","finalpe",
"finalpehebrew","finaltsadi","finaltsadihebrew","firsttonechinese","fisheye",
"fitacyrillic","five","fivearabic","fivebengali","fivecircle",
"fivecircleinversesansserif","fivedeva","fiveeighths","fivegujarati",
"fivegurmukhi","fivehackarabic","fivehangzhou","fiveideographicparen",
"fiveinferior","fivemonospace","fiveoldstyle","fiveparen","fiveperiod",
"fivepersian","fiveroman","fivesuperior","fivethai","fl","florin",
"fmonospace","fmsquare","fofanthai","fofathai","fongmanthai","forall","four",
"fourarabic","fourbengali","fourcircle","fourcircleinversesansserif",
"fourdeva","fourgujarati","fourgurmukhi","fourhackarabic","fourhangzhou",
"fourideographicparen","fourinferior","fourmonospace","fournumeratorbengali",
"fouroldstyle","fourparen","fourperiod","fourpersian","fourroman",
"foursuperior","fourteencircle","fourteenparen","fourteenperiod","fourthai",
"fourthtonechinese","fparen","fraction","franc","g","gabengali","gacute",
"gadeva","gafarabic","gaffinalarabic","gafinitialarabic","gafmedialarabic",
"gagujarati","gagurmukhi","gahiragana","gakatakana","gamma","gammalatinsmall",
"gammasuperior","gangiacoptic","gbopomofo","gbreve","gcaron","gcedilla",
"gcircle","gcircumflex","gcommaaccent","gdot","gdotaccent","gecyrillic",
"gehiragana","gekatakana","geometricallyequal","gereshaccenthebrew",
"gereshhebrew","gereshmuqdamhebrew","germandbls","gershayimaccenthebrew",
"gershayimhebrew","getamark","ghabengali","ghadarmenian","ghadeva",
"ghagujarati","ghagurmukhi","ghainarabic","ghainfinalarabic",
"ghaininitialarabic","ghainmedialarabic","ghemiddlehookcyrillic",
"ghestrokecyrillic","gheupturncyrillic","ghhadeva","ghhagurmukhi","ghook",
"ghzsquare","gihiragana","gikatakana","gimarmenian","gimel","gimeldagesh",
"gimeldageshhebrew","gimelhebrew","gjecyrillic","glottalinvertedstroke",
"glottalstop","glottalstopinverted","glottalstopmod","glottalstopreversed",
"glottalstopreversedmod","glottalstopreversedsuperior","glottalstopstroke",
"glottalstopstrokereversed","gmacron","gmonospace","gohiragana","gokatakana",
"gparen","gpasquare","gradient","grave","gravebelowcmb","gravecmb",
"gravecomb","gravedeva","gravelowmod","gravemonospace","gravetonecmb",
"greater","greaterequal","greaterequalorless","greatermonospace",
"greaterorequivalent","greaterorless","greateroverequal","greatersmall",
"gscript","gstroke","guhiragana","guillemotleft","guillemotright",
"guilsinglleft","guilsinglright","gukatakana","guramusquare","gysquare","h",
"haabkhasiancyrillic","haaltonearabic","habengali","hadescendercyrillic",
"hadeva","hagujarati","hagurmukhi","haharabic","hahfinalarabic",
"hahinitialarabic","hahiragana","hahmedialarabic","haitusquare","hakatakana",
"hakatakanahalfwidth","halantgurmukhi","hamzaarabic","hamzadammaarabic",
"hamzadammatanarabic","hamzafathaarabic","hamzafathatanarabic",
"hamzalowarabic","hamzalowkasraarabic","hamzalowkasratanarabic",
"hamzasukunarabic","hangulfiller","hardsigncyrillic","harpoonleftbarbup",
"harpoonrightbarbup","hasquare","hatafpatah","hatafpatah16","hatafpatah23",
"hatafpatah2f","hatafpatahhebrew","hatafpatahnarrowhebrew",
"hatafpatahquarterhebrew","hatafpatahwidehebrew","hatafqamats",
"hatafqamats1b","hatafqamats28","hatafqamats34","hatafqamatshebrew",
"hatafqamatsnarrowhebrew","hatafqamatsquarterhebrew","hatafqamatswidehebrew",
"hatafsegol","hatafsegol17","hatafsegol24","hatafsegol30","hatafsegolhebrew",
"hatafsegolnarrowhebrew","hatafsegolquarterhebrew","hatafsegolwidehebrew",
"hbar","hbopomofo","hbrevebelow","hcedilla","hcircle","hcircumflex",
"hdieresis","hdotaccent","hdotbelow","he","heart","heartsuitblack",
"heartsuitwhite","hedagesh","hedageshhebrew","hehaltonearabic","heharabic",
"hehebrew","hehfinalaltonearabic","hehfinalalttwoarabic","hehfinalarabic",
"hehhamzaabovefinalarabic","hehhamzaaboveisolatedarabic",
"hehinitialaltonearabic","hehinitialarabic","hehiragana",
"hehmedialaltonearabic","hehmedialarabic","heiseierasquare","hekatakana",
"hekatakanahalfwidth","hekutaarusquare","henghook","herutusquare","het",
"hethebrew","hhook","hhooksuperior","hieuhacirclekorean","hieuhaparenkorean",
"hieuhcirclekorean","hieuhkorean","hieuhparenkorean","hihiragana",
"hikatakana","hikatakanahalfwidth","hiriq","hiriq14","hiriq21","hiriq2d",
"hiriqhebrew","hiriqnarrowhebrew","hiriqquarterhebrew","hiriqwidehebrew",
"hlinebelow","hmonospace","hoarmenian","hohipthai","hohiragana","hokatakana",
"hokatakanahalfwidth","holam","holam19","holam26","holam32","holamhebrew",
"holamnarrowhebrew","holamquarterhebrew","holamwidehebrew","honokhukthai",
"hookabovecomb","hookcmb","hookpalatalizedbelowcmb","hookretroflexbelowcmb",
"hoonsquare","horicoptic","horizontalbar","horncmb","hotsprings","house",
"hparen","hsuperior","hturned","huhiragana","huiitosquare","hukatakana",
"hukatakanahalfwidth","hungarumlaut","hungarumlautcmb","hv","hyphen",
"hypheninferior","hyphenmonospace","hyphensmall","hyphensuperior","hyphentwo",
"i","iacute","iacyrillic","ibengali","ibopomofo","ibreve","icaron","icircle",
"icircumflex","icyrillic","idblgrave","ideographearthcircle",
"ideographfirecircle","ideographicallianceparen","ideographiccallparen",
"ideographiccentrecircle","ideographicclose","ideographiccomma",
"ideographiccommaleft","ideographiccongratulationparen",
"ideographiccorrectcircle","ideographicearthparen",
"ideographicenterpriseparen","ideographicexcellentcircle",
"ideographicfestivalparen","ideographicfinancialcircle",
"ideographicfinancialparen","ideographicfireparen","ideographichaveparen",
"ideographichighcircle","ideographiciterationmark","ideographiclaborcircle",
"ideographiclaborparen","ideographicleftcircle","ideographiclowcircle",
"ideographicmedicinecircle","ideographicmetalparen","ideographicmoonparen",
"ideographicnameparen","ideographicperiod","ideographicprintcircle",
"ideographicreachparen","ideographicrepresentparen",
"ideographicresourceparen","ideographicrightcircle","ideographicsecretcircle",
"ideographicselfparen","ideographicsocietyparen","ideographicspace",
"ideographicspecialparen","ideographicstockparen","ideographicstudyparen",
"ideographicsunparen","ideographicsuperviseparen","ideographicwaterparen",
"ideographicwoodparen","ideographiczero","ideographmetalcircle",
"ideographmooncircle","ideographnamecircle","ideographsuncircle",
"ideographwatercircle","ideographwoodcircle","ideva","idieresis",
"idieresisacute","idieresiscyrillic","idotbelow","iebrevecyrillic",
"iecyrillic","ieungacirclekorean","ieungaparenkorean","ieungcirclekorean",
"ieungkorean","ieungparenkorean","igrave","igujarati","igurmukhi","ihiragana",
"ihookabove","iibengali","iicyrillic","iideva","iigujarati","iigurmukhi",
"iimatragurmukhi","iinvertedbreve","iishortcyrillic","iivowelsignbengali",
"iivowelsigndeva","iivowelsigngujarati","ij","ikatakana","ikatakanahalfwidth",
"ikorean","ilde","iluyhebrew","imacron","imacroncyrillic",
"imageorapproximatelyequal","imatragurmukhi","imonospace","increment",
"infinity","iniarmenian","integral","integralbottom","integralbt",
"integralex","integraltop","integraltp","intersection","intisquare",
"invbullet","invcircle","invsmileface","iocyrillic","iogonek","iota",
"iotadieresis","iotadieresistonos","iotalatin","iotatonos","iparen",
"irigurmukhi","ismallhiragana","ismallkatakana","ismallkatakanahalfwidth",
"issharbengali","istroke","isuperior","iterationhiragana","iterationkatakana",
"itilde","itildebelow","iubopomofo","iucyrillic","ivowelsignbengali",
"ivowelsigndeva","ivowelsigngujarati","izhitsacyrillic",
"izhitsadblgravecyrillic","j","jaarmenian","jabengali","jadeva","jagujarati",
"jagurmukhi","jbopomofo","jcaron","jcircle","jcircumflex","jcrossedtail",
"jdotlessstroke","jecyrillic","jeemarabic","jeemfinalarabic",
"jeeminitialarabic","jeemmedialarabic","jeharabic","jehfinalarabic",
"jhabengali","jhadeva","jhagujarati","jhagurmukhi","jheharmenian","jis",
"jmonospace","jparen","jsuperior","k","kabashkircyrillic","kabengali",
"kacute","kacyrillic","kadescendercyrillic","kadeva","kaf","kafarabic",
"kafdagesh","kafdageshhebrew","kaffinalarabic","kafhebrew","kafinitialarabic",
"kafmedialarabic","kafrafehebrew","kagujarati","kagurmukhi","kahiragana",
"kahookcyrillic","kakatakana","kakatakanahalfwidth","kappa",
"kappasymbolgreek","kapyeounmieumkorean","kapyeounphieuphkorean",
"kapyeounpieupkorean","kapyeounssangpieupkorean","karoriisquare",
"kashidaautoarabic","kashidaautonosidebearingarabic","kasmallkatakana",
"kasquare","kasraarabic","kasratanarabic","kastrokecyrillic",
"katahiraprolongmarkhalfwidth","kaverticalstrokecyrillic","kbopomofo",
"kcalsquare","kcaron","kcedilla","kcircle","kcommaaccent","kdotbelow",
"keharmenian","kehiragana","kekatakana","kekatakanahalfwidth","kenarmenian",
"kesmallkatakana","kgreenlandic","khabengali","khacyrillic","khadeva",
"khagujarati","khagurmukhi","khaharabic","khahfinalarabic",
"khahinitialarabic","khahmedialarabic","kheicoptic","khhadeva","khhagurmukhi",
"khieukhacirclekorean","khieukhaparenkorean","khieukhcirclekorean",
"khieukhkorean","khieukhparenkorean","khokhaithai","khokhonthai",
"khokhuatthai","khokhwaithai","khomutthai","khook","khorakhangthai",
"khzsquare","kihiragana","kikatakana","kikatakanahalfwidth",
"kiroguramusquare","kiromeetorusquare","kirosquare","kiyeokacirclekorean",
"kiyeokaparenkorean","kiyeokcirclekorean","kiyeokkorean","kiyeokparenkorean",
"kiyeoksioskorean","kjecyrillic","klinebelow","klsquare","kmcubedsquare",
"kmonospace","kmsquaredsquare","kohiragana","kohmsquare","kokaithai",
"kokatakana","kokatakanahalfwidth","kooposquare","koppacyrillic",
"koreanstandardsymbol","koroniscmb","kparen","kpasquare","ksicyrillic",
"ktsquare","kturned","kuhiragana","kukatakana","kukatakanahalfwidth",
"kvsquare","kwsquare","l","labengali","lacute","ladeva","lagujarati",
"lagurmukhi","lakkhangyaothai","lamaleffinalarabic",
"lamalefhamzaabovefinalarabic","lamalefhamzaaboveisolatedarabic",
"lamalefhamzabelowfinalarabic","lamalefhamzabelowisolatedarabic",
"lamalefisolatedarabic","lamalefmaddaabovefinalarabic",
"lamalefmaddaaboveisolatedarabic","lamarabic","lambda","lambdastroke","lamed",
"lameddagesh","lameddageshhebrew","lamedhebrew","lamedholam",
"lamedholamdagesh","lamedholamdageshhebrew","lamedholamhebrew",
"lamfinalarabic","lamhahinitialarabic","laminitialarabic",
"lamjeeminitialarabic","lamkhahinitialarabic","lamlamhehisolatedarabic",
"lammedialarabic","lammeemhahinitialarabic","lammeeminitialarabic",
"lammeemjeeminitialarabic","lammeemkhahinitialarabic","largecircle","lbar",
"lbelt","lbopomofo","lcaron","lcedilla","lcircle","lcircumflexbelow",
"lcommaaccent","ldot","ldotaccent","ldotbelow","ldotbelowmacron",
"leftangleabovecmb","lefttackbelowcmb","less","lessequal",
"lessequalorgreater","lessmonospace","lessorequivalent","lessorgreater",
"lessoverequal","lesssmall","lezh","lfblock","lhookretroflex","lira",
"liwnarmenian","lj","ljecyrillic","ll","lladeva","llagujarati","llinebelow",
"llladeva","llvocalicbengali","llvocalicdeva","llvocalicvowelsignbengali",
"llvocalicvowelsigndeva","lmiddletilde","lmonospace","lmsquare","lochulathai",
"logicaland","logicalnot","logicalnotreversed","logicalor","lolingthai",
"longs","lowlinecenterline","lowlinecmb","lowlinedashed","lozenge","lparen",
"lslash","lsquare","lsuperior","ltshade","luthai","lvocalicbengali",
"lvocalicdeva","lvocalicvowelsignbengali","lvocalicvowelsigndeva","lxsquare",
"m","mabengali","macron","macronbelowcmb","macroncmb","macronlowmod",
"macronmonospace","macute","madeva","magujarati","magurmukhi",
"mahapakhhebrew","mahapakhlefthebrew","mahiragana","maichattawalowleftthai",
"maichattawalowrightthai","maichattawathai","maichattawaupperleftthai",
"maieklowleftthai","maieklowrightthai","maiekthai","maiekupperleftthai",
"maihanakatleftthai","maihanakatthai","maitaikhuleftthai","maitaikhuthai",
"maitholowleftthai","maitholowrightthai","maithothai","maithoupperleftthai",
"maitrilowleftthai","maitrilowrightthai","maitrithai","maitriupperleftthai",
"maiyamokthai","makatakana","makatakanahalfwidth","male","mansyonsquare",
"maqafhebrew","mars","masoracirclehebrew","masquare","mbopomofo","mbsquare",
"mcircle","mcubedsquare","mdotaccent","mdotbelow","meemarabic",
"meemfinalarabic","meeminitialarabic","meemmedialarabic",
"meemmeeminitialarabic","meemmeemisolatedarabic","meetorusquare","mehiragana",
"meizierasquare","mekatakana","mekatakanahalfwidth","mem","memdagesh",
"memdageshhebrew","memhebrew","menarmenian","merkhahebrew",
"merkhakefulahebrew","merkhakefulalefthebrew","merkhalefthebrew","mhook",
"mhzsquare","middledotkatakanahalfwidth","middot","mieumacirclekorean",
"mieumaparenkorean","mieumcirclekorean","mieumkorean","mieumpansioskorean",
"mieumparenkorean","mieumpieupkorean","mieumsioskorean","mihiragana",
"mikatakana","mikatakanahalfwidth","minus","minusbelowcmb","minuscircle",
"minusmod","minusplus","minute","miribaarusquare","mirisquare",
"mlonglegturned","mlsquare","mmcubedsquare","mmonospace","mmsquaredsquare",
"mohiragana","mohmsquare","mokatakana","mokatakanahalfwidth","molsquare",
"momathai","moverssquare","moverssquaredsquare","mparen","mpasquare",
"mssquare","msuperior","mturned","mu","mu1","muasquare","muchgreater",
"muchless","mufsquare","mugreek","mugsquare","muhiragana","mukatakana",
"mukatakanahalfwidth","mulsquare","multiply","mumsquare","munahhebrew",
"munahlefthebrew","musicalnote","musicalnotedbl","musicflatsign",
"musicsharpsign","mussquare","muvsquare","muwsquare","mvmegasquare",
"mvsquare","mwmegasquare","mwsquare","n","nabengali","nabla","nacute",
"nadeva","nagujarati","nagurmukhi","nahiragana","nakatakana",
"nakatakanahalfwidth","napostrophe","nasquare","nbopomofo","nbspace","ncaron",
"ncedilla","ncircle","ncircumflexbelow","ncommaaccent","ndotaccent",
"ndotbelow","nehiragana","nekatakana","nekatakanahalfwidth","newsheqelsign",
"nfsquare","ngabengali","ngadeva","ngagujarati","ngagurmukhi","ngonguthai",
"nhiragana","nhookleft","nhookretroflex","nieunacirclekorean",
"nieunaparenkorean","nieuncieuckorean","nieuncirclekorean","nieunhieuhkorean",
"nieunkorean","nieunpansioskorean","nieunparenkorean","nieunsioskorean",
"nieuntikeutkorean","nihiragana","nikatakana","nikatakanahalfwidth",
"nikhahitleftthai","nikhahitthai","nine","ninearabic","ninebengali",
"ninecircle","ninecircleinversesansserif","ninedeva","ninegujarati",
"ninegurmukhi","ninehackarabic","ninehangzhou","nineideographicparen",
"nineinferior","ninemonospace","nineoldstyle","nineparen","nineperiod",
"ninepersian","nineroman","ninesuperior","nineteencircle","nineteenparen",
"nineteenperiod","ninethai","nj","njecyrillic","nkatakana",
"nkatakanahalfwidth","nlegrightlong","nlinebelow","nmonospace","nmsquare",
"nnabengali","nnadeva","nnagujarati","nnagurmukhi","nnnadeva","nohiragana",
"nokatakana","nokatakanahalfwidth","nonbreakingspace","nonenthai","nonuthai",
"noonarabic","noonfinalarabic","noonghunnaarabic","noonghunnafinalarabic",
"noonhehinitialarabic","nooninitialarabic","noonjeeminitialarabic",
"noonjeemisolatedarabic","noonmedialarabic","noonmeeminitialarabic",
"noonmeemisolatedarabic","noonnoonfinalarabic","notcontains","notelement",
"notelementof","notequal","notgreater","notgreaternorequal",
"notgreaternorless","notidentical","notless","notlessnorequal","notparallel",
"notprecedes","notsubset","notsucceeds","notsuperset","nowarmenian","nparen",
"nssquare","nsuperior","ntilde","nu","nuhiragana","nukatakana",
"nukatakanahalfwidth","nuktabengali","nuktadeva","nuktagujarati",
"nuktagurmukhi","numbersign","numbersignmonospace","numbersignsmall",
"numeralsigngreek","numeralsignlowergreek","numero","nun","nundagesh",
"nundageshhebrew","nunhebrew","nvsquare","nwsquare","nyabengali","nyadeva",
"nyagujarati","nyagurmukhi","o","oacute","oangthai","obarred",
"obarredcyrillic","obarreddieresiscyrillic","obengali","obopomofo","obreve",
"ocandradeva","ocandragujarati","ocandravowelsigndeva",
"ocandravowelsigngujarati","ocaron","ocircle","ocircumflex",
"ocircumflexacute","ocircumflexdotbelow","ocircumflexgrave",
"ocircumflexhookabove","ocircumflextilde","ocyrillic","odblacute","odblgrave",
"odeva","odieresis","odieresiscyrillic","odotbelow","oe","oekorean","ogonek",
"ogonekcmb","ograve","ogujarati","oharmenian","ohiragana","ohookabove",
"ohorn","ohornacute","ohorndotbelow","ohorngrave","ohornhookabove",
"ohorntilde","ohungarumlaut","oi","oinvertedbreve","okatakana",
"okatakanahalfwidth","okorean","olehebrew","omacron","omacronacute",
"omacrongrave","omdeva","omega","omega1","omegacyrillic","omegalatinclosed",
"omegaroundcyrillic","omegatitlocyrillic","omegatonos","omgujarati","omicron",
"omicrontonos","omonospace","one","onearabic","onebengali","onecircle",
"onecircleinversesansserif","onedeva","onedotenleader","oneeighth",
"onefitted","onegujarati","onegurmukhi","onehackarabic","onehalf",
"onehangzhou","oneideographicparen","oneinferior","onemonospace",
"onenumeratorbengali","oneoldstyle","oneparen","oneperiod","onepersian",
"onequarter","oneroman","onesuperior","onethai","onethird","oogonek",
"oogonekmacron","oogurmukhi","oomatragurmukhi","oopen","oparen","openbullet",
"option","ordfeminine","ordmasculine","orthogonal","oshortdeva",
"oshortvowelsigndeva","oslash","oslashacute","osmallhiragana",
"osmallkatakana","osmallkatakanahalfwidth","ostrokeacute","osuperior",
"otcyrillic","otilde","otildeacute","otildedieresis","oubopomofo","overline",
"overlinecenterline","overlinecmb","overlinedashed","overlinedblwavy",
"overlinewavy","overscore","ovowelsignbengali","ovowelsigndeva",
"ovowelsigngujarati","p","paampssquare","paasentosquare","pabengali","pacute",
"padeva","pagedown","pageup","pagujarati","pagurmukhi","pahiragana",
"paiyannoithai","pakatakana","palatalizationcyrilliccmb","palochkacyrillic",
"pansioskorean","paragraph","parallel","parenleft","parenleftaltonearabic",
"parenleftbt","parenleftex","parenleftinferior","parenleftmonospace",
"parenleftsmall","parenleftsuperior","parenlefttp","parenleftvertical",
"parenright","parenrightaltonearabic","parenrightbt","parenrightex",
"parenrightinferior","parenrightmonospace","parenrightsmall",
"parenrightsuperior","parenrighttp","parenrightvertical","partialdiff",
"paseqhebrew","pashtahebrew","pasquare","patah","patah11","patah1d","patah2a",
"patahhebrew","patahnarrowhebrew","patahquarterhebrew","patahwidehebrew",
"pazerhebrew","pbopomofo","pcircle","pdotaccent","pe","pecyrillic","pedagesh",
"pedageshhebrew","peezisquare","pefinaldageshhebrew","peharabic",
"peharmenian","pehebrew","pehfinalarabic","pehinitialarabic","pehiragana",
"pehmedialarabic","pekatakana","pemiddlehookcyrillic","perafehebrew",
"percent","percentarabic","percentmonospace","percentsmall","period",
"periodarmenian","periodcentered","periodhalfwidth","periodinferior",
"periodmonospace","periodsmall","periodsuperior","perispomenigreekcmb",
"perpendicular","perthousand","peseta","pfsquare","phabengali","phadeva",
"phagujarati","phagurmukhi","phi","phi1","phieuphacirclekorean",
"phieuphaparenkorean","phieuphcirclekorean","phieuphkorean",
"phieuphparenkorean","philatin","phinthuthai","phisymbolgreek","phook",
"phophanthai","phophungthai","phosamphaothai","pi","pieupacirclekorean",
"pieupaparenkorean","pieupcieuckorean","pieupcirclekorean",
"pieupkiyeokkorean","pieupkorean","pieupparenkorean","pieupsioskiyeokkorean",
"pieupsioskorean","pieupsiostikeutkorean","pieupthieuthkorean",
"pieuptikeutkorean","pihiragana","pikatakana","pisymbolgreek","piwrarmenian",
"plus","plusbelowcmb","pluscircle","plusminus","plusmod","plusmonospace",
"plussmall","plussuperior","pmonospace","pmsquare","pohiragana",
"pointingindexdownwhite","pointingindexleftwhite","pointingindexrightwhite",
"pointingindexupwhite","pokatakana","poplathai","postalmark","postalmarkface",
"pparen","precedes","prescription","primemod","primereversed","product",
"projective","prolongedkana","propellor","propersubset","propersuperset",
"proportion","proportional","psi","psicyrillic","psilipneumatacyrilliccmb",
"pssquare","puhiragana","pukatakana","pvsquare","pwsquare","q","qadeva",
"qadmahebrew","qafarabic","qaffinalarabic","qafinitialarabic",
"qafmedialarabic","qamats","qamats10","qamats1a","qamats1c","qamats27",
"qamats29","qamats33","qamatsde","qamatshebrew","qamatsnarrowhebrew",
"qamatsqatanhebrew","qamatsqatannarrowhebrew","qamatsqatanquarterhebrew",
"qamatsqatanwidehebrew","qamatsquarterhebrew","qamatswidehebrew",
"qarneyparahebrew","qbopomofo","qcircle","qhook","qmonospace","qof",
"qofdagesh","qofdageshhebrew","qofhatafpatah","qofhatafpatahhebrew",
"qofhatafsegol","qofhatafsegolhebrew","qofhebrew","qofhiriq","qofhiriqhebrew",
"qofholam","qofholamhebrew","qofpatah","qofpatahhebrew","qofqamats",
"qofqamatshebrew","qofqubuts","qofqubutshebrew","qofsegol","qofsegolhebrew",
"qofsheva","qofshevahebrew","qoftsere","qoftserehebrew","qparen",
"quarternote","qubuts","qubuts18","qubuts25","qubuts31","qubutshebrew",
"qubutsnarrowhebrew","qubutsquarterhebrew","qubutswidehebrew","question",
"questionarabic","questionarmenian","questiondown","questiondownsmall",
"questiongreek","questionmonospace","questionsmall","quotedbl","quotedblbase",
"quotedblleft","quotedblmonospace","quotedblprime","quotedblprimereversed",
"quotedblright","quoteleft","quoteleftreversed","quotereversed","quoteright",
"quoterightn","quotesinglbase","quotesingle","quotesinglemonospace","r",
"raarmenian","rabengali","racute","radeva","radical","radicalex",
"radoverssquare","radoverssquaredsquare","radsquare","rafe","rafehebrew",
"ragujarati","ragurmukhi","rahiragana","rakatakana","rakatakanahalfwidth",
"ralowerdiagonalbengali","ramiddlediagonalbengali","ramshorn","ratio",
"rbopomofo","rcaron","rcedilla","rcircle","rcommaaccent","rdblgrave",
"rdotaccent","rdotbelow","rdotbelowmacron","referencemark","reflexsubset",
"reflexsuperset","registered","registersans","registerserif","reharabic",
"reharmenian","rehfinalarabic","rehiragana","rehyehaleflamarabic",
"rekatakana","rekatakanahalfwidth","resh","reshdageshhebrew","reshhatafpatah",
"reshhatafpatahhebrew","reshhatafsegol","reshhatafsegolhebrew","reshhebrew",
"reshhiriq","reshhiriqhebrew","reshholam","reshholamhebrew","reshpatah",
"reshpatahhebrew","reshqamats","reshqamatshebrew","reshqubuts",
"reshqubutshebrew","reshsegol","reshsegolhebrew","reshsheva",
"reshshevahebrew","reshtsere","reshtserehebrew","reversedtilde","reviahebrew",
"reviamugrashhebrew","revlogicalnot","rfishhook","rfishhookreversed",
"rhabengali","rhadeva","rho","rhook","rhookturned","rhookturnedsuperior",
"rhosymbolgreek","rhotichookmod","rieulacirclekorean","rieulaparenkorean",
"rieulcirclekorean","rieulhieuhkorean","rieulkiyeokkorean",
"rieulkiyeoksioskorean","rieulkorean","rieulmieumkorean","rieulpansioskorean",
"rieulparenkorean","rieulphieuphkorean","rieulpieupkorean",
"rieulpieupsioskorean","rieulsioskorean","rieulthieuthkorean",
"rieultikeutkorean","rieulyeorinhieuhkorean","rightangle","righttackbelowcmb",
"righttriangle","rihiragana","rikatakana","rikatakanahalfwidth","ring",
"ringbelowcmb","ringcmb","ringhalfleft","ringhalfleftarmenian",
"ringhalfleftbelowcmb","ringhalfleftcentered","ringhalfright",
"ringhalfrightbelowcmb","ringhalfrightcentered","rinvertedbreve",
"rittorusquare","rlinebelow","rlongleg","rlonglegturned","rmonospace",
"rohiragana","rokatakana","rokatakanahalfwidth","roruathai","rparen",
"rrabengali","rradeva","rragurmukhi","rreharabic","rrehfinalarabic",
"rrvocalicbengali","rrvocalicdeva","rrvocalicgujarati",
"rrvocalicvowelsignbengali","rrvocalicvowelsigndeva",
"rrvocalicvowelsigngujarati","rsuperior","rtblock","rturned",
"rturnedsuperior","ruhiragana","rukatakana","rukatakanahalfwidth",
"rupeemarkbengali","rupeesignbengali","rupiah","ruthai","rvocalicbengali",
"rvocalicdeva","rvocalicgujarati","rvocalicvowelsignbengali",
"rvocalicvowelsigndeva","rvocalicvowelsigngujarati","s","sabengali","sacute",
"sacutedotaccent","sadarabic","sadeva","sadfinalarabic","sadinitialarabic",
"sadmedialarabic","sagujarati","sagurmukhi","sahiragana","sakatakana",
"sakatakanahalfwidth","sallallahoualayhewasallamarabic","samekh",
"samekhdagesh","samekhdageshhebrew","samekhhebrew","saraaathai","saraaethai",
"saraaimaimalaithai","saraaimaimuanthai","saraamthai","saraathai","saraethai",
"saraiileftthai","saraiithai","saraileftthai","saraithai","saraothai",
"saraueeleftthai","saraueethai","saraueleftthai","sarauethai","sarauthai",
"sarauuthai","sbopomofo","scaron","scarondotaccent","scedilla","schwa",
"schwacyrillic","schwadieresiscyrillic","schwahook","scircle","scircumflex",
"scommaaccent","sdotaccent","sdotbelow","sdotbelowdotaccent",
"seagullbelowcmb","second","secondtonechinese","section","seenarabic",
"seenfinalarabic","seeninitialarabic","seenmedialarabic","segol","segol13",
"segol1f","segol2c","segolhebrew","segolnarrowhebrew","segolquarterhebrew",
"segoltahebrew","segolwidehebrew","seharmenian","sehiragana","sekatakana",
"sekatakanahalfwidth","semicolon","semicolonarabic","semicolonmonospace",
"semicolonsmall","semivoicedmarkkana","semivoicedmarkkanahalfwidth",
"sentisquare","sentosquare","seven","sevenarabic","sevenbengali",
"sevencircle","sevencircleinversesansserif","sevendeva","seveneighths",
"sevengujarati","sevengurmukhi","sevenhackarabic","sevenhangzhou",
"sevenideographicparen","seveninferior","sevenmonospace","sevenoldstyle",
"sevenparen","sevenperiod","sevenpersian","sevenroman","sevensuperior",
"seventeencircle","seventeenparen","seventeenperiod","seventhai","sfthyphen",
"shaarmenian","shabengali","shacyrillic","shaddaarabic","shaddadammaarabic",
"shaddadammatanarabic","shaddafathaarabic","shaddafathatanarabic",
"shaddakasraarabic","shaddakasratanarabic","shade","shadedark","shadelight",
"shademedium","shadeva","shagujarati","shagurmukhi","shalshelethebrew",
"shbopomofo","shchacyrillic","sheenarabic","sheenfinalarabic",
"sheeninitialarabic","sheenmedialarabic","sheicoptic","sheqel","sheqelhebrew",
"sheva","sheva115","sheva15","sheva22","sheva2e","shevahebrew",
"shevanarrowhebrew","shevaquarterhebrew","shevawidehebrew","shhacyrillic",
"shimacoptic","shin","shindagesh","shindageshhebrew","shindageshshindot",
"shindageshshindothebrew","shindageshsindot","shindageshsindothebrew",
"shindothebrew","shinhebrew","shinshindot","shinshindothebrew","shinsindot",
"shinsindothebrew","shook","sigma","sigma1","sigmafinal",
"sigmalunatesymbolgreek","sihiragana","sikatakana","sikatakanahalfwidth",
"siluqhebrew","siluqlefthebrew","similar","sindothebrew","siosacirclekorean",
"siosaparenkorean","sioscieuckorean","sioscirclekorean","sioskiyeokkorean",
"sioskorean","siosnieunkorean","siosparenkorean","siospieupkorean",
"siostikeutkorean","six","sixarabic","sixbengali","sixcircle",
"sixcircleinversesansserif","sixdeva","sixgujarati","sixgurmukhi",
"sixhackarabic","sixhangzhou","sixideographicparen","sixinferior",
"sixmonospace","sixoldstyle","sixparen","sixperiod","sixpersian","sixroman",
"sixsuperior","sixteencircle","sixteencurrencydenominatorbengali",
"sixteenparen","sixteenperiod","sixthai","slash","slashmonospace","slong",
"slongdotaccent","smileface","smonospace","sofpasuqhebrew","softhyphen",
"softsigncyrillic","sohiragana","sokatakana","sokatakanahalfwidth",
"soliduslongoverlaycmb","solidusshortoverlaycmb","sorusithai","sosalathai",
"sosothai","sosuathai","space","spacehackarabic","spade","spadesuitblack",
"spadesuitwhite","sparen","squarebelowcmb","squarecc","squarecm",
"squarediagonalcrosshatchfill","squarehorizontalfill","squarekg","squarekm",
"squarekmcapital","squareln","squarelog","squaremg","squaremil","squaremm",
"squaremsquared","squareorthogonalcrosshatchfill",
"squareupperlefttolowerrightfill","squareupperrighttolowerleftfill",
"squareverticalfill","squarewhitewithsmallblack","srsquare","ssabengali",
"ssadeva","ssagujarati","ssangcieuckorean","ssanghieuhkorean",
"ssangieungkorean","ssangkiyeokkorean","ssangnieunkorean","ssangpieupkorean",
"ssangsioskorean","ssangtikeutkorean","ssuperior","sterling",
"sterlingmonospace","strokelongoverlaycmb","strokeshortoverlaycmb","subset",
"subsetnotequal","subsetorequal","succeeds","suchthat","suhiragana",
"sukatakana","sukatakanahalfwidth","sukunarabic","summation","sun","superset",
"supersetnotequal","supersetorequal","svsquare","syouwaerasquare","t",
"tabengali","tackdown","tackleft","tadeva","tagujarati","tagurmukhi",
"taharabic","tahfinalarabic","tahinitialarabic","tahiragana",
"tahmedialarabic","taisyouerasquare","takatakana","takatakanahalfwidth",
"tatweelarabic","tau","tav","tavdages","tavdagesh","tavdageshhebrew",
"tavhebrew","tbar","tbopomofo","tcaron","tccurl","tcedilla","tcheharabic",
"tchehfinalarabic","tchehinitialarabic","tchehmedialarabic",
"tchehmeeminitialarabic","tcircle","tcircumflexbelow","tcommaaccent",
"tdieresis","tdotaccent","tdotbelow","tecyrillic","tedescendercyrillic",
"teharabic","tehfinalarabic","tehhahinitialarabic","tehhahisolatedarabic",
"tehinitialarabic","tehiragana","tehjeeminitialarabic",
"tehjeemisolatedarabic","tehmarbutaarabic","tehmarbutafinalarabic",
"tehmedialarabic","tehmeeminitialarabic","tehmeemisolatedarabic",
"tehnoonfinalarabic","tekatakana","tekatakanahalfwidth","telephone",
"telephoneblack","telishagedolahebrew","telishaqetanahebrew","tencircle",
"tenideographicparen","tenparen","tenperiod","tenroman","tesh","tet",
"tetdagesh","tetdageshhebrew","tethebrew","tetsecyrillic","tevirhebrew",
"tevirlefthebrew","thabengali","thadeva","thagujarati","thagurmukhi",
"thalarabic","thalfinalarabic","thanthakhatlowleftthai",
"thanthakhatlowrightthai","thanthakhatthai","thanthakhatupperleftthai",
"theharabic","thehfinalarabic","thehinitialarabic","thehmedialarabic",
"thereexists","therefore","theta","theta1","thetasymbolgreek",
"thieuthacirclekorean","thieuthaparenkorean","thieuthcirclekorean",
"thieuthkorean","thieuthparenkorean","thirteencircle","thirteenparen",
"thirteenperiod","thonangmonthothai","thook","thophuthaothai","thorn",
"thothahanthai","thothanthai","thothongthai","thothungthai",
"thousandcyrillic","thousandsseparatorarabic","thousandsseparatorpersian",
"three","threearabic","threebengali","threecircle",
"threecircleinversesansserif","threedeva","threeeighths","threegujarati",
"threegurmukhi","threehackarabic","threehangzhou","threeideographicparen",
"threeinferior","threemonospace","threenumeratorbengali","threeoldstyle",
"threeparen","threeperiod","threepersian","threequarters",
"threequartersemdash","threeroman","threesuperior","threethai","thzsquare",
"tihiragana","tikatakana","tikatakanahalfwidth","tikeutacirclekorean",
"tikeutaparenkorean","tikeutcirclekorean","tikeutkorean","tikeutparenkorean",
"tilde","tildebelowcmb","tildecmb","tildecomb","tildedoublecmb",
"tildeoperator","tildeoverlaycmb","tildeverticalcmb","timescircle",
"tipehahebrew","tipehalefthebrew","tippigurmukhi","titlocyrilliccmb",
"tiwnarmenian","tlinebelow","tmonospace","toarmenian","tohiragana",
"tokatakana","tokatakanahalfwidth","tonebarextrahighmod","tonebarextralowmod",
"tonebarhighmod","tonebarlowmod","tonebarmidmod","tonefive","tonesix",
"tonetwo","tonos","tonsquare","topatakthai","tortoiseshellbracketleft",
"tortoiseshellbracketleftsmall","tortoiseshellbracketleftvertical",
"tortoiseshellbracketright","tortoiseshellbracketrightsmall",
"tortoiseshellbracketrightvertical","totaothai","tpalatalhook","tparen",
"trademark","trademarksans","trademarkserif","tretroflexhook","triagdn",
"triaglf","triagrt","triagup","ts","tsadi","tsadidagesh","tsadidageshhebrew",
"tsadihebrew","tsecyrillic","tsere","tsere12","tsere1e","tsere2b",
"tserehebrew","tserenarrowhebrew","tserequarterhebrew","tserewidehebrew",
"tshecyrillic","tsuperior","ttabengali","ttadeva","ttagujarati","ttagurmukhi",
"tteharabic","ttehfinalarabic","ttehinitialarabic","ttehmedialarabic",
"tthabengali","tthadeva","tthagujarati","tthagurmukhi","tturned","tuhiragana",
"tukatakana","tukatakanahalfwidth","tusmallhiragana","tusmallkatakana",
"tusmallkatakanahalfwidth","twelvecircle","twelveparen","twelveperiod",
"twelveroman","twentycircle","twentyhangzhou","twentyparen","twentyperiod",
"two","twoarabic","twobengali","twocircle","twocircleinversesansserif",
"twodeva","twodotenleader","twodotleader","twodotleadervertical",
"twogujarati","twogurmukhi","twohackarabic","twohangzhou",
"twoideographicparen","twoinferior","twomonospace","twonumeratorbengali",
"twooldstyle","twoparen","twoperiod","twopersian","tworoman","twostroke",
"twosuperior","twothai","twothirds","u","uacute","ubar","ubengali",
"ubopomofo","ubreve","ucaron","ucircle","ucircumflex","ucircumflexbelow",
"ucyrillic","udattadeva","udblacute","udblgrave","udeva","udieresis",
"udieresisacute","udieresisbelow","udieresiscaron","udieresiscyrillic",
"udieresisgrave","udieresismacron","udotbelow","ugrave","ugujarati",
"ugurmukhi","uhiragana","uhookabove","uhorn","uhornacute","uhorndotbelow",
"uhorngrave","uhornhookabove","uhorntilde","uhungarumlaut",
"uhungarumlautcyrillic","uinvertedbreve","ukatakana","ukatakanahalfwidth",
"ukcyrillic","ukorean","umacron","umacroncyrillic","umacrondieresis",
"umatragurmukhi","umonospace","underscore","underscoredbl",
"underscoremonospace","underscorevertical","underscorewavy","union",
"universal","uogonek","uparen","upblock","upperdothebrew","upsilon",
"upsilondieresis","upsilondieresistonos","upsilonlatin","upsilontonos",
"uptackbelowcmb","uptackmod","uragurmukhi","uring","ushortcyrillic",
"usmallhiragana","usmallkatakana","usmallkatakanahalfwidth",
"ustraightcyrillic","ustraightstrokecyrillic","utilde","utildeacute",
"utildebelow","uubengali","uudeva","uugujarati","uugurmukhi",
"uumatragurmukhi","uuvowelsignbengali","uuvowelsigndeva",
"uuvowelsigngujarati","uvowelsignbengali","uvowelsigndeva",
"uvowelsigngujarati","v","vadeva","vagujarati","vagurmukhi","vakatakana",
"vav","vavdagesh","vavdagesh65","vavdageshhebrew","vavhebrew","vavholam",
"vavholamhebrew","vavvavhebrew","vavyodhebrew","vcircle","vdotbelow",
"vecyrillic","veharabic","vehfinalarabic","vehinitialarabic",
"vehmedialarabic","vekatakana","venus","verticalbar","verticallineabovecmb",
"verticallinebelowcmb","verticallinelowmod","verticallinemod","vewarmenian",
"vhook","vikatakana","viramabengali","viramadeva","viramagujarati",
"visargabengali","visargadeva","visargagujarati","vmonospace","voarmenian",
"voicediterationhiragana","voicediterationkatakana","voicedmarkkana",
"voicedmarkkanahalfwidth","vokatakana","vparen","vtilde","vturned",
"vuhiragana","vukatakana","w","wacute","waekorean","wahiragana","wakatakana",
"wakatakanahalfwidth","wakorean","wasmallhiragana","wasmallkatakana",
"wattosquare","wavedash","wavyunderscorevertical","wawarabic",
"wawfinalarabic","wawhamzaabovearabic","wawhamzaabovefinalarabic","wbsquare",
"wcircle","wcircumflex","wdieresis","wdotaccent","wdotbelow","wehiragana",
"weierstrass","wekatakana","wekorean","weokorean","wgrave","whitebullet",
"whitecircle","whitecircleinverse","whitecornerbracketleft",
"whitecornerbracketleftvertical","whitecornerbracketright",
"whitecornerbracketrightvertical","whitediamond",
"whitediamondcontainingblacksmalldiamond","whitedownpointingsmalltriangle",
"whitedownpointingtriangle","whiteleftpointingsmalltriangle",
"whiteleftpointingtriangle","whitelenticularbracketleft",
"whitelenticularbracketright","whiterightpointingsmalltriangle",
"whiterightpointingtriangle","whitesmallsquare","whitesmilingface",
"whitesquare","whitestar","whitetelephone","whitetortoiseshellbracketleft",
"whitetortoiseshellbracketright","whiteuppointingsmalltriangle",
"whiteuppointingtriangle","wihiragana","wikatakana","wikorean","wmonospace",
"wohiragana","wokatakana","wokatakanahalfwidth","won","wonmonospace",
"wowaenthai","wparen","wring","wsuperior","wturned","wynn","x","xabovecmb",
"xbopomofo","xcircle","xdieresis","xdotaccent","xeharmenian","xi",
"xmonospace","xparen","xsuperior","y","yaadosquare","yabengali","yacute",
"yadeva","yaekorean","yagujarati","yagurmukhi","yahiragana","yakatakana",
"yakatakanahalfwidth","yakorean","yamakkanthai","yasmallhiragana",
"yasmallkatakana","yasmallkatakanahalfwidth","yatcyrillic","ycircle",
"ycircumflex","ydieresis","ydotaccent","ydotbelow","yeharabic",
"yehbarreearabic","yehbarreefinalarabic","yehfinalarabic",
"yehhamzaabovearabic","yehhamzaabovefinalarabic","yehhamzaaboveinitialarabic",
"yehhamzaabovemedialarabic","yehinitialarabic","yehmedialarabic",
"yehmeeminitialarabic","yehmeemisolatedarabic","yehnoonfinalarabic",
"yehthreedotsbelowarabic","yekorean","yen","yenmonospace","yeokorean",
"yeorinhieuhkorean","yerahbenyomohebrew","yerahbenyomolefthebrew",
"yericyrillic","yerudieresiscyrillic","yesieungkorean",
"yesieungpansioskorean","yesieungsioskorean","yetivhebrew","ygrave","yhook",
"yhookabove","yiarmenian","yicyrillic","yikorean","yinyang","yiwnarmenian",
"ymonospace","yod","yoddagesh","yoddageshhebrew","yodhebrew","yodyodhebrew",
"yodyodpatahhebrew","yohiragana","yoikorean","yokatakana",
"yokatakanahalfwidth","yokorean","yosmallhiragana","yosmallkatakana",
"yosmallkatakanahalfwidth","yotgreek","yoyaekorean","yoyakorean","yoyakthai",
"yoyingthai","yparen","ypogegrammeni","ypogegrammenigreekcmb","yr","yring",
"ysuperior","ytilde","yturned","yuhiragana","yuikorean","yukatakana",
"yukatakanahalfwidth","yukorean","yusbigcyrillic","yusbigiotifiedcyrillic",
"yuslittlecyrillic","yuslittleiotifiedcyrillic","yusmallhiragana",
"yusmallkatakana","yusmallkatakanahalfwidth","yuyekorean","yuyeokorean",
"yyabengali","yyadeva","z","zaarmenian","zacute","zadeva","zagurmukhi",
"zaharabic","zahfinalarabic","zahinitialarabic","zahiragana",
"zahmedialarabic","zainarabic","zainfinalarabic","zakatakana",
"zaqefgadolhebrew","zaqefqatanhebrew","zarqahebrew","zayin","zayindagesh",
"zayindageshhebrew","zayinhebrew","zbopomofo","zcaron","zcircle",
"zcircumflex","zcurl","zdot","zdotaccent","zdotbelow","zecyrillic",
"zedescendercyrillic","zedieresiscyrillic","zehiragana","zekatakana","zero",
"zeroarabic","zerobengali","zerodeva","zerogujarati","zerogurmukhi",
"zerohackarabic","zeroinferior","zeromonospace","zerooldstyle","zeropersian",
"zerosuperior","zerothai","zerowidthjoiner","zerowidthnonjoiner",
"zerowidthspace","zeta","zhbopomofo","zhearmenian","zhebrevecyrillic",
"zhecyrillic","zhedescendercyrillic","zhedieresiscyrillic","zihiragana",
"zikatakana","zinorhebrew","zlinebelow","zmonospace","zohiragana",
"zokatakana","zparen","zretroflexhook","zstroke","zuhiragana","zukatakana",
};
 
static const unsigned short agl_code_list[] = {
65,198,508,482,63462,193,63457,258,7854,1232,7862,7856,7858,7860,461,9398,194,
7844,7852,7846,7848,63458,7850,63177,63412,1040,512,196,1234,478,63460,7840,
480,192,63456,7842,1236,514,913,902,256,65313,260,197,506,7680,63461,63329,
195,63459,1329,66,9399,7682,7684,1041,1330,914,385,7686,65314,63220,63330,386,
67,1342,262,63178,63221,268,199,7688,63463,9400,264,266,266,63416,1353,1212,
1063,1214,1206,1268,1347,1227,1208,935,391,63222,65315,1361,63331,68,497,452,
1332,393,270,7696,9401,7698,272,7690,7692,1044,1006,8710,916,394,63179,63180,
63181,63400,988,1026,7694,65316,63223,272,63332,395,498,453,1248,1029,1039,69,
201,63465,276,282,7708,1333,9402,202,7870,7704,7878,7872,7874,63466,7876,1028,
516,203,63467,278,278,7864,1060,200,63464,1335,7866,8551,518,1124,1051,8554,
274,7702,7700,1052,65317,1053,1186,330,1188,1223,280,400,917,904,1056,398,
1069,1057,1194,425,63333,919,1336,905,208,63472,7868,7706,8364,439,494,440,70,
9403,7710,1366,996,401,1138,8548,65318,8547,63334,71,13191,500,915,404,1002,
286,486,290,9404,284,290,288,288,1043,1346,1172,1170,1168,403,1331,1027,7712,
65319,63182,63328,63335,667,484,72,9679,9642,9643,9633,13259,1192,1202,1066,
294,7722,7720,9405,292,7718,7714,7716,65320,1344,1000,63336,63183,63224,13200,
73,1071,306,1070,205,63469,300,463,9406,206,63470,1030,520,207,7726,1252,
63471,304,304,7882,1238,1045,8465,204,63468,7880,1048,522,1049,298,1250,65321,
1339,1025,302,921,406,938,906,63337,407,296,7724,1140,1142,74,1345,9407,308,
1032,1355,65322,63338,75,13189,13261,1184,7728,1050,1178,1219,922,1182,1180,
488,310,9408,310,7730,1364,1343,1061,998,408,1036,7732,65323,1152,990,1134,
63339,76,455,63167,313,923,317,315,9409,7740,315,319,319,7734,7736,1340,456,
1033,7738,65324,321,63225,63340,77,13190,63184,63407,7742,9410,7744,7746,1348,
65325,63341,412,924,78,458,323,327,325,9411,7754,325,7748,7750,413,8552,459,
1034,7752,65326,1350,63342,209,63473,925,79,338,63226,211,63475,1256,1258,334,
465,415,9412,212,7888,7896,7890,7892,63476,7894,1054,336,524,214,1254,63478,
7884,63227,210,63474,1365,8486,7886,416,7898,7906,7900,7902,7904,336,418,526,
332,7762,7760,8486,1120,937,1146,1148,911,927,908,65327,8544,490,492,390,216,
510,63480,63343,510,1150,213,7756,7758,63477,80,7764,9413,7766,1055,1354,1190,
934,420,928,1363,65328,936,1136,63344,81,9414,65329,63345,82,1356,340,344,342,
9415,342,528,7768,7770,7772,1360,8476,929,63228,530,7774,65330,63346,641,694,
83,9484,9492,9488,9496,9532,9516,9524,9500,9508,9472,9474,9569,9570,9558,9557,
9571,9553,9559,9565,9564,9563,9566,9567,9562,9556,9577,9574,9568,9552,9580,
9575,9576,9572,9573,9561,9560,9554,9555,9579,9578,346,7780,992,352,7782,63229,
350,399,1240,1242,9416,348,536,7776,7778,7784,1357,8550,1351,1064,1065,994,
1210,1004,931,8549,65331,1068,63347,986,84,932,358,356,354,9417,7792,354,7786,
7788,1058,1196,8553,1204,920,428,222,63486,8546,63230,1359,7790,65332,1337,
444,388,423,430,1062,1035,63348,8555,8545,85,218,63482,364,467,9418,219,7798,
63483,1059,368,532,220,471,7794,473,1264,475,469,63484,7908,217,63481,7910,
431,7912,7920,7914,7916,7918,368,1266,534,1144,362,1262,7802,65333,370,933,
978,979,433,939,980,978,910,366,1038,63349,1198,1200,360,7800,7796,86,9419,
7806,1042,1358,434,65334,1352,63350,7804,87,7810,9420,372,7812,7814,7816,7808,
65335,63351,88,9421,7820,7818,1341,926,65336,63352,89,221,63485,1122,9422,374,
376,63487,7822,7924,1067,1272,7922,435,7926,1349,1031,1362,65337,63353,7928,
1130,1132,1126,1128,90,1334,377,381,63231,9423,7824,379,379,7826,1047,1176,
1246,918,1338,1217,1046,1174,1244,7828,65338,63354,437,97,2438,225,2310,2694,
2566,2622,13059,2494,2366,2750,1375,2416,2437,12570,259,7855,1233,7863,7857,
7859,7861,462,9424,226,7845,7853,7847,7849,7851,180,791,769,769,2388,719,833,
1072,513,2673,2309,228,1235,479,7841,481,230,509,12624,483,8213,8356,1040,
1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,
1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,
1070,1071,1168,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1038,
63172,63173,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,
1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,
1099,1100,1101,1102,1103,1169,1106,1107,1108,1109,1110,1111,1112,1113,1114,
1115,1116,1118,1039,1122,1138,1140,63174,1119,1123,1139,1141,63175,63176,1241,
8206,8207,8205,1642,1548,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,
1563,1567,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,
1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1600,1601,
1602,1603,1604,1605,1606,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,
1618,1607,1700,1662,1670,1688,1711,1657,1672,1681,1722,1746,1749,8362,1470,
1475,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,
1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,64298,64299,
64331,64287,1520,1521,1522,64309,1460,1461,1462,1467,1464,1463,1456,1458,1457,
1459,1474,1473,1465,1468,1469,1471,1472,700,8453,8467,8470,8236,8237,8238,
8204,1645,701,224,2693,2565,12354,7843,2448,12574,2320,1237,2704,2576,2632,
1593,65226,65227,65228,515,2504,2376,2760,12450,65393,12623,1488,1575,64304,
65166,1571,65156,1573,65160,1488,64335,1570,65154,1609,65264,65267,65268,
64302,64303,8501,8780,945,940,257,65345,38,65286,63270,13250,12578,12580,3674,
8736,12296,65087,12297,65088,9001,9002,8491,903,2386,2434,2306,2690,261,13056,
9372,1370,700,63743,8784,8776,8786,8773,12686,12685,8978,7834,229,507,7681,
8596,8675,8672,8674,8673,8660,8659,8656,8658,8657,8595,8601,8600,8681,709,706,
707,708,63719,8592,8656,8653,8646,8678,8594,8655,10142,8644,8680,8676,8677,
8593,8597,8616,8616,8598,8645,8599,8679,63718,94,65342,126,65374,593,594,
12353,12449,65383,42,1645,1645,8727,65290,65121,8258,63209,8771,64,227,65312,
65131,592,2452,12576,2324,2708,2580,2519,2636,2508,2380,2764,2365,1377,1506,
64288,1506,98,2476,92,65340,2348,2732,2604,12400,3647,12496,124,65372,12549,
9425,7683,7685,9836,8757,1073,1576,65168,65169,12409,65170,64671,64520,64621,
12505,1378,1489,946,976,64305,64305,1489,64332,2477,2349,2733,2605,595,12403,
12499,664,2562,13105,9679,9670,9660,9668,9664,12304,65083,12305,65084,9699,
9698,9644,9658,9654,9642,9787,9632,9733,9700,9701,9652,9650,9251,7687,9608,
65346,3610,12412,12508,9373,13251,63732,123,63731,63730,65371,65115,63729,
65079,125,63742,63741,65373,65116,63740,65080,91,63728,63727,65339,63726,93,
63739,63738,65341,63737,728,814,774,815,785,865,810,826,166,384,63210,387,
12406,12502,8226,9688,8729,9678,99,1390,2458,263,2330,2714,2586,13192,2433,
784,2305,2689,8682,8453,711,812,780,8629,12568,269,231,7689,9426,265,597,267,
267,13253,184,807,162,8451,63199,65504,63394,63200,1401,2459,2331,2715,2587,
12564,1213,10003,1095,1215,1207,1269,1395,1228,1209,967,12919,12823,12905,
12618,12809,3594,3592,3593,3596,392,12918,12822,12904,12616,12808,12828,9675,
8855,8857,8853,12342,9680,9681,710,813,770,8999,450,448,449,451,9827,9827,
9831,13220,65347,13216,1409,58,8353,65306,8353,65109,721,720,44,787,789,63171,
1548,1373,63201,65292,788,701,65104,63202,786,699,9788,8773,8750,8963,6,7,8,
24,13,17,18,19,20,127,16,25,5,4,27,23,3,12,28,29,9,10,21,30,15,14,2,1,26,22,
31,11,169,63721,63193,12300,65378,65089,12301,65379,65090,13183,13255,13254,
9374,8354,663,8911,8910,164,63185,63186,63188,63189,100,1380,2470,1590,2342,
65214,65215,65216,1468,1468,8224,8225,2726,2598,12384,12480,1583,1491,64307,
64307,1491,1491,1491,1491,1491,1491,1491,1491,1491,1491,1491,1491,1491,1491,
1491,1491,1491,1491,1491,1491,1491,65194,1615,1615,1612,1612,2404,1447,1447,
1157,63187,12298,65085,12299,65086,811,8660,8658,2405,63190,783,8748,8215,819,
831,698,8214,782,12553,13256,271,7697,9427,7699,273,2465,2337,2721,2593,1672,
64393,2396,2466,2338,2722,2594,7691,7693,1643,1643,1076,176,1453,12391,1007,
12487,9003,8998,948,397,2552,676,2471,2343,2727,2599,599,901,836,9830,9826,
168,63191,804,776,63192,901,12386,12482,12291,247,8739,8725,1106,9619,7695,
13207,273,65348,9604,3598,3604,12393,12489,36,63203,65284,63268,65129,63204,
8363,13094,729,775,803,803,12539,305,63166,644,8901,9676,64287,64287,798,725,
9375,63211,598,396,12389,12485,499,675,454,677,1249,1109,1119,101,233,9793,
2447,12572,277,2317,2701,2373,2757,283,7709,1381,1415,9428,234,7871,7705,7879,
7873,7875,7877,1108,517,2319,235,279,279,7865,2575,2631,1092,232,2703,1383,
12573,12360,7867,12575,56,1640,2542,9319,10129,2414,9329,9349,9369,2798,2670,
1640,12328,9835,12839,8328,65304,63288,9339,9359,1784,8567,8312,3672,519,1125,
12456,65396,2676,12628,1083,8712,9322,9342,9362,8570,8230,8942,275,7703,7701,
1084,8212,65073,65349,1371,8709,12579,1085,8211,65074,1187,331,12581,1189,
1224,8194,281,12627,603,666,604,606,605,9376,949,941,61,65309,65126,8316,8801,
12582,1088,600,1101,1089,1195,643,646,2318,2374,426,645,12359,12455,65386,
8494,63212,951,1384,942,240,7869,7707,1425,1425,1425,1425,477,12641,8364,2503,
2375,2759,33,1372,8252,161,63393,65281,63265,8707,658,495,659,441,442,102,
2398,2654,8457,1614,1614,1611,12552,9429,7711,1601,1414,65234,65235,65236,997,
9792,64256,64259,64260,64257,9326,9346,9366,8210,9632,9644,1498,64314,64314,
1498,1498,1498,1498,1498,1501,1501,1503,1503,1507,1507,1509,1509,713,9673,
1139,53,1637,2539,9316,10126,2411,8541,2795,2667,1637,12325,12836,8325,65301,
63285,9336,9356,1781,8564,8309,3669,64258,402,65350,13209,3615,3613,3663,8704,
52,1636,2538,9315,10125,2410,2794,2666,1636,12324,12835,8324,65300,2551,63284,
9335,9355,1780,8563,8308,9325,9345,9365,3668,715,9377,8260,8355,103,2455,501,
2327,1711,64403,64404,64405,2711,2583,12364,12460,947,611,736,1003,12557,287,
487,291,9430,285,291,289,289,1075,12370,12466,8785,1436,1523,1437,223,1438,
1524,12307,2456,1394,2328,2712,2584,1594,65230,65231,65232,1173,1171,1169,
2394,2650,608,13203,12366,12462,1379,1490,64306,64306,1490,1107,446,660,662,
704,661,705,740,673,674,7713,65351,12372,12468,9378,13228,8711,96,790,768,768,
2387,718,65344,832,62,8805,8923,65310,8819,8823,8807,65125,609,485,12368,171,
187,8249,8250,12464,13080,13257,104,1193,1729,2489,1203,2361,2745,2617,1581,
65186,65187,12399,65188,13098,12495,65418,2637,1569,1569,1569,1569,1569,1569,
1569,1569,1569,12644,1098,8636,8640,13258,1458,1458,1458,1458,1458,1458,1458,
1458,1459,1459,1459,1459,1459,1459,1459,1459,1457,1457,1457,1457,1457,1457,
1457,1457,295,12559,7723,7721,9431,293,7719,7715,7717,1492,9829,9829,9825,
64308,64308,1729,1607,1492,64423,65258,65258,64421,64420,64424,65259,12408,
64425,65260,13179,12504,65421,13110,615,13113,1495,1495,614,689,12923,12827,
12909,12622,12813,12402,12498,65419,1460,1460,1460,1460,1460,1460,1460,1460,
7830,65352,1392,3627,12411,12507,65422,1465,1465,1465,1465,1465,1465,1465,
1465,3630,777,777,801,802,13122,1001,8213,795,9832,8962,9379,688,613,12405,
13107,12501,65420,733,779,405,45,63205,65293,65123,63206,8208,105,237,1103,
2439,12583,301,464,9432,238,1110,521,12943,12939,12863,12858,12965,12294,
12289,65380,12855,12963,12847,12861,12957,12864,12950,12854,12843,12850,12964,
12293,12952,12856,12967,12966,12969,12846,12842,12852,12290,12958,12867,12857,
12862,12968,12953,12866,12851,12288,12853,12849,12859,12848,12860,12844,12845,
12295,12942,12938,12948,12944,12940,12941,2311,239,7727,1253,7883,1239,1077,
12917,12821,12903,12615,12807,236,2695,2567,12356,7881,2440,1080,2312,2696,
2568,2624,523,1081,2496,2368,2752,307,12452,65394,12643,732,1452,299,1251,
8787,2623,65353,8710,8734,1387,8747,8993,8993,63733,8992,8992,8745,13061,9688,
9689,9787,1105,303,953,970,912,617,943,9380,2674,12355,12451,65384,2554,616,
63213,12445,12541,297,7725,12585,1102,2495,2367,2751,1141,1143,106,1393,2460,
2332,2716,2588,12560,496,9433,309,669,607,1112,1580,65182,65183,65184,1688,
64395,2461,2333,2717,2589,1403,12292,65354,9381,690,107,1185,2453,7729,1082,
1179,2325,1499,1603,64315,64315,65242,1499,65243,65244,64333,2709,2581,12363,
1220,12459,65398,954,1008,12657,12676,12664,12665,13069,1600,1600,12533,13188,
1616,1613,1183,65392,1181,12558,13193,489,311,9434,311,7731,1412,12369,12465,
65401,1391,12534,312,2454,1093,2326,2710,2582,1582,65190,65191,65192,999,2393,
2649,12920,12824,12906,12619,12810,3586,3589,3587,3588,3675,409,3590,13201,
12365,12461,65399,13077,13078,13076,12910,12814,12896,12593,12800,12595,1116,
7733,13208,13222,65355,13218,12371,13248,3585,12467,65402,13086,1153,12927,
835,9382,13226,1135,13263,670,12367,12463,65400,13240,13246,108,2482,314,2354,
2738,2610,3653,65276,65272,65271,65274,65273,65275,65270,65269,1604,955,411,
1500,64316,64316,1500,1500,1500,1500,1500,65246,64714,65247,64713,64715,65010,
65248,64904,64716,65247,65247,9711,410,620,12556,318,316,9435,7741,316,320,
320,7735,7737,794,792,60,8804,8922,65308,8818,8822,8806,65124,622,9612,621,
8356,1388,457,1113,63168,2355,2739,7739,2356,2529,2401,2531,2403,619,65356,
13264,3628,8743,172,8976,8744,3621,383,65102,818,65101,9674,9383,322,8467,
63214,9617,3622,2444,2316,2530,2402,13267,109,2478,175,817,772,717,65507,7743,
2350,2734,2606,1444,1444,12414,63637,63636,3659,63635,63628,63627,3656,63626,
63620,3633,63625,3655,63631,63630,3657,63629,63634,63633,3658,63632,3654,
12510,65423,9794,13127,1470,9794,1455,13187,12551,13268,9436,13221,7745,7747,
1605,65250,65251,65252,64721,64584,13133,12417,13182,12513,65426,1502,64318,
64318,1502,1396,1445,1446,1446,1445,625,13202,65381,183,12914,12818,12900,
12609,12656,12804,12654,12655,12415,12511,65424,8722,800,8854,727,8723,8242,
13130,13129,624,13206,13219,65357,13215,12418,13249,12514,65427,13270,3617,
13223,13224,9384,13227,13235,63215,623,181,181,13186,8811,8810,13196,956,
13197,12416,12512,65425,13205,215,13211,1443,1443,9834,9835,9837,9839,13234,
13238,13244,13241,13239,13247,13245,110,2472,8711,324,2344,2728,2600,12394,
12490,65413,329,13185,12555,160,328,326,9437,7755,326,7749,7751,12397,12493,
65416,8362,13195,2457,2329,2713,2585,3591,12435,626,627,12911,12815,12597,
12897,12598,12596,12648,12801,12647,12646,12395,12491,65414,63641,3661,57,
1641,2543,9320,10130,2415,2799,2671,1641,12329,12840,8329,65305,63289,9340,
9360,1785,8568,8313,9330,9350,9370,3673,460,1114,12531,65437,414,7753,65358,
13210,2467,2339,2723,2595,2345,12398,12494,65417,160,3603,3609,1606,65254,
1722,64415,65255,65255,64722,64587,65256,64725,64590,64653,8716,8713,8713,
8800,8815,8817,8825,8802,8814,8816,8742,8832,8836,8833,8837,1398,9385,13233,
8319,241,957,12396,12492,65415,2492,2364,2748,2620,35,65283,65119,884,885,
8470,1504,64320,64320,1504,13237,13243,2462,2334,2718,2590,111,243,3629,629,
1257,1259,2451,12571,335,2321,2705,2377,2761,466,9438,244,7889,7897,7891,7893,
7895,1086,337,525,2323,246,1255,7885,339,12634,731,808,242,2707,1413,12362,
7887,417,7899,7907,7901,7903,7905,337,419,527,12458,65397,12631,1451,333,7763,
7761,2384,969,982,1121,631,1147,1149,974,2768,959,972,65359,49,1633,2535,9312,
10122,2407,8228,8539,63196,2791,2663,1633,189,12321,12832,8321,65297,2548,
63281,9332,9352,1777,188,8560,185,3665,8531,491,493,2579,2635,596,9386,9702,
8997,170,186,8735,2322,2378,248,511,12361,12457,65387,511,63216,1151,245,7757,
7759,12577,8254,65098,773,65097,65100,65099,175,2507,2379,2763,112,13184,
13099,2474,7765,2346,8671,8670,2730,2602,12401,3631,12497,1156,1216,12671,182,
8741,40,64830,63725,63724,8333,65288,65113,8317,63723,65077,41,64831,63736,
63735,8334,65289,65114,8318,63734,65078,8706,1472,1433,13225,1463,1463,1463,
1463,1463,1463,1463,1463,1441,12550,9439,7767,1508,1087,64324,64324,13115,
64323,1662,1402,1508,64343,64344,12410,64345,12506,1191,64334,37,1642,65285,
65130,46,1417,183,65377,63207,65294,65106,63208,834,8869,8240,8359,13194,2475,
2347,2731,2603,966,981,12922,12826,12908,12621,12812,632,3642,981,421,3614,
3612,3616,960,12915,12819,12662,12901,12658,12610,12805,12660,12612,12661,
12663,12659,12404,12500,982,1411,43,799,8853,177,726,65291,65122,8314,65360,
13272,12413,9759,9756,9758,9757,12509,3611,12306,12320,9387,8826,8478,697,
8245,8719,8965,12540,8984,8834,8835,8759,8733,968,1137,1158,13232,12407,12503,
13236,13242,113,2392,1448,1602,65238,65239,65240,1464,1464,1464,1464,1464,
1464,1464,1464,1464,1464,1464,1464,1464,1464,1464,1464,1439,12561,9440,672,
65361,1511,64327,64327,1511,1511,1511,1511,1511,1511,1511,1511,1511,1511,1511,
1511,1511,1511,1511,1511,1511,1511,1511,1511,1511,9388,9833,1467,1467,1467,
1467,1467,1467,1467,1467,63,1567,1374,191,63423,894,65311,63295,34,8222,8220,
65282,12318,12317,8221,8216,8219,8219,8217,329,8218,39,65287,114,1404,2480,
341,2352,8730,63717,13230,13231,13229,1471,1471,2736,2608,12425,12521,65431,
2545,2544,612,8758,12566,345,343,9441,343,529,7769,7771,7773,8251,8838,8839,
174,63720,63194,1585,1408,65198,12428,1585,12524,65434,1512,64328,1512,1512,
1512,1512,1512,1512,1512,1512,1512,1512,1512,1512,1512,1512,1512,1512,1512,
1512,1512,1512,1512,8765,1431,1431,8976,638,639,2525,2397,961,637,635,693,
1009,734,12913,12817,12899,12608,12602,12649,12601,12603,12652,12803,12607,
12604,12651,12605,12606,12650,12653,8735,793,8895,12426,12522,65432,730,805,
778,703,1369,796,723,702,825,722,531,13137,7775,636,634,65362,12429,12525,
65435,3619,9389,2524,2353,2652,1681,64397,2528,2400,2784,2500,2372,2756,63217,
9616,633,692,12427,12523,65433,2546,2547,63197,3620,2443,2315,2699,2499,2371,
2755,115,2488,347,7781,1589,2360,65210,65211,65212,2744,2616,12373,12469,
65403,65018,1505,64321,64321,1505,3634,3649,3652,3651,3635,3632,3648,63622,
3637,63621,3636,3650,63624,3639,63623,3638,3640,3641,12569,353,7783,351,601,
1241,1243,602,9442,349,537,7777,7779,7785,828,8243,714,167,1587,65202,65203,
65204,1462,1462,1462,1462,1462,1462,1462,1426,1462,1405,12379,12475,65406,59,
1563,65307,65108,12444,65439,13090,13091,55,1639,2541,9318,10128,2413,8542,
2797,2669,1639,12327,12838,8327,65303,63287,9338,9358,1783,8566,8311,9328,
9348,9368,3671,173,1399,2486,1096,1617,64609,64606,64608,1617,64610,64607,
9618,9619,9617,9618,2358,2742,2614,1427,12565,1097,1588,65206,65207,65208,995,
8362,8362,1456,1456,1456,1456,1456,1456,1456,1456,1456,1211,1005,1513,64329,
64329,64300,64300,64301,64301,1473,1513,64298,64298,64299,64299,642,963,962,
962,1010,12375,12471,65404,1469,1469,8764,1474,12916,12820,12670,12902,12666,
12613,12667,12806,12669,12668,54,1638,2540,9317,10127,2412,2796,2668,1638,
12326,12837,8326,65302,63286,9337,9357,1782,8565,8310,9327,2553,9347,9367,
3670,47,65295,383,7835,9786,65363,1475,173,1100,12381,12477,65407,824,823,
3625,3624,3595,3626,32,32,9824,9824,9828,9390,827,13252,13213,9641,9636,13199,
13214,13262,13265,13266,13198,13269,13212,13217,9638,9639,9640,9637,9635,
13275,2487,2359,2743,12617,12677,12672,12594,12645,12611,12614,12600,63218,
163,65505,822,821,8834,8842,8838,8827,8715,12377,12473,65405,1618,8721,9788,
8835,8843,8839,13276,13180,116,2468,8868,8867,2340,2724,2596,1591,65218,65219,
12383,65220,13181,12479,65408,1600,964,1514,64330,64330,64330,1514,359,12554,
357,680,355,1670,64379,64380,64381,64380,9443,7793,355,7831,7787,7789,1090,
1197,1578,65174,64674,64524,65175,12390,64673,64523,1577,65172,65176,64676,
64526,64627,12486,65411,8481,9742,1440,1449,9321,12841,9341,9361,8569,679,
1496,64312,64312,1496,1205,1435,1435,2469,2341,2725,2597,1584,65196,63640,
63639,3660,63638,1579,65178,65179,65180,8707,8756,952,977,977,12921,12825,
12907,12620,12811,9324,9344,9364,3601,429,3602,254,3607,3600,3608,3606,1154,
1644,1644,51,1635,2537,9314,10124,2409,8540,2793,2665,1635,12323,12834,8323,
65299,2550,63283,9334,9354,1779,190,63198,8562,179,3667,13204,12385,12481,
65409,12912,12816,12898,12599,12802,732,816,771,771,864,8764,820,830,8855,
1430,1430,2672,1155,1407,7791,65364,1385,12392,12488,65412,741,745,742,744,
743,445,389,424,900,13095,3599,12308,65117,65081,12309,65118,65082,3605,427,
9391,8482,63722,63195,648,9660,9668,9658,9650,678,1510,64326,64326,1510,1094,
1461,1461,1461,1461,1461,1461,1461,1461,1115,63219,2463,2335,2719,2591,1657,
64359,64360,64361,2464,2336,2720,2592,647,12388,12484,65410,12387,12483,65391,
9323,9343,9363,8571,9331,21316,9351,9371,50,1634,2536,9313,10123,2408,8229,
8229,65072,2792,2664,1634,12322,12833,8322,65298,2549,63282,9333,9353,1778,
8561,443,178,3666,8532,117,250,649,2441,12584,365,468,9444,251,7799,1091,2385,
369,533,2313,252,472,7795,474,1265,476,470,7909,249,2697,2569,12358,7911,432,
7913,7921,7915,7917,7919,369,1267,535,12454,65395,1145,12636,363,1263,7803,
2625,65365,95,8215,65343,65075,65103,8746,8704,371,9392,9600,1476,965,971,944,
650,973,797,724,2675,367,1118,12357,12453,65385,1199,1201,361,7801,7797,2442,
2314,2698,2570,2626,2498,2370,2754,2497,2369,2753,118,2357,2741,2613,12535,
1493,64309,64309,64309,1493,64331,64331,1520,1521,9445,7807,1074,1700,64363,
64364,64365,12537,9792,124,781,809,716,712,1406,651,12536,2509,2381,2765,2435,
2307,2691,65366,1400,12446,12542,12443,65438,12538,9393,7805,652,12436,12532,
119,7811,12633,12431,12527,65436,12632,12430,12526,13143,12316,65076,1608,
65262,1572,65158,13277,9446,373,7813,7815,7817,12433,8472,12529,12638,12637,
7809,9702,9675,9689,12302,65091,12303,65092,9671,9672,9663,9661,9667,9665,
12310,12311,9657,9655,9643,9786,9633,9734,9743,12312,12313,9653,9651,12432,
12528,12639,65367,12434,12530,65382,8361,65510,3623,9394,7832,695,653,447,120,
829,12562,9447,7821,7819,1389,958,65368,9395,739,121,13134,2479,253,2351,
12626,2735,2607,12420,12516,65428,12625,3662,12419,12515,65388,1123,9448,375,
255,7823,7925,1610,1746,64431,65266,1574,65162,65163,65164,65267,65268,64733,
64600,64660,1745,12630,165,65509,12629,12678,1450,1450,1099,1273,12673,12675,
12674,1434,7923,436,7927,1397,1111,12642,9775,1410,65369,1497,64313,64313,
1497,1522,64287,12424,12681,12520,65430,12635,12423,12519,65390,1011,12680,
12679,3618,3597,9396,890,837,422,7833,696,7929,654,12422,12684,12518,65429,
12640,1131,1133,1127,1129,12421,12517,65389,12683,12682,2527,2399,122,1382,
378,2395,2651,1592,65222,65223,12374,65224,1586,65200,12470,1429,1428,1432,
1494,64310,64310,1494,12567,382,9449,7825,657,380,380,7827,1079,1177,1247,
12380,12476,48,1632,2534,2406,2790,2662,1632,8320,65296,63280,1776,8304,3664,
65279,8204,8203,950,12563,1386,1218,1078,1175,1245,12376,12472,1454,7829,
65370,12382,12478,9397,656,438,12378,12474,
};
 
static const unsigned short agl_dup_offsets[] = {
32,0,124,3,160,6,173,9,175,12,181,15,183,18,266,21,267,24,272,27,273,30,
278,33,279,36,288,39,289,42,290,45,291,48,304,51,310,54,311,57,315,60,316,63,
319,66,320,69,325,72,326,75,329,78,336,81,337,84,342,87,343,90,354,93,355,96,
368,99,369,102,379,105,380,108,383,111,510,114,511,117,700,120,701,123,
732,126,768,129,769,132,771,135,777,138,803,141,901,144,962,147,977,150,
978,153,981,156,982,159,1025,162,1026,165,1027,168,1028,171,1029,174,1030,177,
1031,180,1032,183,1033,186,1034,189,1035,192,1036,195,1038,198,1039,201,
1040,204,1041,207,1042,210,1043,213,1044,216,1045,219,1046,222,1047,225,
1048,228,1049,231,1050,234,1051,237,1052,240,1053,243,1054,246,1055,249,
1056,252,1057,255,1058,258,1059,261,1060,264,1061,267,1062,270,1063,273,
1064,276,1065,279,1066,282,1067,285,1068,288,1069,291,1070,294,1071,297,
1072,300,1073,303,1074,306,1075,309,1076,312,1077,315,1078,318,1079,321,
1080,324,1081,327,1082,330,1083,333,1084,336,1085,339,1086,342,1087,345,
1088,348,1089,351,1090,354,1091,357,1092,360,1093,363,1094,366,1095,369,
1096,372,1097,375,1098,378,1099,381,1100,384,1101,387,1102,390,1103,393,
1105,396,1106,399,1107,402,1108,405,1109,408,1110,411,1111,414,1112,417,
1113,420,1114,423,1115,426,1116,429,1118,432,1119,435,1122,438,1123,441,
1138,444,1139,447,1140,450,1141,453,1168,456,1169,459,1241,462,1425,465,
1430,470,1431,473,1435,476,1443,479,1444,482,1445,485,1446,488,1447,491,
1450,494,1456,497,1457,508,1458,518,1459,528,1460,538,1461,548,1462,558,
1463,568,1464,578,1465,596,1467,606,1468,616,1469,620,1470,624,1471,627,
1472,631,1473,634,1474,637,1475,640,1488,643,1489,647,1490,651,1491,655,
1492,679,1493,683,1494,687,1495,691,1496,695,1497,699,1498,703,1499,711,
1500,715,1501,723,1502,727,1503,731,1504,735,1505,739,1506,743,1507,747,
1508,751,1509,755,1510,759,1511,763,1512,787,1513,811,1514,815,1520,819,
1521,822,1522,825,1548,828,1563,831,1567,834,1569,837,1570,848,1571,851,
1572,854,1573,857,1574,860,1575,863,1576,866,1577,869,1578,872,1579,875,
1580,878,1581,881,1582,884,1583,887,1584,890,1585,893,1586,897,1587,900,
1588,903,1589,906,1590,909,1591,912,1592,915,1593,918,1594,921,1600,924,
1601,929,1602,932,1603,935,1604,938,1605,941,1606,944,1607,947,1608,950,
1609,953,1610,956,1611,959,1612,962,1613,966,1614,969,1615,973,1616,977,
1617,980,1618,984,1632,987,1633,991,1634,995,1635,999,1636,1003,1637,1007,
1638,1011,1639,1015,1640,1019,1641,1023,1642,1027,1643,1030,1644,1033,
1645,1036,1657,1040,1662,1043,1670,1046,1672,1049,1681,1052,1688,1055,
1700,1058,1711,1061,1722,1064,1729,1067,1746,1070,8204,1073,8213,1076,
8215,1079,8219,1082,8229,1085,8353,1088,8356,1091,8362,1094,8364,1099,
8453,1102,8467,1105,8470,1108,8486,1111,8616,1114,8656,1117,8658,1120,
8660,1123,8704,1126,8707,1129,8710,1132,8711,1135,8713,1138,8735,1141,
8764,1144,8773,1147,8834,1150,8835,1153,8838,1156,8839,1159,8853,1162,
8855,1165,8976,1168,8992,1171,8993,1174,9617,1177,9618,1180,9619,1183,
9632,1186,9633,1189,9642,1192,9643,1195,9644,1198,9650,1201,9658,1204,
9660,1207,9668,1210,9675,1213,9679,1216,9688,1219,9689,1222,9702,1225,
9786,1228,9787,1231,9788,1234,9792,1237,9794,1240,9824,1243,9827,1246,
9829,1249,9835,1252,64287,1255,64298,1260,64299,1264,64300,1268,64301,1271,
64305,1274,64306,1277,64307,1280,64308,1283,64309,1286,64310,1291,64312,1294,
64313,1297,64314,1300,64315,1303,64316,1306,64318,1309,64320,1312,64321,1315,
64324,1318,64326,1321,64327,1324,64329,1327,64330,1330,64331,1334,64380,1338,
65247,1341,65255,1345,65258,1348,65267,1351,65268,1354,
};
 
static const char *agl_dup_names[] = {
"space","spacehackarabic",0,"bar","verticalbar",0,"nbspace",
"nonbreakingspace",0,"sfthyphen","softhyphen",0,"macron","overscore",0,"mu",
"mu1",0,"middot","periodcentered",0,"Cdot","Cdotaccent",0,"cdot","cdotaccent",
0,"Dcroat","Dslash",0,"dcroat","dmacron",0,"Edot","Edotaccent",0,"edot",
"edotaccent",0,"Gdot","Gdotaccent",0,"gdot","gdotaccent",0,"Gcedilla",
"Gcommaaccent",0,"gcedilla","gcommaaccent",0,"Idot","Idotaccent",0,"Kcedilla",
"Kcommaaccent",0,"kcedilla","kcommaaccent",0,"Lcedilla","Lcommaaccent",0,
"lcedilla","lcommaaccent",0,"Ldot","Ldotaccent",0,"ldot","ldotaccent",0,
"Ncedilla","Ncommaaccent",0,"ncedilla","ncommaaccent",0,"napostrophe",
"quoterightn",0,"Odblacute","Ohungarumlaut",0,"odblacute","ohungarumlaut",0,
"Rcedilla","Rcommaaccent",0,"rcedilla","rcommaaccent",0,"Tcedilla",
"Tcommaaccent",0,"tcedilla","tcommaaccent",0,"Udblacute","Uhungarumlaut",0,
"udblacute","uhungarumlaut",0,"Zdot","Zdotaccent",0,"zdot","zdotaccent",0,
"longs","slong",0,"Oslashacute","Ostrokeacute",0,"oslashacute","ostrokeacute",
0,"afii57929","apostrophemod",0,"afii64937","commareversedmod",0,"ilde",
"tilde",0,"gravecmb","gravecomb",0,"acutecmb","acutecomb",0,"tildecmb",
"tildecomb",0,"hookabovecomb","hookcmb",0,"dotbelowcmb","dotbelowcomb",0,
"dialytikatonos","dieresistonos",0,"sigma1","sigmafinal",0,"theta1",
"thetasymbolgreek",0,"Upsilon1","Upsilonhooksymbol",0,"phi1","phisymbolgreek",
0,"omega1","pisymbolgreek",0,"Iocyrillic","afii10023",0,"Djecyrillic",
"afii10051",0,"Gjecyrillic","afii10052",0,"Ecyrillic","afii10053",0,
"Dzecyrillic","afii10054",0,"Icyrillic","afii10055",0,"Yicyrillic",
"afii10056",0,"Jecyrillic","afii10057",0,"Ljecyrillic","afii10058",0,
"Njecyrillic","afii10059",0,"Tshecyrillic","afii10060",0,"Kjecyrillic",
"afii10061",0,"Ushortcyrillic","afii10062",0,"Dzhecyrillic","afii10145",0,
"Acyrillic","afii10017",0,"Becyrillic","afii10018",0,"Vecyrillic","afii10019",
0,"Gecyrillic","afii10020",0,"Decyrillic","afii10021",0,"Iecyrillic",
"afii10022",0,"Zhecyrillic","afii10024",0,"Zecyrillic","afii10025",0,
"Iicyrillic","afii10026",0,"Iishortcyrillic","afii10027",0,"Kacyrillic",
"afii10028",0,"Elcyrillic","afii10029",0,"Emcyrillic","afii10030",0,
"Encyrillic","afii10031",0,"Ocyrillic","afii10032",0,"Pecyrillic","afii10033",
0,"Ercyrillic","afii10034",0,"Escyrillic","afii10035",0,"Tecyrillic",
"afii10036",0,"Ucyrillic","afii10037",0,"Efcyrillic","afii10038",0,
"Khacyrillic","afii10039",0,"Tsecyrillic","afii10040",0,"Checyrillic",
"afii10041",0,"Shacyrillic","afii10042",0,"Shchacyrillic","afii10043",0,
"Hardsigncyrillic","afii10044",0,"Yericyrillic","afii10045",0,
"Softsigncyrillic","afii10046",0,"Ereversedcyrillic","afii10047",0,
"IUcyrillic","afii10048",0,"IAcyrillic","afii10049",0,"acyrillic","afii10065",
0,"afii10066","becyrillic",0,"afii10067","vecyrillic",0,"afii10068",
"gecyrillic",0,"afii10069","decyrillic",0,"afii10070","iecyrillic",0,
"afii10072","zhecyrillic",0,"afii10073","zecyrillic",0,"afii10074",
"iicyrillic",0,"afii10075","iishortcyrillic",0,"afii10076","kacyrillic",0,
"afii10077","elcyrillic",0,"afii10078","emcyrillic",0,"afii10079",
"encyrillic",0,"afii10080","ocyrillic",0,"afii10081","pecyrillic",0,
"afii10082","ercyrillic",0,"afii10083","escyrillic",0,"afii10084",
"tecyrillic",0,"afii10085","ucyrillic",0,"afii10086","efcyrillic",0,
"afii10087","khacyrillic",0,"afii10088","tsecyrillic",0,"afii10089",
"checyrillic",0,"afii10090","shacyrillic",0,"afii10091","shchacyrillic",0,
"afii10092","hardsigncyrillic",0,"afii10093","yericyrillic",0,"afii10094",
"softsigncyrillic",0,"afii10095","ereversedcyrillic",0,"afii10096",
"iucyrillic",0,"afii10097","iacyrillic",0,"afii10071","iocyrillic",0,
"afii10099","djecyrillic",0,"afii10100","gjecyrillic",0,"afii10101",
"ecyrillic",0,"afii10102","dzecyrillic",0,"afii10103","icyrillic",0,
"afii10104","yicyrillic",0,"afii10105","jecyrillic",0,"afii10106",
"ljecyrillic",0,"afii10107","njecyrillic",0,"afii10108","tshecyrillic",0,
"afii10109","kjecyrillic",0,"afii10110","ushortcyrillic",0,"afii10193",
"dzhecyrillic",0,"Yatcyrillic","afii10146",0,"afii10194","yatcyrillic",0,
"Fitacyrillic","afii10147",0,"afii10195","fitacyrillic",0,"Izhitsacyrillic",
"afii10148",0,"afii10196","izhitsacyrillic",0,"Gheupturncyrillic","afii10050",
0,"afii10098","gheupturncyrillic",0,"afii10846","schwacyrillic",0,
"etnahtafoukhhebrew","etnahtafoukhlefthebrew","etnahtahebrew",
"etnahtalefthebrew",0,"tipehahebrew","tipehalefthebrew",0,"reviahebrew",
"reviamugrashhebrew",0,"tevirhebrew","tevirlefthebrew",0,"munahhebrew",
"munahlefthebrew",0,"mahapakhhebrew","mahapakhlefthebrew",0,"merkhahebrew",
"merkhalefthebrew",0,"merkhakefulahebrew","merkhakefulalefthebrew",0,
"dargahebrew","dargalefthebrew",0,"yerahbenyomohebrew",
"yerahbenyomolefthebrew",0,"afii57799","sheva","sheva115","sheva15","sheva22",
"sheva2e","shevahebrew","shevanarrowhebrew","shevaquarterhebrew",
"shevawidehebrew",0,"afii57801","hatafsegol","hatafsegol17","hatafsegol24",
"hatafsegol30","hatafsegolhebrew","hatafsegolnarrowhebrew",
"hatafsegolquarterhebrew","hatafsegolwidehebrew",0,"afii57800","hatafpatah",
"hatafpatah16","hatafpatah23","hatafpatah2f","hatafpatahhebrew",
"hatafpatahnarrowhebrew","hatafpatahquarterhebrew","hatafpatahwidehebrew",0,
"afii57802","hatafqamats","hatafqamats1b","hatafqamats28","hatafqamats34",
"hatafqamatshebrew","hatafqamatsnarrowhebrew","hatafqamatsquarterhebrew",
"hatafqamatswidehebrew",0,"afii57793","hiriq","hiriq14","hiriq21","hiriq2d",
"hiriqhebrew","hiriqnarrowhebrew","hiriqquarterhebrew","hiriqwidehebrew",0,
"afii57794","tsere","tsere12","tsere1e","tsere2b","tserehebrew",
"tserenarrowhebrew","tserequarterhebrew","tserewidehebrew",0,"afii57795",
"segol","segol13","segol1f","segol2c","segolhebrew","segolnarrowhebrew",
"segolquarterhebrew","segolwidehebrew",0,"afii57798","patah","patah11",
"patah1d","patah2a","patahhebrew","patahnarrowhebrew","patahquarterhebrew",
"patahwidehebrew",0,"afii57797","qamats","qamats10","qamats1a","qamats1c",
"qamats27","qamats29","qamats33","qamatsde","qamatshebrew",
"qamatsnarrowhebrew","qamatsqatanhebrew","qamatsqatannarrowhebrew",
"qamatsqatanquarterhebrew","qamatsqatanwidehebrew","qamatsquarterhebrew",
"qamatswidehebrew",0,"afii57806","holam","holam19","holam26","holam32",
"holamhebrew","holamnarrowhebrew","holamquarterhebrew","holamwidehebrew",0,
"afii57796","qubuts","qubuts18","qubuts25","qubuts31","qubutshebrew",
"qubutsnarrowhebrew","qubutsquarterhebrew","qubutswidehebrew",0,"afii57807",
"dagesh","dageshhebrew",0,"afii57839","siluqhebrew","siluqlefthebrew",0,
"afii57645","maqafhebrew",0,"afii57841","rafe","rafehebrew",0,"afii57842",
"paseqhebrew",0,"afii57804","shindothebrew",0,"afii57803","sindothebrew",0,
"afii57658","sofpasuqhebrew",0,"afii57664","alef","alefhebrew",0,"afii57665",
"bet","bethebrew",0,"afii57666","gimel","gimelhebrew",0,"afii57667","dalet",
"dalethatafpatah","dalethatafpatahhebrew","dalethatafsegol",
"dalethatafsegolhebrew","dalethebrew","dalethiriq","dalethiriqhebrew",
"daletholam","daletholamhebrew","daletpatah","daletpatahhebrew","daletqamats",
"daletqamatshebrew","daletqubuts","daletqubutshebrew","daletsegol",
"daletsegolhebrew","daletsheva","daletshevahebrew","dalettsere",
"dalettserehebrew",0,"afii57668","he","hehebrew",0,"afii57669","vav",
"vavhebrew",0,"afii57670","zayin","zayinhebrew",0,"afii57671","het",
"hethebrew",0,"afii57672","tet","tethebrew",0,"afii57673","yod","yodhebrew",0,
"afii57674","finalkaf","finalkafhebrew","finalkafqamats",
"finalkafqamatshebrew","finalkafsheva","finalkafshevahebrew",0,"afii57675",
"kaf","kafhebrew",0,"afii57676","lamed","lamedhebrew","lamedholam",
"lamedholamdagesh","lamedholamdageshhebrew","lamedholamhebrew",0,"afii57677",
"finalmem","finalmemhebrew",0,"afii57678","mem","memhebrew",0,"afii57679",
"finalnun","finalnunhebrew",0,"afii57680","nun","nunhebrew",0,"afii57681",
"samekh","samekhhebrew",0,"afii57682","ayin","ayinhebrew",0,"afii57683",
"finalpe","finalpehebrew",0,"afii57684","pe","pehebrew",0,"afii57685",
"finaltsadi","finaltsadihebrew",0,"afii57686","tsadi","tsadihebrew",0,
"afii57687","qof","qofhatafpatah","qofhatafpatahhebrew","qofhatafsegol",
"qofhatafsegolhebrew","qofhebrew","qofhiriq","qofhiriqhebrew","qofholam",
"qofholamhebrew","qofpatah","qofpatahhebrew","qofqamats","qofqamatshebrew",
"qofqubuts","qofqubutshebrew","qofsegol","qofsegolhebrew","qofsheva",
"qofshevahebrew","qoftsere","qoftserehebrew",0,"afii57688","resh",
"reshhatafpatah","reshhatafpatahhebrew","reshhatafsegol",
"reshhatafsegolhebrew","reshhebrew","reshhiriq","reshhiriqhebrew","reshholam",
"reshholamhebrew","reshpatah","reshpatahhebrew","reshqamats",
"reshqamatshebrew","reshqubuts","reshqubutshebrew","reshsegol",
"reshsegolhebrew","reshsheva","reshshevahebrew","reshtsere","reshtserehebrew",
0,"afii57689","shin","shinhebrew",0,"afii57690","tav","tavhebrew",0,
"afii57716","vavvavhebrew",0,"afii57717","vavyodhebrew",0,"afii57718",
"yodyodhebrew",0,"afii57388","commaarabic",0,"afii57403","semicolonarabic",0,
"afii57407","questionarabic",0,"afii57409","hamzaarabic","hamzadammaarabic",
"hamzadammatanarabic","hamzafathaarabic","hamzafathatanarabic",
"hamzalowarabic","hamzalowkasraarabic","hamzalowkasratanarabic",
"hamzasukunarabic",0,"afii57410","alefmaddaabovearabic",0,"afii57411",
"alefhamzaabovearabic",0,"afii57412","wawhamzaabovearabic",0,"afii57413",
"alefhamzabelowarabic",0,"afii57414","yehhamzaabovearabic",0,"afii57415",
"alefarabic",0,"afii57416","beharabic",0,"afii57417","tehmarbutaarabic",0,
"afii57418","teharabic",0,"afii57419","theharabic",0,"afii57420","jeemarabic",
0,"afii57421","haharabic",0,"afii57422","khaharabic",0,"afii57423",
"dalarabic",0,"afii57424","thalarabic",0,"afii57425","reharabic",
"rehyehaleflamarabic",0,"afii57426","zainarabic",0,"afii57427","seenarabic",0,
"afii57428","sheenarabic",0,"afii57429","sadarabic",0,"afii57430","dadarabic",
0,"afii57431","taharabic",0,"afii57432","zaharabic",0,"afii57433","ainarabic",
0,"afii57434","ghainarabic",0,"afii57440","kashidaautoarabic",
"kashidaautonosidebearingarabic","tatweelarabic",0,"afii57441","feharabic",0,
"afii57442","qafarabic",0,"afii57443","kafarabic",0,"afii57444","lamarabic",0,
"afii57445","meemarabic",0,"afii57446","noonarabic",0,"afii57470","heharabic",
0,"afii57448","wawarabic",0,"afii57449","alefmaksuraarabic",0,"afii57450",
"yeharabic",0,"afii57451","fathatanarabic",0,"afii57452",
"dammatanaltonearabic","dammatanarabic",0,"afii57453","kasratanarabic",0,
"afii57454","fathaarabic","fathalowarabic",0,"afii57455","dammaarabic",
"dammalowarabic",0,"afii57456","kasraarabic",0,"afii57457","shaddaarabic",
"shaddafathatanarabic",0,"afii57458","sukunarabic",0,"afii57392","zeroarabic",
"zerohackarabic",0,"afii57393","onearabic","onehackarabic",0,"afii57394",
"twoarabic","twohackarabic",0,"afii57395","threearabic","threehackarabic",0,
"afii57396","fourarabic","fourhackarabic",0,"afii57397","fivearabic",
"fivehackarabic",0,"afii57398","sixarabic","sixhackarabic",0,"afii57399",
"sevenarabic","sevenhackarabic",0,"afii57400","eightarabic","eighthackarabic",
0,"afii57401","ninearabic","ninehackarabic",0,"afii57381","percentarabic",0,
"decimalseparatorarabic","decimalseparatorpersian",0,
"thousandsseparatorarabic","thousandsseparatorpersian",0,"afii63167",
"asteriskaltonearabic","asteriskarabic",0,"afii57511","tteharabic",0,
"afii57506","peharabic",0,"afii57507","tcheharabic",0,"afii57512",
"ddalarabic",0,"afii57513","rreharabic",0,"afii57508","jeharabic",0,
"afii57505","veharabic",0,"afii57509","gafarabic",0,"afii57514",
"noonghunnaarabic",0,"haaltonearabic","hehaltonearabic",0,"afii57519",
"yehbarreearabic",0,"afii61664","zerowidthnonjoiner",0,"afii00208",
"horizontalbar",0,"dbllowline","underscoredbl",0,"quoteleftreversed",
"quotereversed",0,"twodotenleader","twodotleader",0,"colonmonetary",
"colonsign",0,"afii08941","lira",0,"afii57636","newsheqelsign","sheqel",
"sheqelhebrew",0,"Euro","euro",0,"afii61248","careof",0,"afii61289","lsquare",
0,"afii61352","numero",0,"Ohm","Omega",0,"arrowupdnbse","arrowupdownbase",0,
"arrowdblleft","arrowleftdbl",0,"arrowdblright","dblarrowright",0,
"arrowdblboth","dblarrowleft",0,"forall","universal",0,"existential",
"thereexists",0,"Delta","increment",0,"gradient","nabla",0,"notelement",
"notelementof",0,"orthogonal","rightangle",0,"similar","tildeoperator",0,
"approximatelyequal","congruent",0,"propersubset","subset",0,"propersuperset",
"superset",0,"reflexsubset","subsetorequal",0,"reflexsuperset",
"supersetorequal",0,"circleplus","pluscircle",0,"circlemultiply",
"timescircle",0,"logicalnotreversed","revlogicalnot",0,"integraltop",
"integraltp",0,"integralbottom","integralbt",0,"ltshade","shadelight",0,
"shade","shademedium",0,"dkshade","shadedark",0,"blacksquare","filledbox",0,
"H22073","whitesquare",0,"H18543","blacksmallsquare",0,"H18551",
"whitesmallsquare",0,"blackrectangle","filledrect",0,
"blackuppointingtriangle","triagup",0,"blackrightpointingpointer","triagrt",0,
"blackdownpointingtriangle","triagdn",0,"blackleftpointingpointer","triaglf",
0,"circle","whitecircle",0,"H18533","blackcircle",0,"bulletinverse",
"invbullet",0,"invcircle","whitecircleinverse",0,"openbullet","whitebullet",0,
"smileface","whitesmilingface",0,"blacksmilingface","invsmileface",0,
"compass","sun",0,"female","venus",0,"male","mars",0,"spade","spadesuitblack",
0,"club","clubsuitblack",0,"heart","heartsuitblack",0,"eighthnotebeamed",
"musicalnotedbl",0,"afii57705","doubleyodpatah","doubleyodpatahhebrew",
"yodyodpatahhebrew",0,"afii57694","shinshindot","shinshindothebrew",0,
"afii57695","shinsindot","shinsindothebrew",0,"shindageshshindot",
"shindageshshindothebrew",0,"shindageshsindot","shindageshsindothebrew",0,
"betdagesh","betdageshhebrew",0,"gimeldagesh","gimeldageshhebrew",0,
"daletdagesh","daletdageshhebrew",0,"hedagesh","hedageshhebrew",0,"afii57723",
"vavdagesh","vavdagesh65","vavdageshhebrew",0,"zayindagesh",
"zayindageshhebrew",0,"tetdagesh","tetdageshhebrew",0,"yoddagesh",
"yoddageshhebrew",0,"finalkafdagesh","finalkafdageshhebrew",0,"kafdagesh",
"kafdageshhebrew",0,"lameddagesh","lameddageshhebrew",0,"memdagesh",
"memdageshhebrew",0,"nundagesh","nundageshhebrew",0,"samekhdagesh",
"samekhdageshhebrew",0,"pedagesh","pedageshhebrew",0,"tsadidagesh",
"tsadidageshhebrew",0,"qofdagesh","qofdageshhebrew",0,"shindagesh",
"shindageshhebrew",0,"tavdages","tavdagesh","tavdageshhebrew",0,"afii57700",
"vavholam","vavholamhebrew",0,"tchehinitialarabic","tchehmeeminitialarabic",0,
"laminitialarabic","lammeemjeeminitialarabic","lammeemkhahinitialarabic",0,
"noonhehinitialarabic","nooninitialarabic",0,"hehfinalalttwoarabic",
"hehfinalarabic",0,"alefmaksurainitialarabic","yehinitialarabic",0,
"alefmaksuramedialarabic","yehmedialarabic",0,
};
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/mupdf.h
0,0 → 1,493
#ifndef _MUPDF_H_
#define _MUPDF_H_
 
#ifndef _FITZ_H_
#error "fitz.h must be included before mupdf.h"
#endif
 
typedef struct pdf_xref_s pdf_xref;
 
/*
* tokenizer and low-level object parser
*/
 
enum
{
PDF_TOK_ERROR, PDF_TOK_EOF,
PDF_TOK_OPEN_ARRAY, PDF_TOK_CLOSE_ARRAY,
PDF_TOK_OPEN_DICT, PDF_TOK_CLOSE_DICT,
PDF_TOK_OPEN_BRACE, PDF_TOK_CLOSE_BRACE,
PDF_TOK_NAME, PDF_TOK_INT, PDF_TOK_REAL, PDF_TOK_STRING, PDF_TOK_KEYWORD,
PDF_TOK_R, PDF_TOK_TRUE, PDF_TOK_FALSE, PDF_TOK_NULL,
PDF_TOK_OBJ, PDF_TOK_ENDOBJ,
PDF_TOK_STREAM, PDF_TOK_ENDSTREAM,
PDF_TOK_XREF, PDF_TOK_TRAILER, PDF_TOK_STARTXREF,
PDF_NUM_TOKENS
};
 
fz_error pdf_lex(int *tok, fz_stream *f, char *buf, int n, int *len);
 
fz_error pdf_parse_array(fz_obj **op, pdf_xref *xref, fz_stream *f, char *buf, int cap);
fz_error pdf_parse_dict(fz_obj **op, pdf_xref *xref, fz_stream *f, char *buf, int cap);
fz_error pdf_parse_stm_obj(fz_obj **op, pdf_xref *xref, fz_stream *f, char *buf, int cap);
fz_error pdf_parse_ind_obj(fz_obj **op, pdf_xref *xref, fz_stream *f, char *buf, int cap, int *num, int *gen, int *stm_ofs);
 
fz_rect pdf_to_rect(fz_obj *array);
fz_matrix pdf_to_matrix(fz_obj *array);
char *pdf_to_utf8(fz_obj *src);
unsigned short *pdf_to_ucs2(fz_obj *src);
fz_obj *pdf_to_utf8_name(fz_obj *src);
char *pdf_from_ucs2(unsigned short *str);
 
/*
* xref and object / stream api
*/
 
typedef struct pdf_xref_entry_s pdf_xref_entry;
typedef struct pdf_crypt_s pdf_crypt;
 
struct pdf_xref_entry_s
{
int ofs; /* file offset / objstm object number */
int gen; /* generation / objstm index */
int stm_ofs; /* on-disk stream */
fz_obj *obj; /* stored/cached object */
int type; /* 0=unset (f)ree i(n)use (o)bjstm */
};
 
struct pdf_xref_s
{
fz_stream *file;
int version;
int startxref;
int file_size;
pdf_crypt *crypt;
fz_obj *trailer;
 
int len;
pdf_xref_entry *table;
 
int page_len;
int page_cap;
fz_obj **page_objs;
fz_obj **page_refs;
 
struct pdf_store_s *store;
 
char scratch[65536];
};
 
fz_obj *pdf_resolve_indirect(fz_obj *ref);
fz_error pdf_cache_object(pdf_xref *, int num, int gen);
fz_error pdf_load_object(fz_obj **objp, pdf_xref *, int num, int gen);
void pdf_update_object( pdf_xref *xref, int num, int gen, fz_obj *newobj);
 
int pdf_is_stream(pdf_xref *xref, int num, int gen);
fz_stream *pdf_open_inline_stream(fz_stream *chain, pdf_xref *xref, fz_obj *stmobj, int length);
fz_error pdf_load_raw_stream(fz_buffer **bufp, pdf_xref *xref, int num, int gen);
fz_error pdf_load_stream(fz_buffer **bufp, pdf_xref *xref, int num, int gen);
fz_error pdf_open_raw_stream(fz_stream **stmp, pdf_xref *, int num, int gen);
fz_error pdf_open_stream(fz_stream **stmp, pdf_xref *, int num, int gen);
fz_error pdf_open_stream_at(fz_stream **stmp, pdf_xref *xref, int num, int gen, fz_obj *dict, int stm_ofs);
 
fz_error pdf_open_xref_with_stream(pdf_xref **xrefp, fz_stream *file, char *password);
fz_error pdf_open_xref(pdf_xref **xrefp, const char *filename, char *password);
void pdf_free_xref(pdf_xref *);
 
/* private */
fz_error pdf_repair_xref(pdf_xref *xref, char *buf, int bufsize);
fz_error pdf_repair_obj_stms(pdf_xref *xref);
void pdf_debug_xref(pdf_xref *);
void pdf_resize_xref(pdf_xref *xref, int newcap);
 
/*
* Encryption
*/
 
enum
{
PDF_PERM_PRINT = 1 << 2,
PDF_PERM_CHANGE = 1 << 3,
PDF_PERM_COPY = 1 << 4,
PDF_PERM_NOTES = 1 << 5,
PDF_PERM_FILL_FORM = 1 << 8,
PDF_PERM_ACCESSIBILITY = 1 << 9,
PDF_PERM_ASSEMBLE = 1 << 10,
PDF_PERM_HIGH_RES_PRINT = 1 << 11,
PDF_DEFAULT_PERM_FLAGS = 0xfffc
};
 
fz_error pdf_new_crypt(pdf_crypt **cp, fz_obj *enc, fz_obj *id);
void pdf_free_crypt(pdf_crypt *crypt);
 
void pdf_crypt_obj(pdf_crypt *crypt, fz_obj *obj, int num, int gen);
fz_stream *pdf_open_crypt(fz_stream *chain, pdf_crypt *crypt, int num, int gen);
fz_stream *pdf_open_crypt_with_filter(fz_stream *chain, pdf_crypt *crypt, char *name, int num, int gen);
 
int pdf_needs_password(pdf_xref *xref);
int pdf_authenticate_password(pdf_xref *xref, char *pw);
int pdf_has_permission(pdf_xref *xref, int p);
 
int pdf_get_crypt_revision(pdf_xref *xref);
char *pdf_get_crypt_method(pdf_xref *xref);
int pdf_get_crypt_length(pdf_xref *xref);
unsigned char *pdf_get_crypt_key(pdf_xref *xref);
 
void pdf_debug_crypt(pdf_crypt *crypt);
 
/*
* Resource store
*/
 
typedef struct pdf_store_s pdf_store;
 
pdf_store *pdf_new_store(void);
void pdf_free_store(pdf_store *store);
void pdf_debug_store(pdf_store *store);
 
void pdf_store_item(pdf_store *store, void *keepfn, void *dropfn, fz_obj *key, void *val);
void *pdf_find_item(pdf_store *store, void *dropfn, fz_obj *key);
void pdf_remove_item(pdf_store *store, void *dropfn, fz_obj *key);
void pdf_age_store(pdf_store *store, int maxage);
 
/*
* Functions, Colorspaces, Shadings and Images
*/
 
typedef struct pdf_function_s pdf_function;
 
fz_error pdf_load_function(pdf_function **func, pdf_xref *xref, fz_obj *ref);
void pdf_eval_function(pdf_function *func, float *in, int inlen, float *out, int outlen);
pdf_function *pdf_keep_function(pdf_function *func);
void pdf_drop_function(pdf_function *func);
 
fz_error pdf_load_colorspace(fz_colorspace **csp, pdf_xref *xref, fz_obj *obj);
fz_pixmap *pdf_expand_indexed_pixmap(fz_pixmap *src);
 
fz_error pdf_load_shading(fz_shade **shadep, pdf_xref *xref, fz_obj *obj);
 
fz_error pdf_load_inline_image(fz_pixmap **imgp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict, fz_stream *file);
fz_error pdf_load_image(fz_pixmap **imgp, pdf_xref *xref, fz_obj *obj);
int pdf_is_jpx_image(fz_obj *dict);
 
/*
* Pattern
*/
 
typedef struct pdf_pattern_s pdf_pattern;
 
struct pdf_pattern_s
{
int refs;
int ismask;
float xstep;
float ystep;
fz_matrix matrix;
fz_rect bbox;
fz_obj *resources;
fz_buffer *contents;
};
 
fz_error pdf_load_pattern(pdf_pattern **patp, pdf_xref *xref, fz_obj *obj);
pdf_pattern *pdf_keep_pattern(pdf_pattern *pat);
void pdf_drop_pattern(pdf_pattern *pat);
 
/*
* XObject
*/
 
typedef struct pdf_xobject_s pdf_xobject;
 
struct pdf_xobject_s
{
int refs;
fz_matrix matrix;
fz_rect bbox;
int isolated;
int knockout;
int transparency;
fz_colorspace *colorspace;
fz_obj *resources;
fz_buffer *contents;
};
 
fz_error pdf_load_xobject(pdf_xobject **xobjp, pdf_xref *xref, fz_obj *obj);
pdf_xobject *pdf_keep_xobject(pdf_xobject *xobj);
void pdf_drop_xobject(pdf_xobject *xobj);
 
/*
* CMap
*/
 
typedef struct pdf_cmap_s pdf_cmap;
typedef struct pdf_range_s pdf_range;
 
enum { PDF_CMAP_SINGLE, PDF_CMAP_RANGE, PDF_CMAP_TABLE, PDF_CMAP_MULTI };
 
struct pdf_range_s
{
unsigned short low;
/* Next, we pack 2 fields into the same unsigned short. Top 14 bits
* are the extent, bottom 2 bits are flags: single, range, table,
* multi */
unsigned short extent_flags;
unsigned short offset; /* range-delta or table-index */
};
 
struct pdf_cmap_s
{
int refs;
char cmap_name[32];
 
char usecmap_name[32];
pdf_cmap *usecmap;
 
int wmode;
 
int codespace_len;
struct
{
unsigned short n;
unsigned short low;
unsigned short high;
} codespace[40];
 
int rlen, rcap;
pdf_range *ranges;
 
int tlen, tcap;
unsigned short *table;
};
 
pdf_cmap *pdf_new_cmap(void);
pdf_cmap *pdf_keep_cmap(pdf_cmap *cmap);
void pdf_drop_cmap(pdf_cmap *cmap);
 
void pdf_debug_cmap(pdf_cmap *cmap);
int pdf_get_wmode(pdf_cmap *cmap);
void pdf_set_wmode(pdf_cmap *cmap, int wmode);
void pdf_set_usecmap(pdf_cmap *cmap, pdf_cmap *usecmap);
 
void pdf_add_codespace(pdf_cmap *cmap, int low, int high, int n);
void pdf_map_range_to_table(pdf_cmap *cmap, int low, int *map, int len);
void pdf_map_range_to_range(pdf_cmap *cmap, int srclo, int srchi, int dstlo);
void pdf_map_one_to_many(pdf_cmap *cmap, int one, int *many, int len);
void pdf_sort_cmap(pdf_cmap *cmap);
 
int pdf_lookup_cmap(pdf_cmap *cmap, int cpt);
int pdf_lookup_cmap_full(pdf_cmap *cmap, int cpt, int *out);
unsigned char *pdf_decode_cmap(pdf_cmap *cmap, unsigned char *s, int *cpt);
 
pdf_cmap *pdf_new_identity_cmap(int wmode, int bytes);
fz_error pdf_parse_cmap(pdf_cmap **cmapp, fz_stream *file);
fz_error pdf_load_embedded_cmap(pdf_cmap **cmapp, pdf_xref *xref, fz_obj *ref);
fz_error pdf_load_system_cmap(pdf_cmap **cmapp, char *name);
pdf_cmap *pdf_find_builtin_cmap(char *cmap_name);
 
/*
* Font
*/
 
enum
{
PDF_FD_FIXED_PITCH = 1 << 0,
PDF_FD_SERIF = 1 << 1,
PDF_FD_SYMBOLIC = 1 << 2,
PDF_FD_SCRIPT = 1 << 3,
PDF_FD_NONSYMBOLIC = 1 << 5,
PDF_FD_ITALIC = 1 << 6,
PDF_FD_ALL_CAP = 1 << 16,
PDF_FD_SMALL_CAP = 1 << 17,
PDF_FD_FORCE_BOLD = 1 << 18
};
 
enum { PDF_ROS_CNS, PDF_ROS_GB, PDF_ROS_JAPAN, PDF_ROS_KOREA };
 
void pdf_load_encoding(char **estrings, char *encoding);
int pdf_lookup_agl(char *name);
const char **pdf_lookup_agl_duplicates(int ucs);
 
extern const unsigned short pdf_doc_encoding[256];
extern const char * const pdf_mac_roman[256];
extern const char * const pdf_mac_expert[256];
extern const char * const pdf_win_ansi[256];
extern const char * const pdf_standard[256];
 
typedef struct pdf_font_desc_s pdf_font_desc;
typedef struct pdf_hmtx_s pdf_hmtx;
typedef struct pdf_vmtx_s pdf_vmtx;
 
struct pdf_hmtx_s
{
unsigned short lo;
unsigned short hi;
int w; /* type3 fonts can be big! */
};
 
struct pdf_vmtx_s
{
unsigned short lo;
unsigned short hi;
short x;
short y;
short w;
};
 
struct pdf_font_desc_s
{
int refs;
 
fz_font *font;
 
/* FontDescriptor */
int flags;
float italic_angle;
float ascent;
float descent;
float cap_height;
float x_height;
float missing_width;
 
/* Encoding (CMap) */
pdf_cmap *encoding;
pdf_cmap *to_ttf_cmap;
int cid_to_gid_len;
unsigned short *cid_to_gid;
 
/* ToUnicode */
pdf_cmap *to_unicode;
int cid_to_ucs_len;
unsigned short *cid_to_ucs;
 
/* Metrics (given in the PDF file) */
int wmode;
 
int hmtx_len, hmtx_cap;
pdf_hmtx dhmtx;
pdf_hmtx *hmtx;
 
int vmtx_len, vmtx_cap;
pdf_vmtx dvmtx;
pdf_vmtx *vmtx;
 
int is_embedded;
};
 
void pdf_set_font_wmode(pdf_font_desc *font, int wmode);
void pdf_set_default_hmtx(pdf_font_desc *font, int w);
void pdf_set_default_vmtx(pdf_font_desc *font, int y, int w);
void pdf_add_hmtx(pdf_font_desc *font, int lo, int hi, int w);
void pdf_add_vmtx(pdf_font_desc *font, int lo, int hi, int x, int y, int w);
void pdf_end_hmtx(pdf_font_desc *font);
void pdf_end_vmtx(pdf_font_desc *font);
pdf_hmtx pdf_get_hmtx(pdf_font_desc *font, int cid);
pdf_vmtx pdf_get_vmtx(pdf_font_desc *font, int cid);
 
fz_error pdf_load_to_unicode(pdf_font_desc *font, pdf_xref *xref, char **strings, char *collection, fz_obj *cmapstm);
 
int pdf_font_cid_to_gid(pdf_font_desc *fontdesc, int cid);
 
unsigned char *pdf_find_builtin_font(char *name, unsigned int *len);
unsigned char *pdf_find_substitute_font(int mono, int serif, int bold, int italic, unsigned int *len);
unsigned char *pdf_find_substitute_cjk_font(int ros, int serif, unsigned int *len);
 
fz_error pdf_load_type3_font(pdf_font_desc **fontp, pdf_xref *xref, fz_obj *rdb, fz_obj *obj);
fz_error pdf_load_font(pdf_font_desc **fontp, pdf_xref *xref, fz_obj *rdb, fz_obj *obj);
 
pdf_font_desc *pdf_new_font_desc(void);
pdf_font_desc *pdf_keep_font(pdf_font_desc *fontdesc);
void pdf_drop_font(pdf_font_desc *font);
 
void pdf_debug_font(pdf_font_desc *fontdesc);
 
/*
* Interactive features
*/
 
typedef struct pdf_link_s pdf_link;
typedef struct pdf_annot_s pdf_annot;
typedef struct pdf_outline_s pdf_outline;
 
typedef enum pdf_link_kind_e
{
PDF_LINK_GOTO = 0,
PDF_LINK_URI,
PDF_LINK_LAUNCH,
PDF_LINK_NAMED,
PDF_LINK_ACTION,
} pdf_link_kind;
 
struct pdf_link_s
{
pdf_link_kind kind;
fz_rect rect;
fz_obj *dest;
pdf_link *next;
};
 
struct pdf_annot_s
{
fz_obj *obj;
fz_rect rect;
pdf_xobject *ap;
fz_matrix matrix;
pdf_annot *next;
};
 
struct pdf_outline_s
{
char *title;
pdf_link *link;
int count;
pdf_outline *child;
pdf_outline *next;
};
 
fz_obj *pdf_lookup_dest(pdf_xref *xref, fz_obj *needle);
fz_obj *pdf_lookup_name(pdf_xref *xref, char *which, fz_obj *needle);
fz_obj *pdf_load_name_tree(pdf_xref *xref, char *which);
 
pdf_outline *pdf_load_outline(pdf_xref *xref);
void pdf_debug_outline(pdf_outline *outline, int level);
void pdf_free_outline(pdf_outline *outline);
 
pdf_link *pdf_load_link(pdf_xref *xref, fz_obj *dict);
void pdf_load_links(pdf_link **, pdf_xref *, fz_obj *annots);
void pdf_free_link(pdf_link *link);
 
void pdf_load_annots(pdf_annot **, pdf_xref *, fz_obj *annots);
void pdf_free_annot(pdf_annot *link);
 
/*
* Page tree, pages and related objects
*/
 
typedef struct pdf_page_s pdf_page;
 
struct pdf_page_s
{
fz_rect mediabox;
int rotate;
int transparency;
fz_obj *resources;
fz_buffer *contents;
pdf_link *links;
pdf_annot *annots;
};
 
fz_error pdf_load_page_tree(pdf_xref *xref);
int pdf_find_page_number(pdf_xref *xref, fz_obj *pageobj);
int pdf_count_pages(pdf_xref *xref);
 
fz_error pdf_load_page(pdf_page **pagep, pdf_xref *xref, int number);
void pdf_free_page(pdf_page *page);
 
/*
* Content stream parsing
*/
 
fz_error pdf_run_page_with_usage(pdf_xref *xref, pdf_page *page, fz_device *dev, fz_matrix ctm, char *target);
fz_error pdf_run_page(pdf_xref *xref, pdf_page *page, fz_device *dev, fz_matrix ctm);
fz_error pdf_run_glyph(pdf_xref *xref, fz_obj *resources, fz_buffer *contents, fz_device *dev, fz_matrix ctm);
 
#endif
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_annot.c
0,0 → 1,234
#include "fitz.h"
#include "mupdf.h"
 
void
pdf_free_link(pdf_link *link)
{
if (link->next)
pdf_free_link(link->next);
if (link->dest)
fz_drop_obj(link->dest);
fz_free(link);
}
 
static fz_obj *
resolve_dest(pdf_xref *xref, fz_obj *dest)
{
if (fz_is_name(dest) || fz_is_string(dest))
{
dest = pdf_lookup_dest(xref, dest);
return resolve_dest(xref, dest);
}
 
else if (fz_is_array(dest))
{
return dest;
}
 
else if (fz_is_dict(dest))
{
dest = fz_dict_gets(dest, "D");
return resolve_dest(xref, dest);
}
 
else if (fz_is_indirect(dest))
return dest;
 
return NULL;
}
 
pdf_link *
pdf_load_link(pdf_xref *xref, fz_obj *dict)
{
fz_obj *dest;
fz_obj *action;
fz_obj *obj;
fz_rect bbox;
pdf_link_kind kind;
 
dest = NULL;
 
obj = fz_dict_gets(dict, "Rect");
if (obj)
bbox = pdf_to_rect(obj);
else
bbox = fz_empty_rect;
 
obj = fz_dict_gets(dict, "Dest");
if (obj)
{
kind = PDF_LINK_GOTO;
dest = resolve_dest(xref, obj);
}
 
action = fz_dict_gets(dict, "A");
 
/* fall back to additional action button's down/up action */
if (!action)
action = fz_dict_getsa(fz_dict_gets(dict, "AA"), "U", "D");
 
if (action)
{
obj = fz_dict_gets(action, "S");
if (fz_is_name(obj) && !strcmp(fz_to_name(obj), "GoTo"))
{
kind = PDF_LINK_GOTO;
dest = resolve_dest(xref, fz_dict_gets(action, "D"));
}
else if (fz_is_name(obj) && !strcmp(fz_to_name(obj), "URI"))
{
kind = PDF_LINK_URI;
dest = fz_dict_gets(action, "URI");
}
else if (fz_is_name(obj) && !strcmp(fz_to_name(obj), "Launch"))
{
kind = PDF_LINK_LAUNCH;
dest = fz_dict_gets(action, "F");
}
else if (fz_is_name(obj) && !strcmp(fz_to_name(obj), "Named"))
{
kind = PDF_LINK_NAMED;
dest = fz_dict_gets(action, "N");
}
else if (fz_is_name(obj) && (!strcmp(fz_to_name(obj), "GoToR")))
{
kind = PDF_LINK_ACTION;
dest = action;
}
else
{
dest = NULL;
}
}
 
if (dest)
{
pdf_link *link = fz_malloc(sizeof(pdf_link));
link->kind = kind;
link->rect = bbox;
link->dest = fz_keep_obj(dest);
link->next = NULL;
return link;
}
 
return NULL;
}
 
void
pdf_load_links(pdf_link **linkp, pdf_xref *xref, fz_obj *annots)
{
pdf_link *link, *head, *tail;
fz_obj *obj;
int i;
 
head = tail = NULL;
link = NULL;
 
for (i = 0; i < fz_array_len(annots); i++)
{
obj = fz_array_get(annots, i);
link = pdf_load_link(xref, obj);
if (link)
{
if (!head)
head = tail = link;
else
{
tail->next = link;
tail = link;
}
}
}
 
*linkp = head;
}
 
void
pdf_free_annot(pdf_annot *annot)
{
if (annot->next)
pdf_free_annot(annot->next);
if (annot->ap)
pdf_drop_xobject(annot->ap);
if (annot->obj)
fz_drop_obj(annot->obj);
fz_free(annot);
}
 
static void
pdf_transform_annot(pdf_annot *annot)
{
fz_matrix matrix = annot->ap->matrix;
fz_rect bbox = annot->ap->bbox;
fz_rect rect = annot->rect;
float w, h, x, y;
 
bbox = fz_transform_rect(matrix, bbox);
w = (rect.x1 - rect.x0) / (bbox.x1 - bbox.x0);
h = (rect.y1 - rect.y0) / (bbox.y1 - bbox.y0);
x = rect.x0 - bbox.x0;
y = rect.y0 - bbox.y0;
 
annot->matrix = fz_concat(fz_scale(w, h), fz_translate(x, y));
}
 
void
pdf_load_annots(pdf_annot **annotp, pdf_xref *xref, fz_obj *annots)
{
pdf_annot *annot, *head, *tail;
fz_obj *obj, *ap, *as, *n, *rect;
pdf_xobject *form;
fz_error error;
int i;
 
head = tail = NULL;
annot = NULL;
 
for (i = 0; i < fz_array_len(annots); i++)
{
obj = fz_array_get(annots, i);
 
rect = fz_dict_gets(obj, "Rect");
ap = fz_dict_gets(obj, "AP");
as = fz_dict_gets(obj, "AS");
if (fz_is_dict(ap))
{
n = fz_dict_gets(ap, "N"); /* normal state */
 
/* lookup current state in sub-dictionary */
if (!pdf_is_stream(xref, fz_to_num(n), fz_to_gen(n)))
n = fz_dict_get(n, as);
 
if (pdf_is_stream(xref, fz_to_num(n), fz_to_gen(n)))
{
error = pdf_load_xobject(&form, xref, n);
if (error)
{
fz_catch(error, "ignoring broken annotation");
continue;
}
 
annot = fz_malloc(sizeof(pdf_annot));
annot->obj = fz_keep_obj(obj);
annot->rect = pdf_to_rect(rect);
annot->ap = form;
annot->next = NULL;
 
pdf_transform_annot(annot);
 
if (annot)
{
if (!head)
head = tail = annot;
else
{
tail->next = annot;
tail = annot;
}
}
}
}
}
 
*annotp = head;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_cmap.c
0,0 → 1,510
/*
* The CMap data structure here is constructed on the fly by
* adding simple range-to-range mappings. Then the data structure
* is optimized to contain both range-to-range and range-to-table
* lookups.
*
* Any one-to-many mappings are inserted as one-to-table
* lookups in the beginning, and are not affected by the optimization
* stage.
*
* There is a special function to add a 256-length range-to-table mapping.
* The ranges do not have to be added in order.
*
* This code can be a lot simpler if we don't care about wasting memory,
* or can trust the parser to give us optimal mappings.
*/
 
#include "fitz.h"
#include "mupdf.h"
 
/* Macros for accessing the combined extent_flags field */
#define pdf_range_high(r) ((r)->low + ((r)->extent_flags >> 2))
#define pdf_range_flags(r) ((r)->extent_flags & 3)
#define pdf_range_set_high(r, h) \
((r)->extent_flags = (((r)->extent_flags & 3) | ((h - (r)->low) << 2)))
#define pdf_range_set_flags(r, f) \
((r)->extent_flags = (((r)->extent_flags & ~3) | f))
 
/*
* Allocate, destroy and simple parameters.
*/
 
pdf_cmap *
pdf_new_cmap(void)
{
pdf_cmap *cmap;
 
cmap = fz_malloc(sizeof(pdf_cmap));
cmap->refs = 1;
 
strcpy(cmap->cmap_name, "");
strcpy(cmap->usecmap_name, "");
cmap->usecmap = NULL;
cmap->wmode = 0;
cmap->codespace_len = 0;
 
cmap->rlen = 0;
cmap->rcap = 0;
cmap->ranges = NULL;
 
cmap->tlen = 0;
cmap->tcap = 0;
cmap->table = NULL;
 
return cmap;
}
 
pdf_cmap *
pdf_keep_cmap(pdf_cmap *cmap)
{
if (cmap->refs >= 0)
cmap->refs ++;
return cmap;
}
 
void
pdf_drop_cmap(pdf_cmap *cmap)
{
if (cmap->refs >= 0)
{
if (--cmap->refs == 0)
{
if (cmap->usecmap)
pdf_drop_cmap(cmap->usecmap);
fz_free(cmap->ranges);
fz_free(cmap->table);
fz_free(cmap);
}
}
}
 
void
pdf_set_usecmap(pdf_cmap *cmap, pdf_cmap *usecmap)
{
int i;
 
if (cmap->usecmap)
pdf_drop_cmap(cmap->usecmap);
cmap->usecmap = pdf_keep_cmap(usecmap);
 
if (cmap->codespace_len == 0)
{
cmap->codespace_len = usecmap->codespace_len;
for (i = 0; i < usecmap->codespace_len; i++)
cmap->codespace[i] = usecmap->codespace[i];
}
}
 
int
pdf_get_wmode(pdf_cmap *cmap)
{
return cmap->wmode;
}
 
void
pdf_set_wmode(pdf_cmap *cmap, int wmode)
{
cmap->wmode = wmode;
}
 
void
pdf_debug_cmap(pdf_cmap *cmap)
{
int i, k, n;
 
printf("cmap $%p /%s {\n", (void *) cmap, cmap->cmap_name);
 
if (cmap->usecmap_name[0])
printf("\tusecmap /%s\n", cmap->usecmap_name);
if (cmap->usecmap)
printf("\tusecmap $%p\n", (void *) cmap->usecmap);
 
printf("\twmode %d\n", cmap->wmode);
 
printf("\tcodespaces {\n");
for (i = 0; i < cmap->codespace_len; i++)
{
printf("\t\t<%x> <%x>\n", cmap->codespace[i].low, cmap->codespace[i].high);
}
printf("\t}\n");
 
printf("\tranges (%d,%d) {\n", cmap->rlen, cmap->tlen);
for (i = 0; i < cmap->rlen; i++)
{
pdf_range *r = &cmap->ranges[i];
printf("\t\t<%04x> <%04x> ", r->low, pdf_range_high(r));
if (pdf_range_flags(r) == PDF_CMAP_TABLE)
{
printf("[ ");
for (k = 0; k < pdf_range_high(r) - r->low + 1; k++)
printf("%d ", cmap->table[r->offset + k]);
printf("]\n");
}
else if (pdf_range_flags(r) == PDF_CMAP_MULTI)
{
printf("< ");
n = cmap->table[r->offset];
for (k = 0; k < n; k++)
printf("%04x ", cmap->table[r->offset + 1 + k]);
printf(">\n");
}
else
printf("%d\n", r->offset);
}
printf("\t}\n}\n");
}
 
/*
* Add a codespacerange section.
* These ranges are used by pdf_decode_cmap to decode
* multi-byte encoded strings.
*/
void
pdf_add_codespace(pdf_cmap *cmap, int low, int high, int n)
{
if (cmap->codespace_len + 1 == nelem(cmap->codespace))
{
fz_warn("assert: too many code space ranges");
return;
}
 
cmap->codespace[cmap->codespace_len].n = n;
cmap->codespace[cmap->codespace_len].low = low;
cmap->codespace[cmap->codespace_len].high = high;
cmap->codespace_len ++;
}
 
/*
* Add an integer to the table.
*/
static void
add_table(pdf_cmap *cmap, int value)
{
if (cmap->tlen == USHRT_MAX)
{
fz_warn("cmap table is full; ignoring additional entries");
return;
}
if (cmap->tlen + 1 > cmap->tcap)
{
cmap->tcap = cmap->tcap > 1 ? (cmap->tcap * 3) / 2 : 256;
cmap->table = fz_realloc(cmap->table, cmap->tcap, sizeof(unsigned short));
}
cmap->table[cmap->tlen++] = value;
}
 
/*
* Add a range.
*/
static void
add_range(pdf_cmap *cmap, int low, int high, int flag, int offset)
{
/* If the range is too large to be represented, split it */
if (high - low > 0x3fff)
{
add_range(cmap, low, low+0x3fff, flag, offset);
add_range(cmap, low+0x3fff, high, flag, offset+0x3fff);
return;
}
if (cmap->rlen + 1 > cmap->rcap)
{
cmap->rcap = cmap->rcap > 1 ? (cmap->rcap * 3) / 2 : 256;
cmap->ranges = fz_realloc(cmap->ranges, cmap->rcap, sizeof(pdf_range));
}
cmap->ranges[cmap->rlen].low = low;
pdf_range_set_high(&cmap->ranges[cmap->rlen], high);
pdf_range_set_flags(&cmap->ranges[cmap->rlen], flag);
cmap->ranges[cmap->rlen].offset = offset;
cmap->rlen ++;
}
 
/*
* Add a range-to-table mapping.
*/
void
pdf_map_range_to_table(pdf_cmap *cmap, int low, int *table, int len)
{
int i;
int high = low + len;
int offset = cmap->tlen;
if (cmap->tlen + len >= USHRT_MAX)
fz_warn("cannot map range to table; table is full");
else
{
for (i = 0; i < len; i++)
add_table(cmap, table[i]);
add_range(cmap, low, high, PDF_CMAP_TABLE, offset);
}
}
 
/*
* Add a range of contiguous one-to-one mappings (ie 1..5 maps to 21..25)
*/
void
pdf_map_range_to_range(pdf_cmap *cmap, int low, int high, int offset)
{
add_range(cmap, low, high, high - low == 0 ? PDF_CMAP_SINGLE : PDF_CMAP_RANGE, offset);
}
 
/*
* Add a single one-to-many mapping.
*/
void
pdf_map_one_to_many(pdf_cmap *cmap, int low, int *values, int len)
{
int offset, i;
 
if (len == 1)
{
add_range(cmap, low, low, PDF_CMAP_SINGLE, values[0]);
return;
}
 
if (len > 8)
{
fz_warn("one to many mapping is too large (%d); truncating", len);
len = 8;
}
 
if (len == 2 &&
values[0] >= 0xD800 && values[0] <= 0xDBFF &&
values[1] >= 0xDC00 && values[1] <= 0xDFFF)
{
fz_warn("ignoring surrogate pair mapping in cmap");
return;
}
 
if (cmap->tlen + len + 1 >= USHRT_MAX)
fz_warn("cannot map one to many; table is full");
else
{
offset = cmap->tlen;
add_table(cmap, len);
for (i = 0; i < len; i++)
add_table(cmap, values[i]);
add_range(cmap, low, low, PDF_CMAP_MULTI, offset);
}
}
 
/*
* Sort the input ranges.
* Merge contiguous input ranges to range-to-range if the output is contiguous.
* Merge contiguous input ranges to range-to-table if the output is random.
*/
 
static int cmprange(const void *va, const void *vb)
{
return ((const pdf_range*)va)->low - ((const pdf_range*)vb)->low;
}
 
void
pdf_sort_cmap(pdf_cmap *cmap)
{
pdf_range *a; /* last written range on output */
pdf_range *b; /* current range examined on input */
 
if (cmap->rlen == 0)
return;
 
qsort(cmap->ranges, cmap->rlen, sizeof(pdf_range), cmprange);
 
if (cmap->tlen == USHRT_MAX)
{
fz_warn("cmap table is full; will not combine ranges");
return;
}
 
a = cmap->ranges;
b = cmap->ranges + 1;
 
while (b < cmap->ranges + cmap->rlen)
{
/* ignore one-to-many mappings */
if (pdf_range_flags(b) == PDF_CMAP_MULTI)
{
*(++a) = *b;
}
 
/* input contiguous */
else if (pdf_range_high(a) + 1 == b->low)
{
/* output contiguous */
if (pdf_range_high(a) - a->low + a->offset + 1 == b->offset)
{
/* SR -> R and SS -> R and RR -> R and RS -> R */
if ((pdf_range_flags(a) == PDF_CMAP_SINGLE || pdf_range_flags(a) == PDF_CMAP_RANGE) && (pdf_range_high(b) - a->low <= 0x3fff))
{
pdf_range_set_flags(a, PDF_CMAP_RANGE);
pdf_range_set_high(a, pdf_range_high(b));
}
 
/* LS -> L */
else if (pdf_range_flags(a) == PDF_CMAP_TABLE && pdf_range_flags(b) == PDF_CMAP_SINGLE && (pdf_range_high(b) - a->low <= 0x3fff))
{
pdf_range_set_high(a, pdf_range_high(b));
add_table(cmap, b->offset);
}
 
/* LR -> LR */
else if (pdf_range_flags(a) == PDF_CMAP_TABLE && pdf_range_flags(b) == PDF_CMAP_RANGE)
{
*(++a) = *b;
}
 
/* XX -> XX */
else
{
*(++a) = *b;
}
}
 
/* output separated */
else
{
/* SS -> L */
if (pdf_range_flags(a) == PDF_CMAP_SINGLE && pdf_range_flags(b) == PDF_CMAP_SINGLE)
{
pdf_range_set_flags(a, PDF_CMAP_TABLE);
pdf_range_set_high(a, pdf_range_high(b));
add_table(cmap, a->offset);
add_table(cmap, b->offset);
a->offset = cmap->tlen - 2;
}
 
/* LS -> L */
else if (pdf_range_flags(a) == PDF_CMAP_TABLE && pdf_range_flags(b) == PDF_CMAP_SINGLE && (pdf_range_high(b) - a->low <= 0x3fff))
{
pdf_range_set_high(a, pdf_range_high(b));
add_table(cmap, b->offset);
}
 
/* XX -> XX */
else
{
*(++a) = *b;
}
}
}
 
/* input separated: XX -> XX */
else
{
*(++a) = *b;
}
 
b ++;
}
 
cmap->rlen = a - cmap->ranges + 1;
 
fz_flush_warnings();
}
 
/*
* Lookup the mapping of a codepoint.
*/
int
pdf_lookup_cmap(pdf_cmap *cmap, int cpt)
{
int l = 0;
int r = cmap->rlen - 1;
int m;
 
while (l <= r)
{
m = (l + r) >> 1;
if (cpt < cmap->ranges[m].low)
r = m - 1;
else if (cpt > pdf_range_high(&cmap->ranges[m]))
l = m + 1;
else
{
int i = cpt - cmap->ranges[m].low + cmap->ranges[m].offset;
if (pdf_range_flags(&cmap->ranges[m]) == PDF_CMAP_TABLE)
return cmap->table[i];
if (pdf_range_flags(&cmap->ranges[m]) == PDF_CMAP_MULTI)
return -1; /* should use lookup_cmap_full */
return i;
}
}
 
if (cmap->usecmap)
return pdf_lookup_cmap(cmap->usecmap, cpt);
 
return -1;
}
 
int
pdf_lookup_cmap_full(pdf_cmap *cmap, int cpt, int *out)
{
int i, k, n;
int l = 0;
int r = cmap->rlen - 1;
int m;
 
while (l <= r)
{
m = (l + r) >> 1;
if (cpt < cmap->ranges[m].low)
r = m - 1;
else if (cpt > pdf_range_high(&cmap->ranges[m]))
l = m + 1;
else
{
k = cpt - cmap->ranges[m].low + cmap->ranges[m].offset;
if (pdf_range_flags(&cmap->ranges[m]) == PDF_CMAP_TABLE)
{
out[0] = cmap->table[k];
return 1;
}
else if (pdf_range_flags(&cmap->ranges[m]) == PDF_CMAP_MULTI)
{
n = cmap->ranges[m].offset;
for (i = 0; i < cmap->table[n]; i++)
out[i] = cmap->table[n + i + 1];
return cmap->table[n];
}
else
{
out[0] = k;
return 1;
}
}
}
 
if (cmap->usecmap)
return pdf_lookup_cmap_full(cmap->usecmap, cpt, out);
 
return 0;
}
 
/*
* Use the codespace ranges to extract a codepoint from a
* multi-byte encoded string.
*/
unsigned char *
pdf_decode_cmap(pdf_cmap *cmap, unsigned char *buf, int *cpt)
{
int k, n, c;
 
c = 0;
for (n = 0; n < 4; n++)
{
c = (c << 8) | buf[n];
for (k = 0; k < cmap->codespace_len; k++)
{
if (cmap->codespace[k].n == n + 1)
{
if (c >= cmap->codespace[k].low && c <= cmap->codespace[k].high)
{
*cpt = c;
return buf + n + 1;
}
}
}
}
 
*cpt = 0;
return buf + 1;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_cmap_load.c
0,0 → 1,118
#include "fitz.h"
#include "mupdf.h"
 
/*
* Load CMap stream in PDF file
*/
fz_error
pdf_load_embedded_cmap(pdf_cmap **cmapp, pdf_xref *xref, fz_obj *stmobj)
{
fz_error error = fz_okay;
fz_stream *file = NULL;
pdf_cmap *cmap = NULL;
pdf_cmap *usecmap;
fz_obj *wmode;
fz_obj *obj;
 
if ((*cmapp = pdf_find_item(xref->store, pdf_drop_cmap, stmobj)))
{
pdf_keep_cmap(*cmapp);
return fz_okay;
}
 
error = pdf_open_stream(&file, xref, fz_to_num(stmobj), fz_to_gen(stmobj));
if (error)
{
error = fz_rethrow(error, "cannot open cmap stream (%d %d R)", fz_to_num(stmobj), fz_to_gen(stmobj));
goto cleanup;
}
 
error = pdf_parse_cmap(&cmap, file);
if (error)
{
error = fz_rethrow(error, "cannot parse cmap stream (%d %d R)", fz_to_num(stmobj), fz_to_gen(stmobj));
goto cleanup;
}
 
fz_close(file);
 
wmode = fz_dict_gets(stmobj, "WMode");
if (fz_is_int(wmode))
pdf_set_wmode(cmap, fz_to_int(wmode));
 
obj = fz_dict_gets(stmobj, "UseCMap");
if (fz_is_name(obj))
{
error = pdf_load_system_cmap(&usecmap, fz_to_name(obj));
if (error)
{
error = fz_rethrow(error, "cannot load system usecmap '%s'", fz_to_name(obj));
goto cleanup;
}
pdf_set_usecmap(cmap, usecmap);
pdf_drop_cmap(usecmap);
}
else if (fz_is_indirect(obj))
{
error = pdf_load_embedded_cmap(&usecmap, xref, obj);
if (error)
{
error = fz_rethrow(error, "cannot load embedded usecmap (%d %d R)", fz_to_num(obj), fz_to_gen(obj));
goto cleanup;
}
pdf_set_usecmap(cmap, usecmap);
pdf_drop_cmap(usecmap);
}
 
pdf_store_item(xref->store, pdf_keep_cmap, pdf_drop_cmap, stmobj, cmap);
 
*cmapp = cmap;
return fz_okay;
 
cleanup:
if (file)
fz_close(file);
if (cmap)
pdf_drop_cmap(cmap);
return error; /* already rethrown */
}
 
/*
* Create an Identity-* CMap (for both 1 and 2-byte encodings)
*/
pdf_cmap *
pdf_new_identity_cmap(int wmode, int bytes)
{
pdf_cmap *cmap = pdf_new_cmap();
sprintf(cmap->cmap_name, "Identity-%c", wmode ? 'V' : 'H');
pdf_add_codespace(cmap, 0x0000, 0xffff, bytes);
pdf_map_range_to_range(cmap, 0x0000, 0xffff, 0);
pdf_sort_cmap(cmap);
pdf_set_wmode(cmap, wmode);
return cmap;
}
 
/*
* Load predefined CMap from system.
*/
fz_error
pdf_load_system_cmap(pdf_cmap **cmapp, char *cmap_name)
{
pdf_cmap *usecmap;
pdf_cmap *cmap;
 
cmap = pdf_find_builtin_cmap(cmap_name);
if (!cmap)
return fz_throw("no builtin cmap file: %s", cmap_name);
 
if (cmap->usecmap_name[0] && !cmap->usecmap)
{
usecmap = pdf_find_builtin_cmap(cmap->usecmap_name);
if (!usecmap)
return fz_throw("nu builtin cmap file: %s", cmap->usecmap_name);
pdf_set_usecmap(cmap, usecmap);
}
 
*cmapp = cmap;
return fz_okay;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_cmap_parse.c
0,0 → 1,490
#include "fitz.h"
#include "mupdf.h"
 
/*
* CMap parser
*/
 
enum
{
TOK_USECMAP = PDF_NUM_TOKENS,
TOK_BEGIN_CODESPACE_RANGE,
TOK_END_CODESPACE_RANGE,
TOK_BEGIN_BF_CHAR,
TOK_END_BF_CHAR,
TOK_BEGIN_BF_RANGE,
TOK_END_BF_RANGE,
TOK_BEGIN_CID_CHAR,
TOK_END_CID_CHAR,
TOK_BEGIN_CID_RANGE,
TOK_END_CID_RANGE,
TOK_END_CMAP
};
 
static int
pdf_cmap_token_from_keyword(char *key)
{
if (!strcmp(key, "usecmap")) return TOK_USECMAP;
if (!strcmp(key, "begincodespacerange")) return TOK_BEGIN_CODESPACE_RANGE;
if (!strcmp(key, "endcodespacerange")) return TOK_END_CODESPACE_RANGE;
if (!strcmp(key, "beginbfchar")) return TOK_BEGIN_BF_CHAR;
if (!strcmp(key, "endbfchar")) return TOK_END_BF_CHAR;
if (!strcmp(key, "beginbfrange")) return TOK_BEGIN_BF_RANGE;
if (!strcmp(key, "endbfrange")) return TOK_END_BF_RANGE;
if (!strcmp(key, "begincidchar")) return TOK_BEGIN_CID_CHAR;
if (!strcmp(key, "endcidchar")) return TOK_END_CID_CHAR;
if (!strcmp(key, "begincidrange")) return TOK_BEGIN_CID_RANGE;
if (!strcmp(key, "endcidrange")) return TOK_END_CID_RANGE;
if (!strcmp(key, "endcmap")) return TOK_END_CMAP;
return PDF_TOK_KEYWORD;
}
 
static int
pdf_code_from_string(char *buf, int len)
{
int a = 0;
while (len--)
a = (a << 8) | *(unsigned char *)buf++;
return a;
}
 
static fz_error
pdf_lex_cmap(int *tok, fz_stream *file, char *buf, int n, int *sl)
{
fz_error error;
 
error = pdf_lex(tok, file, buf, n, sl);
if (error)
return fz_rethrow(error, "cannot parse cmap token");
 
if (*tok == PDF_TOK_KEYWORD)
*tok = pdf_cmap_token_from_keyword(buf);
 
return fz_okay;
}
 
static fz_error
pdf_parse_cmap_name(pdf_cmap *cmap, fz_stream *file)
{
fz_error error;
char buf[256];
int tok;
int len;
 
error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
 
if (tok == PDF_TOK_NAME)
fz_strlcpy(cmap->cmap_name, buf, sizeof(cmap->cmap_name));
else
fz_warn("expected name after CMapName in cmap");
 
return fz_okay;
}
 
static fz_error
pdf_parse_wmode(pdf_cmap *cmap, fz_stream *file)
{
fz_error error;
char buf[256];
int tok;
int len;
 
error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
 
if (tok == PDF_TOK_INT)
pdf_set_wmode(cmap, atoi(buf));
else
fz_warn("expected integer after WMode in cmap");
 
return fz_okay;
}
 
static fz_error
pdf_parse_codespace_range(pdf_cmap *cmap, fz_stream *file)
{
fz_error error;
char buf[256];
int tok;
int len;
int lo, hi;
 
while (1)
{
error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
 
if (tok == TOK_END_CODESPACE_RANGE)
return fz_okay;
 
else if (tok == PDF_TOK_STRING)
{
lo = pdf_code_from_string(buf, len);
error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
if (tok == PDF_TOK_STRING)
{
hi = pdf_code_from_string(buf, len);
pdf_add_codespace(cmap, lo, hi, len);
}
else break;
}
 
else break;
}
 
return fz_throw("expected string or endcodespacerange");
}
 
static fz_error
pdf_parse_cid_range(pdf_cmap *cmap, fz_stream *file)
{
fz_error error;
char buf[256];
int tok;
int len;
int lo, hi, dst;
 
while (1)
{
error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
 
if (tok == TOK_END_CID_RANGE)
return fz_okay;
 
else if (tok != PDF_TOK_STRING)
return fz_throw("expected string or endcidrange");
 
lo = pdf_code_from_string(buf, len);
 
error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
if (tok != PDF_TOK_STRING)
return fz_throw("expected string");
 
hi = pdf_code_from_string(buf, len);
 
error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
if (tok != PDF_TOK_INT)
return fz_throw("expected integer");
 
dst = atoi(buf);
 
pdf_map_range_to_range(cmap, lo, hi, dst);
}
}
 
static fz_error
pdf_parse_cid_char(pdf_cmap *cmap, fz_stream *file)
{
fz_error error;
char buf[256];
int tok;
int len;
int src, dst;
 
while (1)
{
error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
 
if (tok == TOK_END_CID_CHAR)
return fz_okay;
 
else if (tok != PDF_TOK_STRING)
return fz_throw("expected string or endcidchar");
 
src = pdf_code_from_string(buf, len);
 
error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
if (tok != PDF_TOK_INT)
return fz_throw("expected integer");
 
dst = atoi(buf);
 
pdf_map_range_to_range(cmap, src, src, dst);
}
}
 
static fz_error
pdf_parse_bf_range_array(pdf_cmap *cmap, fz_stream *file, int lo, int hi)
{
fz_error error;
char buf[256];
int tok;
int len;
int dst[256];
int i;
 
while (1)
{
error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
 
if (tok == PDF_TOK_CLOSE_ARRAY)
return fz_okay;
 
/* Note: does not handle [ /Name /Name ... ] */
else if (tok != PDF_TOK_STRING)
return fz_throw("expected string or ]");
 
if (len / 2)
{
for (i = 0; i < len / 2; i++)
dst[i] = pdf_code_from_string(buf + i * 2, 2);
 
pdf_map_one_to_many(cmap, lo, dst, len / 2);
}
 
lo ++;
}
}
 
static fz_error
pdf_parse_bf_range(pdf_cmap *cmap, fz_stream *file)
{
fz_error error;
char buf[256];
int tok;
int len;
int lo, hi, dst;
 
while (1)
{
error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
 
if (tok == TOK_END_BF_RANGE)
return fz_okay;
 
else if (tok != PDF_TOK_STRING)
return fz_throw("expected string or endbfrange");
 
lo = pdf_code_from_string(buf, len);
 
error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
if (tok != PDF_TOK_STRING)
return fz_throw("expected string");
 
hi = pdf_code_from_string(buf, len);
 
error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
 
if (tok == PDF_TOK_STRING)
{
if (len == 2)
{
dst = pdf_code_from_string(buf, len);
pdf_map_range_to_range(cmap, lo, hi, dst);
}
else
{
int dststr[256];
int i;
 
if (len / 2)
{
for (i = 0; i < len / 2; i++)
dststr[i] = pdf_code_from_string(buf + i * 2, 2);
 
while (lo <= hi)
{
dststr[i-1] ++;
pdf_map_one_to_many(cmap, lo, dststr, i);
lo ++;
}
}
}
}
 
else if (tok == PDF_TOK_OPEN_ARRAY)
{
error = pdf_parse_bf_range_array(cmap, file, lo, hi);
if (error)
return fz_rethrow(error, "cannot map bfrange");
}
 
else
{
return fz_throw("expected string or array or endbfrange");
}
}
}
 
static fz_error
pdf_parse_bf_char(pdf_cmap *cmap, fz_stream *file)
{
fz_error error;
char buf[256];
int tok;
int len;
int dst[256];
int src;
int i;
 
while (1)
{
error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
 
if (tok == TOK_END_BF_CHAR)
return fz_okay;
 
else if (tok != PDF_TOK_STRING)
return fz_throw("expected string or endbfchar");
 
src = pdf_code_from_string(buf, len);
 
error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
/* Note: does not handle /dstName */
if (tok != PDF_TOK_STRING)
return fz_throw("expected string");
 
if (len / 2)
{
for (i = 0; i < len / 2; i++)
dst[i] = pdf_code_from_string(buf + i * 2, 2);
pdf_map_one_to_many(cmap, src, dst, i);
}
}
}
 
fz_error
pdf_parse_cmap(pdf_cmap **cmapp, fz_stream *file)
{
fz_error error;
pdf_cmap *cmap;
char key[64];
char buf[256];
int tok;
int len;
 
cmap = pdf_new_cmap();
 
strcpy(key, ".notdef");
 
while (1)
{
error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len);
if (error)
{
error = fz_rethrow(error, "syntaxerror in cmap");
goto cleanup;
}
 
if (tok == PDF_TOK_EOF || tok == TOK_END_CMAP)
break;
 
else if (tok == PDF_TOK_NAME)
{
if (!strcmp(buf, "CMapName"))
{
error = pdf_parse_cmap_name(cmap, file);
if (error)
{
error = fz_rethrow(error, "syntaxerror in cmap after CMapName");
goto cleanup;
}
}
else if (!strcmp(buf, "WMode"))
{
error = pdf_parse_wmode(cmap, file);
if (error)
{
error = fz_rethrow(error, "syntaxerror in cmap after WMode");
goto cleanup;
}
}
else
fz_strlcpy(key, buf, sizeof key);
}
 
else if (tok == TOK_USECMAP)
{
fz_strlcpy(cmap->usecmap_name, key, sizeof(cmap->usecmap_name));
}
 
else if (tok == TOK_BEGIN_CODESPACE_RANGE)
{
error = pdf_parse_codespace_range(cmap, file);
if (error)
{
error = fz_rethrow(error, "syntaxerror in cmap codespacerange");
goto cleanup;
}
}
 
else if (tok == TOK_BEGIN_BF_CHAR)
{
error = pdf_parse_bf_char(cmap, file);
if (error)
{
error = fz_rethrow(error, "syntaxerror in cmap bfchar");
goto cleanup;
}
}
 
else if (tok == TOK_BEGIN_CID_CHAR)
{
error = pdf_parse_cid_char(cmap, file);
if (error)
{
error = fz_rethrow(error, "syntaxerror in cmap cidchar");
goto cleanup;
}
}
 
else if (tok == TOK_BEGIN_BF_RANGE)
{
error = pdf_parse_bf_range(cmap, file);
if (error)
{
error = fz_rethrow(error, "syntaxerror in cmap bfrange");
goto cleanup;
}
}
 
else if (tok == TOK_BEGIN_CID_RANGE)
{
error = pdf_parse_cid_range(cmap, file);
if (error)
{
error = fz_rethrow(error, "syntaxerror in cmap cidrange");
goto cleanup;
}
}
 
/* ignore everything else */
}
 
pdf_sort_cmap(cmap);
 
*cmapp = cmap;
return fz_okay;
 
cleanup:
pdf_drop_cmap(cmap);
return error; /* already rethrown */
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_cmap_table.c
0,0 → 1,184
#include "fitz.h"
#include "mupdf.h"
 
#ifndef NOCJK
#include "../generated/cmap_cns.h"
#include "../generated/cmap_gb.h"
#include "../generated/cmap_japan.h"
#include "../generated/cmap_korea.h"
#endif
 
static const struct { char *name; pdf_cmap *cmap; } cmap_table[] =
{
#ifndef NOCJK
{"78-EUC-H",&cmap_78_EUC_H},
{"78-EUC-V",&cmap_78_EUC_V},
{"78-H",&cmap_78_H},
{"78-RKSJ-H",&cmap_78_RKSJ_H},
{"78-RKSJ-V",&cmap_78_RKSJ_V},
{"78-V",&cmap_78_V},
{"78ms-RKSJ-H",&cmap_78ms_RKSJ_H},
{"78ms-RKSJ-V",&cmap_78ms_RKSJ_V},
{"83pv-RKSJ-H",&cmap_83pv_RKSJ_H},
{"90ms-RKSJ-H",&cmap_90ms_RKSJ_H},
{"90ms-RKSJ-V",&cmap_90ms_RKSJ_V},
{"90msp-RKSJ-H",&cmap_90msp_RKSJ_H},
{"90msp-RKSJ-V",&cmap_90msp_RKSJ_V},
{"90pv-RKSJ-H",&cmap_90pv_RKSJ_H},
{"90pv-RKSJ-V",&cmap_90pv_RKSJ_V},
{"Add-H",&cmap_Add_H},
{"Add-RKSJ-H",&cmap_Add_RKSJ_H},
{"Add-RKSJ-V",&cmap_Add_RKSJ_V},
{"Add-V",&cmap_Add_V},
{"Adobe-CNS1-0",&cmap_Adobe_CNS1_0},
{"Adobe-CNS1-1",&cmap_Adobe_CNS1_1},
{"Adobe-CNS1-2",&cmap_Adobe_CNS1_2},
{"Adobe-CNS1-3",&cmap_Adobe_CNS1_3},
{"Adobe-CNS1-4",&cmap_Adobe_CNS1_4},
{"Adobe-CNS1-5",&cmap_Adobe_CNS1_5},
{"Adobe-CNS1-6",&cmap_Adobe_CNS1_6},
{"Adobe-CNS1-UCS2",&cmap_Adobe_CNS1_UCS2},
{"Adobe-GB1-0",&cmap_Adobe_GB1_0},
{"Adobe-GB1-1",&cmap_Adobe_GB1_1},
{"Adobe-GB1-2",&cmap_Adobe_GB1_2},
{"Adobe-GB1-3",&cmap_Adobe_GB1_3},
{"Adobe-GB1-4",&cmap_Adobe_GB1_4},
{"Adobe-GB1-5",&cmap_Adobe_GB1_5},
{"Adobe-GB1-UCS2",&cmap_Adobe_GB1_UCS2},
{"Adobe-Japan1-0",&cmap_Adobe_Japan1_0},
{"Adobe-Japan1-1",&cmap_Adobe_Japan1_1},
{"Adobe-Japan1-2",&cmap_Adobe_Japan1_2},
{"Adobe-Japan1-3",&cmap_Adobe_Japan1_3},
{"Adobe-Japan1-4",&cmap_Adobe_Japan1_4},
{"Adobe-Japan1-5",&cmap_Adobe_Japan1_5},
{"Adobe-Japan1-6",&cmap_Adobe_Japan1_6},
{"Adobe-Japan1-UCS2",&cmap_Adobe_Japan1_UCS2},
{"Adobe-Japan2-0",&cmap_Adobe_Japan2_0},
{"Adobe-Korea1-0",&cmap_Adobe_Korea1_0},
{"Adobe-Korea1-1",&cmap_Adobe_Korea1_1},
{"Adobe-Korea1-2",&cmap_Adobe_Korea1_2},
{"Adobe-Korea1-UCS2",&cmap_Adobe_Korea1_UCS2},
{"B5-H",&cmap_B5_H},
{"B5-V",&cmap_B5_V},
{"B5pc-H",&cmap_B5pc_H},
{"B5pc-V",&cmap_B5pc_V},
{"CNS-EUC-H",&cmap_CNS_EUC_H},
{"CNS-EUC-V",&cmap_CNS_EUC_V},
{"CNS1-H",&cmap_CNS1_H},
{"CNS1-V",&cmap_CNS1_V},
{"CNS2-H",&cmap_CNS2_H},
{"CNS2-V",&cmap_CNS2_V},
{"ETHK-B5-H",&cmap_ETHK_B5_H},
{"ETHK-B5-V",&cmap_ETHK_B5_V},
{"ETen-B5-H",&cmap_ETen_B5_H},
{"ETen-B5-V",&cmap_ETen_B5_V},
{"ETenms-B5-H",&cmap_ETenms_B5_H},
{"ETenms-B5-V",&cmap_ETenms_B5_V},
{"EUC-H",&cmap_EUC_H},
{"EUC-V",&cmap_EUC_V},
{"Ext-H",&cmap_Ext_H},
{"Ext-RKSJ-H",&cmap_Ext_RKSJ_H},
{"Ext-RKSJ-V",&cmap_Ext_RKSJ_V},
{"Ext-V",&cmap_Ext_V},
{"GB-EUC-H",&cmap_GB_EUC_H},
{"GB-EUC-V",&cmap_GB_EUC_V},
{"GB-H",&cmap_GB_H},
{"GB-V",&cmap_GB_V},
{"GBK-EUC-H",&cmap_GBK_EUC_H},
{"GBK-EUC-V",&cmap_GBK_EUC_V},
{"GBK2K-H",&cmap_GBK2K_H},
{"GBK2K-V",&cmap_GBK2K_V},
{"GBKp-EUC-H",&cmap_GBKp_EUC_H},
{"GBKp-EUC-V",&cmap_GBKp_EUC_V},
{"GBT-EUC-H",&cmap_GBT_EUC_H},
{"GBT-EUC-V",&cmap_GBT_EUC_V},
{"GBT-H",&cmap_GBT_H},
{"GBT-V",&cmap_GBT_V},
{"GBTpc-EUC-H",&cmap_GBTpc_EUC_H},
{"GBTpc-EUC-V",&cmap_GBTpc_EUC_V},
{"GBpc-EUC-H",&cmap_GBpc_EUC_H},
{"GBpc-EUC-V",&cmap_GBpc_EUC_V},
{"H",&cmap_H},
{"HKdla-B5-H",&cmap_HKdla_B5_H},
{"HKdla-B5-V",&cmap_HKdla_B5_V},
{"HKdlb-B5-H",&cmap_HKdlb_B5_H},
{"HKdlb-B5-V",&cmap_HKdlb_B5_V},
{"HKgccs-B5-H",&cmap_HKgccs_B5_H},
{"HKgccs-B5-V",&cmap_HKgccs_B5_V},
{"HKm314-B5-H",&cmap_HKm314_B5_H},
{"HKm314-B5-V",&cmap_HKm314_B5_V},
{"HKm471-B5-H",&cmap_HKm471_B5_H},
{"HKm471-B5-V",&cmap_HKm471_B5_V},
{"HKscs-B5-H",&cmap_HKscs_B5_H},
{"HKscs-B5-V",&cmap_HKscs_B5_V},
{"Hankaku",&cmap_Hankaku},
{"Hiragana",&cmap_Hiragana},
{"Hojo-EUC-H",&cmap_Hojo_EUC_H},
{"Hojo-EUC-V",&cmap_Hojo_EUC_V},
{"Hojo-H",&cmap_Hojo_H},
{"Hojo-V",&cmap_Hojo_V},
{"KSC-EUC-H",&cmap_KSC_EUC_H},
{"KSC-EUC-V",&cmap_KSC_EUC_V},
{"KSC-H",&cmap_KSC_H},
{"KSC-Johab-H",&cmap_KSC_Johab_H},
{"KSC-Johab-V",&cmap_KSC_Johab_V},
{"KSC-V",&cmap_KSC_V},
{"KSCms-UHC-H",&cmap_KSCms_UHC_H},
{"KSCms-UHC-HW-H",&cmap_KSCms_UHC_HW_H},
{"KSCms-UHC-HW-V",&cmap_KSCms_UHC_HW_V},
{"KSCms-UHC-V",&cmap_KSCms_UHC_V},
{"KSCpc-EUC-H",&cmap_KSCpc_EUC_H},
{"KSCpc-EUC-V",&cmap_KSCpc_EUC_V},
{"Katakana",&cmap_Katakana},
{"NWP-H",&cmap_NWP_H},
{"NWP-V",&cmap_NWP_V},
{"RKSJ-H",&cmap_RKSJ_H},
{"RKSJ-V",&cmap_RKSJ_V},
{"Roman",&cmap_Roman},
{"UniCNS-UCS2-H",&cmap_UniCNS_UCS2_H},
{"UniCNS-UCS2-V",&cmap_UniCNS_UCS2_V},
{"UniCNS-UTF16-H",&cmap_UniCNS_UTF16_H},
{"UniCNS-UTF16-V",&cmap_UniCNS_UTF16_V},
{"UniGB-UCS2-H",&cmap_UniGB_UCS2_H},
{"UniGB-UCS2-V",&cmap_UniGB_UCS2_V},
{"UniGB-UTF16-H",&cmap_UniGB_UTF16_H},
{"UniGB-UTF16-V",&cmap_UniGB_UTF16_V},
{"UniHojo-UCS2-H",&cmap_UniHojo_UCS2_H},
{"UniHojo-UCS2-V",&cmap_UniHojo_UCS2_V},
{"UniHojo-UTF16-H",&cmap_UniHojo_UTF16_H},
{"UniHojo-UTF16-V",&cmap_UniHojo_UTF16_V},
{"UniJIS-UCS2-H",&cmap_UniJIS_UCS2_H},
{"UniJIS-UCS2-HW-H",&cmap_UniJIS_UCS2_HW_H},
{"UniJIS-UCS2-HW-V",&cmap_UniJIS_UCS2_HW_V},
{"UniJIS-UCS2-V",&cmap_UniJIS_UCS2_V},
{"UniJIS-UTF16-H",&cmap_UniJIS_UTF16_H},
{"UniJIS-UTF16-V",&cmap_UniJIS_UTF16_V},
{"UniJISPro-UCS2-HW-V",&cmap_UniJISPro_UCS2_HW_V},
{"UniJISPro-UCS2-V",&cmap_UniJISPro_UCS2_V},
{"UniKS-UCS2-H",&cmap_UniKS_UCS2_H},
{"UniKS-UCS2-V",&cmap_UniKS_UCS2_V},
{"UniKS-UTF16-H",&cmap_UniKS_UTF16_H},
{"UniKS-UTF16-V",&cmap_UniKS_UTF16_V},
{"V",&cmap_V},
{"WP-Symbol",&cmap_WP_Symbol},
#endif
};
 
pdf_cmap *
pdf_find_builtin_cmap(char *cmap_name)
{
int l = 0;
int r = nelem(cmap_table) - 1;
while (l <= r)
{
int m = (l + r) >> 1;
int c = strcmp(cmap_name, cmap_table[m].name);
if (c < 0)
r = m - 1;
else if (c > 0)
l = m + 1;
else
return cmap_table[m].cmap;
}
return NULL;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_colorspace.c
0,0 → 1,387
#include "fitz.h"
#include "mupdf.h"
 
/* ICCBased */
 
static fz_error
load_icc_based(fz_colorspace **csp, pdf_xref *xref, fz_obj *dict)
{
int n;
 
n = fz_to_int(fz_dict_gets(dict, "N"));
 
switch (n)
{
case 1: *csp = fz_device_gray; return fz_okay;
case 3: *csp = fz_device_rgb; return fz_okay;
case 4: *csp = fz_device_cmyk; return fz_okay;
}
 
return fz_throw("syntaxerror: ICCBased must have 1, 3 or 4 components");
}
 
/* Lab */
 
static inline float fung(float x)
{
if (x >= 6.0f / 29.0f)
return x * x * x;
return (108.0f / 841.0f) * (x - (4.0f / 29.0f));
}
 
static void
lab_to_rgb(fz_colorspace *cs, float *lab, float *rgb)
{
/* input is in range (0..100, -128..127, -128..127) not (0..1, 0..1, 0..1) */
float lstar, astar, bstar, l, m, n, x, y, z, r, g, b;
lstar = lab[0];
astar = lab[1];
bstar = lab[2];
m = (lstar + 16) / 116;
l = m + astar / 500;
n = m - bstar / 200;
x = fung(l);
y = fung(m);
z = fung(n);
r = (3.240449f * x + -1.537136f * y + -0.498531f * z) * 0.830026f;
g = (-0.969265f * x + 1.876011f * y + 0.041556f * z) * 1.05452f;
b = (0.055643f * x + -0.204026f * y + 1.057229f * z) * 1.1003f;
rgb[0] = sqrtf(CLAMP(r, 0, 1));
rgb[1] = sqrtf(CLAMP(g, 0, 1));
rgb[2] = sqrtf(CLAMP(b, 0, 1));
}
 
static void
rgb_to_lab(fz_colorspace *cs, float *rgb, float *lab)
{
fz_warn("cannot convert into L*a*b colorspace");
lab[0] = rgb[0];
lab[1] = rgb[1];
lab[2] = rgb[2];
}
 
static fz_colorspace k_device_lab = { -1, "Lab", 3, lab_to_rgb, rgb_to_lab };
static fz_colorspace *fz_device_lab = &k_device_lab;
 
/* Separation and DeviceN */
 
struct separation
{
fz_colorspace *base;
pdf_function *tint;
};
 
static void
separation_to_rgb(fz_colorspace *cs, float *color, float *rgb)
{
struct separation *sep = cs->data;
float alt[FZ_MAX_COLORS];
pdf_eval_function(sep->tint, color, cs->n, alt, sep->base->n);
sep->base->to_rgb(sep->base, alt, rgb);
}
 
static void
free_separation(fz_colorspace *cs)
{
struct separation *sep = cs->data;
fz_drop_colorspace(sep->base);
pdf_drop_function(sep->tint);
fz_free(sep);
}
 
static fz_error
load_separation(fz_colorspace **csp, pdf_xref *xref, fz_obj *array)
{
fz_error error;
fz_colorspace *cs;
struct separation *sep;
fz_obj *nameobj = fz_array_get(array, 1);
fz_obj *baseobj = fz_array_get(array, 2);
fz_obj *tintobj = fz_array_get(array, 3);
fz_colorspace *base;
pdf_function *tint;
int n;
 
if (fz_is_array(nameobj))
n = fz_array_len(nameobj);
else
n = 1;
 
if (n > FZ_MAX_COLORS)
return fz_throw("too many components in colorspace");
 
error = pdf_load_colorspace(&base, xref, baseobj);
if (error)
return fz_rethrow(error, "cannot load base colorspace (%d %d R)", fz_to_num(baseobj), fz_to_gen(baseobj));
 
error = pdf_load_function(&tint, xref, tintobj);
if (error)
{
fz_drop_colorspace(base);
return fz_rethrow(error, "cannot load tint function (%d %d R)", fz_to_num(tintobj), fz_to_gen(tintobj));
}
 
sep = fz_malloc(sizeof(struct separation));
sep->base = base;
sep->tint = tint;
 
cs = fz_new_colorspace(n == 1 ? "Separation" : "DeviceN", n);
cs->to_rgb = separation_to_rgb;
cs->free_data = free_separation;
cs->data = sep;
 
*csp = cs;
return fz_okay;
}
 
/* Indexed */
 
struct indexed
{
fz_colorspace *base;
int high;
unsigned char *lookup;
};
 
static void
indexed_to_rgb(fz_colorspace *cs, float *color, float *rgb)
{
struct indexed *idx = cs->data;
float alt[FZ_MAX_COLORS];
int i, k;
i = color[0] * 255;
i = CLAMP(i, 0, idx->high);
for (k = 0; k < idx->base->n; k++)
alt[k] = idx->lookup[i * idx->base->n + k] / 255.0f;
idx->base->to_rgb(idx->base, alt, rgb);
}
 
static void
free_indexed(fz_colorspace *cs)
{
struct indexed *idx = cs->data;
if (idx->base)
fz_drop_colorspace(idx->base);
fz_free(idx->lookup);
fz_free(idx);
}
 
fz_pixmap *
pdf_expand_indexed_pixmap(fz_pixmap *src)
{
struct indexed *idx;
fz_pixmap *dst;
unsigned char *s, *d;
int y, x, k, n, high;
unsigned char *lookup;
 
assert(src->colorspace->to_rgb == indexed_to_rgb);
assert(src->n == 2);
 
idx = src->colorspace->data;
high = idx->high;
lookup = idx->lookup;
n = idx->base->n;
 
dst = fz_new_pixmap_with_rect(idx->base, fz_bound_pixmap(src));
s = src->samples;
d = dst->samples;
 
for (y = 0; y < src->h; y++)
{
for (x = 0; x < src->w; x++)
{
int v = *s++;
int a = *s++;
v = MIN(v, high);
for (k = 0; k < n; k++)
*d++ = fz_mul255(lookup[v * n + k], a);
*d++ = a;
}
}
 
if (src->mask)
dst->mask = fz_keep_pixmap(src->mask);
dst->interpolate = src->interpolate;
 
return dst;
}
 
static fz_error
load_indexed(fz_colorspace **csp, pdf_xref *xref, fz_obj *array)
{
fz_error error;
fz_colorspace *cs;
struct indexed *idx;
fz_obj *baseobj = fz_array_get(array, 1);
fz_obj *highobj = fz_array_get(array, 2);
fz_obj *lookup = fz_array_get(array, 3);
fz_colorspace *base;
int i, n;
 
error = pdf_load_colorspace(&base, xref, baseobj);
if (error)
return fz_rethrow(error, "cannot load base colorspace (%d %d R)", fz_to_num(baseobj), fz_to_gen(baseobj));
 
idx = fz_malloc(sizeof(struct indexed));
idx->base = base;
idx->high = fz_to_int(highobj);
idx->high = CLAMP(idx->high, 0, 255);
n = base->n * (idx->high + 1);
idx->lookup = fz_malloc(n);
memset(idx->lookup, 0, n);
 
cs = fz_new_colorspace("Indexed", 1);
cs->to_rgb = indexed_to_rgb;
cs->free_data = free_indexed;
cs->data = idx;
 
if (fz_is_string(lookup) && fz_to_str_len(lookup) == n)
{
unsigned char *buf = (unsigned char *) fz_to_str_buf(lookup);
for (i = 0; i < n; i++)
idx->lookup[i] = buf[i];
}
else if (fz_is_indirect(lookup))
{
fz_stream *file;
 
error = pdf_open_stream(&file, xref, fz_to_num(lookup), fz_to_gen(lookup));
if (error)
{
fz_drop_colorspace(cs);
return fz_rethrow(error, "cannot open colorspace lookup table (%d 0 R)", fz_to_num(lookup));
}
 
i = fz_read(file, idx->lookup, n);
if (i < 0)
{
fz_drop_colorspace(cs);
return fz_throw("cannot read colorspace lookup table (%d 0 R)", fz_to_num(lookup));
}
 
fz_close(file);
}
else
{
fz_drop_colorspace(cs);
return fz_throw("cannot parse colorspace lookup table");
}
 
*csp = cs;
return fz_okay;
}
 
/* Parse and create colorspace from PDF object */
 
static fz_error
pdf_load_colorspace_imp(fz_colorspace **csp, pdf_xref *xref, fz_obj *obj)
{
if (fz_is_name(obj))
{
if (!strcmp(fz_to_name(obj), "Pattern"))
*csp = fz_device_gray;
else if (!strcmp(fz_to_name(obj), "G"))
*csp = fz_device_gray;
else if (!strcmp(fz_to_name(obj), "RGB"))
*csp = fz_device_rgb;
else if (!strcmp(fz_to_name(obj), "CMYK"))
*csp = fz_device_cmyk;
else if (!strcmp(fz_to_name(obj), "DeviceGray"))
*csp = fz_device_gray;
else if (!strcmp(fz_to_name(obj), "DeviceRGB"))
*csp = fz_device_rgb;
else if (!strcmp(fz_to_name(obj), "DeviceCMYK"))
*csp = fz_device_cmyk;
else
return fz_throw("unknown colorspace: %s", fz_to_name(obj));
return fz_okay;
}
 
else if (fz_is_array(obj))
{
fz_obj *name = fz_array_get(obj, 0);
 
if (fz_is_name(name))
{
/* load base colorspace instead */
if (!strcmp(fz_to_name(name), "Pattern"))
{
fz_error error;
 
obj = fz_array_get(obj, 1);
if (!obj)
{
*csp = fz_device_gray;
return fz_okay;
}
 
error = pdf_load_colorspace(csp, xref, obj);
if (error)
return fz_rethrow(error, "cannot load pattern (%d %d R)", fz_to_num(obj), fz_to_gen(obj));
}
 
else if (!strcmp(fz_to_name(name), "G"))
*csp = fz_device_gray;
else if (!strcmp(fz_to_name(name), "RGB"))
*csp = fz_device_rgb;
else if (!strcmp(fz_to_name(name), "CMYK"))
*csp = fz_device_cmyk;
else if (!strcmp(fz_to_name(name), "DeviceGray"))
*csp = fz_device_gray;
else if (!strcmp(fz_to_name(name), "DeviceRGB"))
*csp = fz_device_rgb;
else if (!strcmp(fz_to_name(name), "DeviceCMYK"))
*csp = fz_device_cmyk;
else if (!strcmp(fz_to_name(name), "CalGray"))
*csp = fz_device_gray;
else if (!strcmp(fz_to_name(name), "CalRGB"))
*csp = fz_device_rgb;
else if (!strcmp(fz_to_name(name), "CalCMYK"))
*csp = fz_device_cmyk;
else if (!strcmp(fz_to_name(name), "Lab"))
*csp = fz_device_lab;
 
else if (!strcmp(fz_to_name(name), "ICCBased"))
return load_icc_based(csp, xref, fz_array_get(obj, 1));
 
else if (!strcmp(fz_to_name(name), "Indexed"))
return load_indexed(csp, xref, obj);
else if (!strcmp(fz_to_name(name), "I"))
return load_indexed(csp, xref, obj);
 
else if (!strcmp(fz_to_name(name), "Separation"))
return load_separation(csp, xref, obj);
 
else if (!strcmp(fz_to_name(name), "DeviceN"))
return load_separation(csp, xref, obj);
 
else
return fz_throw("syntaxerror: unknown colorspace %s", fz_to_name(name));
 
return fz_okay;
}
}
 
return fz_throw("syntaxerror: could not parse color space (%d %d R)", fz_to_num(obj), fz_to_gen(obj));
}
 
fz_error
pdf_load_colorspace(fz_colorspace **csp, pdf_xref *xref, fz_obj *obj)
{
fz_error error;
 
if ((*csp = pdf_find_item(xref->store, fz_drop_colorspace, obj)))
{
fz_keep_colorspace(*csp);
return fz_okay;
}
 
error = pdf_load_colorspace_imp(csp, xref, obj);
if (error)
return fz_rethrow(error, "cannot load colorspace (%d %d R)", fz_to_num(obj), fz_to_gen(obj));
 
pdf_store_item(xref->store, fz_keep_colorspace, fz_drop_colorspace, obj, *csp);
 
return fz_okay;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_crypt.c
0,0 → 1,847
#include "fitz.h"
#include "mupdf.h"
 
enum
{
PDF_CRYPT_NONE,
PDF_CRYPT_RC4,
PDF_CRYPT_AESV2,
PDF_CRYPT_AESV3,
PDF_CRYPT_UNKNOWN,
};
 
typedef struct pdf_crypt_filter_s pdf_crypt_filter;
 
struct pdf_crypt_filter_s
{
int method;
int length;
};
 
struct pdf_crypt_s
{
fz_obj *id;
 
int v;
int length;
fz_obj *cf;
pdf_crypt_filter stmf;
pdf_crypt_filter strf;
 
int r;
unsigned char o[48];
unsigned char u[48];
unsigned char oe[32];
unsigned char ue[32];
int p;
int encrypt_metadata;
 
unsigned char key[32]; /* decryption key generated from password */
};
 
static fz_error pdf_parse_crypt_filter(pdf_crypt_filter *cf, fz_obj *dict, char *name, int defaultlength);
 
/*
* Create crypt object for decrypting strings and streams
* given the Encryption and ID objects.
*/
 
fz_error
pdf_new_crypt(pdf_crypt **cryptp, fz_obj *dict, fz_obj *id)
{
pdf_crypt *crypt;
fz_error error;
fz_obj *obj;
 
crypt = fz_malloc(sizeof(pdf_crypt));
memset(crypt, 0x00, sizeof(pdf_crypt));
 
/* Common to all security handlers (PDF 1.7 table 3.18) */
 
obj = fz_dict_gets(dict, "Filter");
if (!fz_is_name(obj))
{
pdf_free_crypt(crypt);
return fz_throw("unspecified encryption handler");
}
if (strcmp(fz_to_name(obj), "Standard") != 0)
{
pdf_free_crypt(crypt);
return fz_throw("unknown encryption handler: '%s'", fz_to_name(obj));
}
 
crypt->v = 0;
obj = fz_dict_gets(dict, "V");
if (fz_is_int(obj))
crypt->v = fz_to_int(obj);
if (crypt->v != 1 && crypt->v != 2 && crypt->v != 4 && crypt->v != 5)
{
pdf_free_crypt(crypt);
return fz_throw("unknown encryption version");
}
 
crypt->length = 40;
if (crypt->v == 2 || crypt->v == 4)
{
obj = fz_dict_gets(dict, "Length");
if (fz_is_int(obj))
crypt->length = fz_to_int(obj);
 
/* work-around for pdf generators that assume length is in bytes */
if (crypt->length < 40)
crypt->length = crypt->length * 8;
 
if (crypt->length % 8 != 0)
{
pdf_free_crypt(crypt);
return fz_throw("invalid encryption key length");
}
if (crypt->length > 256)
{
pdf_free_crypt(crypt);
return fz_throw("invalid encryption key length");
}
}
 
if (crypt->v == 5)
crypt->length = 256;
 
if (crypt->v == 1 || crypt->v == 2)
{
crypt->stmf.method = PDF_CRYPT_RC4;
crypt->stmf.length = crypt->length;
 
crypt->strf.method = PDF_CRYPT_RC4;
crypt->strf.length = crypt->length;
}
 
if (crypt->v == 4 || crypt->v == 5)
{
crypt->stmf.method = PDF_CRYPT_NONE;
crypt->stmf.length = crypt->length;
 
crypt->strf.method = PDF_CRYPT_NONE;
crypt->strf.length = crypt->length;
 
obj = fz_dict_gets(dict, "CF");
if (fz_is_dict(obj))
{
crypt->cf = fz_keep_obj(obj);
}
else
{
crypt->cf = NULL;
}
 
obj = fz_dict_gets(dict, "StmF");
if (fz_is_name(obj))
{
error = pdf_parse_crypt_filter(&crypt->stmf, crypt->cf, fz_to_name(obj), crypt->length);
if (error)
{
pdf_free_crypt(crypt);
return fz_rethrow(error, "cannot parse stream crypt filter (%d %d R)", fz_to_num(obj), fz_to_gen(obj));
}
}
 
obj = fz_dict_gets(dict, "StrF");
if (fz_is_name(obj))
{
error = pdf_parse_crypt_filter(&crypt->strf, crypt->cf, fz_to_name(obj), crypt->length);
if (error)
{
pdf_free_crypt(crypt);
return fz_rethrow(error, "cannot parse string crypt filter (%d %d R)", fz_to_num(obj), fz_to_gen(obj));
}
}
 
/* in crypt revision 4, the crypt filter determines the key length */
if (crypt->strf.method != PDF_CRYPT_NONE)
crypt->length = crypt->stmf.length;
}
 
/* Standard security handler (PDF 1.7 table 3.19) */
 
obj = fz_dict_gets(dict, "R");
if (fz_is_int(obj))
crypt->r = fz_to_int(obj);
else
{
pdf_free_crypt(crypt);
return fz_throw("encryption dictionary missing revision value");
}
 
obj = fz_dict_gets(dict, "O");
if (fz_is_string(obj) && fz_to_str_len(obj) == 32)
memcpy(crypt->o, fz_to_str_buf(obj), 32);
/* /O and /U are supposed to be 48 bytes long for revision 5, they're often longer, though */
else if (crypt->r == 5 && fz_is_string(obj) && fz_to_str_len(obj) >= 48)
memcpy(crypt->o, fz_to_str_buf(obj), 48);
else
{
pdf_free_crypt(crypt);
return fz_throw("encryption dictionary missing owner password");
}
 
obj = fz_dict_gets(dict, "U");
if (fz_is_string(obj) && fz_to_str_len(obj) == 32)
memcpy(crypt->u, fz_to_str_buf(obj), 32);
else if (fz_is_string(obj) && fz_to_str_len(obj) >= 48 && crypt->r == 5)
memcpy(crypt->u, fz_to_str_buf(obj), 48);
else if (fz_is_string(obj) && fz_to_str_len(obj) < 32)
{
fz_warn("encryption password key too short (%d)", fz_to_str_len(obj));
memcpy(crypt->u, fz_to_str_buf(obj), fz_to_str_len(obj));
}
else
{
pdf_free_crypt(crypt);
return fz_throw("encryption dictionary missing user password");
}
 
obj = fz_dict_gets(dict, "P");
if (fz_is_int(obj))
crypt->p = fz_to_int(obj);
else
{
pdf_free_crypt(crypt);
return fz_throw("encryption dictionary missing permissions value");
}
 
if (crypt->r == 5)
{
obj = fz_dict_gets(dict, "OE");
if (!fz_is_string(obj) || fz_to_str_len(obj) != 32)
{
pdf_free_crypt(crypt);
return fz_throw("encryption dictionary missing owner encryption key");
}
memcpy(crypt->oe, fz_to_str_buf(obj), 32);
 
obj = fz_dict_gets(dict, "UE");
if (!fz_is_string(obj) || fz_to_str_len(obj) != 32)
{
pdf_free_crypt(crypt);
return fz_throw("encryption dictionary missing user encryption key");
}
memcpy(crypt->ue, fz_to_str_buf(obj), 32);
}
 
crypt->encrypt_metadata = 1;
obj = fz_dict_gets(dict, "EncryptMetadata");
if (fz_is_bool(obj))
crypt->encrypt_metadata = fz_to_bool(obj);
 
/* Extract file identifier string */
 
if (fz_is_array(id) && fz_array_len(id) == 2)
{
obj = fz_array_get(id, 0);
if (fz_is_string(obj))
crypt->id = fz_keep_obj(obj);
}
else
fz_warn("missing file identifier, may not be able to do decryption");
 
*cryptp = crypt;
return fz_okay;
}
 
void
pdf_free_crypt(pdf_crypt *crypt)
{
if (crypt->id) fz_drop_obj(crypt->id);
if (crypt->cf) fz_drop_obj(crypt->cf);
fz_free(crypt);
}
 
/*
* Parse a CF dictionary entry (PDF 1.7 table 3.22)
*/
 
static fz_error
pdf_parse_crypt_filter(pdf_crypt_filter *cf, fz_obj *cf_obj, char *name, int defaultlength)
{
fz_obj *obj;
fz_obj *dict;
int is_identity = (strcmp(name, "Identity") == 0);
int is_stdcf = (!is_identity && (strcmp(name, "StdCF") == 0));
 
if (!is_identity && !is_stdcf)
{
return fz_throw("Crypt Filter not Identity or StdCF (%d %d R)", fz_to_num(cf_obj), fz_to_gen(cf_obj));
}
cf->method = PDF_CRYPT_NONE;
cf->length = defaultlength;
 
if (cf_obj == NULL)
{
cf->method = (is_identity ? PDF_CRYPT_NONE : PDF_CRYPT_RC4);
return fz_okay;
}
 
dict = fz_dict_gets(cf_obj, name);
if (!fz_is_dict(dict))
{
return fz_throw("cannot parse crypt filter (%d %d R)", fz_to_num(cf_obj), fz_to_gen(cf_obj));
}
obj = fz_dict_gets(dict, "CFM");
if (fz_is_name(obj))
{
if (!strcmp(fz_to_name(obj), "None"))
cf->method = PDF_CRYPT_NONE;
else if (!strcmp(fz_to_name(obj), "V2"))
cf->method = PDF_CRYPT_RC4;
else if (!strcmp(fz_to_name(obj), "AESV2"))
cf->method = PDF_CRYPT_AESV2;
else if (!strcmp(fz_to_name(obj), "AESV3"))
cf->method = PDF_CRYPT_AESV3;
else
fz_throw("unknown encryption method: %s", fz_to_name(obj));
}
 
obj = fz_dict_gets(dict, "Length");
if (fz_is_int(obj))
cf->length = fz_to_int(obj);
 
/* the length for crypt filters is supposed to be in bytes not bits */
if (cf->length < 40)
cf->length = cf->length * 8;
 
if ((cf->length % 8) != 0)
return fz_throw("invalid key length: %d", cf->length);
 
return fz_okay;
}
 
/*
* Compute an encryption key (PDF 1.7 algorithm 3.2)
*/
 
static const unsigned char padding[32] =
{
0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41,
0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08,
0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80,
0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a
};
 
static void
pdf_compute_encryption_key(pdf_crypt *crypt, unsigned char *password, int pwlen, unsigned char *key)
{
unsigned char buf[32];
unsigned int p;
int i, n;
fz_md5 md5;
 
n = crypt->length / 8;
 
/* Step 1 - copy and pad password string */
if (pwlen > 32)
pwlen = 32;
memcpy(buf, password, pwlen);
memcpy(buf + pwlen, padding, 32 - pwlen);
 
/* Step 2 - init md5 and pass value of step 1 */
fz_md5_init(&md5);
fz_md5_update(&md5, buf, 32);
 
/* Step 3 - pass O value */
fz_md5_update(&md5, crypt->o, 32);
 
/* Step 4 - pass P value as unsigned int, low-order byte first */
p = (unsigned int) crypt->p;
buf[0] = (p) & 0xFF;
buf[1] = (p >> 8) & 0xFF;
buf[2] = (p >> 16) & 0xFF;
buf[3] = (p >> 24) & 0xFF;
fz_md5_update(&md5, buf, 4);
 
/* Step 5 - pass first element of ID array */
fz_md5_update(&md5, (unsigned char *)fz_to_str_buf(crypt->id), fz_to_str_len(crypt->id));
 
/* Step 6 (revision 4 or greater) - if metadata is not encrypted pass 0xFFFFFFFF */
if (crypt->r >= 4)
{
if (!crypt->encrypt_metadata)
{
buf[0] = 0xFF;
buf[1] = 0xFF;
buf[2] = 0xFF;
buf[3] = 0xFF;
fz_md5_update(&md5, buf, 4);
}
}
 
/* Step 7 - finish the hash */
fz_md5_final(&md5, buf);
 
/* Step 8 (revision 3 or greater) - do some voodoo 50 times */
if (crypt->r >= 3)
{
for (i = 0; i < 50; i++)
{
fz_md5_init(&md5);
fz_md5_update(&md5, buf, n);
fz_md5_final(&md5, buf);
}
}
 
/* Step 9 - the key is the first 'n' bytes of the result */
memcpy(key, buf, n);
}
 
/*
* Compute an encryption key (PDF 1.7 ExtensionLevel 3 algorithm 3.2a)
*/
 
static void
pdf_compute_encryption_key_r5(pdf_crypt *crypt, unsigned char *password, int pwlen, int ownerkey, unsigned char *validationkey)
{
unsigned char buffer[128 + 8 + 48];
fz_sha256 sha256;
fz_aes aes;
 
/* Step 2 - truncate UTF-8 password to 127 characters */
 
if (pwlen > 127)
pwlen = 127;
 
/* Step 3/4 - test password against owner/user key and compute encryption key */
 
memcpy(buffer, password, pwlen);
if (ownerkey)
{
memcpy(buffer + pwlen, crypt->o + 32, 8);
memcpy(buffer + pwlen + 8, crypt->u, 48);
}
else
memcpy(buffer + pwlen, crypt->u + 32, 8);
 
fz_sha256_init(&sha256);
fz_sha256_update(&sha256, buffer, pwlen + 8 + (ownerkey ? 48 : 0));
fz_sha256_final(&sha256, validationkey);
 
/* Step 3.5/4.5 - compute file encryption key from OE/UE */
 
memcpy(buffer + pwlen, crypt->u + 40, 8);
 
fz_sha256_init(&sha256);
fz_sha256_update(&sha256, buffer, pwlen + 8);
fz_sha256_final(&sha256, buffer);
 
// clear password buffer and use it as iv
memset(buffer + 32, 0, sizeof(buffer) - 32);
aes_setkey_dec(&aes, buffer, crypt->length);
aes_crypt_cbc(&aes, AES_DECRYPT, 32, buffer + 32, ownerkey ? crypt->oe : crypt->ue, crypt->key);
}
 
/*
* Computing the user password (PDF 1.7 algorithm 3.4 and 3.5)
* Also save the generated key for decrypting objects and streams in crypt->key.
*/
 
static void
pdf_compute_user_password(pdf_crypt *crypt, unsigned char *password, int pwlen, unsigned char *output)
{
if (crypt->r == 2)
{
fz_arc4 arc4;
 
pdf_compute_encryption_key(crypt, password, pwlen, crypt->key);
fz_arc4_init(&arc4, crypt->key, crypt->length / 8);
fz_arc4_encrypt(&arc4, output, padding, 32);
}
 
if (crypt->r == 3 || crypt->r == 4)
{
unsigned char xor[32];
unsigned char digest[16];
fz_md5 md5;
fz_arc4 arc4;
int i, x, n;
 
n = crypt->length / 8;
 
pdf_compute_encryption_key(crypt, password, pwlen, crypt->key);
 
fz_md5_init(&md5);
fz_md5_update(&md5, padding, 32);
fz_md5_update(&md5, (unsigned char*)fz_to_str_buf(crypt->id), fz_to_str_len(crypt->id));
fz_md5_final(&md5, digest);
 
fz_arc4_init(&arc4, crypt->key, n);
fz_arc4_encrypt(&arc4, output, digest, 16);
 
for (x = 1; x <= 19; x++)
{
for (i = 0; i < n; i++)
xor[i] = crypt->key[i] ^ x;
fz_arc4_init(&arc4, xor, n);
fz_arc4_encrypt(&arc4, output, output, 16);
}
 
memcpy(output + 16, padding, 16);
}
 
if (crypt->r == 5)
{
pdf_compute_encryption_key_r5(crypt, password, pwlen, 0, output);
}
}
 
/*
* Authenticating the user password (PDF 1.7 algorithm 3.6
* and ExtensionLevel 3 algorithm 3.11)
* This also has the side effect of saving a key generated
* from the password for decrypting objects and streams.
*/
 
static int
pdf_authenticate_user_password(pdf_crypt *crypt, unsigned char *password, int pwlen)
{
unsigned char output[32];
pdf_compute_user_password(crypt, password, pwlen, output);
if (crypt->r == 2 || crypt->r == 5)
return memcmp(output, crypt->u, 32) == 0;
if (crypt->r == 3 || crypt->r == 4)
return memcmp(output, crypt->u, 16) == 0;
return 0;
}
 
/*
* Authenticating the owner password (PDF 1.7 algorithm 3.7
* and ExtensionLevel 3 algorithm 3.12)
* Generates the user password from the owner password
* and calls pdf_authenticate_user_password.
*/
 
static int
pdf_authenticate_owner_password(pdf_crypt *crypt, unsigned char *ownerpass, int pwlen)
{
unsigned char pwbuf[32];
unsigned char key[32];
unsigned char xor[32];
unsigned char userpass[32];
int i, n, x;
fz_md5 md5;
fz_arc4 arc4;
 
if (crypt->r == 5)
{
/* PDF 1.7 ExtensionLevel 3 algorithm 3.12 */
 
pdf_compute_encryption_key_r5(crypt, ownerpass, pwlen, 1, key);
 
return !memcmp(key, crypt->o, 32);
}
 
n = crypt->length / 8;
 
/* Step 1 -- steps 1 to 4 of PDF 1.7 algorithm 3.3 */
 
/* copy and pad password string */
if (pwlen > 32)
pwlen = 32;
memcpy(pwbuf, ownerpass, pwlen);
memcpy(pwbuf + pwlen, padding, 32 - pwlen);
 
/* take md5 hash of padded password */
fz_md5_init(&md5);
fz_md5_update(&md5, pwbuf, 32);
fz_md5_final(&md5, key);
 
/* do some voodoo 50 times (Revision 3 or greater) */
if (crypt->r >= 3)
{
for (i = 0; i < 50; i++)
{
fz_md5_init(&md5);
fz_md5_update(&md5, key, 16);
fz_md5_final(&md5, key);
}
}
 
/* Step 2 (Revision 2) */
if (crypt->r == 2)
{
fz_arc4_init(&arc4, key, n);
fz_arc4_encrypt(&arc4, userpass, crypt->o, 32);
}
 
/* Step 2 (Revision 3 or greater) */
if (crypt->r >= 3)
{
memcpy(userpass, crypt->o, 32);
for (x = 0; x < 20; x++)
{
for (i = 0; i < n; i++)
xor[i] = key[i] ^ (19 - x);
fz_arc4_init(&arc4, xor, n);
fz_arc4_encrypt(&arc4, userpass, userpass, 32);
}
}
 
return pdf_authenticate_user_password(crypt, userpass, 32);
}
 
int
pdf_authenticate_password(pdf_xref *xref, char *password)
{
if (xref->crypt)
{
if (pdf_authenticate_user_password(xref->crypt, (unsigned char *)password, strlen(password)))
return 1;
if (pdf_authenticate_owner_password(xref->crypt, (unsigned char *)password, strlen(password)))
return 1;
return 0;
}
return 1;
}
 
int
pdf_needs_password(pdf_xref *xref)
{
if (!xref->crypt)
return 0;
if (pdf_authenticate_password(xref, ""))
return 0;
return 1;
}
 
int
pdf_has_permission(pdf_xref *xref, int p)
{
if (!xref->crypt)
return 1;
return xref->crypt->p & p;
}
 
unsigned char *
pdf_get_crypt_key(pdf_xref *xref)
{
if (xref->crypt)
return xref->crypt->key;
return NULL;
}
 
int
pdf_get_crypt_revision(pdf_xref *xref)
{
if (xref->crypt)
return xref->crypt->v;
return 0;
}
 
char *
pdf_get_crypt_method(pdf_xref *xref)
{
if (xref->crypt)
{
switch (xref->crypt->strf.method)
{
case PDF_CRYPT_NONE: return "None";
case PDF_CRYPT_RC4: return "RC4";
case PDF_CRYPT_AESV2: return "AES";
case PDF_CRYPT_AESV3: return "AES";
case PDF_CRYPT_UNKNOWN: return "Unknown";
}
}
return "None";
}
 
int
pdf_get_crypt_length(pdf_xref *xref)
{
if (xref->crypt)
return xref->crypt->length;
return 0;
}
 
/*
* PDF 1.7 algorithm 3.1 and ExtensionLevel 3 algorithm 3.1a
*
* Using the global encryption key that was generated from the
* password, create a new key that is used to decrypt indivual
* objects and streams. This key is based on the object and
* generation numbers.
*/
 
static int
pdf_compute_object_key(pdf_crypt *crypt, pdf_crypt_filter *cf, int num, int gen, unsigned char *key)
{
fz_md5 md5;
unsigned char message[5];
 
if (cf->method == PDF_CRYPT_AESV3)
{
memcpy(key, crypt->key, crypt->length / 8);
return crypt->length / 8;
}
 
fz_md5_init(&md5);
fz_md5_update(&md5, crypt->key, crypt->length / 8);
message[0] = (num) & 0xFF;
message[1] = (num >> 8) & 0xFF;
message[2] = (num >> 16) & 0xFF;
message[3] = (gen) & 0xFF;
message[4] = (gen >> 8) & 0xFF;
fz_md5_update(&md5, message, 5);
 
if (cf->method == PDF_CRYPT_AESV2)
fz_md5_update(&md5, (unsigned char *)"sAlT", 4);
 
fz_md5_final(&md5, key);
 
if (crypt->length / 8 + 5 > 16)
return 16;
return crypt->length / 8 + 5;
}
 
/*
* PDF 1.7 algorithm 3.1 and ExtensionLevel 3 algorithm 3.1a
*
* Decrypt all strings in obj modifying the data in-place.
* Recurse through arrays and dictionaries, but do not follow
* indirect references.
*/
 
static void
pdf_crypt_obj_imp(pdf_crypt *crypt, fz_obj *obj, unsigned char *key, int keylen)
{
unsigned char *s;
int i, n;
 
if (fz_is_indirect(obj))
return;
 
if (fz_is_string(obj))
{
s = (unsigned char *) fz_to_str_buf(obj);
n = fz_to_str_len(obj);
 
if (crypt->strf.method == PDF_CRYPT_RC4)
{
fz_arc4 arc4;
fz_arc4_init(&arc4, key, keylen);
fz_arc4_encrypt(&arc4, s, s, n);
}
 
if (crypt->strf.method == PDF_CRYPT_AESV2 || crypt->strf.method == PDF_CRYPT_AESV3)
{
if (n & 15 || n < 32)
fz_warn("invalid string length for aes encryption");
else
{
unsigned char iv[16];
fz_aes aes;
memcpy(iv, s, 16);
aes_setkey_dec(&aes, key, keylen * 8);
aes_crypt_cbc(&aes, AES_DECRYPT, n - 16, iv, s + 16, s);
/* delete space used for iv and padding bytes at end */
if (s[n - 17] < 1 || s[n - 17] > 16)
fz_warn("aes padding out of range");
else
fz_set_str_len(obj, n - 16 - s[n - 17]);
}
}
}
 
else if (fz_is_array(obj))
{
n = fz_array_len(obj);
for (i = 0; i < n; i++)
{
pdf_crypt_obj_imp(crypt, fz_array_get(obj, i), key, keylen);
}
}
 
else if (fz_is_dict(obj))
{
n = fz_dict_len(obj);
for (i = 0; i < n; i++)
{
pdf_crypt_obj_imp(crypt, fz_dict_get_val(obj, i), key, keylen);
}
}
}
 
void
pdf_crypt_obj(pdf_crypt *crypt, fz_obj *obj, int num, int gen)
{
unsigned char key[32];
int len;
 
len = pdf_compute_object_key(crypt, &crypt->strf, num, gen, key);
 
pdf_crypt_obj_imp(crypt, obj, key, len);
}
 
/*
* PDF 1.7 algorithm 3.1 and ExtensionLevel 3 algorithm 3.1a
*
* Create filter suitable for de/encrypting a stream.
*/
static fz_stream *
pdf_open_crypt_imp(fz_stream *chain, pdf_crypt *crypt, pdf_crypt_filter *stmf, int num, int gen)
{
unsigned char key[32];
int len;
 
len = pdf_compute_object_key(crypt, stmf, num, gen, key);
 
if (stmf->method == PDF_CRYPT_RC4)
return fz_open_arc4(chain, key, len);
 
if (stmf->method == PDF_CRYPT_AESV2 || stmf->method == PDF_CRYPT_AESV3)
return fz_open_aesd(chain, key, len);
 
return fz_open_copy(chain);
}
 
fz_stream *
pdf_open_crypt(fz_stream *chain, pdf_crypt *crypt, int num, int gen)
{
return pdf_open_crypt_imp(chain, crypt, &crypt->stmf, num, gen);
}
 
fz_stream *
pdf_open_crypt_with_filter(fz_stream *chain, pdf_crypt *crypt, char *name, int num, int gen)
{
fz_error error;
pdf_crypt_filter cf;
 
if (strcmp(name, "Identity"))
{
error = pdf_parse_crypt_filter(&cf, crypt->cf, name, crypt->length);
if (error)
fz_catch(error, "cannot parse crypt filter (%d %d R)", num, gen);
else
return pdf_open_crypt_imp(chain, crypt, &cf, num, gen);
}
return chain;
}
 
void pdf_debug_crypt(pdf_crypt *crypt)
{
int i;
 
printf("crypt {\n");
 
printf("\tv=%d length=%d\n", crypt->v, crypt->length);
printf("\tstmf method=%d length=%d\n", crypt->stmf.method, crypt->stmf.length);
printf("\tstrf method=%d length=%d\n", crypt->strf.method, crypt->strf.length);
printf("\tr=%d\n", crypt->r);
 
printf("\to=<");
for (i = 0; i < 32; i++)
printf("%02X", crypt->o[i]);
printf(">\n");
 
printf("\tu=<");
for (i = 0; i < 32; i++)
printf("%02X", crypt->u[i]);
printf(">\n");
 
printf("}\n");
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_encoding.c
0,0 → 1,83
#include "fitz.h"
#include "mupdf.h"
 
#include "data_encodings.h"
#include "data_glyphlist.h"
 
void
pdf_load_encoding(char **estrings, char *encoding)
{
char **bstrings = NULL;
int i;
 
if (!strcmp(encoding, "StandardEncoding"))
bstrings = (char**) pdf_standard;
if (!strcmp(encoding, "MacRomanEncoding"))
bstrings = (char**) pdf_mac_roman;
if (!strcmp(encoding, "MacExpertEncoding"))
bstrings = (char**) pdf_mac_expert;
if (!strcmp(encoding, "WinAnsiEncoding"))
bstrings = (char**) pdf_win_ansi;
 
if (bstrings)
for (i = 0; i < 256; i++)
estrings[i] = bstrings[i];
}
 
int
pdf_lookup_agl(char *name)
{
char buf[64];
char *p;
int l = 0;
int r = nelem(agl_name_list) - 1;
 
fz_strlcpy(buf, name, sizeof buf);
 
/* kill anything after first period and underscore */
p = strchr(buf, '.');
if (p) p[0] = 0;
p = strchr(buf, '_');
if (p) p[0] = 0;
 
while (l <= r)
{
int m = (l + r) >> 1;
int c = strcmp(buf, agl_name_list[m]);
if (c < 0)
r = m - 1;
else if (c > 0)
l = m + 1;
else
return agl_code_list[m];
}
 
if (strstr(buf, "uni") == buf)
return strtol(buf + 3, NULL, 16);
else if (strstr(buf, "u") == buf)
return strtol(buf + 1, NULL, 16);
else if (strstr(buf, "a") == buf && strlen(buf) >= 3)
return strtol(buf + 1, NULL, 10);
 
return 0;
}
 
static const char *empty_dup_list[] = { 0 };
 
const char **
pdf_lookup_agl_duplicates(int ucs)
{
int l = 0;
int r = nelem(agl_dup_offsets) / 2 - 1;
while (l <= r)
{
int m = (l + r) >> 1;
if (ucs < agl_dup_offsets[m << 1])
r = m - 1;
else if (ucs > agl_dup_offsets[m << 1])
l = m + 1;
else
return agl_dup_names + agl_dup_offsets[(m << 1) + 1];
}
return empty_dup_list;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_font.c
0,0 → 1,1165
#include "fitz.h"
#include "mupdf.h"
 
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_XFREE86_H
 
static fz_error pdf_load_font_descriptor(pdf_font_desc *fontdesc, pdf_xref *xref, fz_obj *dict, char *collection, char *basefont);
 
static char *base_font_names[14][7] =
{
{ "Courier", "CourierNew", "CourierNewPSMT", NULL },
{ "Courier-Bold", "CourierNew,Bold", "Courier,Bold",
"CourierNewPS-BoldMT", "CourierNew-Bold", NULL },
{ "Courier-Oblique", "CourierNew,Italic", "Courier,Italic",
"CourierNewPS-ItalicMT", "CourierNew-Italic", NULL },
{ "Courier-BoldOblique", "CourierNew,BoldItalic", "Courier,BoldItalic",
"CourierNewPS-BoldItalicMT", "CourierNew-BoldItalic", NULL },
{ "Helvetica", "ArialMT", "Arial", NULL },
{ "Helvetica-Bold", "Arial-BoldMT", "Arial,Bold", "Arial-Bold",
"Helvetica,Bold", NULL },
{ "Helvetica-Oblique", "Arial-ItalicMT", "Arial,Italic", "Arial-Italic",
"Helvetica,Italic", "Helvetica-Italic", NULL },
{ "Helvetica-BoldOblique", "Arial-BoldItalicMT",
"Arial,BoldItalic", "Arial-BoldItalic",
"Helvetica,BoldItalic", "Helvetica-BoldItalic", NULL },
{ "Times-Roman", "TimesNewRomanPSMT", "TimesNewRoman",
"TimesNewRomanPS", NULL },
{ "Times-Bold", "TimesNewRomanPS-BoldMT", "TimesNewRoman,Bold",
"TimesNewRomanPS-Bold", "TimesNewRoman-Bold", NULL },
{ "Times-Italic", "TimesNewRomanPS-ItalicMT", "TimesNewRoman,Italic",
"TimesNewRomanPS-Italic", "TimesNewRoman-Italic", NULL },
{ "Times-BoldItalic", "TimesNewRomanPS-BoldItalicMT",
"TimesNewRoman,BoldItalic", "TimesNewRomanPS-BoldItalic",
"TimesNewRoman-BoldItalic", NULL },
{ "Symbol", NULL },
{ "ZapfDingbats", NULL }
};
 
static int is_dynalab(char *name)
{
if (strstr(name, "HuaTian"))
return 1;
if (strstr(name, "MingLi"))
return 1;
if ((strstr(name, "DF") == name) || strstr(name, "+DF"))
return 1;
if ((strstr(name, "DLC") == name) || strstr(name, "+DLC"))
return 1;
return 0;
}
 
static int strcmp_ignore_space(char *a, char *b)
{
while (1)
{
while (*a == ' ')
a++;
while (*b == ' ')
b++;
if (*a != *b)
return 1;
if (*a == 0)
return *a != *b;
if (*b == 0)
return *a != *b;
a++;
b++;
}
}
 
static char *clean_font_name(char *fontname)
{
int i, k;
for (i = 0; i < 14; i++)
for (k = 0; base_font_names[i][k]; k++)
if (!strcmp_ignore_space(base_font_names[i][k], fontname))
return base_font_names[i][0];
return fontname;
}
 
/*
* FreeType and Rendering glue
*/
 
enum { UNKNOWN, TYPE1, TRUETYPE };
 
static int ft_kind(FT_Face face)
{
/// ZAGLUSHKA ///
//const char *kind = FT_Get_X11_Font_Format(face);
const char *kind = "TrueType";
if (!strcmp(kind, "TrueType"))
return TRUETYPE;
if (!strcmp(kind, "Type 1"))
return TYPE1;
if (!strcmp(kind, "CFF"))
return TYPE1;
if (!strcmp(kind, "CID Type 1"))
return TYPE1;
return UNKNOWN;
}
 
static int ft_is_bold(FT_Face face)
{
return face->style_flags & FT_STYLE_FLAG_BOLD;
}
 
static int ft_is_italic(FT_Face face)
{
return face->style_flags & FT_STYLE_FLAG_ITALIC;
}
 
static int ft_char_index(FT_Face face, int cid)
{
int gid = FT_Get_Char_Index(face, cid);
if (gid == 0)
gid = FT_Get_Char_Index(face, 0xf000 + cid);
 
/* some chinese fonts only ship the similarly looking 0x2026 */
if (gid == 0 && cid == 0x22ef)
gid = FT_Get_Char_Index(face, 0x2026);
 
return gid;
}
 
static int ft_cid_to_gid(pdf_font_desc *fontdesc, int cid)
{
if (fontdesc->to_ttf_cmap)
{
cid = pdf_lookup_cmap(fontdesc->to_ttf_cmap, cid);
return ft_char_index(fontdesc->font->ft_face, cid);
}
 
if (fontdesc->cid_to_gid)
return fontdesc->cid_to_gid[cid];
 
return cid;
}
 
int
pdf_font_cid_to_gid(pdf_font_desc *fontdesc, int cid)
{
if (fontdesc->font->ft_face)
return ft_cid_to_gid(fontdesc, cid);
return cid;
}
 
static int ft_width(pdf_font_desc *fontdesc, int cid)
{
int gid = ft_cid_to_gid(fontdesc, cid);
int fterr = FT_Load_Glyph(fontdesc->font->ft_face, gid,
FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_TRANSFORM);
if (fterr)
{
fz_warn("freetype load glyph (gid %d): %s", gid, ft_error_string(fterr));
return 0;
}
return ((FT_Face)fontdesc->font->ft_face)->glyph->advance.x;
}
 
static int lookup_mre_code(char *name)
{
int i;
for (i = 0; i < 256; i++)
if (pdf_mac_roman[i] && !strcmp(name, pdf_mac_roman[i]))
return i;
return -1;
}
 
/*
* Load font files.
*/
 
static fz_error
pdf_load_builtin_font(pdf_font_desc *fontdesc, char *fontname)
{
fz_error error;
unsigned char *data;
unsigned int len;
 
data = pdf_find_builtin_font(fontname, &len);
if (!data)
return fz_throw("cannot find builtin font: '%s'", fontname);
 
error = fz_new_font_from_memory(&fontdesc->font, data, len, 0);
if (error)
return fz_rethrow(error, "cannot load freetype font from memory");
 
if (!strcmp(fontname, "Symbol") || !strcmp(fontname, "ZapfDingbats"))
fontdesc->flags |= PDF_FD_SYMBOLIC;
 
return fz_okay;
}
 
static fz_error
pdf_load_substitute_font(pdf_font_desc *fontdesc, int mono, int serif, int bold, int italic)
{
fz_error error;
unsigned char *data;
unsigned int len;
 
data = pdf_find_substitute_font(mono, serif, bold, italic, &len);
if (!data)
return fz_throw("cannot find substitute font");
 
error = fz_new_font_from_memory(&fontdesc->font, data, len, 0);
if (error)
return fz_rethrow(error, "cannot load freetype font from memory");
 
fontdesc->font->ft_substitute = 1;
fontdesc->font->ft_bold = bold && !ft_is_bold(fontdesc->font->ft_face);
fontdesc->font->ft_italic = italic && !ft_is_italic(fontdesc->font->ft_face);
return fz_okay;
}
 
static fz_error
pdf_load_substitute_cjk_font(pdf_font_desc *fontdesc, int ros, int serif)
{
fz_error error;
unsigned char *data;
unsigned int len;
 
data = pdf_find_substitute_cjk_font(ros, serif, &len);
if (!data)
return fz_throw("cannot find builtin CJK font");
 
error = fz_new_font_from_memory(&fontdesc->font, data, len, 0);
if (error)
return fz_rethrow(error, "cannot load builtin CJK font");
 
fontdesc->font->ft_substitute = 1;
return fz_okay;
}
 
static fz_error
pdf_load_system_font(pdf_font_desc *fontdesc, char *fontname, char *collection)
{
fz_error error;
int bold = 0;
int italic = 0;
int serif = 0;
int mono = 0;
 
if (strstr(fontname, "Bold"))
bold = 1;
if (strstr(fontname, "Italic"))
italic = 1;
if (strstr(fontname, "Oblique"))
italic = 1;
 
if (fontdesc->flags & PDF_FD_FIXED_PITCH)
mono = 1;
if (fontdesc->flags & PDF_FD_SERIF)
serif = 1;
if (fontdesc->flags & PDF_FD_ITALIC)
italic = 1;
if (fontdesc->flags & PDF_FD_FORCE_BOLD)
bold = 1;
 
if (collection)
{
if (!strcmp(collection, "Adobe-CNS1"))
return pdf_load_substitute_cjk_font(fontdesc, PDF_ROS_CNS, serif);
else if (!strcmp(collection, "Adobe-GB1"))
return pdf_load_substitute_cjk_font(fontdesc, PDF_ROS_GB, serif);
else if (!strcmp(collection, "Adobe-Japan1"))
return pdf_load_substitute_cjk_font(fontdesc, PDF_ROS_JAPAN, serif);
else if (!strcmp(collection, "Adobe-Korea1"))
return pdf_load_substitute_cjk_font(fontdesc, PDF_ROS_KOREA, serif);
return fz_throw("unknown cid collection: %s", collection);
}
 
error = pdf_load_substitute_font(fontdesc, mono, serif, bold, italic);
if (error)
return fz_rethrow(error, "cannot load substitute font");
 
return fz_okay;
}
 
static fz_error
pdf_load_embedded_font(pdf_font_desc *fontdesc, pdf_xref *xref, fz_obj *stmref)
{
fz_error error;
fz_buffer *buf;
 
error = pdf_load_stream(&buf, xref, fz_to_num(stmref), fz_to_gen(stmref));
if (error)
return fz_rethrow(error, "cannot load font stream (%d %d R)", fz_to_num(stmref), fz_to_gen(stmref));
 
error = fz_new_font_from_memory(&fontdesc->font, buf->data, buf->len, 0);
if (error)
{
fz_drop_buffer(buf);
return fz_rethrow(error, "cannot load embedded font (%d %d R)", fz_to_num(stmref), fz_to_gen(stmref));
}
 
/* save the buffer so we can free it later */
fontdesc->font->ft_data = buf->data;
fontdesc->font->ft_size = buf->len;
fz_free(buf); /* only free the fz_buffer struct, not the contained data */
 
fontdesc->is_embedded = 1;
 
return fz_okay;
}
 
/*
* Create and destroy
*/
 
pdf_font_desc *
pdf_keep_font(pdf_font_desc *fontdesc)
{
fontdesc->refs ++;
return fontdesc;
}
 
void
pdf_drop_font(pdf_font_desc *fontdesc)
{
if (fontdesc && --fontdesc->refs == 0)
{
if (fontdesc->font)
fz_drop_font(fontdesc->font);
if (fontdesc->encoding)
pdf_drop_cmap(fontdesc->encoding);
if (fontdesc->to_ttf_cmap)
pdf_drop_cmap(fontdesc->to_ttf_cmap);
if (fontdesc->to_unicode)
pdf_drop_cmap(fontdesc->to_unicode);
fz_free(fontdesc->cid_to_gid);
fz_free(fontdesc->cid_to_ucs);
fz_free(fontdesc->hmtx);
fz_free(fontdesc->vmtx);
fz_free(fontdesc);
}
}
 
pdf_font_desc *
pdf_new_font_desc(void)
{
pdf_font_desc *fontdesc;
 
fontdesc = fz_malloc(sizeof(pdf_font_desc));
fontdesc->refs = 1;
 
fontdesc->font = NULL;
 
fontdesc->flags = 0;
fontdesc->italic_angle = 0;
fontdesc->ascent = 0;
fontdesc->descent = 0;
fontdesc->cap_height = 0;
fontdesc->x_height = 0;
fontdesc->missing_width = 0;
 
fontdesc->encoding = NULL;
fontdesc->to_ttf_cmap = NULL;
fontdesc->cid_to_gid_len = 0;
fontdesc->cid_to_gid = NULL;
 
fontdesc->to_unicode = NULL;
fontdesc->cid_to_ucs_len = 0;
fontdesc->cid_to_ucs = NULL;
 
fontdesc->wmode = 0;
 
fontdesc->hmtx_cap = 0;
fontdesc->vmtx_cap = 0;
fontdesc->hmtx_len = 0;
fontdesc->vmtx_len = 0;
fontdesc->hmtx = NULL;
fontdesc->vmtx = NULL;
 
fontdesc->dhmtx.lo = 0x0000;
fontdesc->dhmtx.hi = 0xFFFF;
fontdesc->dhmtx.w = 1000;
 
fontdesc->dvmtx.lo = 0x0000;
fontdesc->dvmtx.hi = 0xFFFF;
fontdesc->dvmtx.x = 0;
fontdesc->dvmtx.y = 880;
fontdesc->dvmtx.w = -1000;
 
fontdesc->is_embedded = 0;
 
return fontdesc;
}
 
/*
* Simple fonts (Type1 and TrueType)
*/
 
static fz_error
pdf_load_simple_font(pdf_font_desc **fontdescp, pdf_xref *xref, fz_obj *dict)
{
fz_error error;
fz_obj *descriptor;
fz_obj *encoding;
fz_obj *widths;
unsigned short *etable = NULL;
pdf_font_desc *fontdesc;
FT_Face face;
FT_CharMap cmap;
int symbolic;
int kind;
 
char *basefont;
char *fontname;
char *estrings[256];
char ebuffer[256][32];
int i, k, n;
int fterr;
 
basefont = fz_to_name(fz_dict_gets(dict, "BaseFont"));
fontname = clean_font_name(basefont);
 
/* Load font file */
 
fontdesc = pdf_new_font_desc();
 
descriptor = fz_dict_gets(dict, "FontDescriptor");
if (descriptor)
error = pdf_load_font_descriptor(fontdesc, xref, descriptor, NULL, basefont);
else
error = pdf_load_builtin_font(fontdesc, fontname);
if (error)
goto cleanup;
 
/* Some chinese documents mistakenly consider WinAnsiEncoding to be codepage 936 */
if (!*fontdesc->font->name &&
!fz_dict_gets(dict, "ToUnicode") &&
!strcmp(fz_to_name(fz_dict_gets(dict, "Encoding")), "WinAnsiEncoding") &&
fz_to_int(fz_dict_gets(descriptor, "Flags")) == 4)
{
/* note: without the comma, pdf_load_font_descriptor would prefer /FontName over /BaseFont */
char *cp936fonts[] = {
"\xCB\xCE\xCC\xE5", "SimSun,Regular",
"\xBA\xDA\xCC\xE5", "SimHei,Regular",
"\xBF\xAC\xCC\xE5_GB2312", "SimKai,Regular",
"\xB7\xC2\xCB\xCE_GB2312", "SimFang,Regular",
"\xC1\xA5\xCA\xE9", "SimLi,Regular",
NULL
};
for (i = 0; cp936fonts[i]; i += 2)
if (!strcmp(basefont, cp936fonts[i]))
break;
if (cp936fonts[i])
{
fz_warn("workaround for S22PDF lying about chinese font encodings");
pdf_drop_font(fontdesc);
fontdesc = pdf_new_font_desc();
error = pdf_load_font_descriptor(fontdesc, xref, descriptor, "Adobe-GB1", cp936fonts[i+1]);
error |= pdf_load_system_cmap(&fontdesc->encoding, "GBK-EUC-H");
error |= pdf_load_system_cmap(&fontdesc->to_unicode, "Adobe-GB1-UCS2");
error |= pdf_load_system_cmap(&fontdesc->to_ttf_cmap, "Adobe-GB1-UCS2");
if (error)
return fz_rethrow(error, "cannot load font");
 
face = fontdesc->font->ft_face;
kind = ft_kind(face);
goto skip_encoding;
}
}
 
face = fontdesc->font->ft_face;
kind = ft_kind(face);
 
/* Encoding */
 
symbolic = fontdesc->flags & 4;
 
if (face->num_charmaps > 0)
cmap = face->charmaps[0];
else
cmap = NULL;
 
for (i = 0; i < face->num_charmaps; i++)
{
FT_CharMap test = face->charmaps[i];
 
if (kind == TYPE1)
{
if (test->platform_id == 7)
cmap = test;
}
 
if (kind == TRUETYPE)
{
if (test->platform_id == 1 && test->encoding_id == 0)
cmap = test;
if (test->platform_id == 3 && test->encoding_id == 1)
cmap = test;
}
}
 
if (cmap)
{
fterr = FT_Set_Charmap(face, cmap);
if (fterr)
fz_warn("freetype could not set cmap: %s", ft_error_string(fterr));
}
else
fz_warn("freetype could not find any cmaps");
 
etable = fz_calloc(256, sizeof(unsigned short));
for (i = 0; i < 256; i++)
{
estrings[i] = NULL;
etable[i] = 0;
}
 
encoding = fz_dict_gets(dict, "Encoding");
if (encoding)
{
if (fz_is_name(encoding))
pdf_load_encoding(estrings, fz_to_name(encoding));
 
if (fz_is_dict(encoding))
{
fz_obj *base, *diff, *item;
 
base = fz_dict_gets(encoding, "BaseEncoding");
if (fz_is_name(base))
pdf_load_encoding(estrings, fz_to_name(base));
else if (!fontdesc->is_embedded && !symbolic)
pdf_load_encoding(estrings, "StandardEncoding");
 
diff = fz_dict_gets(encoding, "Differences");
if (fz_is_array(diff))
{
n = fz_array_len(diff);
k = 0;
for (i = 0; i < n; i++)
{
item = fz_array_get(diff, i);
if (fz_is_int(item))
k = fz_to_int(item);
if (fz_is_name(item))
estrings[k++] = fz_to_name(item);
if (k < 0) k = 0;
if (k > 255) k = 255;
}
}
}
}
 
/* start with the builtin encoding */
for (i = 0; i < 256; i++)
etable[i] = ft_char_index(face, i);
 
/* encode by glyph name where we can */
if (kind == TYPE1)
{
for (i = 0; i < 256; i++)
{
if (estrings[i])
{
etable[i] = FT_Get_Name_Index(face, estrings[i]);
if (etable[i] == 0)
{
int aglcode = pdf_lookup_agl(estrings[i]);
const char **dupnames = pdf_lookup_agl_duplicates(aglcode);
while (*dupnames)
{
etable[i] = FT_Get_Name_Index(face, (char*)*dupnames);
if (etable[i])
break;
dupnames++;
}
}
}
}
}
 
/* encode by glyph name where we can */
if (kind == TRUETYPE)
{
/* Unicode cmap */
if (!symbolic && face->charmap && face->charmap->platform_id == 3)
{
for (i = 0; i < 256; i++)
{
if (estrings[i])
{
int aglcode = pdf_lookup_agl(estrings[i]);
if (!aglcode)
etable[i] = FT_Get_Name_Index(face, estrings[i]);
else
etable[i] = ft_char_index(face, aglcode);
}
}
}
 
/* MacRoman cmap */
else if (!symbolic && face->charmap && face->charmap->platform_id == 1)
{
for (i = 0; i < 256; i++)
{
if (estrings[i])
{
k = lookup_mre_code(estrings[i]);
if (k <= 0)
etable[i] = FT_Get_Name_Index(face, estrings[i]);
else
etable[i] = ft_char_index(face, k);
}
}
}
 
/* Symbolic cmap */
else
{
for (i = 0; i < 256; i++)
{
if (estrings[i])
{
etable[i] = FT_Get_Name_Index(face, estrings[i]);
if (etable[i] == 0)
etable[i] = ft_char_index(face, i);
}
}
}
}
 
/* try to reverse the glyph names from the builtin encoding */
for (i = 0; i < 256; i++)
{
if (etable[i] && !estrings[i])
{
if (FT_HAS_GLYPH_NAMES(face))
{
fterr = FT_Get_Glyph_Name(face, etable[i], ebuffer[i], 32);
if (fterr)
fz_warn("freetype get glyph name (gid %d): %s", etable[i], ft_error_string(fterr));
if (ebuffer[i][0])
estrings[i] = ebuffer[i];
}
else
{
estrings[i] = (char*) pdf_win_ansi[i]; /* discard const */
}
}
}
 
fontdesc->encoding = pdf_new_identity_cmap(0, 1);
fontdesc->cid_to_gid_len = 256;
fontdesc->cid_to_gid = etable;
 
error = pdf_load_to_unicode(fontdesc, xref, estrings, NULL, fz_dict_gets(dict, "ToUnicode"));
if (error)
fz_catch(error, "cannot load to_unicode");
 
skip_encoding:
 
/* Widths */
 
pdf_set_default_hmtx(fontdesc, fontdesc->missing_width);
 
widths = fz_dict_gets(dict, "Widths");
if (widths)
{
int first, last;
 
first = fz_to_int(fz_dict_gets(dict, "FirstChar"));
last = fz_to_int(fz_dict_gets(dict, "LastChar"));
 
if (first < 0 || last > 255 || first > last)
first = last = 0;
 
for (i = 0; i < last - first + 1; i++)
{
int wid = fz_to_int(fz_array_get(widths, i));
pdf_add_hmtx(fontdesc, i + first, i + first, wid);
}
}
else
{
fterr = FT_Set_Char_Size(face, 1000, 1000, 72, 72);
if (fterr)
fz_warn("freetype set character size: %s", ft_error_string(fterr));
for (i = 0; i < 256; i++)
{
pdf_add_hmtx(fontdesc, i, i, ft_width(fontdesc, i));
}
}
 
pdf_end_hmtx(fontdesc);
 
*fontdescp = fontdesc;
return fz_okay;
 
cleanup:
if (etable != fontdesc->cid_to_gid)
fz_free(etable);
pdf_drop_font(fontdesc);
return fz_rethrow(error, "cannot load simple font (%d %d R)", fz_to_num(dict), fz_to_gen(dict));
}
 
/*
* CID Fonts
*/
 
static fz_error
load_cid_font(pdf_font_desc **fontdescp, pdf_xref *xref, fz_obj *dict, fz_obj *encoding, fz_obj *to_unicode)
{
fz_error error;
fz_obj *widths;
fz_obj *descriptor;
pdf_font_desc *fontdesc;
FT_Face face;
int kind;
char collection[256];
char *basefont;
int i, k, fterr;
fz_obj *obj;
int dw;
 
/* Get font name and CID collection */
 
basefont = fz_to_name(fz_dict_gets(dict, "BaseFont"));
 
{
fz_obj *cidinfo;
char tmpstr[64];
int tmplen;
 
cidinfo = fz_dict_gets(dict, "CIDSystemInfo");
if (!cidinfo)
return fz_throw("cid font is missing info");
 
obj = fz_dict_gets(cidinfo, "Registry");
tmplen = MIN(sizeof tmpstr - 1, fz_to_str_len(obj));
memcpy(tmpstr, fz_to_str_buf(obj), tmplen);
tmpstr[tmplen] = '\0';
fz_strlcpy(collection, tmpstr, sizeof collection);
 
fz_strlcat(collection, "-", sizeof collection);
 
obj = fz_dict_gets(cidinfo, "Ordering");
tmplen = MIN(sizeof tmpstr - 1, fz_to_str_len(obj));
memcpy(tmpstr, fz_to_str_buf(obj), tmplen);
tmpstr[tmplen] = '\0';
fz_strlcat(collection, tmpstr, sizeof collection);
}
 
/* Load font file */
 
fontdesc = pdf_new_font_desc();
 
descriptor = fz_dict_gets(dict, "FontDescriptor");
if (descriptor)
error = pdf_load_font_descriptor(fontdesc, xref, descriptor, collection, basefont);
else
error = fz_throw("syntaxerror: missing font descriptor");
if (error)
goto cleanup;
 
face = fontdesc->font->ft_face;
kind = ft_kind(face);
 
/* Encoding */
 
error = fz_okay;
if (fz_is_name(encoding))
{
if (!strcmp(fz_to_name(encoding), "Identity-H"))
fontdesc->encoding = pdf_new_identity_cmap(0, 2);
else if (!strcmp(fz_to_name(encoding), "Identity-V"))
fontdesc->encoding = pdf_new_identity_cmap(1, 2);
else
error = pdf_load_system_cmap(&fontdesc->encoding, fz_to_name(encoding));
}
else if (fz_is_indirect(encoding))
{
error = pdf_load_embedded_cmap(&fontdesc->encoding, xref, encoding);
}
else
{
error = fz_throw("syntaxerror: font missing encoding");
}
if (error)
goto cleanup;
 
pdf_set_font_wmode(fontdesc, pdf_get_wmode(fontdesc->encoding));
 
if (kind == TRUETYPE)
{
fz_obj *cidtogidmap;
 
cidtogidmap = fz_dict_gets(dict, "CIDToGIDMap");
if (fz_is_indirect(cidtogidmap))
{
fz_buffer *buf;
 
error = pdf_load_stream(&buf, xref, fz_to_num(cidtogidmap), fz_to_gen(cidtogidmap));
if (error)
goto cleanup;
 
fontdesc->cid_to_gid_len = (buf->len) / 2;
fontdesc->cid_to_gid = fz_calloc(fontdesc->cid_to_gid_len, sizeof(unsigned short));
for (i = 0; i < fontdesc->cid_to_gid_len; i++)
fontdesc->cid_to_gid[i] = (buf->data[i * 2] << 8) + buf->data[i * 2 + 1];
 
fz_drop_buffer(buf);
}
 
/* if truetype font is external, cidtogidmap should not be identity */
/* so we map from cid to unicode and then map that through the (3 1) */
/* unicode cmap to get a glyph id */
else if (fontdesc->font->ft_substitute)
{
fterr = FT_Select_Charmap(face, ft_encoding_unicode);
if (fterr)
{
error = fz_throw("fonterror: no unicode cmap when emulating CID font: %s", ft_error_string(fterr));
goto cleanup;
}
 
if (!strcmp(collection, "Adobe-CNS1"))
error = pdf_load_system_cmap(&fontdesc->to_ttf_cmap, "Adobe-CNS1-UCS2");
else if (!strcmp(collection, "Adobe-GB1"))
error = pdf_load_system_cmap(&fontdesc->to_ttf_cmap, "Adobe-GB1-UCS2");
else if (!strcmp(collection, "Adobe-Japan1"))
error = pdf_load_system_cmap(&fontdesc->to_ttf_cmap, "Adobe-Japan1-UCS2");
else if (!strcmp(collection, "Adobe-Japan2"))
error = pdf_load_system_cmap(&fontdesc->to_ttf_cmap, "Adobe-Japan2-UCS2");
else if (!strcmp(collection, "Adobe-Korea1"))
error = pdf_load_system_cmap(&fontdesc->to_ttf_cmap, "Adobe-Korea1-UCS2");
else
error = fz_okay;
 
if (error)
{
error = fz_rethrow(error, "cannot load system cmap %s", collection);
goto cleanup;
}
}
}
 
error = pdf_load_to_unicode(fontdesc, xref, NULL, collection, to_unicode);
if (error)
fz_catch(error, "cannot load to_unicode");
 
/* Horizontal */
 
dw = 1000;
obj = fz_dict_gets(dict, "DW");
if (obj)
dw = fz_to_int(obj);
pdf_set_default_hmtx(fontdesc, dw);
 
widths = fz_dict_gets(dict, "W");
if (widths)
{
int c0, c1, w;
 
for (i = 0; i < fz_array_len(widths); )
{
c0 = fz_to_int(fz_array_get(widths, i));
obj = fz_array_get(widths, i + 1);
if (fz_is_array(obj))
{
for (k = 0; k < fz_array_len(obj); k++)
{
w = fz_to_int(fz_array_get(obj, k));
pdf_add_hmtx(fontdesc, c0 + k, c0 + k, w);
}
i += 2;
}
else
{
c1 = fz_to_int(obj);
w = fz_to_int(fz_array_get(widths, i + 2));
pdf_add_hmtx(fontdesc, c0, c1, w);
i += 3;
}
}
}
 
pdf_end_hmtx(fontdesc);
 
/* Vertical */
 
if (pdf_get_wmode(fontdesc->encoding) == 1)
{
int dw2y = 880;
int dw2w = -1000;
 
obj = fz_dict_gets(dict, "DW2");
if (obj)
{
dw2y = fz_to_int(fz_array_get(obj, 0));
dw2w = fz_to_int(fz_array_get(obj, 1));
}
 
pdf_set_default_vmtx(fontdesc, dw2y, dw2w);
 
widths = fz_dict_gets(dict, "W2");
if (widths)
{
int c0, c1, w, x, y;
 
for (i = 0; i < fz_array_len(widths); )
{
c0 = fz_to_int(fz_array_get(widths, i));
obj = fz_array_get(widths, i + 1);
if (fz_is_array(obj))
{
for (k = 0; k * 3 < fz_array_len(obj); k ++)
{
w = fz_to_int(fz_array_get(obj, k * 3 + 0));
x = fz_to_int(fz_array_get(obj, k * 3 + 1));
y = fz_to_int(fz_array_get(obj, k * 3 + 2));
pdf_add_vmtx(fontdesc, c0 + k, c0 + k, x, y, w);
}
i += 2;
}
else
{
c1 = fz_to_int(obj);
w = fz_to_int(fz_array_get(widths, i + 2));
x = fz_to_int(fz_array_get(widths, i + 3));
y = fz_to_int(fz_array_get(widths, i + 4));
pdf_add_vmtx(fontdesc, c0, c1, x, y, w);
i += 5;
}
}
}
 
pdf_end_vmtx(fontdesc);
}
 
*fontdescp = fontdesc;
return fz_okay;
 
cleanup:
pdf_drop_font(fontdesc);
return fz_rethrow(error, "cannot load cid font (%d %d R)", fz_to_num(dict), fz_to_gen(dict));
}
 
static fz_error
pdf_load_type0_font(pdf_font_desc **fontdescp, pdf_xref *xref, fz_obj *dict)
{
fz_error error;
fz_obj *dfonts;
fz_obj *dfont;
fz_obj *subtype;
fz_obj *encoding;
fz_obj *to_unicode;
 
dfonts = fz_dict_gets(dict, "DescendantFonts");
if (!dfonts)
return fz_throw("cid font is missing descendant fonts");
 
dfont = fz_array_get(dfonts, 0);
 
subtype = fz_dict_gets(dfont, "Subtype");
encoding = fz_dict_gets(dict, "Encoding");
to_unicode = fz_dict_gets(dict, "ToUnicode");
 
if (fz_is_name(subtype) && !strcmp(fz_to_name(subtype), "CIDFontType0"))
error = load_cid_font(fontdescp, xref, dfont, encoding, to_unicode);
else if (fz_is_name(subtype) && !strcmp(fz_to_name(subtype), "CIDFontType2"))
error = load_cid_font(fontdescp, xref, dfont, encoding, to_unicode);
else
error = fz_throw("syntaxerror: unknown cid font type");
if (error)
return fz_rethrow(error, "cannot load descendant font (%d %d R)", fz_to_num(dfont), fz_to_gen(dfont));
 
return fz_okay;
}
 
/*
* FontDescriptor
*/
 
static fz_error
pdf_load_font_descriptor(pdf_font_desc *fontdesc, pdf_xref *xref, fz_obj *dict, char *collection, char *basefont)
{
fz_error error;
fz_obj *obj1, *obj2, *obj3, *obj;
char *fontname;
char *origname;
FT_Face face;
 
if (!strchr(basefont, ',') || strchr(basefont, '+'))
origname = fz_to_name(fz_dict_gets(dict, "FontName"));
else
origname = basefont;
fontname = clean_font_name(origname);
 
fontdesc->flags = fz_to_int(fz_dict_gets(dict, "Flags"));
fontdesc->italic_angle = fz_to_real(fz_dict_gets(dict, "ItalicAngle"));
fontdesc->ascent = fz_to_real(fz_dict_gets(dict, "Ascent"));
fontdesc->descent = fz_to_real(fz_dict_gets(dict, "Descent"));
fontdesc->cap_height = fz_to_real(fz_dict_gets(dict, "CapHeight"));
fontdesc->x_height = fz_to_real(fz_dict_gets(dict, "XHeight"));
fontdesc->missing_width = fz_to_real(fz_dict_gets(dict, "MissingWidth"));
 
obj1 = fz_dict_gets(dict, "FontFile");
obj2 = fz_dict_gets(dict, "FontFile2");
obj3 = fz_dict_gets(dict, "FontFile3");
obj = obj1 ? obj1 : obj2 ? obj2 : obj3;
 
if (fz_is_indirect(obj))
{
error = pdf_load_embedded_font(fontdesc, xref, obj);
if (error)
{
fz_catch(error, "ignored error when loading embedded font, attempting to load system font");
if (origname != fontname)
error = pdf_load_builtin_font(fontdesc, fontname);
else
error = pdf_load_system_font(fontdesc, fontname, collection);
if (error)
return fz_rethrow(error, "cannot load font descriptor (%d %d R)", fz_to_num(dict), fz_to_gen(dict));
}
}
else
{
if (origname != fontname)
error = pdf_load_builtin_font(fontdesc, fontname);
else
error = pdf_load_system_font(fontdesc, fontname, collection);
if (error)
return fz_rethrow(error, "cannot load font descriptor (%d %d R)", fz_to_num(dict), fz_to_gen(dict));
}
 
fz_strlcpy(fontdesc->font->name, fontname, sizeof fontdesc->font->name);
 
/* Check for DynaLab fonts that must use hinting */
face = fontdesc->font->ft_face;
if (ft_kind(face) == TRUETYPE)
{
if (FT_IS_TRICKY(face) || is_dynalab(fontdesc->font->name))
fontdesc->font->ft_hint = 1;
}
 
return fz_okay;
 
}
 
static void
pdf_make_width_table(pdf_font_desc *fontdesc)
{
fz_font *font = fontdesc->font;
int i, k, cid, gid;
 
font->width_count = 0;
for (i = 0; i < fontdesc->hmtx_len; i++)
{
for (k = fontdesc->hmtx[i].lo; k <= fontdesc->hmtx[i].hi; k++)
{
cid = pdf_lookup_cmap(fontdesc->encoding, k);
gid = pdf_font_cid_to_gid(fontdesc, cid);
if (gid > font->width_count)
font->width_count = gid;
}
}
font->width_count ++;
 
font->width_table = fz_calloc(font->width_count, sizeof(int));
memset(font->width_table, 0, sizeof(int) * font->width_count);
 
for (i = 0; i < fontdesc->hmtx_len; i++)
{
for (k = fontdesc->hmtx[i].lo; k <= fontdesc->hmtx[i].hi; k++)
{
cid = pdf_lookup_cmap(fontdesc->encoding, k);
gid = pdf_font_cid_to_gid(fontdesc, cid);
if (gid >= 0 && gid < font->width_count)
font->width_table[gid] = fontdesc->hmtx[i].w;
}
}
}
 
fz_error
pdf_load_font(pdf_font_desc **fontdescp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict)
{
fz_error error;
char *subtype;
fz_obj *dfonts;
fz_obj *charprocs;
 
if ((*fontdescp = pdf_find_item(xref->store, pdf_drop_font, dict)))
{
pdf_keep_font(*fontdescp);
return fz_okay;
}
 
subtype = fz_to_name(fz_dict_gets(dict, "Subtype"));
dfonts = fz_dict_gets(dict, "DescendantFonts");
charprocs = fz_dict_gets(dict, "CharProcs");
 
if (subtype && !strcmp(subtype, "Type0"))
error = pdf_load_type0_font(fontdescp, xref, dict);
else if (subtype && !strcmp(subtype, "Type1"))
error = pdf_load_simple_font(fontdescp, xref, dict);
else if (subtype && !strcmp(subtype, "MMType1"))
error = pdf_load_simple_font(fontdescp, xref, dict);
else if (subtype && !strcmp(subtype, "TrueType"))
error = pdf_load_simple_font(fontdescp, xref, dict);
else if (subtype && !strcmp(subtype, "Type3"))
error = pdf_load_type3_font(fontdescp, xref, rdb, dict);
else if (charprocs)
{
fz_warn("unknown font format, guessing type3.");
error = pdf_load_type3_font(fontdescp, xref, rdb, dict);
}
else if (dfonts)
{
fz_warn("unknown font format, guessing type0.");
error = pdf_load_type0_font(fontdescp, xref, dict);
}
else
{
fz_warn("unknown font format, guessing type1 or truetype.");
error = pdf_load_simple_font(fontdescp, xref, dict);
}
if (error)
return fz_rethrow(error, "cannot load font (%d %d R)", fz_to_num(dict), fz_to_gen(dict));
 
/* Save the widths to stretch non-CJK substitute fonts */
if ((*fontdescp)->font->ft_substitute && !(*fontdescp)->to_ttf_cmap)
pdf_make_width_table(*fontdescp);
 
pdf_store_item(xref->store, pdf_keep_font, pdf_drop_font, dict, *fontdescp);
 
return fz_okay;
}
 
void
pdf_debug_font(pdf_font_desc *fontdesc)
{
int i;
 
printf("fontdesc {\n");
 
if (fontdesc->font->ft_face)
printf("\tfreetype font\n");
if (fontdesc->font->t3procs)
printf("\ttype3 font\n");
 
printf("\twmode %d\n", fontdesc->wmode);
printf("\tDW %d\n", fontdesc->dhmtx.w);
 
printf("\tW {\n");
for (i = 0; i < fontdesc->hmtx_len; i++)
printf("\t\t<%04x> <%04x> %d\n",
fontdesc->hmtx[i].lo, fontdesc->hmtx[i].hi, fontdesc->hmtx[i].w);
printf("\t}\n");
 
if (fontdesc->wmode)
{
printf("\tDW2 [%d %d]\n", fontdesc->dvmtx.y, fontdesc->dvmtx.w);
printf("\tW2 {\n");
for (i = 0; i < fontdesc->vmtx_len; i++)
printf("\t\t<%04x> <%04x> %d %d %d\n", fontdesc->vmtx[i].lo, fontdesc->vmtx[i].hi,
fontdesc->vmtx[i].x, fontdesc->vmtx[i].y, fontdesc->vmtx[i].w);
printf("\t}\n");
}
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_fontfile.c
0,0 → 1,139
#include "fitz.h"
#include "mupdf.h"
 
#ifdef NOCJK
#define NOCJKFONT
#endif
 
#include "../generated/font_base14.h"
 
#ifndef NODROIDFONT
#include "../generated/font_droid.h"
#endif
 
#ifndef NOCJKFONT
#include "../generated/font_cjk.h"
#endif
 
unsigned char *
pdf_find_builtin_font(char *name, unsigned int *len)
{
if (!strcmp("Courier", name)) {
*len = sizeof pdf_font_NimbusMonL_Regu;
return (unsigned char*) pdf_font_NimbusMonL_Regu;
}
if (!strcmp("Courier-Bold", name)) {
*len = sizeof pdf_font_NimbusMonL_Bold;
return (unsigned char*) pdf_font_NimbusMonL_Bold;
}
if (!strcmp("Courier", name)) {
*len = sizeof pdf_font_NimbusMonL_Regu;
return (unsigned char*) pdf_font_NimbusMonL_Regu;
}
if (!strcmp("Courier-Bold", name)) {
*len = sizeof pdf_font_NimbusMonL_Bold;
return (unsigned char*) pdf_font_NimbusMonL_Bold;
}
if (!strcmp("Courier-Oblique", name)) {
*len = sizeof pdf_font_NimbusMonL_ReguObli;
return (unsigned char*) pdf_font_NimbusMonL_ReguObli;
}
if (!strcmp("Courier-BoldOblique", name)) {
*len = sizeof pdf_font_NimbusMonL_BoldObli;
return (unsigned char*) pdf_font_NimbusMonL_BoldObli;
}
if (!strcmp("Helvetica", name)) {
*len = sizeof pdf_font_NimbusSanL_Regu;
return (unsigned char*) pdf_font_NimbusSanL_Regu;
}
if (!strcmp("Helvetica-Bold", name)) {
*len = sizeof pdf_font_NimbusSanL_Bold;
return (unsigned char*) pdf_font_NimbusSanL_Bold;
}
if (!strcmp("Helvetica-Oblique", name)) {
*len = sizeof pdf_font_NimbusSanL_ReguItal;
return (unsigned char*) pdf_font_NimbusSanL_ReguItal;
}
if (!strcmp("Helvetica-BoldOblique", name)) {
*len = sizeof pdf_font_NimbusSanL_BoldItal;
return (unsigned char*) pdf_font_NimbusSanL_BoldItal;
}
if (!strcmp("Times-Roman", name)) {
*len = sizeof pdf_font_NimbusRomNo9L_Regu;
return (unsigned char*) pdf_font_NimbusRomNo9L_Regu;
}
if (!strcmp("Times-Bold", name)) {
*len = sizeof pdf_font_NimbusRomNo9L_Medi;
return (unsigned char*) pdf_font_NimbusRomNo9L_Medi;
}
if (!strcmp("Times-Italic", name)) {
*len = sizeof pdf_font_NimbusRomNo9L_ReguItal;
return (unsigned char*) pdf_font_NimbusRomNo9L_ReguItal;
}
if (!strcmp("Times-BoldItalic", name)) {
*len = sizeof pdf_font_NimbusRomNo9L_MediItal;
return (unsigned char*) pdf_font_NimbusRomNo9L_MediItal;
}
if (!strcmp("Symbol", name)) {
*len = sizeof pdf_font_StandardSymL;
return (unsigned char*) pdf_font_StandardSymL;
}
if (!strcmp("ZapfDingbats", name)) {
*len = sizeof pdf_font_Dingbats;
return (unsigned char*) pdf_font_Dingbats;
}
*len = 0;
return NULL;
}
 
unsigned char *
pdf_find_substitute_font(int mono, int serif, int bold, int italic, unsigned int *len)
{
#ifdef NODROIDFONT
if (mono) {
if (bold) {
if (italic) return pdf_find_builtin_font("Courier-BoldOblique", len);
else return pdf_find_builtin_font("Courier-Bold", len);
} else {
if (italic) return pdf_find_builtin_font("Courier-Oblique", len);
else return pdf_find_builtin_font("Courier", len);
}
} else if (serif) {
if (bold) {
if (italic) return pdf_find_builtin_font("Times-BoldItalic", len);
else return pdf_find_builtin_font("Times-Bold", len);
} else {
if (italic) return pdf_find_builtin_font("Times-Italic", len);
else return pdf_find_builtin_font("Times-Roman", len);
}
} else {
if (bold) {
if (italic) return pdf_find_builtin_font("Helvetica-BoldOblique", len);
else return pdf_find_builtin_font("Helvetica-Bold", len);
} else {
if (italic) return pdf_find_builtin_font("Helvetica-Oblique", len);
else return pdf_find_builtin_font("Helvetica", len);
}
}
#else
if (mono) {
*len = sizeof pdf_font_DroidSansMono;
return (unsigned char*) pdf_font_DroidSansMono;
} else {
*len = sizeof pdf_font_DroidSans;
return (unsigned char*) pdf_font_DroidSans;
}
#endif
}
 
unsigned char *
pdf_find_substitute_cjk_font(int ros, int serif, unsigned int *len)
{
#ifndef NOCJKFONT
*len = sizeof pdf_font_DroidSansFallback;
return (unsigned char*) pdf_font_DroidSansFallback;
#else
*len = 0;
return NULL;
#endif
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_function.c
0,0 → 1,1694
#include "fitz.h"
#include "mupdf.h"
 
enum
{
MAXN = FZ_MAX_COLORS,
MAXM = FZ_MAX_COLORS,
};
 
typedef struct psobj_s psobj;
 
enum
{
SAMPLE = 0,
EXPONENTIAL = 2,
STITCHING = 3,
POSTSCRIPT = 4
};
 
struct pdf_function_s
{
int refs;
int type; /* 0=sample 2=exponential 3=stitching 4=postscript */
int m; /* number of input values */
int n; /* number of output values */
float domain[MAXM][2]; /* even index : min value, odd index : max value */
float range[MAXN][2]; /* even index : min value, odd index : max value */
int has_range;
 
union
{
struct {
unsigned short bps;
int size[MAXM];
float encode[MAXM][2];
float decode[MAXN][2];
float *samples;
} sa;
 
struct {
float n;
float c0[MAXN];
float c1[MAXN];
} e;
 
struct {
int k;
pdf_function **funcs; /* k */
float *bounds; /* k - 1 */
float *encode; /* k * 2 */
} st;
 
struct {
psobj *code;
int cap;
} p;
} u;
};
 
#define RADIAN 57.2957795
 
static inline float lerp(float x, float xmin, float xmax, float ymin, float ymax)
{
if (xmin == xmax)
return ymin;
if (ymin == ymax)
return ymin;
return ymin + (x - xmin) * (ymax - ymin) / (xmax - xmin);
}
 
/*
* PostScript calculator
*/
 
enum { PS_BOOL, PS_INT, PS_REAL, PS_OPERATOR, PS_BLOCK };
 
enum
{
PS_OP_ABS, PS_OP_ADD, PS_OP_AND, PS_OP_ATAN, PS_OP_BITSHIFT,
PS_OP_CEILING, PS_OP_COPY, PS_OP_COS, PS_OP_CVI, PS_OP_CVR,
PS_OP_DIV, PS_OP_DUP, PS_OP_EQ, PS_OP_EXCH, PS_OP_EXP,
PS_OP_FALSE, PS_OP_FLOOR, PS_OP_GE, PS_OP_GT, PS_OP_IDIV,
PS_OP_INDEX, PS_OP_LE, PS_OP_LN, PS_OP_LOG, PS_OP_LT, PS_OP_MOD,
PS_OP_MUL, PS_OP_NE, PS_OP_NEG, PS_OP_NOT, PS_OP_OR, PS_OP_POP,
PS_OP_ROLL, PS_OP_ROUND, PS_OP_SIN, PS_OP_SQRT, PS_OP_SUB,
PS_OP_TRUE, PS_OP_TRUNCATE, PS_OP_XOR, PS_OP_IF, PS_OP_IFELSE,
PS_OP_RETURN
};
 
static char *ps_op_names[] =
{
"abs", "add", "and", "atan", "bitshift", "ceiling", "copy",
"cos", "cvi", "cvr", "div", "dup", "eq", "exch", "exp",
"false", "floor", "ge", "gt", "idiv", "index", "le", "ln",
"log", "lt", "mod", "mul", "ne", "neg", "not", "or", "pop",
"roll", "round", "sin", "sqrt", "sub", "true", "truncate",
"xor", "if", "ifelse", "return"
};
 
struct psobj_s
{
int type;
union
{
int b; /* boolean (stack only) */
int i; /* integer (stack and code) */
float f; /* real (stack and code) */
int op; /* operator (code only) */
int block; /* if/ifelse block pointer (code only) */
} u;
};
 
typedef struct ps_stack_s ps_stack;
 
struct ps_stack_s
{
psobj stack[100];
int sp;
};
 
void
pdf_debug_ps_stack(ps_stack *st)
{
int i;
 
printf("stack: ");
 
for (i = 0; i < st->sp; i++)
{
switch (st->stack[i].type)
{
case PS_BOOL:
if (st->stack[i].u.b)
printf("true ");
else
printf("false ");
break;
 
case PS_INT:
printf("%d ", st->stack[i].u.i);
break;
 
case PS_REAL:
printf("%g ", st->stack[i].u.f);
break;
}
}
printf("\n");
 
}
 
static void
ps_init_stack(ps_stack *st)
{
memset(st->stack, 0, sizeof(st->stack));
st->sp = 0;
}
 
static inline int ps_overflow(ps_stack *st, int n)
{
return n < 0 || st->sp + n >= nelem(st->stack);
}
 
static inline int ps_underflow(ps_stack *st, int n)
{
return n < 0 || st->sp - n < 0;
}
 
static inline int ps_is_type(ps_stack *st, int t)
{
return !ps_underflow(st, 1) && st->stack[st->sp - 1].type == t;
}
 
static inline int ps_is_type2(ps_stack *st, int t)
{
return !ps_underflow(st, 2) && st->stack[st->sp - 1].type == t && st->stack[st->sp - 2].type == t;
}
 
static void
ps_push_bool(ps_stack *st, int b)
{
if (!ps_overflow(st, 1))
{
st->stack[st->sp].type = PS_BOOL;
st->stack[st->sp].u.b = b;
st->sp++;
}
}
 
static void
ps_push_int(ps_stack *st, int n)
{
if (!ps_overflow(st, 1))
{
st->stack[st->sp].type = PS_INT;
st->stack[st->sp].u.i = n;
st->sp++;
}
}
 
static void
ps_push_real(ps_stack *st, float n)
{
if (!ps_overflow(st, 1))
{
st->stack[st->sp].type = PS_REAL;
st->stack[st->sp].u.f = n;
st->sp++;
}
}
 
static int
ps_pop_bool(ps_stack *st)
{
if (!ps_underflow(st, 1))
{
if (ps_is_type(st, PS_BOOL))
return st->stack[--st->sp].u.b;
}
return 0;
}
 
static int
ps_pop_int(ps_stack *st)
{
if (!ps_underflow(st, 1))
{
if (ps_is_type(st, PS_INT))
return st->stack[--st->sp].u.i;
if (ps_is_type(st, PS_REAL))
return st->stack[--st->sp].u.f;
}
return 0;
}
 
static float
ps_pop_real(ps_stack *st)
{
if (!ps_underflow(st, 1))
{
if (ps_is_type(st, PS_INT))
return st->stack[--st->sp].u.i;
if (ps_is_type(st, PS_REAL))
return st->stack[--st->sp].u.f;
}
return 0;
}
 
static void
ps_copy(ps_stack *st, int n)
{
if (!ps_underflow(st, n) && !ps_overflow(st, n))
{
memcpy(st->stack + st->sp, st->stack + st->sp - n, n * sizeof(psobj));
st->sp += n;
}
}
 
static void
ps_roll(ps_stack *st, int n, int j)
{
psobj tmp;
int i;
 
if (ps_underflow(st, n) || j == 0 || n == 0)
return;
 
if (j >= 0)
{
j %= n;
}
else
{
j = -j % n;
if (j != 0)
j = n - j;
}
 
for (i = 0; i < j; i++)
{
tmp = st->stack[st->sp - 1];
memmove(st->stack + st->sp - n + 1, st->stack + st->sp - n, n * sizeof(psobj));
st->stack[st->sp - n] = tmp;
}
}
 
static void
ps_index(ps_stack *st, int n)
{
if (!ps_overflow(st, 1) && !ps_underflow(st, n))
{
st->stack[st->sp] = st->stack[st->sp - n - 1];
st->sp++;
}
}
 
static void
ps_run(psobj *code, ps_stack *st, int pc)
{
int i1, i2;
float r1, r2;
int b1, b2;
 
while (1)
{
switch (code[pc].type)
{
case PS_INT:
ps_push_int(st, code[pc++].u.i);
break;
 
case PS_REAL:
ps_push_real(st, code[pc++].u.f);
break;
 
case PS_OPERATOR:
switch (code[pc++].u.op)
{
case PS_OP_ABS:
if (ps_is_type(st, PS_INT))
ps_push_int(st, abs(ps_pop_int(st)));
else
ps_push_real(st, fabsf(ps_pop_real(st)));
break;
 
case PS_OP_ADD:
if (ps_is_type2(st, PS_INT)) {
i2 = ps_pop_int(st);
i1 = ps_pop_int(st);
ps_push_int(st, i1 + i2);
}
else {
r2 = ps_pop_real(st);
r1 = ps_pop_real(st);
ps_push_real(st, r1 + r2);
}
break;
 
case PS_OP_AND:
if (ps_is_type2(st, PS_INT)) {
i2 = ps_pop_int(st);
i1 = ps_pop_int(st);
ps_push_int(st, i1 & i2);
}
else {
b2 = ps_pop_bool(st);
b1 = ps_pop_bool(st);
ps_push_bool(st, b1 && b2);
}
break;
 
case PS_OP_ATAN:
r2 = ps_pop_real(st);
r1 = ps_pop_real(st);
r1 = atan2f(r1, r2) * RADIAN;
if (r1 < 0)
r1 += 360;
ps_push_real(st, r1);
break;
 
case PS_OP_BITSHIFT:
i2 = ps_pop_int(st);
i1 = ps_pop_int(st);
if (i2 > 0)
ps_push_int(st, i1 << i2);
else if (i2 < 0)
ps_push_int(st, (int)((unsigned int)i1 >> i2));
else
ps_push_int(st, i1);
break;
 
case PS_OP_CEILING:
r1 = ps_pop_real(st);
ps_push_real(st, ceilf(r1));
break;
 
case PS_OP_COPY:
ps_copy(st, ps_pop_int(st));
break;
 
case PS_OP_COS:
r1 = ps_pop_real(st);
ps_push_real(st, cosf(r1/RADIAN));
break;
 
case PS_OP_CVI:
ps_push_int(st, ps_pop_int(st));
break;
 
case PS_OP_CVR:
ps_push_real(st, ps_pop_real(st));
break;
 
case PS_OP_DIV:
r2 = ps_pop_real(st);
r1 = ps_pop_real(st);
ps_push_real(st, r1 / r2);
break;
 
case PS_OP_DUP:
ps_copy(st, 1);
break;
 
case PS_OP_EQ:
if (ps_is_type2(st, PS_BOOL)) {
b2 = ps_pop_bool(st);
b1 = ps_pop_bool(st);
ps_push_bool(st, b1 == b2);
}
else if (ps_is_type2(st, PS_INT)) {
i2 = ps_pop_int(st);
i1 = ps_pop_int(st);
ps_push_bool(st, i1 == i2);
}
else {
r2 = ps_pop_real(st);
r1 = ps_pop_real(st);
ps_push_bool(st, r1 == r2);
}
break;
 
case PS_OP_EXCH:
ps_roll(st, 2, 1);
break;
 
case PS_OP_EXP:
r2 = ps_pop_real(st);
r1 = ps_pop_real(st);
ps_push_real(st, powf(r1, r2));
break;
 
case PS_OP_FALSE:
ps_push_bool(st, 0);
break;
 
case PS_OP_FLOOR:
r1 = ps_pop_real(st);
ps_push_real(st, floorf(r1));
break;
 
case PS_OP_GE:
if (ps_is_type2(st, PS_INT)) {
i2 = ps_pop_int(st);
i1 = ps_pop_int(st);
ps_push_bool(st, i1 >= i2);
}
else {
r2 = ps_pop_real(st);
r1 = ps_pop_real(st);
ps_push_bool(st, r1 >= r2);
}
break;
 
case PS_OP_GT:
if (ps_is_type2(st, PS_INT)) {
i2 = ps_pop_int(st);
i1 = ps_pop_int(st);
ps_push_bool(st, i1 > i2);
}
else {
r2 = ps_pop_real(st);
r1 = ps_pop_real(st);
ps_push_bool(st, r1 > r2);
}
break;
 
case PS_OP_IDIV:
i2 = ps_pop_int(st);
i1 = ps_pop_int(st);
ps_push_int(st, i1 / i2);
break;
 
case PS_OP_INDEX:
ps_index(st, ps_pop_int(st));
break;
 
case PS_OP_LE:
if (ps_is_type2(st, PS_INT)) {
i2 = ps_pop_int(st);
i1 = ps_pop_int(st);
ps_push_bool(st, i1 <= i2);
}
else {
r2 = ps_pop_real(st);
r1 = ps_pop_real(st);
ps_push_bool(st, r1 <= r2);
}
break;
 
case PS_OP_LN:
r1 = ps_pop_real(st);
ps_push_real(st, logf(r1));
break;
 
case PS_OP_LOG:
r1 = ps_pop_real(st);
ps_push_real(st, log10f(r1));
break;
 
case PS_OP_LT:
if (ps_is_type2(st, PS_INT)) {
i2 = ps_pop_int(st);
i1 = ps_pop_int(st);
ps_push_bool(st, i1 < i2);
}
else {
r2 = ps_pop_real(st);
r1 = ps_pop_real(st);
ps_push_bool(st, r1 < r2);
}
break;
 
case PS_OP_MOD:
i2 = ps_pop_int(st);
i1 = ps_pop_int(st);
ps_push_int(st, i1 % i2);
break;
 
case PS_OP_MUL:
if (ps_is_type2(st, PS_INT)) {
i2 = ps_pop_int(st);
i1 = ps_pop_int(st);
ps_push_int(st, i1 * i2);
}
else {
r2 = ps_pop_real(st);
r1 = ps_pop_real(st);
ps_push_real(st, r1 * r2);
}
break;
 
case PS_OP_NE:
if (ps_is_type2(st, PS_BOOL)) {
b2 = ps_pop_bool(st);
b1 = ps_pop_bool(st);
ps_push_bool(st, b1 != b2);
}
else if (ps_is_type2(st, PS_INT)) {
i2 = ps_pop_int(st);
i1 = ps_pop_int(st);
ps_push_bool(st, i1 != i2);
}
else {
r2 = ps_pop_real(st);
r1 = ps_pop_real(st);
ps_push_bool(st, r1 != r2);
}
break;
 
case PS_OP_NEG:
if (ps_is_type(st, PS_INT))
ps_push_int(st, -ps_pop_int(st));
else
ps_push_real(st, -ps_pop_real(st));
break;
 
case PS_OP_NOT:
if (ps_is_type(st, PS_BOOL))
ps_push_bool(st, !ps_pop_bool(st));
else
ps_push_int(st, ~ps_pop_int(st));
break;
 
case PS_OP_OR:
if (ps_is_type2(st, PS_BOOL)) {
b2 = ps_pop_bool(st);
b1 = ps_pop_bool(st);
ps_push_bool(st, b1 || b2);
}
else {
i2 = ps_pop_int(st);
i1 = ps_pop_int(st);
ps_push_int(st, i1 | i2);
}
break;
 
case PS_OP_POP:
if (!ps_underflow(st, 1))
st->sp--;
break;
 
case PS_OP_ROLL:
i2 = ps_pop_int(st);
i1 = ps_pop_int(st);
ps_roll(st, i1, i2);
break;
 
case PS_OP_ROUND:
if (!ps_is_type(st, PS_INT)) {
r1 = ps_pop_real(st);
ps_push_real(st, (r1 >= 0) ? floorf(r1 + 0.5f) : ceilf(r1 - 0.5f));
}
break;
 
case PS_OP_SIN:
r1 = ps_pop_real(st);
ps_push_real(st, sinf(r1/RADIAN));
break;
 
case PS_OP_SQRT:
r1 = ps_pop_real(st);
ps_push_real(st, sqrtf(r1));
break;
 
case PS_OP_SUB:
if (ps_is_type2(st, PS_INT)) {
i2 = ps_pop_int(st);
i1 = ps_pop_int(st);
ps_push_int(st, i1 - i2);
}
else {
r2 = ps_pop_real(st);
r1 = ps_pop_real(st);
ps_push_real(st, r1 - r2);
}
break;
 
case PS_OP_TRUE:
ps_push_bool(st, 1);
break;
 
case PS_OP_TRUNCATE:
if (!ps_is_type(st, PS_INT)) {
r1 = ps_pop_real(st);
ps_push_real(st, (r1 >= 0) ? floorf(r1) : ceilf(r1));
}
break;
 
case PS_OP_XOR:
if (ps_is_type2(st, PS_BOOL)) {
b2 = ps_pop_bool(st);
b1 = ps_pop_bool(st);
ps_push_bool(st, b1 ^ b2);
}
else {
i2 = ps_pop_int(st);
i1 = ps_pop_int(st);
ps_push_int(st, i1 ^ i2);
}
break;
 
case PS_OP_IF:
b1 = ps_pop_bool(st);
if (b1)
ps_run(code, st, code[pc + 1].u.block);
pc = code[pc + 2].u.block;
break;
 
case PS_OP_IFELSE:
b1 = ps_pop_bool(st);
if (b1)
ps_run(code, st, code[pc + 1].u.block);
else
ps_run(code, st, code[pc + 0].u.block);
pc = code[pc + 2].u.block;
break;
 
case PS_OP_RETURN:
return;
 
default:
fz_warn("foreign operator in calculator function");
return;
}
break;
 
default:
fz_warn("foreign object in calculator function");
return;
}
}
}
 
static void
resize_code(pdf_function *func, int newsize)
{
if (newsize >= func->u.p.cap)
{
func->u.p.cap = func->u.p.cap + 64;
func->u.p.code = fz_realloc(func->u.p.code, func->u.p.cap, sizeof(psobj));
}
}
 
static fz_error
parse_code(pdf_function *func, fz_stream *stream, int *codeptr)
{
fz_error error;
char buf[64];
int len;
int tok;
int opptr, elseptr, ifptr;
int a, b, mid, cmp;
 
memset(buf, 0, sizeof(buf));
 
while (1)
{
error = pdf_lex(&tok, stream, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "calculator function lexical error");
 
switch(tok)
{
case PDF_TOK_EOF:
return fz_throw("truncated calculator function");
 
case PDF_TOK_INT:
resize_code(func, *codeptr);
func->u.p.code[*codeptr].type = PS_INT;
func->u.p.code[*codeptr].u.i = atoi(buf);
++*codeptr;
break;
 
case PDF_TOK_REAL:
resize_code(func, *codeptr);
func->u.p.code[*codeptr].type = PS_REAL;
func->u.p.code[*codeptr].u.f = fz_atof(buf);
++*codeptr;
break;
 
case PDF_TOK_OPEN_BRACE:
opptr = *codeptr;
*codeptr += 4;
 
resize_code(func, *codeptr);
 
ifptr = *codeptr;
error = parse_code(func, stream, codeptr);
if (error)
return fz_rethrow(error, "error in 'if' branch");
 
error = pdf_lex(&tok, stream, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "calculator function syntax error");
 
if (tok == PDF_TOK_OPEN_BRACE)
{
elseptr = *codeptr;
error = parse_code(func, stream, codeptr);
if (error)
return fz_rethrow(error, "error in 'else' branch");
 
error = pdf_lex(&tok, stream, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "calculator function syntax error");
}
else
{
elseptr = -1;
}
 
if (tok == PDF_TOK_KEYWORD)
{
if (!strcmp(buf, "if"))
{
if (elseptr >= 0)
return fz_throw("too many branches for 'if'");
func->u.p.code[opptr].type = PS_OPERATOR;
func->u.p.code[opptr].u.op = PS_OP_IF;
func->u.p.code[opptr+2].type = PS_BLOCK;
func->u.p.code[opptr+2].u.block = ifptr;
func->u.p.code[opptr+3].type = PS_BLOCK;
func->u.p.code[opptr+3].u.block = *codeptr;
}
else if (!strcmp(buf, "ifelse"))
{
if (elseptr < 0)
return fz_throw("not enough branches for 'ifelse'");
func->u.p.code[opptr].type = PS_OPERATOR;
func->u.p.code[opptr].u.op = PS_OP_IFELSE;
func->u.p.code[opptr+1].type = PS_BLOCK;
func->u.p.code[opptr+1].u.block = elseptr;
func->u.p.code[opptr+2].type = PS_BLOCK;
func->u.p.code[opptr+2].u.block = ifptr;
func->u.p.code[opptr+3].type = PS_BLOCK;
func->u.p.code[opptr+3].u.block = *codeptr;
}
else
{
return fz_throw("unknown keyword in 'if-else' context: '%s'", buf);
}
}
else
{
return fz_throw("missing keyword in 'if-else' context");
}
break;
 
case PDF_TOK_CLOSE_BRACE:
resize_code(func, *codeptr);
func->u.p.code[*codeptr].type = PS_OPERATOR;
func->u.p.code[*codeptr].u.op = PS_OP_RETURN;
++*codeptr;
return fz_okay;
 
case PDF_TOK_KEYWORD:
cmp = -1;
a = -1;
b = nelem(ps_op_names);
while (b - a > 1)
{
mid = (a + b) / 2;
cmp = strcmp(buf, ps_op_names[mid]);
if (cmp > 0)
a = mid;
else if (cmp < 0)
b = mid;
else
a = b = mid;
}
if (cmp != 0)
return fz_throw("unknown operator: '%s'", buf);
 
resize_code(func, *codeptr);
func->u.p.code[*codeptr].type = PS_OPERATOR;
func->u.p.code[*codeptr].u.op = a;
++*codeptr;
break;
 
default:
return fz_throw("calculator function syntax error");
}
}
}
 
static fz_error
load_postscript_func(pdf_function *func, pdf_xref *xref, fz_obj *dict, int num, int gen)
{
fz_error error;
fz_stream *stream;
int codeptr;
char buf[64];
int tok;
int len;
 
error = pdf_open_stream(&stream, xref, num, gen);
if (error)
return fz_rethrow(error, "cannot open calculator function stream");
 
error = pdf_lex(&tok, stream, buf, sizeof buf, &len);
if (error)
{
fz_close(stream);
return fz_rethrow(error, "stream is not a calculator function");
}
 
if (tok != PDF_TOK_OPEN_BRACE)
{
fz_close(stream);
return fz_throw("stream is not a calculator function");
}
 
func->u.p.code = NULL;
func->u.p.cap = 0;
 
codeptr = 0;
error = parse_code(func, stream, &codeptr);
if (error)
{
fz_close(stream);
return fz_rethrow(error, "cannot parse calculator function (%d %d R)", num, gen);
}
 
fz_close(stream);
return fz_okay;
}
 
static void
eval_postscript_func(pdf_function *func, float *in, float *out)
{
ps_stack st;
float x;
int i;
 
ps_init_stack(&st);
 
for (i = 0; i < func->m; i++)
{
x = CLAMP(in[i], func->domain[i][0], func->domain[i][1]);
ps_push_real(&st, x);
}
 
ps_run(func->u.p.code, &st, 0);
 
for (i = func->n - 1; i >= 0; i--)
{
x = ps_pop_real(&st);
out[i] = CLAMP(x, func->range[i][0], func->range[i][1]);
}
}
 
/*
* Sample function
*/
 
static fz_error
load_sample_func(pdf_function *func, pdf_xref *xref, fz_obj *dict, int num, int gen)
{
fz_error error;
fz_stream *stream;
fz_obj *obj;
int samplecount;
int bps;
int i;
 
func->u.sa.samples = NULL;
 
obj = fz_dict_gets(dict, "Size");
if (!fz_is_array(obj) || fz_array_len(obj) != func->m)
return fz_throw("malformed /Size");
for (i = 0; i < func->m; i++)
func->u.sa.size[i] = fz_to_int(fz_array_get(obj, i));
 
obj = fz_dict_gets(dict, "BitsPerSample");
if (!fz_is_int(obj))
return fz_throw("malformed /BitsPerSample");
func->u.sa.bps = bps = fz_to_int(obj);
 
obj = fz_dict_gets(dict, "Encode");
if (fz_is_array(obj))
{
if (fz_array_len(obj) != func->m * 2)
return fz_throw("malformed /Encode");
for (i = 0; i < func->m; i++)
{
func->u.sa.encode[i][0] = fz_to_real(fz_array_get(obj, i*2+0));
func->u.sa.encode[i][1] = fz_to_real(fz_array_get(obj, i*2+1));
}
}
else
{
for (i = 0; i < func->m; i++)
{
func->u.sa.encode[i][0] = 0;
func->u.sa.encode[i][1] = func->u.sa.size[i] - 1;
}
}
 
obj = fz_dict_gets(dict, "Decode");
if (fz_is_array(obj))
{
if (fz_array_len(obj) != func->n * 2)
return fz_throw("malformed /Decode");
for (i = 0; i < func->n; i++)
{
func->u.sa.decode[i][0] = fz_to_real(fz_array_get(obj, i*2+0));
func->u.sa.decode[i][1] = fz_to_real(fz_array_get(obj, i*2+1));
}
}
else
{
for (i = 0; i < func->n; i++)
{
func->u.sa.decode[i][0] = func->range[i][0];
func->u.sa.decode[i][1] = func->range[i][1];
}
}
 
for (i = 0, samplecount = func->n; i < func->m; i++)
samplecount *= func->u.sa.size[i];
 
func->u.sa.samples = fz_calloc(samplecount, sizeof(float));
 
error = pdf_open_stream(&stream, xref, num, gen);
if (error)
return fz_rethrow(error, "cannot open samples stream (%d %d R)", num, gen);
 
/* read samples */
for (i = 0; i < samplecount; i++)
{
unsigned int x;
float s;
 
if (fz_is_eof_bits(stream))
{
fz_close(stream);
return fz_throw("truncated sample stream");
}
 
switch (bps)
{
case 1: s = fz_read_bits(stream, 1); break;
case 2: s = fz_read_bits(stream, 2) / 3.0f; break;
case 4: s = fz_read_bits(stream, 4) / 15.0f; break;
case 8: s = fz_read_byte(stream) / 255.0f; break;
case 12: s = fz_read_bits(stream, 12) / 4095.0f; break;
case 16:
x = fz_read_byte(stream) << 8;
x |= fz_read_byte(stream);
s = x / 65535.0f;
break;
case 24:
x = fz_read_byte(stream) << 16;
x |= fz_read_byte(stream) << 8;
x |= fz_read_byte(stream);
s = x / 16777215.0f;
break;
case 32:
x = fz_read_byte(stream) << 24;
x |= fz_read_byte(stream) << 16;
x |= fz_read_byte(stream) << 8;
x |= fz_read_byte(stream);
s = x / 4294967295.0f;
break;
default:
fz_close(stream);
return fz_throw("sample stream bit depth %d unsupported", bps);
}
 
func->u.sa.samples[i] = s;
}
 
fz_close(stream);
 
return fz_okay;
}
 
static float
interpolate_sample(pdf_function *func, int *scale, int *e0, int *e1, float *efrac, int dim, int idx)
{
float a, b;
int idx0, idx1;
 
idx0 = e0[dim] * scale[dim] + idx;
idx1 = e1[dim] * scale[dim] + idx;
 
if (dim == 0)
{
a = func->u.sa.samples[idx0];
b = func->u.sa.samples[idx1];
}
else
{
a = interpolate_sample(func, scale, e0, e1, efrac, dim - 1, idx0);
b = interpolate_sample(func, scale, e0, e1, efrac, dim - 1, idx1);
}
 
return a + (b - a) * efrac[dim];
}
 
static void
eval_sample_func(pdf_function *func, float *in, float *out)
{
int e0[MAXM], e1[MAXM], scale[MAXM];
float efrac[MAXM];
float x;
int i;
 
/* encode input coordinates */
for (i = 0; i < func->m; i++)
{
x = CLAMP(in[i], func->domain[i][0], func->domain[i][1]);
x = lerp(x, func->domain[i][0], func->domain[i][1],
func->u.sa.encode[i][0], func->u.sa.encode[i][1]);
x = CLAMP(x, 0, func->u.sa.size[i] - 1);
e0[i] = floorf(x);
e1[i] = ceilf(x);
efrac[i] = x - floorf(x);
}
 
scale[0] = func->n;
for (i = 1; i < func->m; i++)
scale[i] = scale[i - 1] * func->u.sa.size[i];
 
for (i = 0; i < func->n; i++)
{
if (func->m == 1)
{
float a = func->u.sa.samples[e0[0] * func->n + i];
float b = func->u.sa.samples[e1[0] * func->n + i];
 
float ab = a + (b - a) * efrac[0];
 
out[i] = lerp(ab, 0, 1, func->u.sa.decode[i][0], func->u.sa.decode[i][1]);
out[i] = CLAMP(out[i], func->range[i][0], func->range[i][1]);
}
 
else if (func->m == 2)
{
int s0 = func->n;
int s1 = s0 * func->u.sa.size[0];
 
float a = func->u.sa.samples[e0[0] * s0 + e0[1] * s1 + i];
float b = func->u.sa.samples[e1[0] * s0 + e0[1] * s1 + i];
float c = func->u.sa.samples[e0[0] * s0 + e1[1] * s1 + i];
float d = func->u.sa.samples[e1[0] * s0 + e1[1] * s1 + i];
 
float ab = a + (b - a) * efrac[0];
float cd = c + (d - c) * efrac[0];
float abcd = ab + (cd - ab) * efrac[1];
 
out[i] = lerp(abcd, 0, 1, func->u.sa.decode[i][0], func->u.sa.decode[i][1]);
out[i] = CLAMP(out[i], func->range[i][0], func->range[i][1]);
}
 
else
{
float x = interpolate_sample(func, scale, e0, e1, efrac, func->m - 1, i);
out[i] = lerp(x, 0, 1, func->u.sa.decode[i][0], func->u.sa.decode[i][1]);
out[i] = CLAMP(out[i], func->range[i][0], func->range[i][1]);
}
}
}
 
/*
* Exponential function
*/
 
static fz_error
load_exponential_func(pdf_function *func, fz_obj *dict)
{
fz_obj *obj;
int i;
 
if (func->m != 1)
return fz_throw("/Domain must be one dimension (%d)", func->m);
 
obj = fz_dict_gets(dict, "N");
if (!fz_is_int(obj) && !fz_is_real(obj))
return fz_throw("malformed /N");
func->u.e.n = fz_to_real(obj);
 
obj = fz_dict_gets(dict, "C0");
if (fz_is_array(obj))
{
func->n = fz_array_len(obj);
if (func->n >= MAXN)
return fz_throw("exponential function result array out of range");
for (i = 0; i < func->n; i++)
func->u.e.c0[i] = fz_to_real(fz_array_get(obj, i));
}
else
{
func->n = 1;
func->u.e.c0[0] = 0;
}
 
obj = fz_dict_gets(dict, "C1");
if (fz_is_array(obj))
{
if (fz_array_len(obj) != func->n)
return fz_throw("/C1 must match /C0 length");
for (i = 0; i < func->n; i++)
func->u.e.c1[i] = fz_to_real(fz_array_get(obj, i));
}
else
{
if (func->n != 1)
return fz_throw("/C1 must match /C0 length");
func->u.e.c1[0] = 1;
}
 
return fz_okay;
}
 
static void
eval_exponential_func(pdf_function *func, float in, float *out)
{
float x = in;
float tmp;
int i;
 
x = CLAMP(x, func->domain[0][0], func->domain[0][1]);
 
/* constraint */
if ((func->u.e.n != (int)func->u.e.n && x < 0) || (func->u.e.n < 0 && x == 0))
{
fz_warn("constraint error");
return;
}
 
tmp = powf(x, func->u.e.n);
for (i = 0; i < func->n; i++)
{
out[i] = func->u.e.c0[i] + tmp * (func->u.e.c1[i] - func->u.e.c0[i]);
if (func->has_range)
out[i] = CLAMP(out[i], func->range[i][0], func->range[i][1]);
}
}
 
/*
* Stitching function
*/
 
static fz_error
load_stitching_func(pdf_function *func, pdf_xref *xref, fz_obj *dict)
{
pdf_function **funcs;
fz_error error;
fz_obj *obj;
fz_obj *sub;
fz_obj *num;
int k;
int i;
 
func->u.st.k = 0;
 
if (func->m != 1)
return fz_throw("/Domain must be one dimension (%d)", func->m);
 
obj = fz_dict_gets(dict, "Functions");
if (!fz_is_array(obj))
return fz_throw("stitching function has no input functions");
{
k = fz_array_len(obj);
 
func->u.st.funcs = fz_calloc(k, sizeof(pdf_function*));
func->u.st.bounds = fz_calloc(k - 1, sizeof(float));
func->u.st.encode = fz_calloc(k * 2, sizeof(float));
funcs = func->u.st.funcs;
 
for (i = 0; i < k; i++)
{
sub = fz_array_get(obj, i);
error = pdf_load_function(&funcs[i], xref, sub);
if (error)
return fz_rethrow(error, "cannot load sub function %d (%d %d R)", i, fz_to_num(sub), fz_to_gen(sub));
if (funcs[i]->m != 1 || funcs[i]->n != funcs[0]->n)
return fz_throw("sub function %d /Domain or /Range mismatch", i);
func->u.st.k ++;
}
 
if (!func->n)
func->n = funcs[0]->n;
else if (func->n != funcs[0]->n)
return fz_throw("sub function /Domain or /Range mismatch");
}
 
obj = fz_dict_gets(dict, "Bounds");
if (!fz_is_array(obj))
return fz_throw("stitching function has no bounds");
{
if (!fz_is_array(obj) || fz_array_len(obj) != k - 1)
return fz_throw("malformed /Bounds (not array or wrong length)");
 
for (i = 0; i < k-1; i++)
{
num = fz_array_get(obj, i);
if (!fz_is_int(num) && !fz_is_real(num))
return fz_throw("malformed /Bounds (item not real)");
func->u.st.bounds[i] = fz_to_real(num);
if (i && func->u.st.bounds[i-1] > func->u.st.bounds[i])
return fz_throw("malformed /Bounds (item not monotonic)");
}
 
if (k != 1 && (func->domain[0][0] > func->u.st.bounds[0] ||
func->domain[0][1] < func->u.st.bounds[k-2]))
fz_warn("malformed shading function bounds (domain mismatch), proceeding anyway.");
}
 
obj = fz_dict_gets(dict, "Encode");
if (!fz_is_array(obj))
return fz_throw("stitching function is missing encoding");
{
if (!fz_is_array(obj) || fz_array_len(obj) != k * 2)
return fz_throw("malformed /Encode");
for (i = 0; i < k; i++)
{
func->u.st.encode[i*2+0] = fz_to_real(fz_array_get(obj, i*2+0));
func->u.st.encode[i*2+1] = fz_to_real(fz_array_get(obj, i*2+1));
}
}
 
return fz_okay;
}
 
static void
eval_stitching_func(pdf_function *func, float in, float *out)
{
float low, high;
int k = func->u.st.k;
float *bounds = func->u.st.bounds;
int i;
 
in = CLAMP(in, func->domain[0][0], func->domain[0][1]);
 
for (i = 0; i < k - 1; i++)
{
if (in < bounds[i])
break;
}
 
if (i == 0 && k == 1)
{
low = func->domain[0][0];
high = func->domain[0][1];
}
else if (i == 0)
{
low = func->domain[0][0];
high = bounds[0];
}
else if (i == k - 1)
{
low = bounds[k-2];
high = func->domain[0][1];
}
else
{
low = bounds[i-1];
high = bounds[i];
}
 
in = lerp(in, low, high, func->u.st.encode[i*2+0], func->u.st.encode[i*2+1]);
 
pdf_eval_function(func->u.st.funcs[i], &in, 1, out, func->n);
}
 
/*
* Common
*/
 
pdf_function *
pdf_keep_function(pdf_function *func)
{
func->refs ++;
return func;
}
 
void
pdf_drop_function(pdf_function *func)
{
int i;
if (--func->refs == 0)
{
switch(func->type)
{
case SAMPLE:
fz_free(func->u.sa.samples);
break;
case EXPONENTIAL:
break;
case STITCHING:
for (i = 0; i < func->u.st.k; i++)
pdf_drop_function(func->u.st.funcs[i]);
fz_free(func->u.st.funcs);
fz_free(func->u.st.bounds);
fz_free(func->u.st.encode);
break;
case POSTSCRIPT:
fz_free(func->u.p.code);
break;
}
fz_free(func);
}
}
 
fz_error
pdf_load_function(pdf_function **funcp, pdf_xref *xref, fz_obj *dict)
{
fz_error error;
pdf_function *func;
fz_obj *obj;
int i;
 
if ((*funcp = pdf_find_item(xref->store, pdf_drop_function, dict)))
{
pdf_keep_function(*funcp);
return fz_okay;
}
 
func = fz_malloc(sizeof(pdf_function));
memset(func, 0, sizeof(pdf_function));
func->refs = 1;
 
obj = fz_dict_gets(dict, "FunctionType");
func->type = fz_to_int(obj);
 
/* required for all */
obj = fz_dict_gets(dict, "Domain");
func->m = fz_array_len(obj) / 2;
for (i = 0; i < func->m; i++)
{
func->domain[i][0] = fz_to_real(fz_array_get(obj, i * 2 + 0));
func->domain[i][1] = fz_to_real(fz_array_get(obj, i * 2 + 1));
}
 
/* required for type0 and type4, optional otherwise */
obj = fz_dict_gets(dict, "Range");
if (fz_is_array(obj))
{
func->has_range = 1;
func->n = fz_array_len(obj) / 2;
for (i = 0; i < func->n; i++)
{
func->range[i][0] = fz_to_real(fz_array_get(obj, i * 2 + 0));
func->range[i][1] = fz_to_real(fz_array_get(obj, i * 2 + 1));
}
}
else
{
func->has_range = 0;
func->n = 0;
}
 
if (func->m >= MAXM || func->n >= MAXN)
{
fz_free(func);
return fz_throw("assert: /Domain or /Range too big");
}
 
switch(func->type)
{
case SAMPLE:
error = load_sample_func(func, xref, dict, fz_to_num(dict), fz_to_gen(dict));
if (error)
{
pdf_drop_function(func);
return fz_rethrow(error, "cannot load sampled function (%d %d R)", fz_to_num(dict), fz_to_gen(dict));
}
break;
 
case EXPONENTIAL:
error = load_exponential_func(func, dict);
if (error)
{
pdf_drop_function(func);
return fz_rethrow(error, "cannot load exponential function (%d %d R)", fz_to_num(dict), fz_to_gen(dict));
}
break;
 
case STITCHING:
error = load_stitching_func(func, xref, dict);
if (error)
{
pdf_drop_function(func);
return fz_rethrow(error, "cannot load stitching function (%d %d R)", fz_to_num(dict), fz_to_gen(dict));
}
break;
 
case POSTSCRIPT:
error = load_postscript_func(func, xref, dict, fz_to_num(dict), fz_to_gen(dict));
if (error)
{
pdf_drop_function(func);
return fz_rethrow(error, "cannot load calculator function (%d %d R)", fz_to_num(dict), fz_to_gen(dict));
}
break;
 
default:
fz_free(func);
return fz_throw("unknown function type (%d %d R)", fz_to_num(dict), fz_to_gen(dict));
}
 
pdf_store_item(xref->store, pdf_keep_function, pdf_drop_function, dict, func);
 
*funcp = func;
return fz_okay;
}
 
void
pdf_eval_function(pdf_function *func, float *in, int inlen, float *out, int outlen)
{
memset(out, 0, sizeof(float) * outlen);
 
if (inlen != func->m)
{
fz_warn("tried to evaluate function with wrong number of inputs");
return;
}
if (func->n != outlen)
{
fz_warn("tried to evaluate function with wrong number of outputs");
return;
}
 
switch(func->type)
{
case SAMPLE: eval_sample_func(func, in, out); break;
case EXPONENTIAL: eval_exponential_func(func, *in, out); break;
case STITCHING: eval_stitching_func(func, *in, out); break;
case POSTSCRIPT: eval_postscript_func(func, in, out); break;
}
}
 
/*
* Debugging prints
*/
 
static void
pdf_debug_indent(char *prefix, int level, char *suffix)
{
int i;
 
printf("%s", prefix);
 
for (i = 0; i < level; i++)
printf("\t");
 
printf("%s", suffix);
}
 
static void
pdf_debug_ps_func_code(psobj *funccode, psobj *code, int level)
{
int eof, wasop;
 
pdf_debug_indent("", level, "{");
 
/* Print empty blocks as { }, instead of separating braces on different lines. */
if (code->type == PS_OPERATOR && code->u.op == PS_OP_RETURN)
{
printf(" } ");
return;
}
 
pdf_debug_indent("\n", ++level, "");
 
eof = 0;
wasop = 0;
while (!eof)
{
switch (code->type)
{
case PS_INT:
if (wasop)
pdf_debug_indent("\n", level, "");
 
printf("%d ", code->u.i);
wasop = 0;
code++;
break;
 
case PS_REAL:
if (wasop)
pdf_debug_indent("\n", level, "");
 
printf("%g ", code->u.f);
wasop = 0;
code++;
break;
 
case PS_OPERATOR:
if (code->u.op == PS_OP_RETURN)
{
printf("\n");
eof = 1;
}
else if (code->u.op == PS_OP_IF)
{
printf("\n");
pdf_debug_ps_func_code(funccode, &funccode[(code + 2)->u.block], level);
 
printf("%s", ps_op_names[code->u.op]);
code = &funccode[(code + 3)->u.block];
if (code->type != PS_OPERATOR || code->u.op != PS_OP_RETURN)
pdf_debug_indent("\n", level, "");
 
wasop = 0;
}
else if (code->u.op == PS_OP_IFELSE)
{
printf("\n");
pdf_debug_ps_func_code(funccode, &funccode[(code + 2)->u.block], level);
 
printf("\n");
pdf_debug_ps_func_code(funccode, &funccode[(code + 1)->u.block], level);
 
printf("%s", ps_op_names[code->u.op]);
code = &funccode[(code + 3)->u.block];
if (code->type != PS_OPERATOR || code->u.op != PS_OP_RETURN)
pdf_debug_indent("\n", level, "");
 
wasop = 0;
}
else
{
printf("%s ", ps_op_names[code->u.op]);
code++;
wasop = 1;
}
break;
}
}
 
pdf_debug_indent("", --level, "} ");
}
 
static void
pdf_debug_function_imp(pdf_function *func, int level)
{
int i;
 
pdf_debug_indent("", level, "function {\n");
 
pdf_debug_indent("", ++level, "");
switch (func->type)
{
case SAMPLE:
printf("sampled");
break;
case EXPONENTIAL:
printf("exponential");
break;
case STITCHING:
printf("stitching");
break;
case POSTSCRIPT:
printf("postscript");
break;
}
 
pdf_debug_indent("\n", level, "");
printf("%d input -> %d output\n", func->m, func->n);
 
pdf_debug_indent("", level, "domain ");
for (i = 0; i < func->m; i++)
printf("%g %g ", func->domain[i][0], func->domain[i][1]);
printf("\n");
 
if (func->has_range)
{
pdf_debug_indent("", level, "range ");
for (i = 0; i < func->n; i++)
printf("%g %g ", func->range[i][0], func->range[i][1]);
printf("\n");
}
 
switch (func->type)
{
case SAMPLE:
pdf_debug_indent("", level, "");
printf("bps: %d\n", func->u.sa.bps);
 
pdf_debug_indent("", level, "");
printf("size: [ ");
for (i = 0; i < func->m; i++)
printf("%d ", func->u.sa.size[i]);
printf("]\n");
 
pdf_debug_indent("", level, "");
printf("encode: [ ");
for (i = 0; i < func->m; i++)
printf("%g %g ", func->u.sa.encode[i][0], func->u.sa.encode[i][1]);
printf("]\n");
 
pdf_debug_indent("", level, "");
printf("decode: [ ");
for (i = 0; i < func->m; i++)
printf("%g %g ", func->u.sa.decode[i][0], func->u.sa.decode[i][1]);
printf("]\n");
break;
 
case EXPONENTIAL:
pdf_debug_indent("", level, "");
printf("n: %g\n", func->u.e.n);
 
pdf_debug_indent("", level, "");
printf("c0: [ ");
for (i = 0; i < func->n; i++)
printf("%g ", func->u.e.c0[i]);
printf("]\n");
 
pdf_debug_indent("", level, "");
printf("c1: [ ");
for (i = 0; i < func->n; i++)
printf("%g ", func->u.e.c1[i]);
printf("]\n");
break;
 
case STITCHING:
pdf_debug_indent("", level, "");
printf("%d functions\n", func->u.st.k);
 
pdf_debug_indent("", level, "");
printf("bounds: [ ");
for (i = 0; i < func->u.st.k - 1; i++)
printf("%g ", func->u.st.bounds[i]);
printf("]\n");
 
pdf_debug_indent("", level, "");
printf("encode: [ ");
for (i = 0; i < func->u.st.k * 2; i++)
printf("%g ", func->u.st.encode[i]);
printf("]\n");
 
for (i = 0; i < func->u.st.k; i++)
pdf_debug_function_imp(func->u.st.funcs[i], level);
break;
 
case POSTSCRIPT:
pdf_debug_ps_func_code(func->u.p.code, func->u.p.code, level);
printf("\n");
break;
}
 
pdf_debug_indent("", --level, "}\n");
}
 
void
pdf_debug_function(pdf_function *func)
{
pdf_debug_function_imp(func, 0);
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_image.c
0,0 → 1,354
#include "fitz.h"
#include "mupdf.h"
 
/* TODO: store JPEG compressed samples */
/* TODO: store flate compressed samples */
 
static fz_error pdf_load_jpx_image(fz_pixmap **imgp, pdf_xref *xref, fz_obj *dict);
 
static void
pdf_mask_color_key(fz_pixmap *pix, int n, int *colorkey)
{
unsigned char *p = pix->samples;
int len = pix->w * pix->h;
int k, t;
while (len--)
{
t = 1;
for (k = 0; k < n; k++)
if (p[k] < colorkey[k * 2] || p[k] > colorkey[k * 2 + 1])
t = 0;
if (t)
for (k = 0; k < pix->n; k++)
p[k] = 0;
p += pix->n;
}
}
 
static fz_error
pdf_load_image_imp(fz_pixmap **imgp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict, fz_stream *cstm, int forcemask)
{
fz_stream *stm;
fz_pixmap *tile;
fz_obj *obj, *res;
fz_error error;
 
int w, h, bpc, n;
int imagemask;
int interpolate;
int indexed;
fz_colorspace *colorspace;
fz_pixmap *mask; /* explicit mask/softmask image */
int usecolorkey;
int colorkey[FZ_MAX_COLORS * 2];
float decode[FZ_MAX_COLORS * 2];
 
int stride;
unsigned char *samples;
int i, len;
 
/* special case for JPEG2000 images */
if (pdf_is_jpx_image(dict))
{
tile = NULL;
error = pdf_load_jpx_image(&tile, xref, dict);
if (error)
return fz_rethrow(error, "cannot load jpx image");
if (forcemask)
{
if (tile->n != 2)
{
fz_drop_pixmap(tile);
return fz_throw("softmask must be grayscale");
}
mask = fz_alpha_from_gray(tile, 1);
fz_drop_pixmap(tile);
*imgp = mask;
return fz_okay;
}
*imgp = tile;
return fz_okay;
}
 
w = fz_to_int(fz_dict_getsa(dict, "Width", "W"));
h = fz_to_int(fz_dict_getsa(dict, "Height", "H"));
bpc = fz_to_int(fz_dict_getsa(dict, "BitsPerComponent", "BPC"));
imagemask = fz_to_bool(fz_dict_getsa(dict, "ImageMask", "IM"));
interpolate = fz_to_bool(fz_dict_getsa(dict, "Interpolate", "I"));
 
indexed = 0;
usecolorkey = 0;
colorspace = NULL;
mask = NULL;
 
if (imagemask)
bpc = 1;
 
if (w == 0)
return fz_throw("image width is zero");
if (h == 0)
return fz_throw("image height is zero");
if (bpc == 0)
return fz_throw("image depth is zero");
if (bpc > 16)
return fz_throw("image depth is too large: %d", bpc);
if (w > (1 << 16))
return fz_throw("image is too wide");
if (h > (1 << 16))
return fz_throw("image is too high");
 
obj = fz_dict_getsa(dict, "ColorSpace", "CS");
if (obj && !imagemask && !forcemask)
{
/* colorspace resource lookup is only done for inline images */
if (fz_is_name(obj))
{
res = fz_dict_get(fz_dict_gets(rdb, "ColorSpace"), obj);
if (res)
obj = res;
}
 
error = pdf_load_colorspace(&colorspace, xref, obj);
if (error)
return fz_rethrow(error, "cannot load image colorspace");
 
if (!strcmp(colorspace->name, "Indexed"))
indexed = 1;
 
n = colorspace->n;
}
else
{
n = 1;
}
 
obj = fz_dict_getsa(dict, "Decode", "D");
if (obj)
{
for (i = 0; i < n * 2; i++)
decode[i] = fz_to_real(fz_array_get(obj, i));
}
else
{
float maxval = indexed ? (1 << bpc) - 1 : 1;
for (i = 0; i < n * 2; i++)
decode[i] = i & 1 ? maxval : 0;
}
 
obj = fz_dict_getsa(dict, "SMask", "Mask");
if (fz_is_dict(obj))
{
/* Not allowed for inline images */
if (!cstm)
{
error = pdf_load_image_imp(&mask, xref, rdb, obj, NULL, 1);
if (error)
{
if (colorspace)
fz_drop_colorspace(colorspace);
return fz_rethrow(error, "cannot load image mask/softmask");
}
}
}
else if (fz_is_array(obj))
{
usecolorkey = 1;
for (i = 0; i < n * 2; i++)
colorkey[i] = fz_to_int(fz_array_get(obj, i));
}
 
/* Allocate now, to fail early if we run out of memory */
tile = fz_new_pixmap_with_limit(colorspace, w, h);
if (!tile)
{
if (colorspace)
fz_drop_colorspace(colorspace);
if (mask)
fz_drop_pixmap(mask);
return fz_throw("out of memory");
}
 
if (colorspace)
fz_drop_colorspace(colorspace);
 
tile->mask = mask;
tile->interpolate = interpolate;
 
stride = (w * n * bpc + 7) / 8;
 
if (cstm)
{
stm = pdf_open_inline_stream(cstm, xref, dict, stride * h);
}
else
{
error = pdf_open_stream(&stm, xref, fz_to_num(dict), fz_to_gen(dict));
if (error)
{
fz_drop_pixmap(tile);
return fz_rethrow(error, "cannot open image data stream (%d 0 R)", fz_to_num(dict));
}
}
 
samples = fz_calloc(h, stride);
 
len = fz_read(stm, samples, h * stride);
if (len < 0)
{
fz_close(stm);
fz_free(samples);
fz_drop_pixmap(tile);
return fz_rethrow(len, "cannot read image data");
}
 
/* Make sure we read the EOF marker (for inline images only) */
if (cstm)
{
unsigned char tbuf[512];
int tlen = fz_read(stm, tbuf, sizeof tbuf);
if (tlen < 0)
fz_catch(tlen, "ignoring error at end of image");
if (tlen > 0)
fz_warn("ignoring garbage at end of image");
}
 
fz_close(stm);
 
/* Pad truncated images */
if (len < stride * h)
{
fz_warn("padding truncated image (%d 0 R)", fz_to_num(dict));
memset(samples + len, 0, stride * h - len);
}
 
/* Invert 1-bit image masks */
if (imagemask)
{
/* 0=opaque and 1=transparent so we need to invert */
unsigned char *p = samples;
len = h * stride;
for (i = 0; i < len; i++)
p[i] = ~p[i];
}
 
fz_unpack_tile(tile, samples, n, bpc, stride, indexed);
 
fz_free(samples);
 
if (usecolorkey)
pdf_mask_color_key(tile, n, colorkey);
 
if (indexed)
{
fz_pixmap *conv;
fz_decode_indexed_tile(tile, decode, (1 << bpc) - 1);
conv = pdf_expand_indexed_pixmap(tile);
fz_drop_pixmap(tile);
tile = conv;
}
else
{
fz_decode_tile(tile, decode);
}
 
*imgp = tile;
return fz_okay;
}
 
fz_error
pdf_load_inline_image(fz_pixmap **pixp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict, fz_stream *file)
{
fz_error error;
 
error = pdf_load_image_imp(pixp, xref, rdb, dict, file, 0);
if (error)
return fz_rethrow(error, "cannot load inline image");
 
return fz_okay;
}
 
int
pdf_is_jpx_image(fz_obj *dict)
{
fz_obj *filter;
int i;
 
filter = fz_dict_gets(dict, "Filter");
if (!strcmp(fz_to_name(filter), "JPXDecode"))
return 1;
for (i = 0; i < fz_array_len(filter); i++)
if (!strcmp(fz_to_name(fz_array_get(filter, i)), "JPXDecode"))
return 1;
return 0;
}
 
static fz_error
pdf_load_jpx_image(fz_pixmap **imgp, pdf_xref *xref, fz_obj *dict)
{
fz_error error;
fz_buffer *buf;
fz_colorspace *colorspace;
fz_pixmap *img;
fz_obj *obj;
 
colorspace = NULL;
 
error = pdf_load_stream(&buf, xref, fz_to_num(dict), fz_to_gen(dict));
if (error)
return fz_rethrow(error, "cannot load jpx image data");
 
obj = fz_dict_gets(dict, "ColorSpace");
if (obj)
{
error = pdf_load_colorspace(&colorspace, xref, obj);
if (error)
fz_catch(error, "cannot load image colorspace");
}
 
error = fz_load_jpx_image(&img, buf->data, buf->len, colorspace);
if (error)
{
if (colorspace)
fz_drop_colorspace(colorspace);
fz_drop_buffer(buf);
return fz_rethrow(error, "cannot load jpx image");
}
 
if (colorspace)
fz_drop_colorspace(colorspace);
fz_drop_buffer(buf);
 
obj = fz_dict_getsa(dict, "SMask", "Mask");
if (fz_is_dict(obj))
{
error = pdf_load_image_imp(&img->mask, xref, NULL, obj, NULL, 1);
if (error)
{
fz_drop_pixmap(img);
return fz_rethrow(error, "cannot load image mask/softmask");
}
}
 
*imgp = img;
return fz_okay;
}
 
fz_error
pdf_load_image(fz_pixmap **pixp, pdf_xref *xref, fz_obj *dict)
{
fz_error error;
 
if ((*pixp = pdf_find_item(xref->store, fz_drop_pixmap, dict)))
{
fz_keep_pixmap(*pixp);
return fz_okay;
}
 
error = pdf_load_image_imp(pixp, xref, NULL, dict, NULL, 0);
if (error)
return fz_rethrow(error, "cannot load image (%d 0 R)", fz_to_num(dict));
 
pdf_store_item(xref->store, fz_keep_pixmap, fz_drop_pixmap, dict, *pixp);
 
return fz_okay;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_interpret.c
0,0 → 1,2304
#include "fitz.h"
#include "mupdf.h"
 
#define TILE
 
typedef struct pdf_material_s pdf_material;
typedef struct pdf_gstate_s pdf_gstate;
typedef struct pdf_csi_s pdf_csi;
 
enum
{
PDF_FILL,
PDF_STROKE,
};
 
enum
{
PDF_MAT_NONE,
PDF_MAT_COLOR,
PDF_MAT_PATTERN,
PDF_MAT_SHADE,
};
 
struct pdf_material_s
{
int kind;
fz_colorspace *colorspace;
pdf_pattern *pattern;
fz_shade *shade;
float alpha;
float v[32];
};
 
struct pdf_gstate_s
{
fz_matrix ctm;
int clip_depth;
 
/* path stroking */
fz_stroke_state stroke_state;
 
/* materials */
pdf_material stroke;
pdf_material fill;
 
/* text state */
float char_space;
float word_space;
float scale;
float leading;
pdf_font_desc *font;
float size;
int render;
float rise;
 
/* transparency */
int blendmode;
pdf_xobject *softmask;
fz_matrix softmask_ctm;
float softmask_bc[FZ_MAX_COLORS];
int luminosity;
};
 
struct pdf_csi_s
{
fz_device *dev;
pdf_xref *xref;
 
/* usage mode for optional content groups */
char *target; /* "View", "Print", "Export" */
 
/* interpreter stack */
fz_obj *obj;
char name[256];
unsigned char string[256];
int string_len;
float stack[32];
int top;
 
int xbalance;
int in_text;
 
/* path object state */
fz_path *path;
 
/* text object state */
fz_text *text;
fz_matrix tlm;
fz_matrix tm;
int text_mode;
int accumulate;
 
/* graphics state */
fz_matrix top_ctm;
pdf_gstate gstate[64];
int gtop;
};
 
static fz_error pdf_run_buffer(pdf_csi *csi, fz_obj *rdb, fz_buffer *contents);
static fz_error pdf_run_xobject(pdf_csi *csi, fz_obj *resources, pdf_xobject *xobj, fz_matrix transform);
static void pdf_show_pattern(pdf_csi *csi, pdf_pattern *pat, fz_rect area, int what);
 
 
static int
pdf_is_hidden_ocg(fz_obj *xobj, char *target)
{
char target_state[16];
fz_obj *obj;
 
fz_strlcpy(target_state, target, sizeof target_state);
fz_strlcat(target_state, "State", sizeof target_state);
 
obj = fz_dict_gets(xobj, "OC");
obj = fz_dict_gets(obj, "OCGs");
if (fz_is_array(obj))
obj = fz_array_get(obj, 0);
obj = fz_dict_gets(obj, "Usage");
obj = fz_dict_gets(obj, target);
obj = fz_dict_gets(obj, target_state);
return !strcmp(fz_to_name(obj), "OFF");
}
 
/*
* Emit graphics calls to device.
*/
 
static void
pdf_begin_group(pdf_csi *csi, fz_rect bbox)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
fz_error error;
 
if (gstate->softmask)
{
pdf_xobject *softmask = gstate->softmask;
fz_rect bbox = fz_transform_rect(gstate->softmask_ctm, softmask->bbox);
fz_matrix save_ctm = gstate->ctm;
 
gstate->softmask = NULL;
gstate->ctm = gstate->softmask_ctm;
 
fz_begin_mask(csi->dev, bbox, gstate->luminosity,
softmask->colorspace, gstate->softmask_bc);
error = pdf_run_xobject(csi, NULL, softmask, fz_identity);
if (error)
fz_catch(error, "cannot run softmask");
fz_end_mask(csi->dev);
 
gstate->softmask = softmask;
gstate->ctm = save_ctm;
}
 
if (gstate->blendmode)
fz_begin_group(csi->dev, bbox, 1, 0, gstate->blendmode, 1);
}
 
static void
pdf_end_group(pdf_csi *csi)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
 
if (gstate->blendmode)
fz_end_group(csi->dev);
 
if (gstate->softmask)
fz_pop_clip(csi->dev);
}
 
static void
pdf_show_shade(pdf_csi *csi, fz_shade *shd)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
fz_rect bbox;
 
bbox = fz_bound_shade(shd, gstate->ctm);
 
pdf_begin_group(csi, bbox);
 
fz_fill_shade(csi->dev, shd, gstate->ctm, gstate->fill.alpha);
 
pdf_end_group(csi);
}
 
static void
pdf_show_image(pdf_csi *csi, fz_pixmap *image)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
fz_rect bbox;
 
bbox = fz_transform_rect(gstate->ctm, fz_unit_rect);
 
if (image->mask)
{
/* apply blend group even though we skip the softmask */
if (gstate->blendmode)
fz_begin_group(csi->dev, bbox, 0, 0, gstate->blendmode, 1);
fz_clip_image_mask(csi->dev, image->mask, &bbox, gstate->ctm);
}
else
pdf_begin_group(csi, bbox);
 
if (!image->colorspace)
{
 
switch (gstate->fill.kind)
{
case PDF_MAT_NONE:
break;
case PDF_MAT_COLOR:
fz_fill_image_mask(csi->dev, image, gstate->ctm,
gstate->fill.colorspace, gstate->fill.v, gstate->fill.alpha);
break;
case PDF_MAT_PATTERN:
if (gstate->fill.pattern)
{
fz_clip_image_mask(csi->dev, image, &bbox, gstate->ctm);
pdf_show_pattern(csi, gstate->fill.pattern, bbox, PDF_FILL);
fz_pop_clip(csi->dev);
}
break;
case PDF_MAT_SHADE:
if (gstate->fill.shade)
{
fz_clip_image_mask(csi->dev, image, &bbox, gstate->ctm);
fz_fill_shade(csi->dev, gstate->fill.shade, gstate->ctm, gstate->fill.alpha);
fz_pop_clip(csi->dev);
}
break;
}
}
else
{
fz_fill_image(csi->dev, image, gstate->ctm, gstate->fill.alpha);
}
 
if (image->mask)
{
fz_pop_clip(csi->dev);
if (gstate->blendmode)
fz_end_group(csi->dev);
}
else
pdf_end_group(csi);
}
 
static void pdf_show_clip(pdf_csi *csi, int even_odd)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
 
gstate->clip_depth++;
fz_clip_path(csi->dev, csi->path, NULL, even_odd, gstate->ctm);
}
 
static void
pdf_show_path(pdf_csi *csi, int doclose, int dofill, int dostroke, int even_odd)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
fz_path *path;
fz_rect bbox;
 
path = csi->path;
csi->path = fz_new_path();
 
if (doclose)
fz_closepath(path);
 
if (dostroke)
bbox = fz_bound_path(path, &gstate->stroke_state, gstate->ctm);
else
bbox = fz_bound_path(path, NULL, gstate->ctm);
 
if (dofill || dostroke)
pdf_begin_group(csi, bbox);
 
if (dofill)
{
switch (gstate->fill.kind)
{
case PDF_MAT_NONE:
break;
case PDF_MAT_COLOR:
fz_fill_path(csi->dev, path, even_odd, gstate->ctm,
gstate->fill.colorspace, gstate->fill.v, gstate->fill.alpha);
break;
case PDF_MAT_PATTERN:
if (gstate->fill.pattern)
{
fz_clip_path(csi->dev, path, NULL, even_odd, gstate->ctm);
pdf_show_pattern(csi, gstate->fill.pattern, bbox, PDF_FILL);
fz_pop_clip(csi->dev);
}
break;
case PDF_MAT_SHADE:
if (gstate->fill.shade)
{
fz_clip_path(csi->dev, path, NULL, even_odd, gstate->ctm);
fz_fill_shade(csi->dev, gstate->fill.shade, csi->top_ctm, gstate->fill.alpha);
fz_pop_clip(csi->dev);
}
break;
}
}
 
if (dostroke)
{
switch (gstate->stroke.kind)
{
case PDF_MAT_NONE:
break;
case PDF_MAT_COLOR:
fz_stroke_path(csi->dev, path, &gstate->stroke_state, gstate->ctm,
gstate->stroke.colorspace, gstate->stroke.v, gstate->stroke.alpha);
break;
case PDF_MAT_PATTERN:
if (gstate->stroke.pattern)
{
fz_clip_stroke_path(csi->dev, path, &bbox, &gstate->stroke_state, gstate->ctm);
pdf_show_pattern(csi, gstate->stroke.pattern, bbox, PDF_FILL);
fz_pop_clip(csi->dev);
}
break;
case PDF_MAT_SHADE:
if (gstate->stroke.shade)
{
fz_clip_stroke_path(csi->dev, path, &bbox, &gstate->stroke_state, gstate->ctm);
fz_fill_shade(csi->dev, gstate->stroke.shade, csi->top_ctm, gstate->stroke.alpha);
fz_pop_clip(csi->dev);
}
break;
}
}
 
if (dofill || dostroke)
pdf_end_group(csi);
 
fz_free_path(path);
}
 
/*
* Assemble and emit text
*/
 
static void
pdf_flush_text(pdf_csi *csi)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
fz_text *text;
int dofill = 0;
int dostroke = 0;
int doclip = 0;
int doinvisible = 0;
fz_rect bbox;
 
if (!csi->text)
return;
text = csi->text;
csi->text = NULL;
 
dofill = dostroke = doclip = doinvisible = 0;
switch (csi->text_mode)
{
case 0: dofill = 1; break;
case 1: dostroke = 1; break;
case 2: dofill = dostroke = 1; break;
case 3: doinvisible = 1; break;
case 4: dofill = doclip = 1; break;
case 5: dostroke = doclip = 1; break;
case 6: dofill = dostroke = doclip = 1; break;
case 7: doclip = 1; break;
}
 
bbox = fz_bound_text(text, gstate->ctm);
 
pdf_begin_group(csi, bbox);
 
if (doinvisible)
fz_ignore_text(csi->dev, text, gstate->ctm);
 
if (doclip)
{
if (csi->accumulate < 2)
gstate->clip_depth++;
fz_clip_text(csi->dev, text, gstate->ctm, csi->accumulate);
csi->accumulate = 2;
}
 
if (dofill)
{
switch (gstate->fill.kind)
{
case PDF_MAT_NONE:
break;
case PDF_MAT_COLOR:
fz_fill_text(csi->dev, text, gstate->ctm,
gstate->fill.colorspace, gstate->fill.v, gstate->fill.alpha);
break;
case PDF_MAT_PATTERN:
if (gstate->fill.pattern)
{
fz_clip_text(csi->dev, text, gstate->ctm, 0);
pdf_show_pattern(csi, gstate->fill.pattern, bbox, PDF_FILL);
fz_pop_clip(csi->dev);
}
break;
case PDF_MAT_SHADE:
if (gstate->fill.shade)
{
fz_clip_text(csi->dev, text, gstate->ctm, 0);
fz_fill_shade(csi->dev, gstate->fill.shade, csi->top_ctm, gstate->fill.alpha);
fz_pop_clip(csi->dev);
}
break;
}
}
 
if (dostroke)
{
switch (gstate->stroke.kind)
{
case PDF_MAT_NONE:
break;
case PDF_MAT_COLOR:
fz_stroke_text(csi->dev, text, &gstate->stroke_state, gstate->ctm,
gstate->stroke.colorspace, gstate->stroke.v, gstate->stroke.alpha);
break;
case PDF_MAT_PATTERN:
if (gstate->stroke.pattern)
{
fz_clip_stroke_text(csi->dev, text, &gstate->stroke_state, gstate->ctm);
pdf_show_pattern(csi, gstate->stroke.pattern, bbox, PDF_FILL);
fz_pop_clip(csi->dev);
}
break;
case PDF_MAT_SHADE:
if (gstate->stroke.shade)
{
fz_clip_stroke_text(csi->dev, text, &gstate->stroke_state, gstate->ctm);
fz_fill_shade(csi->dev, gstate->stroke.shade, csi->top_ctm, gstate->stroke.alpha);
fz_pop_clip(csi->dev);
}
break;
}
}
 
pdf_end_group(csi);
 
fz_free_text(text);
}
 
static void
pdf_show_char(pdf_csi *csi, int cid)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
pdf_font_desc *fontdesc = gstate->font;
fz_matrix tsm, trm;
float w0, w1, tx, ty;
pdf_hmtx h;
pdf_vmtx v;
int gid;
int ucsbuf[8];
int ucslen;
int i;
 
tsm.a = gstate->size * gstate->scale;
tsm.b = 0;
tsm.c = 0;
tsm.d = gstate->size;
tsm.e = 0;
tsm.f = gstate->rise;
 
ucslen = 0;
if (fontdesc->to_unicode)
ucslen = pdf_lookup_cmap_full(fontdesc->to_unicode, cid, ucsbuf);
if (ucslen == 0 && cid < fontdesc->cid_to_ucs_len)
{
ucsbuf[0] = fontdesc->cid_to_ucs[cid];
ucslen = 1;
}
if (ucslen == 0 || (ucslen == 1 && ucsbuf[0] == 0))
{
ucsbuf[0] = '?';
ucslen = 1;
}
 
gid = pdf_font_cid_to_gid(fontdesc, cid);
 
if (fontdesc->wmode == 1)
{
v = pdf_get_vmtx(fontdesc, cid);
tsm.e -= v.x * gstate->size * 0.001f;
tsm.f -= v.y * gstate->size * 0.001f;
}
 
trm = fz_concat(tsm, csi->tm);
 
/* flush buffered text if face or matrix or rendermode has changed */
if (!csi->text ||
fontdesc->font != csi->text->font ||
fontdesc->wmode != csi->text->wmode ||
fabsf(trm.a - csi->text->trm.a) > FLT_EPSILON ||
fabsf(trm.b - csi->text->trm.b) > FLT_EPSILON ||
fabsf(trm.c - csi->text->trm.c) > FLT_EPSILON ||
fabsf(trm.d - csi->text->trm.d) > FLT_EPSILON ||
gstate->render != csi->text_mode)
{
pdf_flush_text(csi);
 
csi->text = fz_new_text(fontdesc->font, trm, fontdesc->wmode);
csi->text->trm.e = 0;
csi->text->trm.f = 0;
csi->text_mode = gstate->render;
}
 
/* add glyph to textobject */
fz_add_text(csi->text, gid, ucsbuf[0], trm.e, trm.f);
 
/* add filler glyphs for one-to-many unicode mapping */
for (i = 1; i < ucslen; i++)
fz_add_text(csi->text, -1, ucsbuf[i], trm.e, trm.f);
 
if (fontdesc->wmode == 0)
{
h = pdf_get_hmtx(fontdesc, cid);
w0 = h.w * 0.001f;
tx = (w0 * gstate->size + gstate->char_space) * gstate->scale;
csi->tm = fz_concat(fz_translate(tx, 0), csi->tm);
}
 
if (fontdesc->wmode == 1)
{
w1 = v.w * 0.001f;
ty = w1 * gstate->size + gstate->char_space;
csi->tm = fz_concat(fz_translate(0, ty), csi->tm);
}
}
 
static void
pdf_show_space(pdf_csi *csi, float tadj)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
pdf_font_desc *fontdesc = gstate->font;
 
if (!fontdesc)
{
fz_warn("cannot draw text since font and size not set");
return;
}
 
if (fontdesc->wmode == 0)
csi->tm = fz_concat(fz_translate(tadj * gstate->scale, 0), csi->tm);
else
csi->tm = fz_concat(fz_translate(0, tadj), csi->tm);
}
 
static void
pdf_show_string(pdf_csi *csi, unsigned char *buf, int len)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
pdf_font_desc *fontdesc = gstate->font;
unsigned char *end = buf + len;
int cpt, cid;
 
if (!fontdesc)
{
fz_warn("cannot draw text since font and size not set");
return;
}
 
while (buf < end)
{
buf = pdf_decode_cmap(fontdesc->encoding, buf, &cpt);
cid = pdf_lookup_cmap(fontdesc->encoding, cpt);
if (cid >= 0)
pdf_show_char(csi, cid);
else
fz_warn("cannot encode character with code point %#x", cpt);
if (cpt == 32)
pdf_show_space(csi, gstate->word_space);
}
}
 
static void
pdf_show_text(pdf_csi *csi, fz_obj *text)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
int i;
 
if (fz_is_array(text))
{
for (i = 0; i < fz_array_len(text); i++)
{
fz_obj *item = fz_array_get(text, i);
if (fz_is_string(item))
pdf_show_string(csi, (unsigned char *)fz_to_str_buf(item), fz_to_str_len(item));
else
pdf_show_space(csi, - fz_to_real(item) * gstate->size * 0.001f);
}
}
else if (fz_is_string(text))
{
pdf_show_string(csi, (unsigned char *)fz_to_str_buf(text), fz_to_str_len(text));
}
}
 
/*
* Interpreter and graphics state stack.
*/
 
static void
pdf_init_gstate(pdf_gstate *gs, fz_matrix ctm)
{
gs->ctm = ctm;
gs->clip_depth = 0;
 
gs->stroke_state.start_cap = 0;
gs->stroke_state.dash_cap = 0;
gs->stroke_state.end_cap = 0;
gs->stroke_state.linejoin = 0;
gs->stroke_state.linewidth = 1;
gs->stroke_state.miterlimit = 10;
gs->stroke_state.dash_phase = 0;
gs->stroke_state.dash_len = 0;
memset(gs->stroke_state.dash_list, 0, sizeof(gs->stroke_state.dash_list));
 
gs->stroke.kind = PDF_MAT_COLOR;
gs->stroke.colorspace = fz_keep_colorspace(fz_device_gray);
gs->stroke.v[0] = 0;
gs->stroke.pattern = NULL;
gs->stroke.shade = NULL;
gs->stroke.alpha = 1;
 
gs->fill.kind = PDF_MAT_COLOR;
gs->fill.colorspace = fz_keep_colorspace(fz_device_gray);
gs->fill.v[0] = 0;
gs->fill.pattern = NULL;
gs->fill.shade = NULL;
gs->fill.alpha = 1;
 
gs->char_space = 0;
gs->word_space = 0;
gs->scale = 1;
gs->leading = 0;
gs->font = NULL;
gs->size = -1;
gs->render = 0;
gs->rise = 0;
 
gs->blendmode = 0;
gs->softmask = NULL;
gs->softmask_ctm = fz_identity;
gs->luminosity = 0;
}
 
static pdf_csi *
pdf_new_csi(pdf_xref *xref, fz_device *dev, fz_matrix ctm, char *target)
{
pdf_csi *csi;
 
csi = fz_malloc(sizeof(pdf_csi));
csi->xref = xref;
csi->dev = dev;
csi->target = target;
 
csi->top = 0;
csi->obj = NULL;
csi->name[0] = 0;
csi->string_len = 0;
memset(csi->stack, 0, sizeof csi->stack);
 
csi->xbalance = 0;
csi->in_text = 0;
 
csi->path = fz_new_path();
 
csi->text = NULL;
csi->tlm = fz_identity;
csi->tm = fz_identity;
csi->text_mode = 0;
csi->accumulate = 1;
 
csi->top_ctm = ctm;
pdf_init_gstate(&csi->gstate[0], ctm);
csi->gtop = 0;
 
return csi;
}
 
static void
pdf_clear_stack(pdf_csi *csi)
{
int i;
 
if (csi->obj)
fz_drop_obj(csi->obj);
csi->obj = NULL;
 
csi->name[0] = 0;
csi->string_len = 0;
for (i = 0; i < csi->top; i++)
csi->stack[i] = 0;
 
csi->top = 0;
}
 
static pdf_material *
pdf_keep_material(pdf_material *mat)
{
if (mat->colorspace)
fz_keep_colorspace(mat->colorspace);
if (mat->pattern)
pdf_keep_pattern(mat->pattern);
if (mat->shade)
fz_keep_shade(mat->shade);
return mat;
}
 
static pdf_material *
pdf_drop_material(pdf_material *mat)
{
if (mat->colorspace)
fz_drop_colorspace(mat->colorspace);
if (mat->pattern)
pdf_drop_pattern(mat->pattern);
if (mat->shade)
fz_drop_shade(mat->shade);
return mat;
}
 
static void
pdf_gsave(pdf_csi *csi)
{
pdf_gstate *gs = csi->gstate + csi->gtop;
 
if (csi->gtop == nelem(csi->gstate) - 1)
{
fz_warn("gstate overflow in content stream");
return;
}
 
memcpy(&csi->gstate[csi->gtop + 1], &csi->gstate[csi->gtop], sizeof(pdf_gstate));
 
csi->gtop ++;
 
pdf_keep_material(&gs->stroke);
pdf_keep_material(&gs->fill);
if (gs->font)
pdf_keep_font(gs->font);
if (gs->softmask)
pdf_keep_xobject(gs->softmask);
}
 
static void
pdf_grestore(pdf_csi *csi)
{
pdf_gstate *gs = csi->gstate + csi->gtop;
int clip_depth = gs->clip_depth;
 
if (csi->gtop == 0)
{
fz_warn("gstate underflow in content stream");
return;
}
 
pdf_drop_material(&gs->stroke);
pdf_drop_material(&gs->fill);
if (gs->font)
pdf_drop_font(gs->font);
if (gs->softmask)
pdf_drop_xobject(gs->softmask);
 
csi->gtop --;
 
gs = csi->gstate + csi->gtop;
while (clip_depth > gs->clip_depth)
{
fz_pop_clip(csi->dev);
clip_depth--;
}
}
 
static void
pdf_free_csi(pdf_csi *csi)
{
while (csi->gtop)
pdf_grestore(csi);
 
pdf_drop_material(&csi->gstate[0].fill);
pdf_drop_material(&csi->gstate[0].stroke);
if (csi->gstate[0].font)
pdf_drop_font(csi->gstate[0].font);
if (csi->gstate[0].softmask)
pdf_drop_xobject(csi->gstate[0].softmask);
 
while (csi->gstate[0].clip_depth--)
fz_pop_clip(csi->dev);
 
if (csi->path) fz_free_path(csi->path);
if (csi->text) fz_free_text(csi->text);
 
pdf_clear_stack(csi);
 
fz_free(csi);
}
 
/*
* Material state
*/
 
static void
pdf_set_colorspace(pdf_csi *csi, int what, fz_colorspace *colorspace)
{
pdf_gstate *gs = csi->gstate + csi->gtop;
pdf_material *mat;
 
pdf_flush_text(csi);
 
mat = what == PDF_FILL ? &gs->fill : &gs->stroke;
 
fz_drop_colorspace(mat->colorspace);
 
mat->kind = PDF_MAT_COLOR;
mat->colorspace = fz_keep_colorspace(colorspace);
 
mat->v[0] = 0;
mat->v[1] = 0;
mat->v[2] = 0;
mat->v[3] = 1;
}
 
static void
pdf_set_color(pdf_csi *csi, int what, float *v)
{
pdf_gstate *gs = csi->gstate + csi->gtop;
pdf_material *mat;
int i;
 
pdf_flush_text(csi);
 
mat = what == PDF_FILL ? &gs->fill : &gs->stroke;
 
switch (mat->kind)
{
case PDF_MAT_PATTERN:
case PDF_MAT_COLOR:
if (!strcmp(mat->colorspace->name, "Lab"))
{
mat->v[0] = v[0] / 100;
mat->v[1] = (v[1] + 100) / 200;
mat->v[2] = (v[2] + 100) / 200;
}
for (i = 0; i < mat->colorspace->n; i++)
mat->v[i] = v[i];
break;
default:
fz_warn("color incompatible with material");
}
}
 
static void
pdf_set_shade(pdf_csi *csi, int what, fz_shade *shade)
{
pdf_gstate *gs = csi->gstate + csi->gtop;
pdf_material *mat;
 
pdf_flush_text(csi);
 
mat = what == PDF_FILL ? &gs->fill : &gs->stroke;
 
if (mat->shade)
fz_drop_shade(mat->shade);
 
mat->kind = PDF_MAT_SHADE;
mat->shade = fz_keep_shade(shade);
}
 
static void
pdf_set_pattern(pdf_csi *csi, int what, pdf_pattern *pat, float *v)
{
pdf_gstate *gs = csi->gstate + csi->gtop;
pdf_material *mat;
 
pdf_flush_text(csi);
 
mat = what == PDF_FILL ? &gs->fill : &gs->stroke;
 
if (mat->pattern)
pdf_drop_pattern(mat->pattern);
 
mat->kind = PDF_MAT_PATTERN;
if (pat)
mat->pattern = pdf_keep_pattern(pat);
else
mat->pattern = NULL;
 
if (v)
pdf_set_color(csi, what, v);
}
 
static void
pdf_unset_pattern(pdf_csi *csi, int what)
{
pdf_gstate *gs = csi->gstate + csi->gtop;
pdf_material *mat;
mat = what == PDF_FILL ? &gs->fill : &gs->stroke;
if (mat->kind == PDF_MAT_PATTERN)
{
if (mat->pattern)
pdf_drop_pattern(mat->pattern);
mat->pattern = NULL;
mat->kind = PDF_MAT_COLOR;
}
}
 
/*
* Patterns, XObjects and ExtGState
*/
 
static void
pdf_show_pattern(pdf_csi *csi, pdf_pattern *pat, fz_rect area, int what)
{
pdf_gstate *gstate;
fz_matrix ptm, invptm;
fz_matrix oldtopctm;
fz_error error;
int x0, y0, x1, y1;
int oldtop;
 
pdf_gsave(csi);
gstate = csi->gstate + csi->gtop;
 
if (pat->ismask)
{
pdf_unset_pattern(csi, PDF_FILL);
pdf_unset_pattern(csi, PDF_STROKE);
if (what == PDF_FILL)
{
pdf_drop_material(&gstate->stroke);
pdf_keep_material(&gstate->fill);
gstate->stroke = gstate->fill;
}
if (what == PDF_STROKE)
{
pdf_drop_material(&gstate->fill);
pdf_keep_material(&gstate->stroke);
gstate->fill = gstate->stroke;
}
}
else
{
// TODO: unset only the current fill/stroke or both?
pdf_unset_pattern(csi, what);
}
 
/* don't apply softmasks to objects in the pattern as well */
if (gstate->softmask)
{
pdf_drop_xobject(gstate->softmask);
gstate->softmask = NULL;
}
 
ptm = fz_concat(pat->matrix, csi->top_ctm);
invptm = fz_invert_matrix(ptm);
 
/* patterns are painted using the ctm in effect at the beginning of the content stream */
/* get bbox of shape in pattern space for stamping */
area = fz_transform_rect(invptm, area);
x0 = floorf(area.x0 / pat->xstep);
y0 = floorf(area.y0 / pat->ystep);
x1 = ceilf(area.x1 / pat->xstep);
y1 = ceilf(area.y1 / pat->ystep);
 
oldtopctm = csi->top_ctm;
oldtop = csi->gtop;
 
#ifdef TILE
if ((x1 - x0) * (y1 - y0) > 0)
{
fz_begin_tile(csi->dev, area, pat->bbox, pat->xstep, pat->ystep, ptm);
gstate->ctm = ptm;
csi->top_ctm = gstate->ctm;
pdf_gsave(csi);
error = pdf_run_buffer(csi, pat->resources, pat->contents);
if (error)
fz_catch(error, "cannot render pattern tile");
pdf_grestore(csi);
while (oldtop < csi->gtop)
pdf_grestore(csi);
fz_end_tile(csi->dev);
}
#else
{
int x, y;
for (y = y0; y < y1; y++)
{
for (x = x0; x < x1; x++)
{
gstate->ctm = fz_concat(fz_translate(x * pat->xstep, y * pat->ystep), ptm);
csi->top_ctm = gstate->ctm;
error = pdf_run_csi_buffer(csi, pat->resources, pat->contents);
while (oldtop < csi->gtop)
pdf_grestore(csi);
if (error)
{
fz_catch(error, "cannot render pattern tile");
goto cleanup;
}
}
}
}
cleanup:
#endif
 
csi->top_ctm = oldtopctm;
 
pdf_grestore(csi);
}
 
static fz_error
pdf_run_xobject(pdf_csi *csi, fz_obj *resources, pdf_xobject *xobj, fz_matrix transform)
{
fz_error error;
pdf_gstate *gstate;
fz_matrix oldtopctm;
int oldtop;
int popmask;
 
pdf_gsave(csi);
 
gstate = csi->gstate + csi->gtop;
oldtop = csi->gtop;
popmask = 0;
 
/* apply xobject's transform matrix */
transform = fz_concat(xobj->matrix, transform);
gstate->ctm = fz_concat(transform, gstate->ctm);
 
/* apply soft mask, create transparency group and reset state */
if (xobj->transparency)
{
if (gstate->softmask)
{
pdf_xobject *softmask = gstate->softmask;
fz_rect bbox = fz_transform_rect(gstate->ctm, xobj->bbox);
 
gstate->softmask = NULL;
popmask = 1;
 
fz_begin_mask(csi->dev, bbox, gstate->luminosity,
softmask->colorspace, gstate->softmask_bc);
error = pdf_run_xobject(csi, resources, softmask, fz_identity);
if (error)
return fz_rethrow(error, "cannot run softmask");
fz_end_mask(csi->dev);
 
pdf_drop_xobject(softmask);
}
 
fz_begin_group(csi->dev,
fz_transform_rect(gstate->ctm, xobj->bbox),
xobj->isolated, xobj->knockout, gstate->blendmode, gstate->fill.alpha);
 
gstate->blendmode = 0;
gstate->stroke.alpha = 1;
gstate->fill.alpha = 1;
}
 
/* clip to the bounds */
 
fz_moveto(csi->path, xobj->bbox.x0, xobj->bbox.y0);
fz_lineto(csi->path, xobj->bbox.x1, xobj->bbox.y0);
fz_lineto(csi->path, xobj->bbox.x1, xobj->bbox.y1);
fz_lineto(csi->path, xobj->bbox.x0, xobj->bbox.y1);
fz_closepath(csi->path);
pdf_show_clip(csi, 0);
pdf_show_path(csi, 0, 0, 0, 0);
 
/* run contents */
 
oldtopctm = csi->top_ctm;
csi->top_ctm = gstate->ctm;
 
if (xobj->resources)
resources = xobj->resources;
 
error = pdf_run_buffer(csi, resources, xobj->contents);
if (error)
fz_catch(error, "cannot interpret XObject stream");
 
csi->top_ctm = oldtopctm;
 
while (oldtop < csi->gtop)
pdf_grestore(csi);
 
pdf_grestore(csi);
 
/* wrap up transparency stacks */
 
if (xobj->transparency)
{
fz_end_group(csi->dev);
if (popmask)
fz_pop_clip(csi->dev);
}
 
return fz_okay;
}
 
static fz_error
pdf_run_extgstate(pdf_csi *csi, fz_obj *rdb, fz_obj *extgstate)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
fz_colorspace *colorspace;
int i, k;
 
pdf_flush_text(csi);
 
for (i = 0; i < fz_dict_len(extgstate); i++)
{
fz_obj *key = fz_dict_get_key(extgstate, i);
fz_obj *val = fz_dict_get_val(extgstate, i);
char *s = fz_to_name(key);
 
if (!strcmp(s, "Font"))
{
if (fz_is_array(val) && fz_array_len(val) == 2)
{
fz_error error;
fz_obj *font = fz_array_get(val, 0);
 
if (gstate->font)
{
pdf_drop_font(gstate->font);
gstate->font = NULL;
}
 
error = pdf_load_font(&gstate->font, csi->xref, rdb, font);
if (error)
return fz_rethrow(error, "cannot load font (%d %d R)", fz_to_num(font), fz_to_gen(font));
if (!gstate->font)
return fz_throw("cannot find font in store");
gstate->size = fz_to_real(fz_array_get(val, 1));
}
else
return fz_throw("malformed /Font dictionary");
}
 
else if (!strcmp(s, "LC"))
{
gstate->stroke_state.start_cap = fz_to_int(val);
gstate->stroke_state.dash_cap = fz_to_int(val);
gstate->stroke_state.end_cap = fz_to_int(val);
}
else if (!strcmp(s, "LW"))
gstate->stroke_state.linewidth = fz_to_real(val);
else if (!strcmp(s, "LJ"))
gstate->stroke_state.linejoin = fz_to_int(val);
else if (!strcmp(s, "ML"))
gstate->stroke_state.miterlimit = fz_to_real(val);
 
else if (!strcmp(s, "D"))
{
if (fz_is_array(val) && fz_array_len(val) == 2)
{
fz_obj *dashes = fz_array_get(val, 0);
gstate->stroke_state.dash_len = MAX(fz_array_len(dashes), 32);
for (k = 0; k < gstate->stroke_state.dash_len; k++)
gstate->stroke_state.dash_list[k] = fz_to_real(fz_array_get(dashes, k));
gstate->stroke_state.dash_phase = fz_to_real(fz_array_get(val, 1));
}
else
return fz_throw("malformed /D");
}
 
else if (!strcmp(s, "CA"))
gstate->stroke.alpha = fz_to_real(val);
 
else if (!strcmp(s, "ca"))
gstate->fill.alpha = fz_to_real(val);
 
else if (!strcmp(s, "BM"))
{
if (fz_is_array(val))
val = fz_array_get(val, 0);
gstate->blendmode = fz_find_blendmode(fz_to_name(val));
}
 
else if (!strcmp(s, "SMask"))
{
if (fz_is_dict(val))
{
fz_error error;
pdf_xobject *xobj;
fz_obj *group, *luminosity, *bc;
 
if (gstate->softmask)
{
pdf_drop_xobject(gstate->softmask);
gstate->softmask = NULL;
}
 
group = fz_dict_gets(val, "G");
if (!group)
return fz_throw("cannot load softmask xobject (%d %d R)", fz_to_num(val), fz_to_gen(val));
error = pdf_load_xobject(&xobj, csi->xref, group);
if (error)
return fz_rethrow(error, "cannot load xobject (%d %d R)", fz_to_num(val), fz_to_gen(val));
 
colorspace = xobj->colorspace;
if (!colorspace)
colorspace = fz_device_gray;
 
gstate->softmask_ctm = fz_concat(xobj->matrix, gstate->ctm);
gstate->softmask = xobj;
for (k = 0; k < colorspace->n; k++)
gstate->softmask_bc[k] = 0;
 
bc = fz_dict_gets(val, "BC");
if (fz_is_array(bc))
{
for (k = 0; k < colorspace->n; k++)
gstate->softmask_bc[k] = fz_to_real(fz_array_get(bc, k));
}
 
luminosity = fz_dict_gets(val, "S");
if (fz_is_name(luminosity) && !strcmp(fz_to_name(luminosity), "Luminosity"))
gstate->luminosity = 1;
else
gstate->luminosity = 0;
}
else if (fz_is_name(val) && !strcmp(fz_to_name(val), "None"))
{
if (gstate->softmask)
{
pdf_drop_xobject(gstate->softmask);
gstate->softmask = NULL;
}
}
}
 
else if (!strcmp(s, "TR"))
{
if (fz_is_name(val) && strcmp(fz_to_name(val), "Identity"))
fz_warn("ignoring transfer function");
}
}
 
return fz_okay;
}
 
/*
* Operators
*/
 
static void pdf_run_BDC(pdf_csi *csi)
{
}
 
static fz_error pdf_run_BI(pdf_csi *csi, fz_obj *rdb, fz_stream *file)
{
int ch;
fz_error error;
char *buf = csi->xref->scratch;
int buflen = sizeof(csi->xref->scratch);
fz_pixmap *img;
fz_obj *obj;
 
error = pdf_parse_dict(&obj, csi->xref, file, buf, buflen);
if (error)
return fz_rethrow(error, "cannot parse inline image dictionary");
 
/* read whitespace after ID keyword */
ch = fz_read_byte(file);
if (ch == '\r')
if (fz_peek_byte(file) == '\n')
fz_read_byte(file);
 
error = pdf_load_inline_image(&img, csi->xref, rdb, obj, file);
fz_drop_obj(obj);
if (error)
return fz_rethrow(error, "cannot load inline image");
 
pdf_show_image(csi, img);
 
fz_drop_pixmap(img);
 
/* find EI */
ch = fz_read_byte(file);
while (ch != 'E' && ch != EOF)
ch = fz_read_byte(file);
ch = fz_read_byte(file);
if (ch != 'I')
return fz_rethrow(error, "syntax error after inline image");
 
return fz_okay;
}
 
static void pdf_run_B(pdf_csi *csi)
{
pdf_show_path(csi, 0, 1, 1, 0);
}
 
static void pdf_run_BMC(pdf_csi *csi)
{
}
 
static void pdf_run_BT(pdf_csi *csi)
{
csi->in_text = 1;
csi->tm = fz_identity;
csi->tlm = fz_identity;
}
 
static void pdf_run_BX(pdf_csi *csi)
{
csi->xbalance ++;
}
 
static void pdf_run_Bstar(pdf_csi *csi)
{
pdf_show_path(csi, 0, 1, 1, 1);
}
 
static fz_error pdf_run_cs_imp(pdf_csi *csi, fz_obj *rdb, int what)
{
fz_colorspace *colorspace;
fz_obj *obj, *dict;
fz_error error;
 
if (!strcmp(csi->name, "Pattern"))
{
pdf_set_pattern(csi, what, NULL, NULL);
}
else
{
if (!strcmp(csi->name, "DeviceGray"))
colorspace = fz_keep_colorspace(fz_device_gray);
else if (!strcmp(csi->name, "DeviceRGB"))
colorspace = fz_keep_colorspace(fz_device_rgb);
else if (!strcmp(csi->name, "DeviceCMYK"))
colorspace = fz_keep_colorspace(fz_device_cmyk);
else
{
dict = fz_dict_gets(rdb, "ColorSpace");
if (!dict)
return fz_throw("cannot find ColorSpace dictionary");
obj = fz_dict_gets(dict, csi->name);
if (!obj)
return fz_throw("cannot find colorspace resource '%s'", csi->name);
error = pdf_load_colorspace(&colorspace, csi->xref, obj);
if (error)
return fz_rethrow(error, "cannot load colorspace (%d 0 R)", fz_to_num(obj));
}
 
pdf_set_colorspace(csi, what, colorspace);
 
fz_drop_colorspace(colorspace);
}
return fz_okay;
}
 
static void pdf_run_CS(pdf_csi *csi, fz_obj *rdb)
{
fz_error error;
error = pdf_run_cs_imp(csi, rdb, PDF_STROKE);
if (error)
fz_catch(error, "cannot set colorspace");
}
 
static void pdf_run_cs(pdf_csi *csi, fz_obj *rdb)
{
fz_error error;
error = pdf_run_cs_imp(csi, rdb, PDF_FILL);
if (error)
fz_catch(error, "cannot set colorspace");
}
 
static void pdf_run_DP(pdf_csi *csi)
{
}
 
static fz_error pdf_run_Do(pdf_csi *csi, fz_obj *rdb)
{
fz_obj *dict;
fz_obj *obj;
fz_obj *subtype;
fz_error error;
 
dict = fz_dict_gets(rdb, "XObject");
if (!dict)
return fz_throw("cannot find XObject dictionary when looking for: '%s'", csi->name);
 
obj = fz_dict_gets(dict, csi->name);
if (!obj)
return fz_throw("cannot find xobject resource: '%s'", csi->name);
 
subtype = fz_dict_gets(obj, "Subtype");
if (!fz_is_name(subtype))
return fz_throw("no XObject subtype specified");
 
if (pdf_is_hidden_ocg(obj, csi->target))
return fz_okay;
 
if (!strcmp(fz_to_name(subtype), "Form") && fz_dict_gets(obj, "Subtype2"))
subtype = fz_dict_gets(obj, "Subtype2");
 
if (!strcmp(fz_to_name(subtype), "Form"))
{
pdf_xobject *xobj;
 
error = pdf_load_xobject(&xobj, csi->xref, obj);
if (error)
return fz_rethrow(error, "cannot load xobject (%d %d R)", fz_to_num(obj), fz_to_gen(obj));
 
/* Inherit parent resources, in case this one was empty XXX check where it's loaded */
if (!xobj->resources)
xobj->resources = fz_keep_obj(rdb);
 
error = pdf_run_xobject(csi, xobj->resources, xobj, fz_identity);
if (error)
return fz_rethrow(error, "cannot draw xobject (%d %d R)", fz_to_num(obj), fz_to_gen(obj));
 
pdf_drop_xobject(xobj);
}
 
else if (!strcmp(fz_to_name(subtype), "Image"))
{
if ((csi->dev->hints & FZ_IGNORE_IMAGE) == 0)
{
fz_pixmap *img;
error = pdf_load_image(&img, csi->xref, obj);
if (error)
return fz_rethrow(error, "cannot load image (%d %d R)", fz_to_num(obj), fz_to_gen(obj));
pdf_show_image(csi, img);
fz_drop_pixmap(img);
}
}
 
else if (!strcmp(fz_to_name(subtype), "PS"))
{
fz_warn("ignoring XObject with subtype PS");
}
 
else
{
return fz_throw("unknown XObject subtype: '%s'", fz_to_name(subtype));
}
 
return fz_okay;
}
 
static void pdf_run_EMC(pdf_csi *csi)
{
}
 
static void pdf_run_ET(pdf_csi *csi)
{
pdf_flush_text(csi);
csi->accumulate = 1;
csi->in_text = 0;
}
 
static void pdf_run_EX(pdf_csi *csi)
{
csi->xbalance --;
}
 
static void pdf_run_F(pdf_csi *csi)
{
pdf_show_path(csi, 0, 1, 0, 0);
}
 
static void pdf_run_G(pdf_csi *csi)
{
pdf_set_colorspace(csi, PDF_STROKE, fz_device_gray);
pdf_set_color(csi, PDF_STROKE, csi->stack);
}
 
static void pdf_run_J(pdf_csi *csi)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
gstate->stroke_state.start_cap = csi->stack[0];
gstate->stroke_state.dash_cap = csi->stack[0];
gstate->stroke_state.end_cap = csi->stack[0];
}
 
static void pdf_run_K(pdf_csi *csi)
{
pdf_set_colorspace(csi, PDF_STROKE, fz_device_cmyk);
pdf_set_color(csi, PDF_STROKE, csi->stack);
}
 
static void pdf_run_M(pdf_csi *csi)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
gstate->stroke_state.miterlimit = csi->stack[0];
}
 
static void pdf_run_MP(pdf_csi *csi)
{
}
 
static void pdf_run_Q(pdf_csi *csi)
{
pdf_grestore(csi);
}
 
static void pdf_run_RG(pdf_csi *csi)
{
pdf_set_colorspace(csi, PDF_STROKE, fz_device_rgb);
pdf_set_color(csi, PDF_STROKE, csi->stack);
}
 
static void pdf_run_S(pdf_csi *csi)
{
pdf_show_path(csi, 0, 0, 1, 0);
}
 
static fz_error pdf_run_SC_imp(pdf_csi *csi, fz_obj *rdb, int what, pdf_material *mat)
{
fz_error error;
fz_obj *patterntype;
fz_obj *dict;
fz_obj *obj;
int kind;
 
kind = mat->kind;
if (csi->name[0])
kind = PDF_MAT_PATTERN;
 
switch (kind)
{
case PDF_MAT_NONE:
return fz_throw("cannot set color in mask objects");
 
case PDF_MAT_COLOR:
pdf_set_color(csi, what, csi->stack);
break;
 
case PDF_MAT_PATTERN:
dict = fz_dict_gets(rdb, "Pattern");
if (!dict)
return fz_throw("cannot find Pattern dictionary");
 
obj = fz_dict_gets(dict, csi->name);
if (!obj)
return fz_throw("cannot find pattern resource '%s'", csi->name);
 
patterntype = fz_dict_gets(obj, "PatternType");
 
if (fz_to_int(patterntype) == 1)
{
pdf_pattern *pat;
error = pdf_load_pattern(&pat, csi->xref, obj);
if (error)
return fz_rethrow(error, "cannot load pattern (%d 0 R)", fz_to_num(obj));
pdf_set_pattern(csi, what, pat, csi->top > 0 ? csi->stack : NULL);
pdf_drop_pattern(pat);
}
else if (fz_to_int(patterntype) == 2)
{
fz_shade *shd;
error = pdf_load_shading(&shd, csi->xref, obj);
if (error)
return fz_rethrow(error, "cannot load shading (%d 0 R)", fz_to_num(obj));
pdf_set_shade(csi, what, shd);
fz_drop_shade(shd);
}
else
{
return fz_throw("unknown pattern type: %d", fz_to_int(patterntype));
}
break;
 
case PDF_MAT_SHADE:
return fz_throw("cannot set color in shade objects");
}
 
return fz_okay;
}
 
static void pdf_run_SC(pdf_csi *csi, fz_obj *rdb)
{
fz_error error;
pdf_gstate *gstate = csi->gstate + csi->gtop;
error = pdf_run_SC_imp(csi, rdb, PDF_STROKE, &gstate->stroke);
if (error)
fz_catch(error, "cannot set color and colorspace");
}
 
static void pdf_run_sc(pdf_csi *csi, fz_obj *rdb)
{
fz_error error;
pdf_gstate *gstate = csi->gstate + csi->gtop;
error = pdf_run_SC_imp(csi, rdb, PDF_FILL, &gstate->fill);
if (error)
fz_catch(error, "cannot set color and colorspace");
}
 
static void pdf_run_Tc(pdf_csi *csi)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
gstate->char_space = csi->stack[0];
}
 
static void pdf_run_Tw(pdf_csi *csi)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
gstate->word_space = csi->stack[0];
}
 
static void pdf_run_Tz(pdf_csi *csi)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
float a = csi->stack[0] / 100;
pdf_flush_text(csi);
gstate->scale = a;
}
 
static void pdf_run_TL(pdf_csi *csi)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
gstate->leading = csi->stack[0];
}
 
static fz_error pdf_run_Tf(pdf_csi *csi, fz_obj *rdb)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
fz_error error;
fz_obj *dict;
fz_obj *obj;
 
gstate->size = csi->stack[0];
if (gstate->font)
pdf_drop_font(gstate->font);
gstate->font = NULL;
 
dict = fz_dict_gets(rdb, "Font");
if (!dict)
return fz_throw("cannot find Font dictionary");
 
obj = fz_dict_gets(dict, csi->name);
if (!obj)
return fz_throw("cannot find font resource: '%s'", csi->name);
 
error = pdf_load_font(&gstate->font, csi->xref, rdb, obj);
if (error)
return fz_rethrow(error, "cannot load font (%d 0 R)", fz_to_num(obj));
 
return fz_okay;
}
 
static void pdf_run_Tr(pdf_csi *csi)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
gstate->render = csi->stack[0];
}
 
static void pdf_run_Ts(pdf_csi *csi)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
gstate->rise = csi->stack[0];
}
 
static void pdf_run_Td(pdf_csi *csi)
{
fz_matrix m = fz_translate(csi->stack[0], csi->stack[1]);
csi->tlm = fz_concat(m, csi->tlm);
csi->tm = csi->tlm;
}
 
static void pdf_run_TD(pdf_csi *csi)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
fz_matrix m;
 
gstate->leading = -csi->stack[1];
m = fz_translate(csi->stack[0], csi->stack[1]);
csi->tlm = fz_concat(m, csi->tlm);
csi->tm = csi->tlm;
}
 
static void pdf_run_Tm(pdf_csi *csi)
{
csi->tm.a = csi->stack[0];
csi->tm.b = csi->stack[1];
csi->tm.c = csi->stack[2];
csi->tm.d = csi->stack[3];
csi->tm.e = csi->stack[4];
csi->tm.f = csi->stack[5];
csi->tlm = csi->tm;
}
 
static void pdf_run_Tstar(pdf_csi *csi)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
fz_matrix m = fz_translate(0, -gstate->leading);
csi->tlm = fz_concat(m, csi->tlm);
csi->tm = csi->tlm;
}
 
static void pdf_run_Tj(pdf_csi *csi)
{
if (csi->string_len)
pdf_show_string(csi, csi->string, csi->string_len);
else
pdf_show_text(csi, csi->obj);
}
 
static void pdf_run_TJ(pdf_csi *csi)
{
if (csi->string_len)
pdf_show_string(csi, csi->string, csi->string_len);
else
pdf_show_text(csi, csi->obj);
}
 
static void pdf_run_W(pdf_csi *csi)
{
pdf_show_clip(csi, 0);
}
 
static void pdf_run_Wstar(pdf_csi *csi)
{
pdf_show_clip(csi, 1);
}
 
static void pdf_run_b(pdf_csi *csi)
{
pdf_show_path(csi, 1, 1, 1, 0);
}
 
static void pdf_run_bstar(pdf_csi *csi)
{
pdf_show_path(csi, 1, 1, 1, 1);
}
 
static void pdf_run_c(pdf_csi *csi)
{
float a, b, c, d, e, f;
a = csi->stack[0];
b = csi->stack[1];
c = csi->stack[2];
d = csi->stack[3];
e = csi->stack[4];
f = csi->stack[5];
fz_curveto(csi->path, a, b, c, d, e, f);
}
 
static void pdf_run_cm(pdf_csi *csi)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
fz_matrix m;
 
m.a = csi->stack[0];
m.b = csi->stack[1];
m.c = csi->stack[2];
m.d = csi->stack[3];
m.e = csi->stack[4];
m.f = csi->stack[5];
 
gstate->ctm = fz_concat(m, gstate->ctm);
}
 
static void pdf_run_d(pdf_csi *csi)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
fz_obj *array;
int i;
 
array = csi->obj;
gstate->stroke_state.dash_len = MIN(fz_array_len(array), nelem(gstate->stroke_state.dash_list));
for (i = 0; i < gstate->stroke_state.dash_len; i++)
gstate->stroke_state.dash_list[i] = fz_to_real(fz_array_get(array, i));
gstate->stroke_state.dash_phase = csi->stack[0];
}
 
static void pdf_run_d0(pdf_csi *csi)
{
csi->dev->flags |= FZ_CHARPROC_COLOR;
}
 
static void pdf_run_d1(pdf_csi *csi)
{
csi->dev->flags |= FZ_CHARPROC_MASK;
}
 
static void pdf_run_f(pdf_csi *csi)
{
pdf_show_path(csi, 0, 1, 0, 0);
}
 
static void pdf_run_fstar(pdf_csi *csi)
{
pdf_show_path(csi, 0, 1, 0, 1);
}
 
static void pdf_run_g(pdf_csi *csi)
{
pdf_set_colorspace(csi, PDF_FILL, fz_device_gray);
pdf_set_color(csi, PDF_FILL, csi->stack);
}
 
static fz_error pdf_run_gs(pdf_csi *csi, fz_obj *rdb)
{
fz_error error;
fz_obj *dict;
fz_obj *obj;
 
dict = fz_dict_gets(rdb, "ExtGState");
if (!dict)
return fz_throw("cannot find ExtGState dictionary");
 
obj = fz_dict_gets(dict, csi->name);
if (!obj)
return fz_throw("cannot find extgstate resource '%s'", csi->name);
 
error = pdf_run_extgstate(csi, rdb, obj);
if (error)
return fz_rethrow(error, "cannot set ExtGState (%d 0 R)", fz_to_num(obj));
return fz_okay;
}
 
static void pdf_run_h(pdf_csi *csi)
{
fz_closepath(csi->path);
}
 
static void pdf_run_i(pdf_csi *csi)
{
}
 
static void pdf_run_j(pdf_csi *csi)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
gstate->stroke_state.linejoin = csi->stack[0];
}
 
static void pdf_run_k(pdf_csi *csi)
{
pdf_set_colorspace(csi, PDF_FILL, fz_device_cmyk);
pdf_set_color(csi, PDF_FILL, csi->stack);
}
 
static void pdf_run_l(pdf_csi *csi)
{
float a, b;
a = csi->stack[0];
b = csi->stack[1];
fz_lineto(csi->path, a, b);
}
 
static void pdf_run_m(pdf_csi *csi)
{
float a, b;
a = csi->stack[0];
b = csi->stack[1];
fz_moveto(csi->path, a, b);
}
 
static void pdf_run_n(pdf_csi *csi)
{
pdf_show_path(csi, 0, 0, 0, 0);
}
 
static void pdf_run_q(pdf_csi *csi)
{
pdf_gsave(csi);
}
 
static void pdf_run_re(pdf_csi *csi)
{
float x, y, w, h;
 
x = csi->stack[0];
y = csi->stack[1];
w = csi->stack[2];
h = csi->stack[3];
 
fz_moveto(csi->path, x, y);
fz_lineto(csi->path, x + w, y);
fz_lineto(csi->path, x + w, y + h);
fz_lineto(csi->path, x, y + h);
fz_closepath(csi->path);
}
 
static void pdf_run_rg(pdf_csi *csi)
{
pdf_set_colorspace(csi, PDF_FILL, fz_device_rgb);
pdf_set_color(csi, PDF_FILL, csi->stack);
}
 
static void pdf_run_ri(pdf_csi *csi)
{
}
 
static void pdf_run(pdf_csi *csi)
{
pdf_show_path(csi, 1, 0, 1, 0);
}
 
static fz_error pdf_run_sh(pdf_csi *csi, fz_obj *rdb)
{
fz_obj *dict;
fz_obj *obj;
fz_shade *shd;
fz_error error;
 
dict = fz_dict_gets(rdb, "Shading");
if (!dict)
return fz_throw("cannot find shading dictionary");
 
obj = fz_dict_gets(dict, csi->name);
if (!obj)
return fz_throw("cannot find shading resource: '%s'", csi->name);
 
if ((csi->dev->hints & FZ_IGNORE_SHADE) == 0)
{
error = pdf_load_shading(&shd, csi->xref, obj);
if (error)
return fz_rethrow(error, "cannot load shading (%d %d R)", fz_to_num(obj), fz_to_gen(obj));
pdf_show_shade(csi, shd);
fz_drop_shade(shd);
}
return fz_okay;
}
 
static void pdf_run_v(pdf_csi *csi)
{
float a, b, c, d;
a = csi->stack[0];
b = csi->stack[1];
c = csi->stack[2];
d = csi->stack[3];
fz_curvetov(csi->path, a, b, c, d);
}
 
static void pdf_run_w(pdf_csi *csi)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
pdf_flush_text(csi); /* linewidth affects stroked text rendering mode */
gstate->stroke_state.linewidth = csi->stack[0];
}
 
static void pdf_run_y(pdf_csi *csi)
{
float a, b, c, d;
a = csi->stack[0];
b = csi->stack[1];
c = csi->stack[2];
d = csi->stack[3];
fz_curvetoy(csi->path, a, b, c, d);
}
 
static void pdf_run_squote(pdf_csi *csi)
{
fz_matrix m;
pdf_gstate *gstate = csi->gstate + csi->gtop;
 
m = fz_translate(0, -gstate->leading);
csi->tlm = fz_concat(m, csi->tlm);
csi->tm = csi->tlm;
 
if (csi->string_len)
pdf_show_string(csi, csi->string, csi->string_len);
else
pdf_show_text(csi, csi->obj);
}
 
static void pdf_run_dquote(pdf_csi *csi)
{
fz_matrix m;
pdf_gstate *gstate = csi->gstate + csi->gtop;
 
gstate->word_space = csi->stack[0];
gstate->char_space = csi->stack[1];
 
m = fz_translate(0, -gstate->leading);
csi->tlm = fz_concat(m, csi->tlm);
csi->tm = csi->tlm;
 
if (csi->string_len)
pdf_show_string(csi, csi->string, csi->string_len);
else
pdf_show_text(csi, csi->obj);
}
 
#define A(a) (a)
#define B(a,b) (a | b << 8)
#define C(a,b,c) (a | b << 8 | c << 16)
 
static fz_error
pdf_run_keyword(pdf_csi *csi, fz_obj *rdb, fz_stream *file, char *buf)
{
fz_error error;
int key;
 
key = buf[0];
if (buf[1])
{
key |= buf[1] << 8;
if (buf[2])
{
key |= buf[2] << 16;
if (buf[3])
key = 0;
}
}
 
switch (key)
{
case A('"'): pdf_run_dquote(csi); break;
case A('\''): pdf_run_squote(csi); break;
case A('B'): pdf_run_B(csi); break;
case B('B','*'): pdf_run_Bstar(csi); break;
case C('B','D','C'): pdf_run_BDC(csi); break;
case B('B','I'):
error = pdf_run_BI(csi, rdb, file);
if (error)
return fz_rethrow(error, "cannot draw inline image");
break;
case C('B','M','C'): pdf_run_BMC(csi); break;
case B('B','T'): pdf_run_BT(csi); break;
case B('B','X'): pdf_run_BX(csi); break;
case B('C','S'): pdf_run_CS(csi, rdb); break;
case B('D','P'): pdf_run_DP(csi); break;
case B('D','o'):
error = pdf_run_Do(csi, rdb);
if (error)
fz_catch(error, "cannot draw xobject/image");
break;
case C('E','M','C'): pdf_run_EMC(csi); break;
case B('E','T'): pdf_run_ET(csi); break;
case B('E','X'): pdf_run_EX(csi); break;
case A('F'): pdf_run_F(csi); break;
case A('G'): pdf_run_G(csi); break;
case A('J'): pdf_run_J(csi); break;
case A('K'): pdf_run_K(csi); break;
case A('M'): pdf_run_M(csi); break;
case B('M','P'): pdf_run_MP(csi); break;
case A('Q'): pdf_run_Q(csi); break;
case B('R','G'): pdf_run_RG(csi); break;
case A('S'): pdf_run_S(csi); break;
case B('S','C'): pdf_run_SC(csi, rdb); break;
case C('S','C','N'): pdf_run_SC(csi, rdb); break;
case B('T','*'): pdf_run_Tstar(csi); break;
case B('T','D'): pdf_run_TD(csi); break;
case B('T','J'): pdf_run_TJ(csi); break;
case B('T','L'): pdf_run_TL(csi); break;
case B('T','c'): pdf_run_Tc(csi); break;
case B('T','d'): pdf_run_Td(csi); break;
case B('T','f'):
error = pdf_run_Tf(csi, rdb);
if (error)
fz_catch(error, "cannot set font");
break;
case B('T','j'): pdf_run_Tj(csi); break;
case B('T','m'): pdf_run_Tm(csi); break;
case B('T','r'): pdf_run_Tr(csi); break;
case B('T','s'): pdf_run_Ts(csi); break;
case B('T','w'): pdf_run_Tw(csi); break;
case B('T','z'): pdf_run_Tz(csi); break;
case A('W'): pdf_run_W(csi); break;
case B('W','*'): pdf_run_Wstar(csi); break;
case A('b'): pdf_run_b(csi); break;
case B('b','*'): pdf_run_bstar(csi); break;
case A('c'): pdf_run_c(csi); break;
case B('c','m'): pdf_run_cm(csi); break;
case B('c','s'): pdf_run_cs(csi, rdb); break;
case A('d'): pdf_run_d(csi); break;
case B('d','0'): pdf_run_d0(csi); break;
case B('d','1'): pdf_run_d1(csi); break;
case A('f'): pdf_run_f(csi); break;
case B('f','*'): pdf_run_fstar(csi); break;
case A('g'): pdf_run_g(csi); break;
case B('g','s'):
error = pdf_run_gs(csi, rdb);
if (error)
fz_catch(error, "cannot set graphics state");
break;
case A('h'): pdf_run_h(csi); break;
case A('i'): pdf_run_i(csi); break;
case A('j'): pdf_run_j(csi); break;
case A('k'): pdf_run_k(csi); break;
case A('l'): pdf_run_l(csi); break;
case A('m'): pdf_run_m(csi); break;
case A('n'): pdf_run_n(csi); break;
case A('q'): pdf_run_q(csi); break;
case B('r','e'): pdf_run_re(csi); break;
case B('r','g'): pdf_run_rg(csi); break;
case B('r','i'): pdf_run_ri(csi); break;
case A('s'): pdf_run(csi); break;
case B('s','c'): pdf_run_sc(csi, rdb); break;
case C('s','c','n'): pdf_run_sc(csi, rdb); break;
case B('s','h'):
error = pdf_run_sh(csi, rdb);
if (error)
fz_catch(error, "cannot draw shading");
break;
case A('v'): pdf_run_v(csi); break;
case A('w'): pdf_run_w(csi); break;
case A('y'): pdf_run_y(csi); break;
default:
if (!csi->xbalance)
fz_warn("unknown keyword: '%s'", buf);
break;
}
 
return fz_okay;
}
 
static fz_error
pdf_run_stream(pdf_csi *csi, fz_obj *rdb, fz_stream *file, char *buf, int buflen)
{
fz_error error;
int tok, len, in_array;
 
/* make sure we have a clean slate if we come here from flush_text */
pdf_clear_stack(csi);
in_array = 0;
 
while (1)
{
if (csi->top == nelem(csi->stack) - 1)
return fz_throw("stack overflow");
 
error = pdf_lex(&tok, file, buf, buflen, &len);
if (error)
return fz_rethrow(error, "lexical error in content stream");
 
if (in_array)
{
if (tok == PDF_TOK_CLOSE_ARRAY)
{
in_array = 0;
}
else if (tok == PDF_TOK_INT || tok == PDF_TOK_REAL)
{
pdf_gstate *gstate = csi->gstate + csi->gtop;
pdf_show_space(csi, -fz_atof(buf) * gstate->size * 0.001f);
}
else if (tok == PDF_TOK_STRING)
{
pdf_show_string(csi, (unsigned char *)buf, len);
}
else if (tok == PDF_TOK_KEYWORD)
{
if (!strcmp(buf, "Tw") || !strcmp(buf, "Tc"))
fz_warn("ignoring keyword '%s' inside array", buf);
else
return fz_throw("syntax error in array");
}
else if (tok == PDF_TOK_EOF)
return fz_okay;
else
return fz_throw("syntax error in array");
}
 
else switch (tok)
{
case PDF_TOK_ENDSTREAM:
case PDF_TOK_EOF:
return fz_okay;
 
case PDF_TOK_OPEN_ARRAY:
if (!csi->in_text)
{
error = pdf_parse_array(&csi->obj, csi->xref, file, buf, buflen);
if (error)
return fz_rethrow(error, "cannot parse array");
}
else
{
in_array = 1;
}
break;
 
case PDF_TOK_OPEN_DICT:
error = pdf_parse_dict(&csi->obj, csi->xref, file, buf, buflen);
if (error)
return fz_rethrow(error, "cannot parse dictionary");
break;
 
case PDF_TOK_NAME:
fz_strlcpy(csi->name, buf, sizeof(csi->name));
break;
 
case PDF_TOK_INT:
csi->stack[csi->top] = atoi(buf);
csi->top ++;
break;
 
case PDF_TOK_REAL:
csi->stack[csi->top] = fz_atof(buf);
csi->top ++;
break;
 
case PDF_TOK_STRING:
if (len <= sizeof(csi->string))
{
memcpy(csi->string, buf, len);
csi->string_len = len;
}
else
{
csi->obj = fz_new_string(buf, len);
}
break;
 
case PDF_TOK_KEYWORD:
error = pdf_run_keyword(csi, rdb, file, buf);
if (error)
return fz_rethrow(error, "cannot run keyword");
pdf_clear_stack(csi);
break;
 
default:
return fz_throw("syntax error in content stream");
}
}
}
 
/*
* Entry points
*/
 
static fz_error
pdf_run_buffer(pdf_csi *csi, fz_obj *rdb, fz_buffer *contents)
{
fz_error error;
int len = sizeof csi->xref->scratch;
char *buf = fz_malloc(len); /* we must be re-entrant for type3 fonts */
fz_stream *file = fz_open_buffer(contents);
int save_in_text = csi->in_text;
csi->in_text = 0;
error = pdf_run_stream(csi, rdb, file, buf, len);
csi->in_text = save_in_text;
fz_close(file);
fz_free(buf);
if (error)
return fz_rethrow(error, "cannot parse content stream");
return fz_okay;
}
 
fz_error
pdf_run_page_with_usage(pdf_xref *xref, pdf_page *page, fz_device *dev, fz_matrix ctm, char *target)
{
pdf_csi *csi;
fz_error error;
pdf_annot *annot;
int flags;
 
if (page->transparency)
fz_begin_group(dev, fz_transform_rect(ctm, page->mediabox), 1, 0, 0, 1);
 
csi = pdf_new_csi(xref, dev, ctm, target);
error = pdf_run_buffer(csi, page->resources, page->contents);
pdf_free_csi(csi);
if (error)
return fz_rethrow(error, "cannot parse page content stream");
 
for (annot = page->annots; annot; annot = annot->next)
{
flags = fz_to_int(fz_dict_gets(annot->obj, "F"));
 
/* TODO: NoZoom and NoRotate */
if (flags & (1 << 0)) /* Invisible */
continue;
if (flags & (1 << 1)) /* Hidden */
continue;
if (flags & (1 << 5)) /* NoView */
continue;
 
if (pdf_is_hidden_ocg(annot->obj, target))
continue;
 
csi = pdf_new_csi(xref, dev, ctm, target);
error = pdf_run_xobject(csi, page->resources, annot->ap, annot->matrix);
pdf_free_csi(csi);
if (error)
return fz_rethrow(error, "cannot parse annotation appearance stream");
}
 
if (page->transparency)
fz_end_group(dev);
 
return fz_okay;
}
 
fz_error
pdf_run_page(pdf_xref *xref, pdf_page *page, fz_device *dev, fz_matrix ctm)
{
return pdf_run_page_with_usage(xref, page, dev, ctm, "View");
}
 
fz_error
pdf_run_glyph(pdf_xref *xref, fz_obj *resources, fz_buffer *contents, fz_device *dev, fz_matrix ctm)
{
pdf_csi *csi = pdf_new_csi(xref, dev, ctm, "View");
fz_error error = pdf_run_buffer(csi, resources, contents);
pdf_free_csi(csi);
if (error)
return fz_rethrow(error, "cannot parse glyph content stream");
return fz_okay;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_lex.c
0,0 → 1,461
#include "fitz.h"
#include "mupdf.h"
 
#define IS_NUMBER \
'+':case'-':case'.':case'0':case'1':case'2':case'3':\
case'4':case'5':case'6':case'7':case'8':case'9'
#define IS_WHITE \
'\000':case'\011':case'\012':case'\014':case'\015':case'\040'
#define IS_HEX \
'0':case'1':case'2':case'3':case'4':case'5':case'6':\
case'7':case'8':case'9':case'A':case'B':case'C':\
case'D':case'E':case'F':case'a':case'b':case'c':\
case'd':case'e':case'f'
#define IS_DELIM \
'(':case')':case'<':case'>':case'[':case']':case'{':\
case'}':case'/':case'%'
 
#define RANGE_0_9 \
'0':case'1':case'2':case'3':case'4':case'5':\
case'6':case'7':case'8':case'9'
#define RANGE_a_f \
'a':case'b':case'c':case'd':case'e':case'f'
#define RANGE_A_F \
'A':case'B':case'C':case'D':case'E':case'F'
 
static inline int iswhite(int ch)
{
return
ch == '\000' ||
ch == '\011' ||
ch == '\012' ||
ch == '\014' ||
ch == '\015' ||
ch == '\040';
}
 
static inline int unhex(int ch)
{
if (ch >= '0' && ch <= '9') return ch - '0';
if (ch >= 'A' && ch <= 'F') return ch - 'A' + 0xA;
if (ch >= 'a' && ch <= 'f') return ch - 'a' + 0xA;
return 0;
}
 
static void
lex_white(fz_stream *f)
{
int c;
do {
c = fz_read_byte(f);
} while ((c <= 32) && (iswhite(c)));
if (c != EOF)
fz_unread_byte(f);
}
 
static void
lex_comment(fz_stream *f)
{
int c;
do {
c = fz_read_byte(f);
} while ((c != '\012') && (c != '\015') && (c != EOF));
}
 
static int
lex_number(fz_stream *f, char *s, int n, int *tok)
{
char *buf = s;
*tok = PDF_TOK_INT;
 
/* Initially we might have +, -, . or a digit */
if (n > 1)
{
int c = fz_read_byte(f);
switch (c)
{
case '.':
*tok = PDF_TOK_REAL;
*s++ = c;
n--;
goto loop_after_dot;
case '+':
case '-':
case RANGE_0_9:
*s++ = c;
n--;
goto loop_after_sign;
default:
fz_unread_byte(f);
goto end;
case EOF:
goto end;
}
}
 
/* We can't accept a sign from here on in, just . or a digit */
loop_after_sign:
while (n > 1)
{
int c = fz_read_byte(f);
switch (c)
{
case '.':
*tok = PDF_TOK_REAL;
*s++ = c;
n--;
goto loop_after_dot;
case RANGE_0_9:
*s++ = c;
break;
default:
fz_unread_byte(f);
goto end;
case EOF:
goto end;
}
n--;
}
 
/* In here, we've seen a dot, so can accept just digits */
loop_after_dot:
while (n > 1)
{
int c = fz_read_byte(f);
switch (c)
{
case RANGE_0_9:
*s++ = c;
break;
default:
fz_unread_byte(f);
goto end;
case EOF:
goto end;
}
n--;
}
 
end:
*s = '\0';
return s-buf;
}
 
static void
lex_name(fz_stream *f, char *s, int n)
{
while (n > 1)
{
int c = fz_read_byte(f);
switch (c)
{
case IS_WHITE:
case IS_DELIM:
fz_unread_byte(f);
goto end;
case EOF:
goto end;
case '#':
{
int d;
c = fz_read_byte(f);
switch (c)
{
case RANGE_0_9:
d = (c - '0') << 4;
break;
case RANGE_a_f:
d = (c - 'a' + 10) << 4;
break;
case RANGE_A_F:
d = (c - 'A' + 10) << 4;
break;
default:
fz_unread_byte(f);
/* fallthrough */
case EOF:
goto end;
}
c = fz_read_byte(f);
switch (c)
{
case RANGE_0_9:
c -= '0';
break;
case RANGE_a_f:
c -= 'a' - 10;
break;
case RANGE_A_F:
c -= 'A' - 10;
break;
default:
fz_unread_byte(f);
/* fallthrough */
case EOF:
*s++ = d;
n--;
goto end;
}
*s++ = d + c;
n--;
break;
}
default:
*s++ = c;
n--;
break;
}
}
end:
*s = '\0';
}
 
static int
lex_string(fz_stream *f, char *buf, int n)
{
char *s = buf;
char *e = buf + n;
int bal = 1;
int oct;
int c;
 
while (s < e)
{
c = fz_read_byte(f);
switch (c)
{
case EOF:
goto end;
case '(':
bal++;
*s++ = c;
break;
case ')':
bal --;
if (bal == 0)
goto end;
*s++ = c;
break;
case '\\':
c = fz_read_byte(f);
switch (c)
{
case EOF:
goto end;
case 'n':
*s++ = '\n';
break;
case 'r':
*s++ = '\r';
break;
case 't':
*s++ = '\t';
break;
case 'b':
*s++ = '\b';
break;
case 'f':
*s++ = '\f';
break;
case '(':
*s++ = '(';
break;
case ')':
*s++ = ')';
break;
case '\\':
*s++ = '\\';
break;
case RANGE_0_9:
oct = c - '0';
c = fz_read_byte(f);
if (c >= '0' && c <= '9')
{
oct = oct * 8 + (c - '0');
c = fz_read_byte(f);
if (c >= '0' && c <= '9')
oct = oct * 8 + (c - '0');
else if (c != EOF)
fz_unread_byte(f);
}
else if (c != EOF)
fz_unread_byte(f);
*s++ = oct;
break;
case '\n':
break;
case '\r':
c = fz_read_byte(f);
if ((c != '\n') && (c != EOF))
fz_unread_byte(f);
break;
default:
*s++ = c;
}
break;
default:
*s++ = c;
break;
}
}
end:
return s - buf;
}
 
static int
lex_hex_string(fz_stream *f, char *buf, int n)
{
char *s = buf;
char *e = buf + n;
int a = 0, x = 0;
int c;
 
while (s < e)
{
c = fz_read_byte(f);
switch (c)
{
case IS_WHITE:
break;
case IS_HEX:
if (x)
{
*s++ = a * 16 + unhex(c);
x = !x;
}
else
{
a = unhex(c);
x = !x;
}
break;
case '>':
case EOF:
goto end;
default:
fz_warn("ignoring invalid character in hex string: '%c'", c);
}
}
end:
return s - buf;
}
 
static int
pdf_token_from_keyword(char *key)
{
switch (*key)
{
case 'R':
if (!strcmp(key, "R")) return PDF_TOK_R;
break;
case 't':
if (!strcmp(key, "true")) return PDF_TOK_TRUE;
if (!strcmp(key, "trailer")) return PDF_TOK_TRAILER;
break;
case 'f':
if (!strcmp(key, "false")) return PDF_TOK_FALSE;
break;
case 'n':
if (!strcmp(key, "null")) return PDF_TOK_NULL;
break;
case 'o':
if (!strcmp(key, "obj")) return PDF_TOK_OBJ;
break;
case 'e':
if (!strcmp(key, "endobj")) return PDF_TOK_ENDOBJ;
if (!strcmp(key, "endstream")) return PDF_TOK_ENDSTREAM;
break;
case 's':
if (!strcmp(key, "stream")) return PDF_TOK_STREAM;
if (!strcmp(key, "startxref")) return PDF_TOK_STARTXREF;
break;
case 'x':
if (!strcmp(key, "xref")) return PDF_TOK_XREF;
break;
default:
break;
}
 
return PDF_TOK_KEYWORD;
}
 
fz_error
pdf_lex(int *tok, fz_stream *f, char *buf, int n, int *sl)
{
while (1)
{
int c = fz_read_byte(f);
switch (c)
{
case EOF:
*tok = PDF_TOK_EOF;
return fz_okay;
case IS_WHITE:
lex_white(f);
break;
case '%':
lex_comment(f);
break;
case '/':
lex_name(f, buf, n);
*sl = strlen(buf);
*tok = PDF_TOK_NAME;
return fz_okay;
case '(':
*sl = lex_string(f, buf, n);
*tok = PDF_TOK_STRING;
return fz_okay;
case ')':
*tok = PDF_TOK_ERROR;
goto cleanuperror;
case '<':
c = fz_read_byte(f);
if (c == '<')
{
*tok = PDF_TOK_OPEN_DICT;
}
else
{
fz_unread_byte(f);
*sl = lex_hex_string(f, buf, n);
*tok = PDF_TOK_STRING;
}
return fz_okay;
case '>':
c = fz_read_byte(f);
if (c == '>')
{
*tok = PDF_TOK_CLOSE_DICT;
return fz_okay;
}
*tok = PDF_TOK_ERROR;
goto cleanuperror;
case '[':
*tok = PDF_TOK_OPEN_ARRAY;
return fz_okay;
case ']':
*tok = PDF_TOK_CLOSE_ARRAY;
return fz_okay;
case '{':
*tok = PDF_TOK_OPEN_BRACE;
return fz_okay;
case '}':
*tok = PDF_TOK_CLOSE_BRACE;
return fz_okay;
case IS_NUMBER:
fz_unread_byte(f);
*sl = lex_number(f, buf, n, tok);
return fz_okay;
default: /* isregular: !isdelim && !iswhite && c != EOF */
fz_unread_byte(f);
lex_name(f, buf, n);
*sl = strlen(buf);
*tok = pdf_token_from_keyword(buf);
return fz_okay;
}
}
 
cleanuperror:
*tok = PDF_TOK_ERROR;
return fz_throw("lexical error");
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_metrics.c
0,0 → 1,138
#include "fitz.h"
#include "mupdf.h"
 
void
pdf_set_font_wmode(pdf_font_desc *font, int wmode)
{
font->wmode = wmode;
}
 
void
pdf_set_default_hmtx(pdf_font_desc *font, int w)
{
font->dhmtx.w = w;
}
 
void
pdf_set_default_vmtx(pdf_font_desc *font, int y, int w)
{
font->dvmtx.y = y;
font->dvmtx.w = w;
}
 
void
pdf_add_hmtx(pdf_font_desc *font, int lo, int hi, int w)
{
if (font->hmtx_len + 1 >= font->hmtx_cap)
{
font->hmtx_cap = font->hmtx_cap + 16;
font->hmtx = fz_realloc(font->hmtx, font->hmtx_cap, sizeof(pdf_hmtx));
}
 
font->hmtx[font->hmtx_len].lo = lo;
font->hmtx[font->hmtx_len].hi = hi;
font->hmtx[font->hmtx_len].w = w;
font->hmtx_len++;
}
 
void
pdf_add_vmtx(pdf_font_desc *font, int lo, int hi, int x, int y, int w)
{
if (font->vmtx_len + 1 >= font->vmtx_cap)
{
font->vmtx_cap = font->vmtx_cap + 16;
font->vmtx = fz_realloc(font->vmtx, font->vmtx_cap, sizeof(pdf_vmtx));
}
 
font->vmtx[font->vmtx_len].lo = lo;
font->vmtx[font->vmtx_len].hi = hi;
font->vmtx[font->vmtx_len].x = x;
font->vmtx[font->vmtx_len].y = y;
font->vmtx[font->vmtx_len].w = w;
font->vmtx_len++;
}
 
static int cmph(const void *a0, const void *b0)
{
pdf_hmtx *a = (pdf_hmtx*)a0;
pdf_hmtx *b = (pdf_hmtx*)b0;
return a->lo - b->lo;
}
 
static int cmpv(const void *a0, const void *b0)
{
pdf_vmtx *a = (pdf_vmtx*)a0;
pdf_vmtx *b = (pdf_vmtx*)b0;
return a->lo - b->lo;
}
 
void
pdf_end_hmtx(pdf_font_desc *font)
{
if (!font->hmtx)
return;
qsort(font->hmtx, font->hmtx_len, sizeof(pdf_hmtx), cmph);
}
 
void
pdf_end_vmtx(pdf_font_desc *font)
{
if (!font->vmtx)
return;
qsort(font->vmtx, font->vmtx_len, sizeof(pdf_vmtx), cmpv);
}
 
pdf_hmtx
pdf_get_hmtx(pdf_font_desc *font, int cid)
{
int l = 0;
int r = font->hmtx_len - 1;
int m;
 
if (!font->hmtx)
goto notfound;
 
while (l <= r)
{
m = (l + r) >> 1;
if (cid < font->hmtx[m].lo)
r = m - 1;
else if (cid > font->hmtx[m].hi)
l = m + 1;
else
return font->hmtx[m];
}
 
notfound:
return font->dhmtx;
}
 
pdf_vmtx
pdf_get_vmtx(pdf_font_desc *font, int cid)
{
pdf_hmtx h;
pdf_vmtx v;
int l = 0;
int r = font->vmtx_len - 1;
int m;
 
if (!font->vmtx)
goto notfound;
 
while (l <= r)
{
m = (l + r) >> 1;
if (cid < font->vmtx[m].lo)
r = m - 1;
else if (cid > font->vmtx[m].hi)
l = m + 1;
else
return font->vmtx[m];
}
 
notfound:
h = pdf_get_hmtx(font, cid);
v = font->dvmtx;
v.x = h.w / 2;
return v;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_nametree.c
0,0 → 1,139
#include "fitz.h"
#include "mupdf.h"
 
static fz_obj *
pdf_lookup_name_imp(fz_obj *node, fz_obj *needle)
{
fz_obj *kids = fz_dict_gets(node, "Kids");
fz_obj *names = fz_dict_gets(node, "Names");
 
if (fz_is_array(kids))
{
int l = 0;
int r = fz_array_len(kids) - 1;
 
while (l <= r)
{
int m = (l + r) >> 1;
fz_obj *kid = fz_array_get(kids, m);
fz_obj *limits = fz_dict_gets(kid, "Limits");
fz_obj *first = fz_array_get(limits, 0);
fz_obj *last = fz_array_get(limits, 1);
 
if (fz_objcmp(needle, first) < 0)
r = m - 1;
else if (fz_objcmp(needle, last) > 0)
l = m + 1;
else
return pdf_lookup_name_imp(kid, needle);
}
}
 
if (fz_is_array(names))
{
int l = 0;
int r = (fz_array_len(names) / 2) - 1;
 
while (l <= r)
{
int m = (l + r) >> 1;
int c;
fz_obj *key = fz_array_get(names, m * 2);
fz_obj *val = fz_array_get(names, m * 2 + 1);
 
c = fz_objcmp(needle, key);
if (c < 0)
r = m - 1;
else if (c > 0)
l = m + 1;
else
return val;
}
}
 
return NULL;
}
 
fz_obj *
pdf_lookup_name(pdf_xref *xref, char *which, fz_obj *needle)
{
fz_obj *root = fz_dict_gets(xref->trailer, "Root");
fz_obj *names = fz_dict_gets(root, "Names");
fz_obj *tree = fz_dict_gets(names, which);
return pdf_lookup_name_imp(tree, needle);
}
 
fz_obj *
pdf_lookup_dest(pdf_xref *xref, fz_obj *needle)
{
fz_obj *root = fz_dict_gets(xref->trailer, "Root");
fz_obj *dests = fz_dict_gets(root, "Dests");
fz_obj *names = fz_dict_gets(root, "Names");
fz_obj *dest = NULL;
 
/* PDF 1.1 has destinations in a dictionary */
if (dests)
{
if (fz_is_name(needle))
return fz_dict_get(dests, needle);
else
return fz_dict_gets(dests, fz_to_str_buf(needle));
}
 
/* PDF 1.2 has destinations in a name tree */
if (names && !dest)
{
fz_obj *tree = fz_dict_gets(names, "Dests");
return pdf_lookup_name_imp(tree, needle);
}
 
return NULL;
}
 
static void
pdf_load_name_tree_imp(fz_obj *dict, pdf_xref *xref, fz_obj *node)
{
fz_obj *kids = fz_dict_gets(node, "Kids");
fz_obj *names = fz_dict_gets(node, "Names");
int i;
 
if (kids)
{
for (i = 0; i < fz_array_len(kids); i++)
pdf_load_name_tree_imp(dict, xref, fz_array_get(kids, i));
}
 
if (names)
{
for (i = 0; i + 1 < fz_array_len(names); i += 2)
{
fz_obj *key = fz_array_get(names, i);
fz_obj *val = fz_array_get(names, i + 1);
if (fz_is_string(key))
{
key = pdf_to_utf8_name(key);
fz_dict_put(dict, key, val);
fz_drop_obj(key);
}
else if (fz_is_name(key))
{
fz_dict_put(dict, key, val);
}
}
}
}
 
fz_obj *
pdf_load_name_tree(pdf_xref *xref, char *which)
{
fz_obj *root = fz_dict_gets(xref->trailer, "Root");
fz_obj *names = fz_dict_gets(root, "Names");
fz_obj *tree = fz_dict_gets(names, which);
if (fz_is_dict(tree))
{
fz_obj *dict = fz_new_dict(100);
pdf_load_name_tree_imp(dict, xref, tree);
return dict;
}
return NULL;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_outline.c
0,0 → 1,93
#include "fitz.h"
#include "mupdf.h"
 
static pdf_outline *
pdf_load_outline_imp(pdf_xref *xref, fz_obj *dict)
{
pdf_outline *node;
fz_obj *obj;
 
if (fz_is_null(dict))
return NULL;
 
node = fz_malloc(sizeof(pdf_outline));
node->title = NULL;
node->link = NULL;
node->child = NULL;
node->next = NULL;
node->count = 0;
 
obj = fz_dict_gets(dict, "Title");
if (obj)
node->title = pdf_to_utf8(obj);
 
obj = fz_dict_gets(dict, "Count");
if (obj)
node->count = fz_to_int(obj);
 
if (fz_dict_gets(dict, "Dest") || fz_dict_gets(dict, "A"))
node->link = pdf_load_link(xref, dict);
 
obj = fz_dict_gets(dict, "First");
if (obj)
node->child = pdf_load_outline_imp(xref, obj);
 
obj = fz_dict_gets(dict, "Next");
if (obj)
node->next = pdf_load_outline_imp(xref, obj);
 
return node;
}
 
pdf_outline *
pdf_load_outline(pdf_xref *xref)
{
fz_obj *root, *obj, *first;
 
root = fz_dict_gets(xref->trailer, "Root");
obj = fz_dict_gets(root, "Outlines");
first = fz_dict_gets(obj, "First");
if (first)
return pdf_load_outline_imp(xref, first);
 
return NULL;
}
 
void
pdf_free_outline(pdf_outline *outline)
{
if (outline->child)
pdf_free_outline(outline->child);
if (outline->next)
pdf_free_outline(outline->next);
if (outline->link)
pdf_free_link(outline->link);
fz_free(outline->title);
fz_free(outline);
}
 
void
pdf_debug_outline(pdf_outline *outline, int level)
{
int i;
while (outline)
{
for (i = 0; i < level; i++)
putchar(' ');
 
if (outline->title)
printf("%s ", outline->title);
else
printf("<NULL> ");
 
if (outline->link)
fz_debug_obj(outline->link->dest);
else
printf("<NULL>\n");
 
if (outline->child)
pdf_debug_outline(outline->child, level + 2);
 
outline = outline->next;
}
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_page.c
0,0 → 1,370
#include "fitz.h"
#include "mupdf.h"
 
struct info
{
fz_obj *resources;
fz_obj *mediabox;
fz_obj *cropbox;
fz_obj *rotate;
};
 
int
pdf_count_pages(pdf_xref *xref)
{
return xref->page_len;
}
 
int
pdf_find_page_number(pdf_xref *xref, fz_obj *page)
{
int i, num = fz_to_num(page);
for (i = 0; i < xref->page_len; i++)
if (num == fz_to_num(xref->page_refs[i]))
return i;
return -1;
}
 
static void
pdf_load_page_tree_node(pdf_xref *xref, fz_obj *node, struct info info)
{
fz_obj *dict, *kids, *count;
fz_obj *obj, *tmp;
int i, n;
 
/* prevent infinite recursion */
if (fz_dict_gets(node, ".seen"))
return;
 
kids = fz_dict_gets(node, "Kids");
count = fz_dict_gets(node, "Count");
 
if (fz_is_array(kids) && fz_is_int(count))
{
obj = fz_dict_gets(node, "Resources");
if (obj)
info.resources = obj;
obj = fz_dict_gets(node, "MediaBox");
if (obj)
info.mediabox = obj;
obj = fz_dict_gets(node, "CropBox");
if (obj)
info.cropbox = obj;
obj = fz_dict_gets(node, "Rotate");
if (obj)
info.rotate = obj;
 
tmp = fz_new_null();
fz_dict_puts(node, ".seen", tmp);
fz_drop_obj(tmp);
 
n = fz_array_len(kids);
for (i = 0; i < n; i++)
{
obj = fz_array_get(kids, i);
pdf_load_page_tree_node(xref, obj, info);
}
 
fz_dict_dels(node, ".seen");
}
else
{
dict = fz_resolve_indirect(node);
 
if (info.resources && !fz_dict_gets(dict, "Resources"))
fz_dict_puts(dict, "Resources", info.resources);
if (info.mediabox && !fz_dict_gets(dict, "MediaBox"))
fz_dict_puts(dict, "MediaBox", info.mediabox);
if (info.cropbox && !fz_dict_gets(dict, "CropBox"))
fz_dict_puts(dict, "CropBox", info.cropbox);
if (info.rotate && !fz_dict_gets(dict, "Rotate"))
fz_dict_puts(dict, "Rotate", info.rotate);
 
if (xref->page_len == xref->page_cap)
{
fz_warn("found more pages than expected");
xref->page_cap ++;
xref->page_refs = fz_realloc(xref->page_refs, xref->page_cap, sizeof(fz_obj*));
xref->page_objs = fz_realloc(xref->page_objs, xref->page_cap, sizeof(fz_obj*));
}
 
xref->page_refs[xref->page_len] = fz_keep_obj(node);
xref->page_objs[xref->page_len] = fz_keep_obj(dict);
xref->page_len ++;
}
}
 
fz_error
pdf_load_page_tree(pdf_xref *xref)
{
struct info info;
fz_obj *catalog = fz_dict_gets(xref->trailer, "Root");
fz_obj *pages = fz_dict_gets(catalog, "Pages");
fz_obj *count = fz_dict_gets(pages, "Count");
 
if (!fz_is_dict(pages))
return fz_throw("missing page tree");
if (!fz_is_int(count))
return fz_throw("missing page count");
 
xref->page_cap = fz_to_int(count);
xref->page_len = 0;
xref->page_refs = fz_calloc(xref->page_cap, sizeof(fz_obj*));
xref->page_objs = fz_calloc(xref->page_cap, sizeof(fz_obj*));
 
info.resources = NULL;
info.mediabox = NULL;
info.cropbox = NULL;
info.rotate = NULL;
 
pdf_load_page_tree_node(xref, pages, info);
 
return fz_okay;
}
 
/* We need to know whether to install a page-level transparency group */
 
static int pdf_resources_use_blending(fz_obj *rdb);
 
static int
pdf_extgstate_uses_blending(fz_obj *dict)
{
fz_obj *obj = fz_dict_gets(dict, "BM");
if (fz_is_name(obj) && strcmp(fz_to_name(obj), "Normal"))
return 1;
return 0;
}
 
static int
pdf_pattern_uses_blending(fz_obj *dict)
{
fz_obj *obj;
obj = fz_dict_gets(dict, "Resources");
if (pdf_resources_use_blending(obj))
return 1;
obj = fz_dict_gets(dict, "ExtGState");
if (pdf_extgstate_uses_blending(obj))
return 1;
return 0;
}
 
static int
pdf_xobject_uses_blending(fz_obj *dict)
{
fz_obj *obj = fz_dict_gets(dict, "Resources");
if (pdf_resources_use_blending(obj))
return 1;
return 0;
}
 
static int
pdf_resources_use_blending(fz_obj *rdb)
{
fz_obj *dict;
fz_obj *tmp;
int i;
 
if (!rdb)
return 0;
 
/* stop on cyclic resource dependencies */
if (fz_dict_gets(rdb, ".useBM"))
return fz_to_bool(fz_dict_gets(rdb, ".useBM"));
 
tmp = fz_new_bool(0);
fz_dict_puts(rdb, ".useBM", tmp);
fz_drop_obj(tmp);
 
dict = fz_dict_gets(rdb, "ExtGState");
for (i = 0; i < fz_dict_len(dict); i++)
if (pdf_extgstate_uses_blending(fz_dict_get_val(dict, i)))
goto found;
 
dict = fz_dict_gets(rdb, "Pattern");
for (i = 0; i < fz_dict_len(dict); i++)
if (pdf_pattern_uses_blending(fz_dict_get_val(dict, i)))
goto found;
 
dict = fz_dict_gets(rdb, "XObject");
for (i = 0; i < fz_dict_len(dict); i++)
if (pdf_xobject_uses_blending(fz_dict_get_val(dict, i)))
goto found;
 
return 0;
 
found:
tmp = fz_new_bool(1);
fz_dict_puts(rdb, ".useBM", tmp);
fz_drop_obj(tmp);
return 1;
}
 
/* we need to combine all sub-streams into one for the content stream interpreter */
 
static fz_error
pdf_load_page_contents_array(fz_buffer **bigbufp, pdf_xref *xref, fz_obj *list)
{
fz_error error;
fz_buffer *big;
fz_buffer *one;
int i, n;
 
big = fz_new_buffer(32 * 1024);
 
n = fz_array_len(list);
for (i = 0; i < n; i++)
{
fz_obj *stm = fz_array_get(list, i);
error = pdf_load_stream(&one, xref, fz_to_num(stm), fz_to_gen(stm));
if (error)
{
fz_catch(error, "cannot load content stream part %d/%d", i + 1, n);
continue;
}
 
if (big->len + one->len + 1 > big->cap)
fz_resize_buffer(big, big->len + one->len + 1);
memcpy(big->data + big->len, one->data, one->len);
big->data[big->len + one->len] = ' ';
big->len += one->len + 1;
 
fz_drop_buffer(one);
}
 
if (n > 0 && big->len == 0)
{
fz_drop_buffer(big);
return fz_throw("cannot load content stream");
}
 
*bigbufp = big;
return fz_okay;
}
 
static fz_error
pdf_load_page_contents(fz_buffer **bufp, pdf_xref *xref, fz_obj *obj)
{
fz_error error;
 
if (fz_is_array(obj))
{
error = pdf_load_page_contents_array(bufp, xref, obj);
if (error)
return fz_rethrow(error, "cannot load content stream array");
}
else if (pdf_is_stream(xref, fz_to_num(obj), fz_to_gen(obj)))
{
error = pdf_load_stream(bufp, xref, fz_to_num(obj), fz_to_gen(obj));
if (error)
return fz_rethrow(error, "cannot load content stream (%d 0 R)", fz_to_num(obj));
}
else
{
fz_warn("page contents missing, leaving page blank");
*bufp = fz_new_buffer(0);
}
 
return fz_okay;
}
 
fz_error
pdf_load_page(pdf_page **pagep, pdf_xref *xref, int number)
{
fz_error error;
pdf_page *page;
pdf_annot *annot;
fz_obj *pageobj, *pageref;
fz_obj *obj;
fz_bbox bbox;
 
if (number < 0 || number >= xref->page_len)
return fz_throw("cannot find page %d", number + 1);
 
/* Ensure that we have a store for resource objects */
if (!xref->store)
xref->store = pdf_new_store();
 
pageobj = xref->page_objs[number];
pageref = xref->page_refs[number];
 
page = fz_malloc(sizeof(pdf_page));
page->resources = NULL;
page->contents = NULL;
page->transparency = 0;
page->links = NULL;
page->annots = NULL;
 
obj = fz_dict_gets(pageobj, "MediaBox");
bbox = fz_round_rect(pdf_to_rect(obj));
if (fz_is_empty_rect(pdf_to_rect(obj)))
{
fz_warn("cannot find page size for page %d", number + 1);
bbox.x0 = 0;
bbox.y0 = 0;
bbox.x1 = 612;
bbox.y1 = 792;
}
 
obj = fz_dict_gets(pageobj, "CropBox");
if (fz_is_array(obj))
{
fz_bbox cropbox = fz_round_rect(pdf_to_rect(obj));
bbox = fz_intersect_bbox(bbox, cropbox);
}
 
page->mediabox.x0 = MIN(bbox.x0, bbox.x1);
page->mediabox.y0 = MIN(bbox.y0, bbox.y1);
page->mediabox.x1 = MAX(bbox.x0, bbox.x1);
page->mediabox.y1 = MAX(bbox.y0, bbox.y1);
 
if (page->mediabox.x1 - page->mediabox.x0 < 1 || page->mediabox.y1 - page->mediabox.y0 < 1)
{
fz_warn("invalid page size in page %d", number + 1);
page->mediabox = fz_unit_rect;
}
 
page->rotate = fz_to_int(fz_dict_gets(pageobj, "Rotate"));
 
obj = fz_dict_gets(pageobj, "Annots");
if (obj)
{
pdf_load_links(&page->links, xref, obj);
pdf_load_annots(&page->annots, xref, obj);
}
 
page->resources = fz_dict_gets(pageobj, "Resources");
if (page->resources)
fz_keep_obj(page->resources);
 
obj = fz_dict_gets(pageobj, "Contents");
error = pdf_load_page_contents(&page->contents, xref, obj);
if (error)
{
pdf_free_page(page);
return fz_rethrow(error, "cannot load page %d contents (%d 0 R)", number + 1, fz_to_num(pageref));
}
 
if (pdf_resources_use_blending(page->resources))
page->transparency = 1;
 
for (annot = page->annots; annot && !page->transparency; annot = annot->next)
if (pdf_resources_use_blending(annot->ap->resources))
page->transparency = 1;
 
*pagep = page;
return fz_okay;
}
 
void
pdf_free_page(pdf_page *page)
{
if (page->resources)
fz_drop_obj(page->resources);
if (page->contents)
fz_drop_buffer(page->contents);
if (page->links)
pdf_free_link(page->links);
if (page->annots)
pdf_free_annot(page->annots);
fz_free(page);
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_parse.c
0,0 → 1,581
#include "fitz.h"
#include "mupdf.h"
 
fz_rect
pdf_to_rect(fz_obj *array)
{
fz_rect r;
float a = fz_to_real(fz_array_get(array, 0));
float b = fz_to_real(fz_array_get(array, 1));
float c = fz_to_real(fz_array_get(array, 2));
float d = fz_to_real(fz_array_get(array, 3));
r.x0 = MIN(a, c);
r.y0 = MIN(b, d);
r.x1 = MAX(a, c);
r.y1 = MAX(b, d);
return r;
}
 
fz_matrix
pdf_to_matrix(fz_obj *array)
{
fz_matrix m;
m.a = fz_to_real(fz_array_get(array, 0));
m.b = fz_to_real(fz_array_get(array, 1));
m.c = fz_to_real(fz_array_get(array, 2));
m.d = fz_to_real(fz_array_get(array, 3));
m.e = fz_to_real(fz_array_get(array, 4));
m.f = fz_to_real(fz_array_get(array, 5));
return m;
}
 
/* Convert Unicode/PdfDocEncoding string into utf-8 */
char *
pdf_to_utf8(fz_obj *src)
{
unsigned char *srcptr = (unsigned char *) fz_to_str_buf(src);
char *dstptr, *dst;
int srclen = fz_to_str_len(src);
int dstlen = 0;
int ucs;
int i;
 
if (srclen > 2 && srcptr[0] == 254 && srcptr[1] == 255)
{
for (i = 2; i < srclen; i += 2)
{
ucs = (srcptr[i] << 8) | srcptr[i+1];
dstlen += runelen(ucs);
}
 
dstptr = dst = fz_malloc(dstlen + 1);
 
for (i = 2; i < srclen; i += 2)
{
ucs = (srcptr[i] << 8) | srcptr[i+1];
dstptr += runetochar(dstptr, &ucs);
}
}
 
else
{
for (i = 0; i < srclen; i++)
dstlen += runelen(pdf_doc_encoding[srcptr[i]]);
 
dstptr = dst = fz_malloc(dstlen + 1);
 
for (i = 0; i < srclen; i++)
{
ucs = pdf_doc_encoding[srcptr[i]];
dstptr += runetochar(dstptr, &ucs);
}
}
 
*dstptr = '\0';
return dst;
}
 
/* Convert Unicode/PdfDocEncoding string into ucs-2 */
unsigned short *
pdf_to_ucs2(fz_obj *src)
{
unsigned char *srcptr = (unsigned char *) fz_to_str_buf(src);
unsigned short *dstptr, *dst;
int srclen = fz_to_str_len(src);
int i;
 
if (srclen > 2 && srcptr[0] == 254 && srcptr[1] == 255)
{
dstptr = dst = fz_calloc((srclen - 2) / 2 + 1, sizeof(short));
for (i = 2; i < srclen; i += 2)
*dstptr++ = (srcptr[i] << 8) | srcptr[i+1];
}
 
else
{
dstptr = dst = fz_calloc(srclen + 1, sizeof(short));
for (i = 0; i < srclen; i++)
*dstptr++ = pdf_doc_encoding[srcptr[i]];
}
 
*dstptr = '\0';
return dst;
}
 
/* Convert UCS-2 string into PdfDocEncoding for authentication */
char *
pdf_from_ucs2(unsigned short *src)
{
int i, j, len;
char *docstr;
 
len = 0;
while (src[len])
len++;
 
docstr = fz_malloc(len + 1);
 
for (i = 0; i < len; i++)
{
/* shortcut: check if the character has the same code point in both encodings */
if (0 < src[i] && src[i] < 256 && pdf_doc_encoding[src[i]] == src[i]) {
docstr[i] = src[i];
continue;
}
 
/* search through pdf_docencoding for the character's code point */
for (j = 0; j < 256; j++)
if (pdf_doc_encoding[j] == src[i])
break;
docstr[i] = j;
 
/* fail, if a character can't be encoded */
if (!docstr[i])
{
fz_free(docstr);
return NULL;
}
}
docstr[len] = '\0';
 
return docstr;
}
 
fz_obj *
pdf_to_utf8_name(fz_obj *src)
{
char *buf = pdf_to_utf8(src);
fz_obj *dst = fz_new_name(buf);
fz_free(buf);
return dst;
}
 
fz_error
pdf_parse_array(fz_obj **op, pdf_xref *xref, fz_stream *file, char *buf, int cap)
{
fz_error error = fz_okay;
fz_obj *ary = NULL;
fz_obj *obj = NULL;
int a = 0, b = 0, n = 0;
int tok;
int len;
 
ary = fz_new_array(4);
 
while (1)
{
error = pdf_lex(&tok, file, buf, cap, &len);
if (error)
{
fz_drop_obj(ary);
return fz_rethrow(error, "cannot parse array");
}
 
if (tok != PDF_TOK_INT && tok != PDF_TOK_R)
{
if (n > 0)
{
obj = fz_new_int(a);
fz_array_push(ary, obj);
fz_drop_obj(obj);
}
if (n > 1)
{
obj = fz_new_int(b);
fz_array_push(ary, obj);
fz_drop_obj(obj);
}
n = 0;
}
 
if (tok == PDF_TOK_INT && n == 2)
{
obj = fz_new_int(a);
fz_array_push(ary, obj);
fz_drop_obj(obj);
a = b;
n --;
}
 
switch (tok)
{
case PDF_TOK_CLOSE_ARRAY:
*op = ary;
return fz_okay;
 
case PDF_TOK_INT:
if (n == 0)
a = atoi(buf);
if (n == 1)
b = atoi(buf);
n ++;
break;
 
case PDF_TOK_R:
if (n != 2)
{
fz_drop_obj(ary);
return fz_throw("cannot parse indirect reference in array");
}
obj = fz_new_indirect(a, b, xref);
fz_array_push(ary, obj);
fz_drop_obj(obj);
n = 0;
break;
 
case PDF_TOK_OPEN_ARRAY:
error = pdf_parse_array(&obj, xref, file, buf, cap);
if (error)
{
fz_drop_obj(ary);
return fz_rethrow(error, "cannot parse array");
}
fz_array_push(ary, obj);
fz_drop_obj(obj);
break;
 
case PDF_TOK_OPEN_DICT:
error = pdf_parse_dict(&obj, xref, file, buf, cap);
if (error)
{
fz_drop_obj(ary);
return fz_rethrow(error, "cannot parse array");
}
fz_array_push(ary, obj);
fz_drop_obj(obj);
break;
 
case PDF_TOK_NAME:
obj = fz_new_name(buf);
fz_array_push(ary, obj);
fz_drop_obj(obj);
break;
case PDF_TOK_REAL:
obj = fz_new_real(fz_atof(buf));
fz_array_push(ary, obj);
fz_drop_obj(obj);
break;
case PDF_TOK_STRING:
obj = fz_new_string(buf, len);
fz_array_push(ary, obj);
fz_drop_obj(obj);
break;
case PDF_TOK_TRUE:
obj = fz_new_bool(1);
fz_array_push(ary, obj);
fz_drop_obj(obj);
break;
case PDF_TOK_FALSE:
obj = fz_new_bool(0);
fz_array_push(ary, obj);
fz_drop_obj(obj);
break;
case PDF_TOK_NULL:
obj = fz_new_null();
fz_array_push(ary, obj);
fz_drop_obj(obj);
break;
 
default:
fz_drop_obj(ary);
return fz_throw("cannot parse token in array");
}
}
}
 
fz_error
pdf_parse_dict(fz_obj **op, pdf_xref *xref, fz_stream *file, char *buf, int cap)
{
fz_error error = fz_okay;
fz_obj *dict = NULL;
fz_obj *key = NULL;
fz_obj *val = NULL;
int tok;
int len;
int a, b;
 
dict = fz_new_dict(8);
 
while (1)
{
error = pdf_lex(&tok, file, buf, cap, &len);
if (error)
{
fz_drop_obj(dict);
return fz_rethrow(error, "cannot parse dict");
}
 
skip:
if (tok == PDF_TOK_CLOSE_DICT)
{
*op = dict;
return fz_okay;
}
 
/* for BI .. ID .. EI in content streams */
if (tok == PDF_TOK_KEYWORD && !strcmp(buf, "ID"))
{
*op = dict;
return fz_okay;
}
 
if (tok != PDF_TOK_NAME)
{
fz_drop_obj(dict);
return fz_throw("invalid key in dict");
}
 
key = fz_new_name(buf);
 
error = pdf_lex(&tok, file, buf, cap, &len);
if (error)
{
fz_drop_obj(key);
fz_drop_obj(dict);
return fz_rethrow(error, "cannot parse dict");
}
 
switch (tok)
{
case PDF_TOK_OPEN_ARRAY:
error = pdf_parse_array(&val, xref, file, buf, cap);
if (error)
{
fz_drop_obj(key);
fz_drop_obj(dict);
return fz_rethrow(error, "cannot parse dict");
}
break;
 
case PDF_TOK_OPEN_DICT:
error = pdf_parse_dict(&val, xref, file, buf, cap);
if (error)
{
fz_drop_obj(key);
fz_drop_obj(dict);
return fz_rethrow(error, "cannot parse dict");
}
break;
 
case PDF_TOK_NAME: val = fz_new_name(buf); break;
case PDF_TOK_REAL: val = fz_new_real(fz_atof(buf)); break;
case PDF_TOK_STRING: val = fz_new_string(buf, len); break;
case PDF_TOK_TRUE: val = fz_new_bool(1); break;
case PDF_TOK_FALSE: val = fz_new_bool(0); break;
case PDF_TOK_NULL: val = fz_new_null(); break;
 
case PDF_TOK_INT:
/* 64-bit to allow for numbers > INT_MAX and overflow */
a = (int) strtoll(buf, 0, 10);
error = pdf_lex(&tok, file, buf, cap, &len);
if (error)
{
fz_drop_obj(key);
fz_drop_obj(dict);
return fz_rethrow(error, "cannot parse dict");
}
if (tok == PDF_TOK_CLOSE_DICT || tok == PDF_TOK_NAME ||
(tok == PDF_TOK_KEYWORD && !strcmp(buf, "ID")))
{
val = fz_new_int(a);
fz_dict_put(dict, key, val);
fz_drop_obj(val);
fz_drop_obj(key);
goto skip;
}
if (tok == PDF_TOK_INT)
{
b = atoi(buf);
error = pdf_lex(&tok, file, buf, cap, &len);
if (error)
{
fz_drop_obj(key);
fz_drop_obj(dict);
return fz_rethrow(error, "cannot parse dict");
}
if (tok == PDF_TOK_R)
{
val = fz_new_indirect(a, b, xref);
break;
}
}
fz_drop_obj(key);
fz_drop_obj(dict);
return fz_throw("invalid indirect reference in dict");
 
default:
fz_drop_obj(key);
fz_drop_obj(dict);
return fz_throw("unknown token in dict");
}
 
fz_dict_put(dict, key, val);
fz_drop_obj(val);
fz_drop_obj(key);
}
}
 
fz_error
pdf_parse_stm_obj(fz_obj **op, pdf_xref *xref, fz_stream *file, char *buf, int cap)
{
fz_error error;
int tok;
int len;
 
error = pdf_lex(&tok, file, buf, cap, &len);
if (error)
return fz_rethrow(error, "cannot parse token in object stream");
 
switch (tok)
{
case PDF_TOK_OPEN_ARRAY:
error = pdf_parse_array(op, xref, file, buf, cap);
if (error)
return fz_rethrow(error, "cannot parse object stream");
break;
case PDF_TOK_OPEN_DICT:
error = pdf_parse_dict(op, xref, file, buf, cap);
if (error)
return fz_rethrow(error, "cannot parse object stream");
break;
case PDF_TOK_NAME: *op = fz_new_name(buf); break;
case PDF_TOK_REAL: *op = fz_new_real(fz_atof(buf)); break;
case PDF_TOK_STRING: *op = fz_new_string(buf, len); break;
case PDF_TOK_TRUE: *op = fz_new_bool(1); break;
case PDF_TOK_FALSE: *op = fz_new_bool(0); break;
case PDF_TOK_NULL: *op = fz_new_null(); break;
case PDF_TOK_INT: *op = fz_new_int(atoi(buf)); break;
default: return fz_throw("unknown token in object stream");
}
 
return fz_okay;
}
 
fz_error
pdf_parse_ind_obj(fz_obj **op, pdf_xref *xref,
fz_stream *file, char *buf, int cap,
int *onum, int *ogen, int *ostmofs)
{
fz_error error = fz_okay;
fz_obj *obj = NULL;
int num = 0, gen = 0, stm_ofs;
int tok;
int len;
int a, b;
 
error = pdf_lex(&tok, file, buf, cap, &len);
if (error)
return fz_rethrow(error, "cannot parse indirect object (%d %d R)", num, gen);
if (tok != PDF_TOK_INT)
return fz_throw("expected object number (%d %d R)", num, gen);
num = atoi(buf);
 
error = pdf_lex(&tok, file, buf, cap, &len);
if (error)
return fz_rethrow(error, "cannot parse indirect object (%d %d R)", num, gen);
if (tok != PDF_TOK_INT)
return fz_throw("expected generation number (%d %d R)", num, gen);
gen = atoi(buf);
 
error = pdf_lex(&tok, file, buf, cap, &len);
if (error)
return fz_rethrow(error, "cannot parse indirect object (%d %d R)", num, gen);
if (tok != PDF_TOK_OBJ)
return fz_throw("expected 'obj' keyword (%d %d R)", num, gen);
 
error = pdf_lex(&tok, file, buf, cap, &len);
if (error)
return fz_rethrow(error, "cannot parse indirect object (%d %d R)", num, gen);
 
switch (tok)
{
case PDF_TOK_OPEN_ARRAY:
error = pdf_parse_array(&obj, xref, file, buf, cap);
if (error)
return fz_rethrow(error, "cannot parse indirect object (%d %d R)", num, gen);
break;
 
case PDF_TOK_OPEN_DICT:
error = pdf_parse_dict(&obj, xref, file, buf, cap);
if (error)
return fz_rethrow(error, "cannot parse indirect object (%d %d R)", num, gen);
break;
 
case PDF_TOK_NAME: obj = fz_new_name(buf); break;
case PDF_TOK_REAL: obj = fz_new_real(fz_atof(buf)); break;
case PDF_TOK_STRING: obj = fz_new_string(buf, len); break;
case PDF_TOK_TRUE: obj = fz_new_bool(1); break;
case PDF_TOK_FALSE: obj = fz_new_bool(0); break;
case PDF_TOK_NULL: obj = fz_new_null(); break;
 
case PDF_TOK_INT:
a = atoi(buf);
error = pdf_lex(&tok, file, buf, cap, &len);
if (error)
return fz_rethrow(error, "cannot parse indirect object (%d %d R)", num, gen);
if (tok == PDF_TOK_STREAM || tok == PDF_TOK_ENDOBJ)
{
obj = fz_new_int(a);
goto skip;
}
if (tok == PDF_TOK_INT)
{
b = atoi(buf);
error = pdf_lex(&tok, file, buf, cap, &len);
if (error)
return fz_rethrow(error, "cannot parse indirect object (%d %d R)", num, gen);
if (tok == PDF_TOK_R)
{
obj = fz_new_indirect(a, b, xref);
break;
}
}
return fz_throw("expected 'R' keyword (%d %d R)", num, gen);
 
case PDF_TOK_ENDOBJ:
obj = fz_new_null();
goto skip;
 
default:
return fz_throw("syntax error in object (%d %d R)", num, gen);
}
 
error = pdf_lex(&tok, file, buf, cap, &len);
if (error)
{
fz_drop_obj(obj);
return fz_rethrow(error, "cannot parse indirect object (%d %d R)", num, gen);
}
 
skip:
if (tok == PDF_TOK_STREAM)
{
int c = fz_read_byte(file);
while (c == ' ')
c = fz_read_byte(file);
if (c == '\r')
{
c = fz_peek_byte(file);
if (c != '\n')
fz_warn("line feed missing after stream begin marker (%d %d R)", num, gen);
else
fz_read_byte(file);
}
stm_ofs = fz_tell(file);
}
else if (tok == PDF_TOK_ENDOBJ)
{
stm_ofs = 0;
}
else
{
fz_warn("expected 'endobj' or 'stream' keyword (%d %d R)", num, gen);
stm_ofs = 0;
}
 
if (onum) *onum = num;
if (ogen) *ogen = gen;
if (ostmofs) *ostmofs = stm_ofs;
*op = obj;
return fz_okay;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_pattern.c
0,0 → 1,72
#include "fitz.h"
#include "mupdf.h"
 
fz_error
pdf_load_pattern(pdf_pattern **patp, pdf_xref *xref, fz_obj *dict)
{
fz_error error;
pdf_pattern *pat;
fz_obj *obj;
 
if ((*patp = pdf_find_item(xref->store, pdf_drop_pattern, dict)))
{
pdf_keep_pattern(*patp);
return fz_okay;
}
 
pat = fz_malloc(sizeof(pdf_pattern));
pat->refs = 1;
pat->resources = NULL;
pat->contents = NULL;
 
/* Store pattern now, to avoid possible recursion if objects refer back to this one */
pdf_store_item(xref->store, pdf_keep_pattern, pdf_drop_pattern, dict, pat);
 
pat->ismask = fz_to_int(fz_dict_gets(dict, "PaintType")) == 2;
pat->xstep = fz_to_real(fz_dict_gets(dict, "XStep"));
pat->ystep = fz_to_real(fz_dict_gets(dict, "YStep"));
 
obj = fz_dict_gets(dict, "BBox");
pat->bbox = pdf_to_rect(obj);
 
obj = fz_dict_gets(dict, "Matrix");
if (obj)
pat->matrix = pdf_to_matrix(obj);
else
pat->matrix = fz_identity;
 
pat->resources = fz_dict_gets(dict, "Resources");
if (pat->resources)
fz_keep_obj(pat->resources);
 
error = pdf_load_stream(&pat->contents, xref, fz_to_num(dict), fz_to_gen(dict));
if (error)
{
pdf_remove_item(xref->store, pdf_drop_pattern, dict);
pdf_drop_pattern(pat);
return fz_rethrow(error, "cannot load pattern stream (%d %d R)", fz_to_num(dict), fz_to_gen(dict));
}
 
*patp = pat;
return fz_okay;
}
 
pdf_pattern *
pdf_keep_pattern(pdf_pattern *pat)
{
pat->refs ++;
return pat;
}
 
void
pdf_drop_pattern(pdf_pattern *pat)
{
if (pat && --pat->refs == 0)
{
if (pat->resources)
fz_drop_obj(pat->resources);
if (pat->contents)
fz_drop_buffer(pat->contents);
fz_free(pat);
}
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_repair.c
0,0 → 1,463
#include "fitz.h"
#include "mupdf.h"
 
/* Scan file for objects and reconstruct xref table */
 
struct entry
{
int num;
int gen;
int ofs;
int stm_ofs;
int stm_len;
};
 
static fz_error
pdf_repair_obj(fz_stream *file, char *buf, int cap, int *stmofsp, int *stmlenp, fz_obj **encrypt, fz_obj **id)
{
fz_error error;
int tok;
int stm_len;
int len;
int n;
 
*stmofsp = 0;
*stmlenp = -1;
 
stm_len = 0;
 
error = pdf_lex(&tok, file, buf, cap, &len);
if (error)
return fz_rethrow(error, "cannot parse object");
if (tok == PDF_TOK_OPEN_DICT)
{
fz_obj *dict, *obj;
 
/* Send NULL xref so we don't try to resolve references */
error = pdf_parse_dict(&dict, NULL, file, buf, cap);
if (error)
return fz_rethrow(error, "cannot parse object");
 
obj = fz_dict_gets(dict, "Type");
if (fz_is_name(obj) && !strcmp(fz_to_name(obj), "XRef"))
{
obj = fz_dict_gets(dict, "Encrypt");
if (obj)
{
if (*encrypt)
fz_drop_obj(*encrypt);
*encrypt = fz_keep_obj(obj);
}
 
obj = fz_dict_gets(dict, "ID");
if (obj)
{
if (*id)
fz_drop_obj(*id);
*id = fz_keep_obj(obj);
}
}
 
obj = fz_dict_gets(dict, "Length");
if (fz_is_int(obj))
stm_len = fz_to_int(obj);
 
fz_drop_obj(dict);
}
 
while ( tok != PDF_TOK_STREAM &&
tok != PDF_TOK_ENDOBJ &&
tok != PDF_TOK_ERROR &&
tok != PDF_TOK_EOF )
{
error = pdf_lex(&tok, file, buf, cap, &len);
if (error)
return fz_rethrow(error, "cannot scan for endobj or stream token");
}
 
if (tok == PDF_TOK_STREAM)
{
int c = fz_read_byte(file);
if (c == '\r') {
c = fz_peek_byte(file);
if (c == '\n')
fz_read_byte(file);
}
 
*stmofsp = fz_tell(file);
if (*stmofsp < 0)
return fz_throw("cannot seek in file");
 
if (stm_len > 0)
{
fz_seek(file, *stmofsp + stm_len, 0);
error = pdf_lex(&tok, file, buf, cap, &len);
if (error)
fz_catch(error, "cannot find endstream token, falling back to scanning");
if (tok == PDF_TOK_ENDSTREAM)
goto atobjend;
fz_seek(file, *stmofsp, 0);
}
 
n = fz_read(file, (unsigned char *) buf, 9);
if (n < 0)
return fz_rethrow(n, "cannot read from file");
 
while (memcmp(buf, "endstream", 9) != 0)
{
c = fz_read_byte(file);
if (c == EOF)
break;
memmove(buf, buf + 1, 8);
buf[8] = c;
}
 
*stmlenp = fz_tell(file) - *stmofsp - 9;
 
atobjend:
error = pdf_lex(&tok, file, buf, cap, &len);
if (error)
return fz_rethrow(error, "cannot scan for endobj token");
if (tok != PDF_TOK_ENDOBJ)
fz_warn("object missing 'endobj' token");
}
 
return fz_okay;
}
 
static fz_error
pdf_repair_obj_stm(pdf_xref *xref, int num, int gen)
{
fz_error error;
fz_obj *obj;
fz_stream *stm;
int tok;
int i, n, count;
char buf[256];
 
error = pdf_load_object(&obj, xref, num, gen);
if (error)
return fz_rethrow(error, "cannot load object stream object (%d %d R)", num, gen);
 
count = fz_to_int(fz_dict_gets(obj, "N"));
 
fz_drop_obj(obj);
 
error = pdf_open_stream(&stm, xref, num, gen);
if (error)
return fz_rethrow(error, "cannot open object stream object (%d %d R)", num, gen);
 
for (i = 0; i < count; i++)
{
error = pdf_lex(&tok, stm, buf, sizeof buf, &n);
if (error || tok != PDF_TOK_INT)
{
fz_close(stm);
return fz_rethrow(error, "corrupt object stream (%d %d R)", num, gen);
}
 
n = atoi(buf);
if (n >= xref->len)
pdf_resize_xref(xref, n + 1);
 
xref->table[n].ofs = num;
xref->table[n].gen = i;
xref->table[n].stm_ofs = 0;
xref->table[n].obj = NULL;
xref->table[n].type = 'o';
 
error = pdf_lex(&tok, stm, buf, sizeof buf, &n);
if (error || tok != PDF_TOK_INT)
{
fz_close(stm);
return fz_rethrow(error, "corrupt object stream (%d %d R)", num, gen);
}
}
 
fz_close(stm);
return fz_okay;
}
 
fz_error
pdf_repair_xref(pdf_xref *xref, char *buf, int bufsize)
{
fz_error error;
fz_obj *dict, *obj;
fz_obj *length;
 
fz_obj *encrypt = NULL;
fz_obj *id = NULL;
fz_obj *root = NULL;
fz_obj *info = NULL;
 
struct entry *list = NULL;
int listlen;
int listcap;
int maxnum = 0;
 
int num = 0;
int gen = 0;
int tmpofs, numofs = 0, genofs = 0;
int stm_len, stm_ofs = 0;
int tok;
int next;
int i, n, c;
 
fz_seek(xref->file, 0, 0);
 
listlen = 0;
listcap = 1024;
list = fz_calloc(listcap, sizeof(struct entry));
 
/* look for '%PDF' version marker within first kilobyte of file */
n = fz_read(xref->file, (unsigned char *)buf, MAX(bufsize, 1024));
if (n < 0)
{
error = fz_rethrow(n, "cannot read from file");
goto cleanup;
}
 
fz_seek(xref->file, 0, 0);
for (i = 0; i < n - 4; i++)
{
if (memcmp(buf + i, "%PDF", 4) == 0)
{
fz_seek(xref->file, i + 8, 0); /* skip "%PDF-X.Y" */
break;
}
}
 
/* skip comment line after version marker since some generators
* forget to terminate the comment with a newline */
c = fz_read_byte(xref->file);
while (c >= 0 && (c == ' ' || c == '%'))
c = fz_read_byte(xref->file);
fz_unread_byte(xref->file);
 
while (1)
{
tmpofs = fz_tell(xref->file);
if (tmpofs < 0)
{
error = fz_throw("cannot tell in file");
goto cleanup;
}
 
error = pdf_lex(&tok, xref->file, buf, bufsize, &n);
if (error)
{
fz_catch(error, "ignoring the rest of the file");
break;
}
 
if (tok == PDF_TOK_INT)
{
numofs = genofs;
num = gen;
genofs = tmpofs;
gen = atoi(buf);
}
 
else if (tok == PDF_TOK_OBJ)
{
error = pdf_repair_obj(xref->file, buf, bufsize, &stm_ofs, &stm_len, &encrypt, &id);
if (error)
{
error = fz_rethrow(error, "cannot parse object (%d %d R)", num, gen);
goto cleanup;
}
 
if (listlen + 1 == listcap)
{
listcap = (listcap * 3) / 2;
list = fz_realloc(list, listcap, sizeof(struct entry));
}
 
list[listlen].num = num;
list[listlen].gen = gen;
list[listlen].ofs = numofs;
list[listlen].stm_ofs = stm_ofs;
list[listlen].stm_len = stm_len;
listlen ++;
 
if (num > maxnum)
maxnum = num;
}
 
/* trailer dictionary */
else if (tok == PDF_TOK_OPEN_DICT)
{
error = pdf_parse_dict(&dict, xref, xref->file, buf, bufsize);
if (error)
{
error = fz_rethrow(error, "cannot parse object");
goto cleanup;
}
 
obj = fz_dict_gets(dict, "Encrypt");
if (obj)
{
if (encrypt)
fz_drop_obj(encrypt);
encrypt = fz_keep_obj(obj);
}
 
obj = fz_dict_gets(dict, "ID");
if (obj)
{
if (id)
fz_drop_obj(id);
id = fz_keep_obj(obj);
}
 
obj = fz_dict_gets(dict, "Root");
if (obj)
{
if (root)
fz_drop_obj(root);
root = fz_keep_obj(obj);
}
 
obj = fz_dict_gets(dict, "Info");
if (obj)
{
if (info)
fz_drop_obj(info);
info = fz_keep_obj(obj);
}
 
fz_drop_obj(dict);
}
 
else if (tok == PDF_TOK_ERROR)
fz_read_byte(xref->file);
 
else if (tok == PDF_TOK_EOF)
break;
}
 
/* make xref reasonable */
 
pdf_resize_xref(xref, maxnum + 1);
 
for (i = 0; i < listlen; i++)
{
xref->table[list[i].num].type = 'n';
xref->table[list[i].num].ofs = list[i].ofs;
xref->table[list[i].num].gen = list[i].gen;
 
xref->table[list[i].num].stm_ofs = list[i].stm_ofs;
 
/* corrected stream length */
if (list[i].stm_len >= 0)
{
error = pdf_load_object(&dict, xref, list[i].num, list[i].gen);
if (error)
{
error = fz_rethrow(error, "cannot load stream object (%d %d R)", list[i].num, list[i].gen);
goto cleanup;
}
 
length = fz_new_int(list[i].stm_len);
fz_dict_puts(dict, "Length", length);
fz_drop_obj(length);
 
fz_drop_obj(dict);
}
 
}
 
xref->table[0].type = 'f';
xref->table[0].ofs = 0;
xref->table[0].gen = 65535;
xref->table[0].stm_ofs = 0;
xref->table[0].obj = NULL;
 
next = 0;
for (i = xref->len - 1; i >= 0; i--)
{
if (xref->table[i].type == 'f')
{
xref->table[i].ofs = next;
if (xref->table[i].gen < 65535)
xref->table[i].gen ++;
next = i;
}
}
 
/* create a repaired trailer, Root will be added later */
 
xref->trailer = fz_new_dict(5);
 
obj = fz_new_int(maxnum + 1);
fz_dict_puts(xref->trailer, "Size", obj);
fz_drop_obj(obj);
 
if (root)
{
fz_dict_puts(xref->trailer, "Root", root);
fz_drop_obj(root);
}
if (info)
{
fz_dict_puts(xref->trailer, "Info", info);
fz_drop_obj(info);
}
 
if (encrypt)
{
if (fz_is_indirect(encrypt))
{
/* create new reference with non-NULL xref pointer */
obj = fz_new_indirect(fz_to_num(encrypt), fz_to_gen(encrypt), xref);
fz_drop_obj(encrypt);
encrypt = obj;
}
fz_dict_puts(xref->trailer, "Encrypt", encrypt);
fz_drop_obj(encrypt);
}
 
if (id)
{
if (fz_is_indirect(id))
{
/* create new reference with non-NULL xref pointer */
obj = fz_new_indirect(fz_to_num(id), fz_to_gen(id), xref);
fz_drop_obj(id);
id = obj;
}
fz_dict_puts(xref->trailer, "ID", id);
fz_drop_obj(id);
}
 
fz_free(list);
return fz_okay;
 
cleanup:
if (encrypt) fz_drop_obj(encrypt);
if (id) fz_drop_obj(id);
if (root) fz_drop_obj(root);
if (info) fz_drop_obj(info);
fz_free(list);
return error; /* already rethrown */
}
 
fz_error
pdf_repair_obj_stms(pdf_xref *xref)
{
fz_obj *dict;
int i;
 
for (i = 0; i < xref->len; i++)
{
if (xref->table[i].stm_ofs)
{
pdf_load_object(&dict, xref, i, 0);
if (!strcmp(fz_to_name(fz_dict_gets(dict, "Type")), "ObjStm"))
pdf_repair_obj_stm(xref, i, 0);
fz_drop_obj(dict);
}
}
 
return fz_okay;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_shade.c
0,0 → 1,1140
#include "fitz.h"
#include "mupdf.h"
 
#define HUGENUM 32000 /* how far to extend axial/radial shadings */
#define FUNSEGS 32 /* size of sampled mesh for function-based shadings */
#define RADSEGS 32 /* how many segments to generate for radial meshes */
#define SUBDIV 3 /* how many levels to subdivide patches */
 
struct vertex
{
float x, y;
float c[FZ_MAX_COLORS];
};
 
static void
pdf_grow_mesh(fz_shade *shade, int amount)
{
if (shade->mesh_len + amount < shade->mesh_cap)
return;
 
if (shade->mesh_cap == 0)
shade->mesh_cap = 1024;
 
while (shade->mesh_len + amount > shade->mesh_cap)
shade->mesh_cap = (shade->mesh_cap * 3) / 2;
 
shade->mesh = fz_realloc(shade->mesh, shade->mesh_cap, sizeof(float));
}
 
static void
pdf_add_vertex(fz_shade *shade, struct vertex *v)
{
int ncomp = shade->use_function ? 1 : shade->colorspace->n;
int i;
pdf_grow_mesh(shade, 2 + ncomp);
shade->mesh[shade->mesh_len++] = v->x;
shade->mesh[shade->mesh_len++] = v->y;
for (i = 0; i < ncomp; i++)
shade->mesh[shade->mesh_len++] = v->c[i];
}
 
static void
pdf_add_triangle(fz_shade *shade,
struct vertex *v0,
struct vertex *v1,
struct vertex *v2)
{
pdf_add_vertex(shade, v0);
pdf_add_vertex(shade, v1);
pdf_add_vertex(shade, v2);
}
 
static void
pdf_add_quad(fz_shade *shade,
struct vertex *v0,
struct vertex *v1,
struct vertex *v2,
struct vertex *v3)
{
pdf_add_triangle(shade, v0, v1, v3);
pdf_add_triangle(shade, v1, v3, v2);
}
 
/* Subdivide and tesselate tensor-patches */
 
typedef struct pdf_tensor_patch_s pdf_tensor_patch;
 
struct pdf_tensor_patch_s
{
fz_point pole[4][4];
float color[4][FZ_MAX_COLORS];
};
 
static void
triangulate_patch(pdf_tensor_patch p, fz_shade *shade)
{
struct vertex v0, v1, v2, v3;
 
v0.x = p.pole[0][0].x;
v0.y = p.pole[0][0].y;
memcpy(v0.c, p.color[0], sizeof(v0.c));
 
v1.x = p.pole[0][3].x;
v1.y = p.pole[0][3].y;
memcpy(v1.c, p.color[1], sizeof(v1.c));
 
v2.x = p.pole[3][3].x;
v2.y = p.pole[3][3].y;
memcpy(v2.c, p.color[2], sizeof(v2.c));
 
v3.x = p.pole[3][0].x;
v3.y = p.pole[3][0].y;
memcpy(v3.c, p.color[3], sizeof(v3.c));
 
pdf_add_quad(shade, &v0, &v1, &v2, &v3);
}
 
static inline void midcolor(float *c, float *c1, float *c2)
{
int i;
for (i = 0; i < FZ_MAX_COLORS; i++)
c[i] = (c1[i] + c2[i]) * 0.5f;
}
 
static void
split_curve(fz_point *pole, fz_point *q0, fz_point *q1, int polestep)
{
/*
split bezier curve given by control points pole[0]..pole[3]
using de casteljau algo at midpoint and build two new
bezier curves q0[0]..q0[3] and q1[0]..q1[3]. all indices
should be multiplies by polestep == 1 for vertical bezier
curves in patch and == 4 for horizontal bezier curves due
to C's multi-dimensional matrix memory layout.
*/
 
float x12 = (pole[1 * polestep].x + pole[2 * polestep].x) * 0.5f;
float y12 = (pole[1 * polestep].y + pole[2 * polestep].y) * 0.5f;
 
q0[1 * polestep].x = (pole[0 * polestep].x + pole[1 * polestep].x) * 0.5f;
q0[1 * polestep].y = (pole[0 * polestep].y + pole[1 * polestep].y) * 0.5f;
q1[2 * polestep].x = (pole[2 * polestep].x + pole[3 * polestep].x) * 0.5f;
q1[2 * polestep].y = (pole[2 * polestep].y + pole[3 * polestep].y) * 0.5f;
 
q0[2 * polestep].x = (q0[1 * polestep].x + x12) * 0.5f;
q0[2 * polestep].y = (q0[1 * polestep].y + y12) * 0.5f;
q1[1 * polestep].x = (x12 + q1[2 * polestep].x) * 0.5f;
q1[1 * polestep].y = (y12 + q1[2 * polestep].y) * 0.5f;
 
q0[3 * polestep].x = (q0[2 * polestep].x + q1[1 * polestep].x) * 0.5f;
q0[3 * polestep].y = (q0[2 * polestep].y + q1[1 * polestep].y) * 0.5f;
q1[0 * polestep].x = (q0[2 * polestep].x + q1[1 * polestep].x) * 0.5f;
q1[0 * polestep].y = (q0[2 * polestep].y + q1[1 * polestep].y) * 0.5f;
 
q0[0 * polestep].x = pole[0 * polestep].x;
q0[0 * polestep].y = pole[0 * polestep].y;
q1[3 * polestep].x = pole[3 * polestep].x;
q1[3 * polestep].y = pole[3 * polestep].y;
}
 
static void
split_stripe(pdf_tensor_patch *p, pdf_tensor_patch *s0, pdf_tensor_patch *s1)
{
/*
split all horizontal bezier curves in patch,
creating two new patches with half the width.
*/
split_curve(&p->pole[0][0], &s0->pole[0][0], &s1->pole[0][0], 4);
split_curve(&p->pole[0][1], &s0->pole[0][1], &s1->pole[0][1], 4);
split_curve(&p->pole[0][2], &s0->pole[0][2], &s1->pole[0][2], 4);
split_curve(&p->pole[0][3], &s0->pole[0][3], &s1->pole[0][3], 4);
 
/* interpolate the colors for the two new patches. */
memcpy(s0->color[0], p->color[0], sizeof(s0->color[0]));
memcpy(s0->color[1], p->color[1], sizeof(s0->color[1]));
midcolor(s0->color[2], p->color[1], p->color[2]);
midcolor(s0->color[3], p->color[0], p->color[3]);
 
memcpy(s1->color[0], s0->color[3], sizeof(s1->color[0]));
memcpy(s1->color[1], s0->color[2], sizeof(s1->color[1]));
memcpy(s1->color[2], p->color[2], sizeof(s1->color[2]));
memcpy(s1->color[3], p->color[3], sizeof(s1->color[3]));
}
 
static void
draw_stripe(pdf_tensor_patch *p, fz_shade *shade, int depth)
{
pdf_tensor_patch s0, s1;
 
/* split patch into two half-height patches */
split_stripe(p, &s0, &s1);
 
depth--;
if (depth == 0)
{
/* if no more subdividing, draw two new patches... */
triangulate_patch(s0, shade);
triangulate_patch(s1, shade);
}
else
{
/* ...otherwise, continue subdividing. */
draw_stripe(&s0, shade, depth);
draw_stripe(&s1, shade, depth);
}
}
 
static void
split_patch(pdf_tensor_patch *p, pdf_tensor_patch *s0, pdf_tensor_patch *s1)
{
/*
split all vertical bezier curves in patch,
creating two new patches with half the height.
*/
split_curve(p->pole[0], s0->pole[0], s1->pole[0], 1);
split_curve(p->pole[1], s0->pole[1], s1->pole[1], 1);
split_curve(p->pole[2], s0->pole[2], s1->pole[2], 1);
split_curve(p->pole[3], s0->pole[3], s1->pole[3], 1);
 
/* interpolate the colors for the two new patches. */
memcpy(s0->color[0], p->color[0], sizeof(s0->color[0]));
midcolor(s0->color[1], p->color[0], p->color[1]);
midcolor(s0->color[2], p->color[2], p->color[3]);
memcpy(s0->color[3], p->color[3], sizeof(s0->color[3]));
 
memcpy(s1->color[0], s0->color[1], sizeof(s1->color[0]));
memcpy(s1->color[1], p->color[1], sizeof(s1->color[1]));
memcpy(s1->color[2], p->color[2], sizeof(s1->color[2]));
memcpy(s1->color[3], s0->color[2], sizeof(s1->color[3]));
}
 
static void
draw_patch(fz_shade *shade, pdf_tensor_patch *p, int depth, int origdepth)
{
pdf_tensor_patch s0, s1;
 
/* split patch into two half-width patches */
split_patch(p, &s0, &s1);
 
depth--;
if (depth == 0)
{
/* if no more subdividing, draw two new patches... */
draw_stripe(&s0, shade, origdepth);
draw_stripe(&s1, shade, origdepth);
}
else
{
/* ...otherwise, continue subdividing. */
draw_patch(shade, &s0, depth, origdepth);
draw_patch(shade, &s1, depth, origdepth);
}
}
 
static fz_point
pdf_compute_tensor_interior(
fz_point a, fz_point b, fz_point c, fz_point d,
fz_point e, fz_point f, fz_point g, fz_point h)
{
fz_point pt;
 
/* see equations at page 330 in pdf 1.7 */
 
pt.x = -4 * a.x;
pt.x += 6 * (b.x + c.x);
pt.x += -2 * (d.x + e.x);
pt.x += 3 * (f.x + g.x);
pt.x += -1 * h.x;
pt.x /= 9;
 
pt.y = -4 * a.y;
pt.y += 6 * (b.y + c.y);
pt.y += -2 * (d.y + e.y);
pt.y += 3 * (f.y + g.y);
pt.y += -1 * h.y;
pt.y /= 9;
 
return pt;
}
 
static void
pdf_make_tensor_patch(pdf_tensor_patch *p, int type, fz_point *pt)
{
if (type == 6)
{
/* see control point stream order at page 325 in pdf 1.7 */
 
p->pole[0][0] = pt[0];
p->pole[0][1] = pt[1];
p->pole[0][2] = pt[2];
p->pole[0][3] = pt[3];
p->pole[1][3] = pt[4];
p->pole[2][3] = pt[5];
p->pole[3][3] = pt[6];
p->pole[3][2] = pt[7];
p->pole[3][1] = pt[8];
p->pole[3][0] = pt[9];
p->pole[2][0] = pt[10];
p->pole[1][0] = pt[11];
 
/* see equations at page 330 in pdf 1.7 */
 
p->pole[1][1] = pdf_compute_tensor_interior(
p->pole[0][0], p->pole[0][1], p->pole[1][0], p->pole[0][3],
p->pole[3][0], p->pole[3][1], p->pole[1][3], p->pole[3][3]);
 
p->pole[1][2] = pdf_compute_tensor_interior(
p->pole[0][3], p->pole[0][2], p->pole[1][3], p->pole[0][0],
p->pole[3][3], p->pole[3][2], p->pole[1][0], p->pole[3][0]);
 
p->pole[2][1] = pdf_compute_tensor_interior(
p->pole[3][0], p->pole[3][1], p->pole[2][0], p->pole[3][3],
p->pole[0][0], p->pole[0][1], p->pole[2][3], p->pole[0][3]);
 
p->pole[2][2] = pdf_compute_tensor_interior(
p->pole[3][3], p->pole[3][2], p->pole[2][3], p->pole[3][0],
p->pole[0][3], p->pole[0][2], p->pole[2][0], p->pole[0][0]);
}
else if (type == 7)
{
/* see control point stream order at page 330 in pdf 1.7 */
 
p->pole[0][0] = pt[0];
p->pole[0][1] = pt[1];
p->pole[0][2] = pt[2];
p->pole[0][3] = pt[3];
p->pole[1][3] = pt[4];
p->pole[2][3] = pt[5];
p->pole[3][3] = pt[6];
p->pole[3][2] = pt[7];
p->pole[3][1] = pt[8];
p->pole[3][0] = pt[9];
p->pole[2][0] = pt[10];
p->pole[1][0] = pt[11];
p->pole[1][1] = pt[12];
p->pole[1][2] = pt[13];
p->pole[2][2] = pt[14];
p->pole[2][1] = pt[15];
}
}
 
/* Sample various functions into lookup tables */
 
static void
pdf_sample_composite_shade_function(fz_shade *shade, pdf_function *func, float t0, float t1)
{
int i;
float t;
 
for (i = 0; i < 256; i++)
{
t = t0 + (i / 255.0f) * (t1 - t0);
pdf_eval_function(func, &t, 1, shade->function[i], shade->colorspace->n);
shade->function[i][shade->colorspace->n] = 1;
}
}
 
static void
pdf_sample_component_shade_function(fz_shade *shade, int funcs, pdf_function **func, float t0, float t1)
{
int i, k;
float t;
 
for (i = 0; i < 256; i++)
{
t = t0 + (i / 255.0f) * (t1 - t0);
for (k = 0; k < funcs; k++)
pdf_eval_function(func[k], &t, 1, &shade->function[i][k], 1);
shade->function[i][k] = 1;
}
}
 
static void
pdf_sample_shade_function(fz_shade *shade, int funcs, pdf_function **func, float t0, float t1)
{
shade->use_function = 1;
if (funcs == 1)
pdf_sample_composite_shade_function(shade, func[0], t0, t1);
else
pdf_sample_component_shade_function(shade, funcs, func, t0, t1);
}
 
/* Type 1-3 -- Function-based, axial and radial shadings */
 
static void
pdf_load_function_based_shading(fz_shade *shade, pdf_xref *xref, fz_obj *dict, pdf_function *func)
{
fz_obj *obj;
float x0, y0, x1, y1;
fz_matrix matrix;
struct vertex v[4];
int xx, yy;
float x, y;
float xn, yn;
int i;
 
x0 = y0 = 0;
x1 = y1 = 1;
obj = fz_dict_gets(dict, "Domain");
if (fz_array_len(obj) == 4)
{
x0 = fz_to_real(fz_array_get(obj, 0));
x1 = fz_to_real(fz_array_get(obj, 1));
y0 = fz_to_real(fz_array_get(obj, 2));
y1 = fz_to_real(fz_array_get(obj, 3));
}
 
matrix = fz_identity;
obj = fz_dict_gets(dict, "Matrix");
if (fz_array_len(obj) == 6)
matrix = pdf_to_matrix(obj);
 
for (yy = 0; yy < FUNSEGS; yy++)
{
y = y0 + (y1 - y0) * yy / FUNSEGS;
yn = y0 + (y1 - y0) * (yy + 1) / FUNSEGS;
 
for (xx = 0; xx < FUNSEGS; xx++)
{
x = x0 + (x1 - x0) * xx / FUNSEGS;
xn = x0 + (x1 - x0) * (xx + 1) / FUNSEGS;
 
v[0].x = x; v[0].y = y;
v[1].x = xn; v[1].y = y;
v[2].x = xn; v[2].y = yn;
v[3].x = x; v[3].y = yn;
 
for (i = 0; i < 4; i++)
{
fz_point pt;
float fv[2];
 
fv[0] = v[i].x;
fv[1] = v[i].y;
pdf_eval_function(func, fv, 2, v[i].c, shade->colorspace->n);
 
pt.x = v[i].x;
pt.y = v[i].y;
pt = fz_transform_point(matrix, pt);
v[i].x = pt.x;
v[i].y = pt.y;
}
 
pdf_add_quad(shade, &v[0], &v[1], &v[2], &v[3]);
}
}
}
 
static void
pdf_load_axial_shading(fz_shade *shade, pdf_xref *xref, fz_obj *dict, int funcs, pdf_function **func)
{
fz_obj *obj;
float d0, d1;
int e0, e1;
float x0, y0, x1, y1;
struct vertex p1, p2;
 
obj = fz_dict_gets(dict, "Coords");
x0 = fz_to_real(fz_array_get(obj, 0));
y0 = fz_to_real(fz_array_get(obj, 1));
x1 = fz_to_real(fz_array_get(obj, 2));
y1 = fz_to_real(fz_array_get(obj, 3));
 
d0 = 0;
d1 = 1;
obj = fz_dict_gets(dict, "Domain");
if (fz_array_len(obj) == 2)
{
d0 = fz_to_real(fz_array_get(obj, 0));
d1 = fz_to_real(fz_array_get(obj, 1));
}
 
e0 = e1 = 0;
obj = fz_dict_gets(dict, "Extend");
if (fz_array_len(obj) == 2)
{
e0 = fz_to_bool(fz_array_get(obj, 0));
e1 = fz_to_bool(fz_array_get(obj, 1));
}
 
pdf_sample_shade_function(shade, funcs, func, d0, d1);
 
shade->type = FZ_LINEAR;
 
shade->extend[0] = e0;
shade->extend[1] = e1;
 
p1.x = x0;
p1.y = y0;
p1.c[0] = 0;
pdf_add_vertex(shade, &p1);
 
p2.x = x1;
p2.y = y1;
p2.c[0] = 0;
pdf_add_vertex(shade, &p2);
}
 
static void
pdf_load_radial_shading(fz_shade *shade, pdf_xref *xref, fz_obj *dict, int funcs, pdf_function **func)
{
fz_obj *obj;
float d0, d1;
int e0, e1;
float x0, y0, r0, x1, y1, r1;
struct vertex p1, p2;
 
obj = fz_dict_gets(dict, "Coords");
x0 = fz_to_real(fz_array_get(obj, 0));
y0 = fz_to_real(fz_array_get(obj, 1));
r0 = fz_to_real(fz_array_get(obj, 2));
x1 = fz_to_real(fz_array_get(obj, 3));
y1 = fz_to_real(fz_array_get(obj, 4));
r1 = fz_to_real(fz_array_get(obj, 5));
 
d0 = 0;
d1 = 1;
obj = fz_dict_gets(dict, "Domain");
if (fz_array_len(obj) == 2)
{
d0 = fz_to_real(fz_array_get(obj, 0));
d1 = fz_to_real(fz_array_get(obj, 1));
}
 
e0 = e1 = 0;
obj = fz_dict_gets(dict, "Extend");
if (fz_array_len(obj) == 2)
{
e0 = fz_to_bool(fz_array_get(obj, 0));
e1 = fz_to_bool(fz_array_get(obj, 1));
}
 
pdf_sample_shade_function(shade, funcs, func, d0, d1);
 
shade->type = FZ_RADIAL;
 
shade->extend[0] = e0;
shade->extend[1] = e1;
 
p1.x = x0;
p1.y = y0;
p1.c[0] = r0;
pdf_add_vertex(shade, &p1);
 
p2.x = x1;
p2.y = y1;
p2.c[0] = r1;
pdf_add_vertex(shade, &p2);
}
 
/* Type 4-7 -- Triangle and patch mesh shadings */
 
static inline float read_sample(fz_stream *stream, int bits, float min, float max)
{
/* we use pow(2,x) because (1<<x) would overflow the math on 32-bit samples */
float bitscale = 1 / (powf(2, bits) - 1);
return min + fz_read_bits(stream, bits) * (max - min) * bitscale;
}
 
struct mesh_params
{
int vprow;
int bpflag;
int bpcoord;
int bpcomp;
float x0, x1;
float y0, y1;
float c0[FZ_MAX_COLORS];
float c1[FZ_MAX_COLORS];
};
 
static void
pdf_load_mesh_params(pdf_xref *xref, fz_obj *dict, struct mesh_params *p)
{
fz_obj *obj;
int i, n;
 
p->x0 = p->y0 = 0;
p->x1 = p->y1 = 1;
for (i = 0; i < FZ_MAX_COLORS; i++)
{
p->c0[i] = 0;
p->c1[i] = 1;
}
 
p->vprow = fz_to_int(fz_dict_gets(dict, "VerticesPerRow"));
p->bpflag = fz_to_int(fz_dict_gets(dict, "BitsPerFlag"));
p->bpcoord = fz_to_int(fz_dict_gets(dict, "BitsPerCoordinate"));
p->bpcomp = fz_to_int(fz_dict_gets(dict, "BitsPerComponent"));
 
obj = fz_dict_gets(dict, "Decode");
if (fz_array_len(obj) >= 6)
{
n = (fz_array_len(obj) - 4) / 2;
p->x0 = fz_to_real(fz_array_get(obj, 0));
p->x1 = fz_to_real(fz_array_get(obj, 1));
p->y0 = fz_to_real(fz_array_get(obj, 2));
p->y1 = fz_to_real(fz_array_get(obj, 3));
for (i = 0; i < n; i++)
{
p->c0[i] = fz_to_real(fz_array_get(obj, 4 + i * 2));
p->c1[i] = fz_to_real(fz_array_get(obj, 5 + i * 2));
}
}
 
if (p->vprow < 2)
p->vprow = 2;
 
if (p->bpflag != 2 && p->bpflag != 4 && p->bpflag != 8)
p->bpflag = 8;
 
if (p->bpcoord != 1 && p->bpcoord != 2 && p->bpcoord != 4 &&
p->bpcoord != 8 && p->bpcoord != 12 && p->bpcoord != 16 &&
p->bpcoord != 24 && p->bpcoord != 32)
p->bpcoord = 8;
 
if (p->bpcomp != 1 && p->bpcomp != 2 && p->bpcomp != 4 &&
p->bpcomp != 8 && p->bpcomp != 12 && p->bpcomp != 16)
p->bpcomp = 8;
}
 
static void
pdf_load_type4_shade(fz_shade *shade, pdf_xref *xref, fz_obj *dict,
int funcs, pdf_function **func, fz_stream *stream)
{
struct mesh_params p;
struct vertex va, vb, vc, vd;
int ncomp;
int flag;
int i;
 
pdf_load_mesh_params(xref, dict, &p);
 
if (funcs > 0)
{
ncomp = 1;
pdf_sample_shade_function(shade, funcs, func, p.c0[0], p.c1[0]);
}
else
ncomp = shade->colorspace->n;
 
while (!fz_is_eof_bits(stream))
{
flag = fz_read_bits(stream, p.bpflag);
vd.x = read_sample(stream, p.bpcoord, p.x0, p.x1);
vd.y = read_sample(stream, p.bpcoord, p.y0, p.y1);
for (i = 0; i < ncomp; i++)
vd.c[i] = read_sample(stream, p.bpcomp, p.c0[i], p.c1[i]);
 
switch (flag)
{
case 0: /* start new triangle */
va = vd;
 
fz_read_bits(stream, p.bpflag);
vb.x = read_sample(stream, p.bpcoord, p.x0, p.x1);
vb.y = read_sample(stream, p.bpcoord, p.y0, p.y1);
for (i = 0; i < ncomp; i++)
vb.c[i] = read_sample(stream, p.bpcomp, p.c0[i], p.c1[i]);
 
fz_read_bits(stream, p.bpflag);
vc.x = read_sample(stream, p.bpcoord, p.x0, p.x1);
vc.y = read_sample(stream, p.bpcoord, p.y0, p.y1);
for (i = 0; i < ncomp; i++)
vc.c[i] = read_sample(stream, p.bpcomp, p.c0[i], p.c1[i]);
 
pdf_add_triangle(shade, &va, &vb, &vc);
break;
 
case 1: /* Vb, Vc, Vd */
va = vb;
vb = vc;
vc = vd;
pdf_add_triangle(shade, &va, &vb, &vc);
break;
 
case 2: /* Va, Vc, Vd */
vb = vc;
vc = vd;
pdf_add_triangle(shade, &va, &vb, &vc);
break;
}
}
}
 
static void
pdf_load_type5_shade(fz_shade *shade, pdf_xref *xref, fz_obj *dict,
int funcs, pdf_function **func, fz_stream *stream)
{
struct mesh_params p;
struct vertex *buf, *ref;
int first;
int ncomp;
int i, k;
 
pdf_load_mesh_params(xref, dict, &p);
 
if (funcs > 0)
{
ncomp = 1;
pdf_sample_shade_function(shade, funcs, func, p.c0[0], p.c1[0]);
}
else
ncomp = shade->colorspace->n;
 
ref = fz_calloc(p.vprow, sizeof(struct vertex));
buf = fz_calloc(p.vprow, sizeof(struct vertex));
first = 1;
 
while (!fz_is_eof_bits(stream))
{
for (i = 0; i < p.vprow; i++)
{
buf[i].x = read_sample(stream, p.bpcoord, p.x0, p.x1);
buf[i].y = read_sample(stream, p.bpcoord, p.y0, p.y1);
for (k = 0; k < ncomp; k++)
buf[i].c[k] = read_sample(stream, p.bpcomp, p.c0[k], p.c1[k]);
}
 
if (!first)
for (i = 0; i < p.vprow - 1; i++)
pdf_add_quad(shade,
&ref[i], &ref[i+1], &buf[i+1], &buf[i]);
 
memcpy(ref, buf, p.vprow * sizeof(struct vertex));
first = 0;
}
 
free(ref);
free(buf);
}
 
/* Type 6 & 7 -- Patch mesh shadings */
 
static void
pdf_load_type6_shade(fz_shade *shade, pdf_xref *xref, fz_obj *dict,
int funcs, pdf_function **func, fz_stream *stream)
{
struct mesh_params p;
int haspatch, hasprevpatch;
float prevc[4][FZ_MAX_COLORS];
fz_point prevp[12];
int ncomp;
int i, k;
 
pdf_load_mesh_params(xref, dict, &p);
 
if (funcs > 0)
{
ncomp = 1;
pdf_sample_shade_function(shade, funcs, func, p.c0[0], p.c1[0]);
}
else
ncomp = shade->colorspace->n;
 
hasprevpatch = 0;
 
while (!fz_is_eof_bits(stream))
{
float c[4][FZ_MAX_COLORS];
fz_point v[12];
int startcolor;
int startpt;
int flag;
 
flag = fz_read_bits(stream, p.bpflag);
 
if (flag == 0)
{
startpt = 0;
startcolor = 0;
}
else
{
startpt = 4;
startcolor = 2;
}
 
for (i = startpt; i < 12; i++)
{
v[i].x = read_sample(stream, p.bpcoord, p.x0, p.x1);
v[i].y = read_sample(stream, p.bpcoord, p.y0, p.y1);
}
 
for (i = startcolor; i < 4; i++)
{
for (k = 0; k < ncomp; k++)
c[i][k] = read_sample(stream, p.bpcomp, p.c0[k], p.c1[k]);
}
 
haspatch = 0;
 
if (flag == 0)
{
haspatch = 1;
}
else if (flag == 1 && hasprevpatch)
{
v[0] = prevp[3];
v[1] = prevp[4];
v[2] = prevp[5];
v[3] = prevp[6];
memcpy(c[0], prevc[1], ncomp * sizeof(float));
memcpy(c[1], prevc[2], ncomp * sizeof(float));
 
haspatch = 1;
}
else if (flag == 2 && hasprevpatch)
{
v[0] = prevp[6];
v[1] = prevp[7];
v[2] = prevp[8];
v[3] = prevp[9];
memcpy(c[0], prevc[2], ncomp * sizeof(float));
memcpy(c[1], prevc[3], ncomp * sizeof(float));
 
haspatch = 1;
}
else if (flag == 3 && hasprevpatch)
{
v[0] = prevp[ 9];
v[1] = prevp[10];
v[2] = prevp[11];
v[3] = prevp[ 0];
memcpy(c[0], prevc[3], ncomp * sizeof(float));
memcpy(c[1], prevc[0], ncomp * sizeof(float));
 
haspatch = 1;
}
 
if (haspatch)
{
pdf_tensor_patch patch;
 
pdf_make_tensor_patch(&patch, 6, v);
 
for (i = 0; i < 4; i++)
memcpy(patch.color[i], c[i], ncomp * sizeof(float));
 
draw_patch(shade, &patch, SUBDIV, SUBDIV);
 
for (i = 0; i < 12; i++)
prevp[i] = v[i];
 
for (i = 0; i < 4; i++)
memcpy(prevc[i], c[i], ncomp * sizeof(float));
 
hasprevpatch = 1;
}
}
}
 
static void
pdf_load_type7_shade(fz_shade *shade, pdf_xref *xref, fz_obj *dict,
int funcs, pdf_function **func, fz_stream *stream)
{
struct mesh_params p;
int haspatch, hasprevpatch;
float prevc[4][FZ_MAX_COLORS];
fz_point prevp[16];
int ncomp;
int i, k;
 
pdf_load_mesh_params(xref, dict, &p);
 
if (funcs > 0)
{
ncomp = 1;
pdf_sample_shade_function(shade, funcs, func, p.c0[0], p.c1[0]);
}
else
ncomp = shade->colorspace->n;
 
hasprevpatch = 0;
 
while (!fz_is_eof_bits(stream))
{
float c[4][FZ_MAX_COLORS];
fz_point v[16];
int startcolor;
int startpt;
int flag;
 
flag = fz_read_bits(stream, p.bpflag);
 
if (flag == 0)
{
startpt = 0;
startcolor = 0;
}
else
{
startpt = 4;
startcolor = 2;
}
 
for (i = startpt; i < 16; i++)
{
v[i].x = read_sample(stream, p.bpcoord, p.x0, p.x1);
v[i].y = read_sample(stream, p.bpcoord, p.y0, p.y1);
}
 
for (i = startcolor; i < 4; i++)
{
for (k = 0; k < ncomp; k++)
c[i][k] = read_sample(stream, p.bpcomp, p.c0[k], p.c1[k]);
}
 
haspatch = 0;
 
if (flag == 0)
{
haspatch = 1;
}
else if (flag == 1 && hasprevpatch)
{
v[0] = prevp[3];
v[1] = prevp[4];
v[2] = prevp[5];
v[3] = prevp[6];
memcpy(c[0], prevc[1], ncomp * sizeof(float));
memcpy(c[1], prevc[2], ncomp * sizeof(float));
 
haspatch = 1;
}
else if (flag == 2 && hasprevpatch)
{
v[0] = prevp[6];
v[1] = prevp[7];
v[2] = prevp[8];
v[3] = prevp[9];
memcpy(c[0], prevc[2], ncomp * sizeof(float));
memcpy(c[1], prevc[3], ncomp * sizeof(float));
 
haspatch = 1;
}
else if (flag == 3 && hasprevpatch)
{
v[0] = prevp[ 9];
v[1] = prevp[10];
v[2] = prevp[11];
v[3] = prevp[ 0];
memcpy(c[0], prevc[3], ncomp * sizeof(float));
memcpy(c[1], prevc[0], ncomp * sizeof(float));
 
haspatch = 1;
}
 
if (haspatch)
{
pdf_tensor_patch patch;
 
pdf_make_tensor_patch(&patch, 7, v);
 
for (i = 0; i < 4; i++)
memcpy(patch.color[i], c[i], ncomp * sizeof(float));
 
draw_patch(shade, &patch, SUBDIV, SUBDIV);
 
for (i = 0; i < 16; i++)
prevp[i] = v[i];
 
for (i = 0; i < 4; i++)
memcpy(prevc[i], c[i], FZ_MAX_COLORS * sizeof(float));
 
hasprevpatch = 1;
}
}
}
 
/* Load all of the shading dictionary parameters, then switch on the shading type. */
 
static fz_error
pdf_load_shading_dict(fz_shade **shadep, pdf_xref *xref, fz_obj *dict, fz_matrix transform)
{
fz_error error;
fz_shade *shade;
pdf_function *func[FZ_MAX_COLORS] = { NULL };
fz_stream *stream = NULL;
fz_obj *obj;
int funcs;
int type;
int i;
 
shade = fz_malloc(sizeof(fz_shade));
shade->refs = 1;
shade->type = FZ_MESH;
shade->use_background = 0;
shade->use_function = 0;
shade->matrix = transform;
shade->bbox = fz_infinite_rect;
shade->extend[0] = 0;
shade->extend[1] = 0;
 
shade->mesh_len = 0;
shade->mesh_cap = 0;
shade->mesh = NULL;
 
shade->colorspace = NULL;
 
funcs = 0;
 
obj = fz_dict_gets(dict, "ShadingType");
type = fz_to_int(obj);
 
obj = fz_dict_gets(dict, "ColorSpace");
if (!obj)
{
fz_drop_shade(shade);
return fz_throw("shading colorspace is missing");
}
error = pdf_load_colorspace(&shade->colorspace, xref, obj);
if (error)
{
fz_drop_shade(shade);
return fz_rethrow(error, "cannot load colorspace (%d %d R)", fz_to_num(obj), fz_to_gen(obj));
}
 
obj = fz_dict_gets(dict, "Background");
if (obj)
{
shade->use_background = 1;
for (i = 0; i < shade->colorspace->n; i++)
shade->background[i] = fz_to_real(fz_array_get(obj, i));
}
 
obj = fz_dict_gets(dict, "BBox");
if (fz_is_array(obj))
{
shade->bbox = pdf_to_rect(obj);
}
 
obj = fz_dict_gets(dict, "Function");
if (fz_is_dict(obj))
{
funcs = 1;
 
error = pdf_load_function(&func[0], xref, obj);
if (error)
{
error = fz_rethrow(error, "cannot load shading function (%d %d R)", fz_to_num(obj), fz_to_gen(obj));
goto cleanup;
}
}
else if (fz_is_array(obj))
{
funcs = fz_array_len(obj);
if (funcs != 1 && funcs != shade->colorspace->n)
{
error = fz_throw("incorrect number of shading functions");
goto cleanup;
}
 
for (i = 0; i < funcs; i++)
{
error = pdf_load_function(&func[i], xref, fz_array_get(obj, i));
if (error)
{
error = fz_rethrow(error, "cannot load shading function (%d %d R)", fz_to_num(obj), fz_to_gen(obj));
goto cleanup;
}
}
}
 
if (type >= 4 && type <= 7)
{
error = pdf_open_stream(&stream, xref, fz_to_num(dict), fz_to_gen(dict));
if (error)
{
error = fz_rethrow(error, "cannot open shading stream (%d %d R)", fz_to_num(dict), fz_to_gen(dict));
goto cleanup;
}
}
 
switch (type)
{
case 1: pdf_load_function_based_shading(shade, xref, dict, func[0]); break;
case 2: pdf_load_axial_shading(shade, xref, dict, funcs, func); break;
case 3: pdf_load_radial_shading(shade, xref, dict, funcs, func); break;
case 4: pdf_load_type4_shade(shade, xref, dict, funcs, func, stream); break;
case 5: pdf_load_type5_shade(shade, xref, dict, funcs, func, stream); break;
case 6: pdf_load_type6_shade(shade, xref, dict, funcs, func, stream); break;
case 7: pdf_load_type7_shade(shade, xref, dict, funcs, func, stream); break;
default:
error = fz_throw("unknown shading type: %d", type);
goto cleanup;
}
 
if (stream)
fz_close(stream);
for (i = 0; i < funcs; i++)
if (func[i])
pdf_drop_function(func[i]);
 
*shadep = shade;
return fz_okay;
 
cleanup:
if (stream)
fz_close(stream);
for (i = 0; i < funcs; i++)
if (func[i])
pdf_drop_function(func[i]);
fz_drop_shade(shade);
 
return fz_rethrow(error, "cannot load shading type %d (%d %d R)", type, fz_to_num(dict), fz_to_gen(dict));
}
 
fz_error
pdf_load_shading(fz_shade **shadep, pdf_xref *xref, fz_obj *dict)
{
fz_error error;
fz_matrix mat;
fz_obj *obj;
 
if ((*shadep = pdf_find_item(xref->store, fz_drop_shade, dict)))
{
fz_keep_shade(*shadep);
return fz_okay;
}
 
/* Type 2 pattern dictionary */
if (fz_dict_gets(dict, "PatternType"))
{
obj = fz_dict_gets(dict, "Matrix");
if (obj)
mat = pdf_to_matrix(obj);
else
mat = fz_identity;
 
obj = fz_dict_gets(dict, "ExtGState");
if (obj)
{
if (fz_dict_gets(obj, "CA") || fz_dict_gets(obj, "ca"))
{
fz_warn("shading with alpha not supported");
}
}
 
obj = fz_dict_gets(dict, "Shading");
if (!obj)
return fz_throw("syntaxerror: missing shading dictionary");
 
error = pdf_load_shading_dict(shadep, xref, obj, mat);
if (error)
return fz_rethrow(error, "cannot load shading dictionary (%d %d R)", fz_to_num(obj), fz_to_gen(obj));
}
 
/* Naked shading dictionary */
else
{
error = pdf_load_shading_dict(shadep, xref, dict, fz_identity);
if (error)
return fz_rethrow(error, "cannot load shading dictionary (%d %d R)", fz_to_num(dict), fz_to_gen(dict));
}
 
pdf_store_item(xref->store, fz_keep_shade, fz_drop_shade, dict, *shadep);
 
return fz_okay;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_store.c
0,0 → 1,222
#include "fitz.h"
#include "mupdf.h"
 
typedef struct pdf_item_s pdf_item;
 
struct pdf_item_s
{
void *drop_func;
fz_obj *key;
void *val;
int age;
pdf_item *next;
};
 
struct refkey
{
void *drop_func;
int num;
int gen;
};
 
struct pdf_store_s
{
fz_hash_table *hash; /* hash for num/gen keys */
pdf_item *root; /* linked list for everything else */
};
 
pdf_store *
pdf_new_store(void)
{
pdf_store *store;
store = fz_malloc(sizeof(pdf_store));
store->hash = fz_new_hash_table(4096, sizeof(struct refkey));
store->root = NULL;
return store;
}
 
void
pdf_store_item(pdf_store *store, void *keepfunc, void *drop_func, fz_obj *key, void *val)
{
pdf_item *item;
 
if (!store)
return;
 
item = fz_malloc(sizeof(pdf_item));
item->drop_func = drop_func;
item->key = fz_keep_obj(key);
item->val = ((void*(*)(void*))keepfunc)(val);
item->age = 0;
item->next = NULL;
 
if (fz_is_indirect(key))
{
struct refkey refkey;
refkey.drop_func = drop_func;
refkey.num = fz_to_num(key);
refkey.gen = fz_to_gen(key);
fz_hash_insert(store->hash, &refkey, item);
}
else
{
item->next = store->root;
store->root = item;
}
}
 
void *
pdf_find_item(pdf_store *store, void *drop_func, fz_obj *key)
{
struct refkey refkey;
pdf_item *item;
 
if (!store)
return NULL;
 
if (key == NULL)
return NULL;
 
if (fz_is_indirect(key))
{
refkey.drop_func = drop_func;
refkey.num = fz_to_num(key);
refkey.gen = fz_to_gen(key);
item = fz_hash_find(store->hash, &refkey);
if (item)
{
item->age = 0;
return item->val;
}
}
else
{
for (item = store->root; item; item = item->next)
{
if (item->drop_func == drop_func && !fz_objcmp(item->key, key))
{
item->age = 0;
return item->val;
}
}
}
 
return NULL;
}
 
void
pdf_remove_item(pdf_store *store, void *drop_func, fz_obj *key)
{
struct refkey refkey;
pdf_item *item, *prev, *next;
 
if (fz_is_indirect(key))
{
refkey.drop_func = drop_func;
refkey.num = fz_to_num(key);
refkey.gen = fz_to_gen(key);
item = fz_hash_find(store->hash, &refkey);
if (item)
{
fz_hash_remove(store->hash, &refkey);
((void(*)(void*))item->drop_func)(item->val);
fz_drop_obj(item->key);
fz_free(item);
}
}
else
{
prev = NULL;
for (item = store->root; item; item = next)
{
next = item->next;
if (item->drop_func == drop_func && !fz_objcmp(item->key, key))
{
if (!prev)
store->root = next;
else
prev->next = next;
((void(*)(void*))item->drop_func)(item->val);
fz_drop_obj(item->key);
fz_free(item);
}
else
prev = item;
}
}
}
 
void
pdf_age_store(pdf_store *store, int maxage)
{
struct refkey *refkey;
pdf_item *item, *prev, *next;
int i;
 
for (i = 0; i < fz_hash_len(store->hash); i++)
{
refkey = fz_hash_get_key(store->hash, i);
item = fz_hash_get_val(store->hash, i);
if (item && ++item->age > maxage)
{
fz_hash_remove(store->hash, refkey);
((void(*)(void*))item->drop_func)(item->val);
fz_drop_obj(item->key);
fz_free(item);
i--; /* items with same hash may move into place */
}
}
 
prev = NULL;
for (item = store->root; item; item = next)
{
next = item->next;
if (++item->age > maxage)
{
if (!prev)
store->root = next;
else
prev->next = next;
((void(*)(void*))item->drop_func)(item->val);
fz_drop_obj(item->key);
fz_free(item);
}
else
prev = item;
}
}
 
void
pdf_free_store(pdf_store *store)
{
pdf_age_store(store, 0);
fz_free_hash(store->hash);
fz_free(store);
}
 
void
pdf_debug_store(pdf_store *store)
{
pdf_item *item;
pdf_item *next;
struct refkey *refkey;
int i;
 
printf("-- resource store contents --\n");
 
for (i = 0; i < fz_hash_len(store->hash); i++)
{
refkey = fz_hash_get_key(store->hash, i);
item = fz_hash_get_val(store->hash, i);
if (item)
printf("store[%d] (%d %d R) = %p\n", i, refkey->num, refkey->gen, item->val);
}
 
for (item = store->root; item; item = next)
{
next = item->next;
printf("store[*] ");
fz_debug_obj(item->key);
printf(" = %p\n", item->val);
}
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_stream.c
0,0 → 1,385
#include "fitz.h"
#include "mupdf.h"
 
/*
* Check if an object is a stream or not.
*/
int
pdf_is_stream(pdf_xref *xref, int num, int gen)
{
fz_error error;
 
if (num < 0 || num >= xref->len)
return 0;
 
error = pdf_cache_object(xref, num, gen);
if (error)
{
fz_catch(error, "cannot load object, ignoring error");
return 0;
}
 
return xref->table[num].stm_ofs > 0;
}
 
/*
* Scan stream dictionary for an explicit /Crypt filter
*/
static int
pdf_stream_has_crypt(fz_obj *stm)
{
fz_obj *filters;
fz_obj *obj;
int i;
 
filters = fz_dict_getsa(stm, "Filter", "F");
if (filters)
{
if (!strcmp(fz_to_name(filters), "Crypt"))
return 1;
if (fz_is_array(filters))
{
for (i = 0; i < fz_array_len(filters); i++)
{
obj = fz_array_get(filters, i);
if (!strcmp(fz_to_name(obj), "Crypt"))
return 1;
}
}
}
return 0;
}
 
/*
* Create a filter given a name and param dictionary.
*/
static fz_stream *
build_filter(fz_stream *chain, pdf_xref * xref, fz_obj * f, fz_obj * p, int num, int gen)
{
fz_error error;
char *s;
 
s = fz_to_name(f);
 
if (!strcmp(s, "ASCIIHexDecode") || !strcmp(s, "AHx"))
return fz_open_ahxd(chain);
 
else if (!strcmp(s, "ASCII85Decode") || !strcmp(s, "A85"))
return fz_open_a85d(chain);
 
else if (!strcmp(s, "CCITTFaxDecode") || !strcmp(s, "CCF"))
return fz_open_faxd(chain, p);
 
else if (!strcmp(s, "DCTDecode") || !strcmp(s, "DCT"))
return fz_open_dctd(chain, p);
 
else if (!strcmp(s, "RunLengthDecode") || !strcmp(s, "RL"))
return fz_open_rld(chain);
 
else if (!strcmp(s, "FlateDecode") || !strcmp(s, "Fl"))
{
fz_obj *obj = fz_dict_gets(p, "Predictor");
if (fz_to_int(obj) > 1)
return fz_open_predict(fz_open_flated(chain), p);
return fz_open_flated(chain);
}
 
else if (!strcmp(s, "LZWDecode") || !strcmp(s, "LZW"))
{
fz_obj *obj = fz_dict_gets(p, "Predictor");
if (fz_to_int(obj) > 1)
return fz_open_predict(fz_open_lzwd(chain, p), p);
return fz_open_lzwd(chain, p);
}
 
else if (!strcmp(s, "JBIG2Decode"))
{
fz_obj *obj = fz_dict_gets(p, "JBIG2Globals");
if (obj)
{
fz_buffer *globals;
error = pdf_load_stream(&globals, xref, fz_to_num(obj), fz_to_gen(obj));
if (error)
fz_catch(error, "cannot load jbig2 global segments");
chain = fz_open_jbig2d(chain, globals);
fz_drop_buffer(globals);
return chain;
}
return fz_open_jbig2d(chain, NULL);
}
 
else if (!strcmp(s, "JPXDecode"))
return chain; /* JPX decoding is special cased in the image loading code */
 
else if (!strcmp(s, "Crypt"))
{
fz_obj *name;
 
if (!xref->crypt)
{
fz_warn("crypt filter in unencrypted document");
return chain;
}
 
name = fz_dict_gets(p, "Name");
if (fz_is_name(name))
return pdf_open_crypt_with_filter(chain, xref->crypt, fz_to_name(name), num, gen);
 
return chain;
}
 
fz_warn("unknown filter name (%s)", s);
return chain;
}
 
/*
* Build a chain of filters given filter names and param dicts.
* If head is given, start filter chain with it.
* Assume ownership of head.
*/
static fz_stream *
build_filter_chain(fz_stream *chain, pdf_xref *xref, fz_obj *fs, fz_obj *ps, int num, int gen)
{
fz_obj *f;
fz_obj *p;
int i;
 
for (i = 0; i < fz_array_len(fs); i++)
{
f = fz_array_get(fs, i);
p = fz_array_get(ps, i);
chain = build_filter(chain, xref, f, p, num, gen);
}
 
return chain;
}
 
/*
* Build a filter for reading raw stream data.
* This is a null filter to constrain reading to the
* stream length, followed by a decryption filter.
*/
static fz_stream *
pdf_open_raw_filter(fz_stream *chain, pdf_xref *xref, fz_obj *stmobj, int num, int gen)
{
int hascrypt;
int len;
 
/* don't close chain when we close this filter */
fz_keep_stream(chain);
 
len = fz_to_int(fz_dict_gets(stmobj, "Length"));
chain = fz_open_null(chain, len);
 
hascrypt = pdf_stream_has_crypt(stmobj);
if (xref->crypt && !hascrypt)
chain = pdf_open_crypt(chain, xref->crypt, num, gen);
 
return chain;
}
 
/*
* Construct a filter to decode a stream, constraining
* to stream length and decrypting.
*/
static fz_stream *
pdf_open_filter(fz_stream *chain, pdf_xref *xref, fz_obj *stmobj, int num, int gen)
{
fz_obj *filters;
fz_obj *params;
 
filters = fz_dict_getsa(stmobj, "Filter", "F");
params = fz_dict_getsa(stmobj, "DecodeParms", "DP");
 
chain = pdf_open_raw_filter(chain, xref, stmobj, num, gen);
 
if (fz_is_name(filters))
return build_filter(chain, xref, filters, params, num, gen);
if (fz_array_len(filters) > 0)
return build_filter_chain(chain, xref, filters, params, num, gen);
 
return chain;
}
 
/*
* Construct a filter to decode a stream, without
* constraining to stream length, and without decryption.
*/
fz_stream *
pdf_open_inline_stream(fz_stream *chain, pdf_xref *xref, fz_obj *stmobj, int length)
{
fz_obj *filters;
fz_obj *params;
 
filters = fz_dict_getsa(stmobj, "Filter", "F");
params = fz_dict_getsa(stmobj, "DecodeParms", "DP");
 
/* don't close chain when we close this filter */
fz_keep_stream(chain);
 
if (fz_is_name(filters))
return build_filter(chain, xref, filters, params, 0, 0);
if (fz_array_len(filters) > 0)
return build_filter_chain(chain, xref, filters, params, 0, 0);
 
return fz_open_null(chain, length);
}
 
/*
* Open a stream for reading the raw (compressed but decrypted) data.
* Using xref->file while this is open is a bad idea.
*/
fz_error
pdf_open_raw_stream(fz_stream **stmp, pdf_xref *xref, int num, int gen)
{
pdf_xref_entry *x;
fz_error error;
 
if (num < 0 || num >= xref->len)
return fz_throw("object id out of range (%d %d R)", num, gen);
 
x = xref->table + num;
 
error = pdf_cache_object(xref, num, gen);
if (error)
return fz_rethrow(error, "cannot load stream object (%d %d R)", num, gen);
 
if (x->stm_ofs)
{
*stmp = pdf_open_raw_filter(xref->file, xref, x->obj, num, gen);
fz_seek(xref->file, x->stm_ofs, 0);
return fz_okay;
}
 
return fz_throw("object is not a stream");
}
 
/*
* Open a stream for reading uncompressed data.
* Put the opened file in xref->stream.
* Using xref->file while a stream is open is a Bad idea.
*/
fz_error
pdf_open_stream(fz_stream **stmp, pdf_xref *xref, int num, int gen)
{
pdf_xref_entry *x;
fz_error error;
 
if (num < 0 || num >= xref->len)
return fz_throw("object id out of range (%d %d R)", num, gen);
 
x = xref->table + num;
 
error = pdf_cache_object(xref, num, gen);
if (error)
return fz_rethrow(error, "cannot load stream object (%d %d R)", num, gen);
 
if (x->stm_ofs)
{
*stmp = pdf_open_filter(xref->file, xref, x->obj, num, gen);
fz_seek(xref->file, x->stm_ofs, 0);
return fz_okay;
}
 
return fz_throw("object is not a stream");
}
 
fz_error
pdf_open_stream_at(fz_stream **stmp, pdf_xref *xref, int num, int gen, fz_obj *dict, int stm_ofs)
{
if (stm_ofs)
{
*stmp = pdf_open_filter(xref->file, xref, dict, num, gen);
fz_seek(xref->file, stm_ofs, 0);
return fz_okay;
}
return fz_throw("object is not a stream");
}
 
/*
* Load raw (compressed but decrypted) contents of a stream into buf.
*/
fz_error
pdf_load_raw_stream(fz_buffer **bufp, pdf_xref *xref, int num, int gen)
{
fz_error error;
fz_stream *stm;
fz_obj *dict;
int len;
 
error = pdf_load_object(&dict, xref, num, gen);
if (error)
return fz_rethrow(error, "cannot load stream dictionary (%d %d R)", num, gen);
 
len = fz_to_int(fz_dict_gets(dict, "Length"));
 
fz_drop_obj(dict);
 
error = pdf_open_raw_stream(&stm, xref, num, gen);
if (error)
return fz_rethrow(error, "cannot open raw stream (%d %d R)", num, gen);
 
error = fz_read_all(bufp, stm, len);
if (error)
{
fz_close(stm);
return fz_rethrow(error, "cannot read raw stream (%d %d R)", num, gen);
}
 
fz_close(stm);
return fz_okay;
}
 
static int
pdf_guess_filter_length(int len, char *filter)
{
if (!strcmp(filter, "ASCIIHexDecode"))
return len / 2;
if (!strcmp(filter, "ASCII85Decode"))
return len * 4 / 5;
if (!strcmp(filter, "FlateDecode"))
return len * 3;
if (!strcmp(filter, "RunLengthDecode"))
return len * 3;
if (!strcmp(filter, "LZWDecode"))
return len * 2;
return len;
}
 
/*
* Load uncompressed contents of a stream into buf.
*/
fz_error
pdf_load_stream(fz_buffer **bufp, pdf_xref *xref, int num, int gen)
{
fz_error error;
fz_stream *stm;
fz_obj *dict, *obj;
int i, len;
 
error = pdf_open_stream(&stm, xref, num, gen);
if (error)
return fz_rethrow(error, "cannot open stream (%d %d R)", num, gen);
 
error = pdf_load_object(&dict, xref, num, gen);
if (error)
return fz_rethrow(error, "cannot load stream dictionary (%d %d R)", num, gen);
 
len = fz_to_int(fz_dict_gets(dict, "Length"));
obj = fz_dict_gets(dict, "Filter");
len = pdf_guess_filter_length(len, fz_to_name(obj));
for (i = 0; i < fz_array_len(obj); i++)
len = pdf_guess_filter_length(len, fz_to_name(fz_array_get(obj, i)));
 
fz_drop_obj(dict);
 
error = fz_read_all(bufp, stm, len);
if (error)
{
fz_close(stm);
return fz_rethrow(error, "cannot read raw stream (%d %d R)", num, gen);
}
 
fz_close(stm);
return fz_okay;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_type3.c
0,0 → 1,158
#include "fitz.h"
#include "mupdf.h"
 
static fz_error
pdf_run_glyph_func(void *xref, fz_obj *rdb, fz_buffer *contents, fz_device *dev, fz_matrix ctm)
{
return pdf_run_glyph(xref, rdb, contents, dev, ctm);
}
 
fz_error
pdf_load_type3_font(pdf_font_desc **fontdescp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict)
{
fz_error error;
char buf[256];
char *estrings[256];
pdf_font_desc *fontdesc;
fz_obj *encoding;
fz_obj *widths;
fz_obj *charprocs;
fz_obj *obj;
int first, last;
int i, k, n;
fz_rect bbox;
fz_matrix matrix;
 
obj = fz_dict_gets(dict, "Name");
if (fz_is_name(obj))
fz_strlcpy(buf, fz_to_name(obj), sizeof buf);
else
sprintf(buf, "Unnamed-T3");
 
fontdesc = pdf_new_font_desc();
 
obj = fz_dict_gets(dict, "FontMatrix");
matrix = pdf_to_matrix(obj);
 
obj = fz_dict_gets(dict, "FontBBox");
bbox = pdf_to_rect(obj);
 
fontdesc->font = fz_new_type3_font(buf, matrix);
 
fz_set_font_bbox(fontdesc->font, bbox.x0, bbox.y0, bbox.x1, bbox.y1);
 
/* Encoding */
 
for (i = 0; i < 256; i++)
estrings[i] = NULL;
 
encoding = fz_dict_gets(dict, "Encoding");
if (!encoding)
{
error = fz_throw("syntaxerror: Type3 font missing Encoding");
goto cleanup;
}
 
if (fz_is_name(encoding))
pdf_load_encoding(estrings, fz_to_name(encoding));
 
if (fz_is_dict(encoding))
{
fz_obj *base, *diff, *item;
 
base = fz_dict_gets(encoding, "BaseEncoding");
if (fz_is_name(base))
pdf_load_encoding(estrings, fz_to_name(base));
 
diff = fz_dict_gets(encoding, "Differences");
if (fz_is_array(diff))
{
n = fz_array_len(diff);
k = 0;
for (i = 0; i < n; i++)
{
item = fz_array_get(diff, i);
if (fz_is_int(item))
k = fz_to_int(item);
if (fz_is_name(item))
estrings[k++] = fz_to_name(item);
if (k < 0) k = 0;
if (k > 255) k = 255;
}
}
}
 
fontdesc->encoding = pdf_new_identity_cmap(0, 1);
 
error = pdf_load_to_unicode(fontdesc, xref, estrings, NULL, fz_dict_gets(dict, "ToUnicode"));
if (error)
goto cleanup;
 
/* Widths */
 
pdf_set_default_hmtx(fontdesc, 0);
 
first = fz_to_int(fz_dict_gets(dict, "FirstChar"));
last = fz_to_int(fz_dict_gets(dict, "LastChar"));
 
widths = fz_dict_gets(dict, "Widths");
if (!widths)
{
error = fz_throw("syntaxerror: Type3 font missing Widths");
goto cleanup;
}
 
for (i = first; i <= last; i++)
{
float w = fz_to_real(fz_array_get(widths, i - first));
w = fontdesc->font->t3matrix.a * w * 1000;
fontdesc->font->t3widths[i] = w * 0.001f;
pdf_add_hmtx(fontdesc, i, i, w);
}
 
pdf_end_hmtx(fontdesc);
 
/* Resources -- inherit page resources if the font doesn't have its own */
 
fontdesc->font->t3resources = fz_dict_gets(dict, "Resources");
if (!fontdesc->font->t3resources)
fontdesc->font->t3resources = rdb;
if (fontdesc->font->t3resources)
fz_keep_obj(fontdesc->font->t3resources);
if (!fontdesc->font->t3resources)
fz_warn("no resource dictionary for type 3 font!");
 
fontdesc->font->t3xref = xref;
fontdesc->font->t3run = pdf_run_glyph_func;
 
/* CharProcs */
 
charprocs = fz_dict_gets(dict, "CharProcs");
if (!charprocs)
{
error = fz_throw("syntaxerror: Type3 font missing CharProcs");
goto cleanup;
}
 
for (i = 0; i < 256; i++)
{
if (estrings[i])
{
obj = fz_dict_gets(charprocs, estrings[i]);
if (pdf_is_stream(xref, fz_to_num(obj), fz_to_gen(obj)))
{
error = pdf_load_stream(&fontdesc->font->t3procs[i], xref, fz_to_num(obj), fz_to_gen(obj));
if (error)
goto cleanup;
}
}
}
 
*fontdescp = fontdesc;
return fz_okay;
 
cleanup:
fz_drop_font(fontdesc->font);
fz_free(fontdesc);
return fz_rethrow(error, "cannot load type3 font (%d %d R)", fz_to_num(dict), fz_to_gen(dict));
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_unicode.c
0,0 → 1,83
#include "fitz.h"
#include "mupdf.h"
 
/* Load or synthesize ToUnicode map for fonts */
 
fz_error
pdf_load_to_unicode(pdf_font_desc *font, pdf_xref *xref,
char **strings, char *collection, fz_obj *cmapstm)
{
fz_error error = fz_okay;
pdf_cmap *cmap;
int cid;
int ucsbuf[8];
int ucslen;
int i;
 
if (pdf_is_stream(xref, fz_to_num(cmapstm), fz_to_gen(cmapstm)))
{
error = pdf_load_embedded_cmap(&cmap, xref, cmapstm);
if (error)
return fz_rethrow(error, "cannot load embedded cmap (%d %d R)", fz_to_num(cmapstm), fz_to_gen(cmapstm));
 
font->to_unicode = pdf_new_cmap();
 
for (i = 0; i < (strings ? 256 : 65536); i++)
{
cid = pdf_lookup_cmap(font->encoding, i);
if (cid >= 0)
{
ucslen = pdf_lookup_cmap_full(cmap, i, ucsbuf);
if (ucslen == 1)
pdf_map_range_to_range(font->to_unicode, cid, cid, ucsbuf[0]);
if (ucslen > 1)
pdf_map_one_to_many(font->to_unicode, cid, ucsbuf, ucslen);
}
}
 
pdf_sort_cmap(font->to_unicode);
 
pdf_drop_cmap(cmap);
}
 
else if (collection)
{
error = fz_okay;
 
if (!strcmp(collection, "Adobe-CNS1"))
error = pdf_load_system_cmap(&font->to_unicode, "Adobe-CNS1-UCS2");
else if (!strcmp(collection, "Adobe-GB1"))
error = pdf_load_system_cmap(&font->to_unicode, "Adobe-GB1-UCS2");
else if (!strcmp(collection, "Adobe-Japan1"))
error = pdf_load_system_cmap(&font->to_unicode, "Adobe-Japan1-UCS2");
else if (!strcmp(collection, "Adobe-Korea1"))
error = pdf_load_system_cmap(&font->to_unicode, "Adobe-Korea1-UCS2");
 
if (error)
return fz_rethrow(error, "cannot load ToUnicode system cmap %s-UCS2", collection);
}
 
if (strings)
{
/* TODO one-to-many mappings */
 
font->cid_to_ucs_len = 256;
font->cid_to_ucs = fz_calloc(256, sizeof(unsigned short));
 
for (i = 0; i < 256; i++)
{
if (strings[i])
font->cid_to_ucs[i] = pdf_lookup_agl(strings[i]);
else
font->cid_to_ucs[i] = '?';
}
}
 
if (!font->to_unicode && !font->cid_to_ucs)
{
/* TODO: synthesize a ToUnicode if it's a freetype font with
* cmap and/or post tables or if it has glyph names. */
}
 
return fz_okay;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_xobject.c
0,0 → 1,96
#include "fitz.h"
#include "mupdf.h"
 
fz_error
pdf_load_xobject(pdf_xobject **formp, pdf_xref *xref, fz_obj *dict)
{
fz_error error;
pdf_xobject *form;
fz_obj *obj;
 
if ((*formp = pdf_find_item(xref->store, pdf_drop_xobject, dict)))
{
pdf_keep_xobject(*formp);
return fz_okay;
}
 
form = fz_malloc(sizeof(pdf_xobject));
form->refs = 1;
form->resources = NULL;
form->contents = NULL;
form->colorspace = NULL;
 
/* Store item immediately, to avoid possible recursion if objects refer back to this one */
pdf_store_item(xref->store, pdf_keep_xobject, pdf_drop_xobject, dict, form);
 
obj = fz_dict_gets(dict, "BBox");
form->bbox = pdf_to_rect(obj);
 
obj = fz_dict_gets(dict, "Matrix");
if (obj)
form->matrix = pdf_to_matrix(obj);
else
form->matrix = fz_identity;
 
form->isolated = 0;
form->knockout = 0;
form->transparency = 0;
 
obj = fz_dict_gets(dict, "Group");
if (obj)
{
fz_obj *attrs = obj;
 
form->isolated = fz_to_bool(fz_dict_gets(attrs, "I"));
form->knockout = fz_to_bool(fz_dict_gets(attrs, "K"));
 
obj = fz_dict_gets(attrs, "S");
if (fz_is_name(obj) && !strcmp(fz_to_name(obj), "Transparency"))
form->transparency = 1;
 
obj = fz_dict_gets(attrs, "CS");
if (obj)
{
error = pdf_load_colorspace(&form->colorspace, xref, obj);
if (error)
fz_catch(error, "cannot load xobject colorspace");
}
}
 
form->resources = fz_dict_gets(dict, "Resources");
if (form->resources)
fz_keep_obj(form->resources);
 
error = pdf_load_stream(&form->contents, xref, fz_to_num(dict), fz_to_gen(dict));
if (error)
{
pdf_remove_item(xref->store, pdf_drop_xobject, dict);
pdf_drop_xobject(form);
return fz_rethrow(error, "cannot load xobject content stream (%d %d R)", fz_to_num(dict), fz_to_gen(dict));
}
 
*formp = form;
return fz_okay;
}
 
pdf_xobject *
pdf_keep_xobject(pdf_xobject *xobj)
{
xobj->refs ++;
return xobj;
}
 
void
pdf_drop_xobject(pdf_xobject *xobj)
{
if (xobj && --xobj->refs == 0)
{
if (xobj->colorspace)
fz_drop_colorspace(xobj->colorspace);
if (xobj->resources)
fz_drop_obj(xobj->resources);
if (xobj->contents)
fz_drop_buffer(xobj->contents);
fz_free(xobj);
}
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/pdf_xref.c
0,0 → 1,940
#include "fitz.h"
#include "mupdf.h"
 
static inline int iswhite(int ch)
{
return
ch == '\000' || ch == '\011' || ch == '\012' ||
ch == '\014' || ch == '\015' || ch == '\040';
}
 
/*
* magic version tag and startxref
*/
 
static fz_error
pdf_load_version(pdf_xref *xref)
{
char buf[20];
 
fz_seek(xref->file, 0, 0);
fz_read_line(xref->file, buf, sizeof buf);
if (memcmp(buf, "%PDF-", 5) != 0)
return fz_throw("cannot recognize version marker");
 
xref->version = atoi(buf + 5) * 10 + atoi(buf + 7);
 
return fz_okay;
}
 
static fz_error
pdf_read_start_xref(pdf_xref *xref)
{
unsigned char buf[1024];
int t, n;
int i;
 
fz_seek(xref->file, 0, 2);
 
xref->file_size = fz_tell(xref->file);
 
t = MAX(0, xref->file_size - (int)sizeof buf);
fz_seek(xref->file, t, 0);
 
n = fz_read(xref->file, buf, sizeof buf);
if (n < 0)
return fz_rethrow(n, "cannot read from file");
 
for (i = n - 9; i >= 0; i--)
{
if (memcmp(buf + i, "startxref", 9) == 0)
{
i += 9;
while (iswhite(buf[i]) && i < n)
i ++;
xref->startxref = atoi((char*)(buf + i));
return fz_okay;
}
}
 
return fz_throw("cannot find startxref");
}
 
/*
* trailer dictionary
*/
 
static fz_error
pdf_read_old_trailer(pdf_xref *xref, char *buf, int cap)
{
fz_error error;
int len;
char *s;
int n;
int t;
int tok;
int c;
 
fz_read_line(xref->file, buf, cap);
if (strncmp(buf, "xref", 4) != 0)
return fz_throw("cannot find xref marker");
 
while (1)
{
c = fz_peek_byte(xref->file);
if (!(c >= '0' && c <= '9'))
break;
 
fz_read_line(xref->file, buf, cap);
s = buf;
fz_strsep(&s, " "); /* ignore ofs */
if (!s)
return fz_throw("invalid range marker in xref");
len = atoi(fz_strsep(&s, " "));
 
/* broken pdfs where the section is not on a separate line */
if (s && *s != '\0')
fz_seek(xref->file, -(2 + (int)strlen(s)), 1);
 
t = fz_tell(xref->file);
if (t < 0)
return fz_throw("cannot tell in file");
 
fz_seek(xref->file, t + 20 * len, 0);
}
 
error = pdf_lex(&tok, xref->file, buf, cap, &n);
if (error)
return fz_rethrow(error, "cannot parse trailer");
if (tok != PDF_TOK_TRAILER)
return fz_throw("expected trailer marker");
 
error = pdf_lex(&tok, xref->file, buf, cap, &n);
if (error)
return fz_rethrow(error, "cannot parse trailer");
if (tok != PDF_TOK_OPEN_DICT)
return fz_throw("expected trailer dictionary");
 
error = pdf_parse_dict(&xref->trailer, xref, xref->file, buf, cap);
if (error)
return fz_rethrow(error, "cannot parse trailer");
return fz_okay;
}
 
static fz_error
pdf_read_new_trailer(pdf_xref *xref, char *buf, int cap)
{
fz_error error;
error = pdf_parse_ind_obj(&xref->trailer, xref, xref->file, buf, cap, NULL, NULL, NULL);
if (error)
return fz_rethrow(error, "cannot parse trailer (compressed)");
return fz_okay;
}
 
static fz_error
pdf_read_trailer(pdf_xref *xref, char *buf, int cap)
{
fz_error error;
int c;
 
fz_seek(xref->file, xref->startxref, 0);
 
while (iswhite(fz_peek_byte(xref->file)))
fz_read_byte(xref->file);
 
c = fz_peek_byte(xref->file);
if (c == 'x')
{
error = pdf_read_old_trailer(xref, buf, cap);
if (error)
return fz_rethrow(error, "cannot read trailer");
}
else if (c >= '0' && c <= '9')
{
error = pdf_read_new_trailer(xref, buf, cap);
if (error)
return fz_rethrow(error, "cannot read trailer");
}
else
{
return fz_throw("cannot recognize xref format: '%c'", c);
}
 
return fz_okay;
}
 
/*
* xref tables
*/
 
void
pdf_resize_xref(pdf_xref *xref, int newlen)
{
int i;
 
xref->table = fz_realloc(xref->table, newlen, sizeof(pdf_xref_entry));
for (i = xref->len; i < newlen; i++)
{
xref->table[i].type = 0;
xref->table[i].ofs = 0;
xref->table[i].gen = 0;
xref->table[i].stm_ofs = 0;
xref->table[i].obj = NULL;
}
xref->len = newlen;
}
 
static fz_error
pdf_read_old_xref(fz_obj **trailerp, pdf_xref *xref, char *buf, int cap)
{
fz_error error;
int ofs, len;
char *s;
int n;
int tok;
int i;
int c;
 
fz_read_line(xref->file, buf, cap);
if (strncmp(buf, "xref", 4) != 0)
return fz_throw("cannot find xref marker");
 
while (1)
{
c = fz_peek_byte(xref->file);
if (!(c >= '0' && c <= '9'))
break;
 
fz_read_line(xref->file, buf, cap);
s = buf;
ofs = atoi(fz_strsep(&s, " "));
len = atoi(fz_strsep(&s, " "));
 
/* broken pdfs where the section is not on a separate line */
if (s && *s != '\0')
{
fz_warn("broken xref section. proceeding anyway.");
fz_seek(xref->file, -(2 + (int)strlen(s)), 1);
}
 
/* broken pdfs where size in trailer undershoots entries in xref sections */
if (ofs + len > xref->len)
{
fz_warn("broken xref section, proceeding anyway.");
pdf_resize_xref(xref, ofs + len);
}
 
for (i = ofs; i < ofs + len; i++)
{
n = fz_read(xref->file, (unsigned char *) buf, 20);
if (n < 0)
return fz_rethrow(n, "cannot read xref table");
if (!xref->table[i].type)
{
s = buf;
 
/* broken pdfs where line start with white space */
while (*s != '\0' && iswhite(*s))
s++;
 
xref->table[i].ofs = atoi(s);
xref->table[i].gen = atoi(s + 11);
xref->table[i].type = s[17];
if (s[17] != 'f' && s[17] != 'n' && s[17] != 'o')
return fz_throw("unexpected xref type: %#x (%d %d R)", s[17], i, xref->table[i].gen);
}
}
}
 
error = pdf_lex(&tok, xref->file, buf, cap, &n);
if (error)
return fz_rethrow(error, "cannot parse trailer");
if (tok != PDF_TOK_TRAILER)
return fz_throw("expected trailer marker");
 
error = pdf_lex(&tok, xref->file, buf, cap, &n);
if (error)
return fz_rethrow(error, "cannot parse trailer");
if (tok != PDF_TOK_OPEN_DICT)
return fz_throw("expected trailer dictionary");
 
error = pdf_parse_dict(trailerp, xref, xref->file, buf, cap);
if (error)
return fz_rethrow(error, "cannot parse trailer");
return fz_okay;
}
 
static fz_error
pdf_read_new_xref_section(pdf_xref *xref, fz_stream *stm, int i0, int i1, int w0, int w1, int w2)
{
int i, n;
 
if (i0 < 0 || i0 + i1 > xref->len)
return fz_throw("xref stream has too many entries");
 
for (i = i0; i < i0 + i1; i++)
{
int a = 0;
int b = 0;
int c = 0;
 
if (fz_is_eof(stm))
return fz_throw("truncated xref stream");
 
for (n = 0; n < w0; n++)
a = (a << 8) + fz_read_byte(stm);
for (n = 0; n < w1; n++)
b = (b << 8) + fz_read_byte(stm);
for (n = 0; n < w2; n++)
c = (c << 8) + fz_read_byte(stm);
 
if (!xref->table[i].type)
{
int t = w0 ? a : 1;
xref->table[i].type = t == 0 ? 'f' : t == 1 ? 'n' : t == 2 ? 'o' : 0;
xref->table[i].ofs = w1 ? b : 0;
xref->table[i].gen = w2 ? c : 0;
}
}
 
return fz_okay;
}
 
static fz_error
pdf_read_new_xref(fz_obj **trailerp, pdf_xref *xref, char *buf, int cap)
{
fz_error error;
fz_stream *stm;
fz_obj *trailer;
fz_obj *index;
fz_obj *obj;
int num, gen, stm_ofs;
int size, w0, w1, w2;
int t;
 
error = pdf_parse_ind_obj(&trailer, xref, xref->file, buf, cap, &num, &gen, &stm_ofs);
if (error)
return fz_rethrow(error, "cannot parse compressed xref stream object");
 
obj = fz_dict_gets(trailer, "Size");
if (!obj)
{
fz_drop_obj(trailer);
return fz_throw("xref stream missing Size entry (%d %d R)", num, gen);
}
size = fz_to_int(obj);
 
if (size > xref->len)
{
pdf_resize_xref(xref, size);
}
 
if (num < 0 || num >= xref->len)
{
fz_drop_obj(trailer);
return fz_throw("object id (%d %d R) out of range (0..%d)", num, gen, xref->len - 1);
}
 
obj = fz_dict_gets(trailer, "W");
if (!obj) {
fz_drop_obj(trailer);
return fz_throw("xref stream missing W entry (%d %d R)", num, gen);
}
w0 = fz_to_int(fz_array_get(obj, 0));
w1 = fz_to_int(fz_array_get(obj, 1));
w2 = fz_to_int(fz_array_get(obj, 2));
 
index = fz_dict_gets(trailer, "Index");
 
error = pdf_open_stream_at(&stm, xref, num, gen, trailer, stm_ofs);
if (error)
{
fz_drop_obj(trailer);
return fz_rethrow(error, "cannot open compressed xref stream (%d %d R)", num, gen);
}
 
if (!index)
{
error = pdf_read_new_xref_section(xref, stm, 0, size, w0, w1, w2);
if (error)
{
fz_close(stm);
fz_drop_obj(trailer);
return fz_rethrow(error, "cannot read xref stream (%d %d R)", num, gen);
}
}
else
{
for (t = 0; t < fz_array_len(index); t += 2)
{
int i0 = fz_to_int(fz_array_get(index, t + 0));
int i1 = fz_to_int(fz_array_get(index, t + 1));
error = pdf_read_new_xref_section(xref, stm, i0, i1, w0, w1, w2);
if (error)
{
fz_close(stm);
fz_drop_obj(trailer);
return fz_rethrow(error, "cannot read xref stream section (%d %d R)", num, gen);
}
}
}
 
fz_close(stm);
 
*trailerp = trailer;
 
return fz_okay;
}
 
static fz_error
pdf_read_xref(fz_obj **trailerp, pdf_xref *xref, int ofs, char *buf, int cap)
{
fz_error error;
int c;
 
fz_seek(xref->file, ofs, 0);
 
while (iswhite(fz_peek_byte(xref->file)))
fz_read_byte(xref->file);
 
c = fz_peek_byte(xref->file);
if (c == 'x')
{
error = pdf_read_old_xref(trailerp, xref, buf, cap);
if (error)
return fz_rethrow(error, "cannot read xref (ofs=%d)", ofs);
}
else if (c >= '0' && c <= '9')
{
error = pdf_read_new_xref(trailerp, xref, buf, cap);
if (error)
return fz_rethrow(error, "cannot read xref (ofs=%d)", ofs);
}
else
{
return fz_throw("cannot recognize xref format");
}
 
return fz_okay;
}
 
static fz_error
pdf_read_xref_sections(pdf_xref *xref, int ofs, char *buf, int cap)
{
fz_error error;
fz_obj *trailer;
fz_obj *prev;
fz_obj *xrefstm;
 
error = pdf_read_xref(&trailer, xref, ofs, buf, cap);
if (error)
return fz_rethrow(error, "cannot read xref section");
 
/* FIXME: do we overwrite free entries properly? */
xrefstm = fz_dict_gets(trailer, "XRefStm");
if (xrefstm)
{
error = pdf_read_xref_sections(xref, fz_to_int(xrefstm), buf, cap);
if (error)
{
fz_drop_obj(trailer);
return fz_rethrow(error, "cannot read /XRefStm xref section");
}
}
 
prev = fz_dict_gets(trailer, "Prev");
if (prev)
{
error = pdf_read_xref_sections(xref, fz_to_int(prev), buf, cap);
if (error)
{
fz_drop_obj(trailer);
return fz_rethrow(error, "cannot read /Prev xref section");
}
}
 
fz_drop_obj(trailer);
return fz_okay;
}
 
/*
* load xref tables from pdf
*/
 
static fz_error
pdf_load_xref(pdf_xref *xref, char *buf, int bufsize)
{
fz_error error;
fz_obj *size;
int i;
 
error = pdf_load_version(xref);
if (error)
return fz_rethrow(error, "cannot read version marker");
 
error = pdf_read_start_xref(xref);
if (error)
return fz_rethrow(error, "cannot read startxref");
 
error = pdf_read_trailer(xref, buf, bufsize);
if (error)
return fz_rethrow(error, "cannot read trailer");
 
size = fz_dict_gets(xref->trailer, "Size");
if (!size)
return fz_throw("trailer missing Size entry");
 
pdf_resize_xref(xref, fz_to_int(size));
 
error = pdf_read_xref_sections(xref, xref->startxref, buf, bufsize);
if (error)
return fz_rethrow(error, "cannot read xref");
 
/* broken pdfs where first object is not free */
if (xref->table[0].type != 'f')
return fz_throw("first object in xref is not free");
 
/* broken pdfs where object offsets are out of range */
for (i = 0; i < xref->len; i++)
{
if (xref->table[i].type == 'n')
if (xref->table[i].ofs <= 0 || xref->table[i].ofs >= xref->file_size)
return fz_throw("object offset out of range: %d (%d 0 R)", xref->table[i].ofs, i);
if (xref->table[i].type == 'o')
if (xref->table[i].ofs <= 0 || xref->table[i].ofs >= xref->len || xref->table[xref->table[i].ofs].type != 'n')
return fz_throw("invalid reference to an objstm that does not exist: %d (%d 0 R)", xref->table[i].ofs, i);
}
 
return fz_okay;
}
 
/*
* Initialize and load xref tables.
* If password is not null, try to decrypt.
*/
 
fz_error
pdf_open_xref_with_stream(pdf_xref **xrefp, fz_stream *file, char *password)
{
pdf_xref *xref;
fz_error error;
fz_obj *encrypt, *id;
fz_obj *dict, *obj;
int i, repaired = 0;
 
/* install pdf specific callback */
fz_resolve_indirect = pdf_resolve_indirect;
 
xref = fz_malloc(sizeof(pdf_xref));
 
memset(xref, 0, sizeof(pdf_xref));
 
xref->file = fz_keep_stream(file);
 
error = pdf_load_xref(xref, xref->scratch, sizeof xref->scratch);
if (error)
{
fz_catch(error, "trying to repair");
if (xref->table)
{
fz_free(xref->table);
xref->table = NULL;
xref->len = 0;
}
if (xref->trailer)
{
fz_drop_obj(xref->trailer);
xref->trailer = NULL;
}
error = pdf_repair_xref(xref, xref->scratch, sizeof xref->scratch);
if (error)
{
pdf_free_xref(xref);
return fz_rethrow(error, "cannot repair document");
}
repaired = 1;
}
 
encrypt = fz_dict_gets(xref->trailer, "Encrypt");
id = fz_dict_gets(xref->trailer, "ID");
if (fz_is_dict(encrypt))
{
error = pdf_new_crypt(&xref->crypt, encrypt, id);
if (error)
{
pdf_free_xref(xref);
return fz_rethrow(error, "cannot decrypt document");
}
}
 
if (pdf_needs_password(xref))
{
/* Only care if we have a password */
if (password)
{
int okay = pdf_authenticate_password(xref, password);
if (!okay)
{
pdf_free_xref(xref);
return fz_throw("invalid password");
}
}
}
 
if (repaired)
{
int hasroot, hasinfo;
 
error = pdf_repair_obj_stms(xref);
if (error)
{
pdf_free_xref(xref);
return fz_rethrow(error, "cannot repair document");
}
 
hasroot = fz_dict_gets(xref->trailer, "Root") != NULL;
hasinfo = fz_dict_gets(xref->trailer, "Info") != NULL;
 
for (i = 1; i < xref->len; i++)
{
if (xref->table[i].type == 0 || xref->table[i].type == 'f')
continue;
 
error = pdf_load_object(&dict, xref, i, 0);
if (error)
{
fz_catch(error, "ignoring broken object (%d 0 R)", i);
continue;
}
 
if (!hasroot)
{
obj = fz_dict_gets(dict, "Type");
if (fz_is_name(obj) && !strcmp(fz_to_name(obj), "Catalog"))
{
obj = fz_new_indirect(i, 0, xref);
fz_dict_puts(xref->trailer, "Root", obj);
fz_drop_obj(obj);
}
}
 
if (!hasinfo)
{
if (fz_dict_gets(dict, "Creator") || fz_dict_gets(dict, "Producer"))
{
obj = fz_new_indirect(i, 0, xref);
fz_dict_puts(xref->trailer, "Info", obj);
fz_drop_obj(obj);
}
}
 
fz_drop_obj(dict);
}
}
 
*xrefp = xref;
return fz_okay;
}
 
void
pdf_free_xref(pdf_xref *xref)
{
int i;
 
if (xref->store)
pdf_free_store(xref->store);
 
if (xref->table)
{
for (i = 0; i < xref->len; i++)
{
if (xref->table[i].obj)
{
fz_drop_obj(xref->table[i].obj);
xref->table[i].obj = NULL;
}
}
fz_free(xref->table);
}
 
if (xref->page_objs)
{
for (i = 0; i < xref->page_len; i++)
fz_drop_obj(xref->page_objs[i]);
fz_free(xref->page_objs);
}
 
if (xref->page_refs)
{
for (i = 0; i < xref->page_len; i++)
fz_drop_obj(xref->page_refs[i]);
fz_free(xref->page_refs);
}
 
if (xref->file)
fz_close(xref->file);
if (xref->trailer)
fz_drop_obj(xref->trailer);
if (xref->crypt)
pdf_free_crypt(xref->crypt);
 
fz_free(xref);
}
 
void
pdf_debug_xref(pdf_xref *xref)
{
int i;
printf("xref\n0 %d\n", xref->len);
for (i = 0; i < xref->len; i++)
{
printf("%05d: %010d %05d %c (stm_ofs=%d)\n", i,
xref->table[i].ofs,
xref->table[i].gen,
xref->table[i].type ? xref->table[i].type : '-',
xref->table[i].stm_ofs);
}
}
 
/*
* compressed object streams
*/
 
static fz_error
pdf_load_obj_stm(pdf_xref *xref, int num, int gen, char *buf, int cap)
{
fz_error error;
fz_stream *stm;
fz_obj *objstm;
int *numbuf;
int *ofsbuf;
 
fz_obj *obj;
int first;
int count;
int i, n;
int tok;
 
error = pdf_load_object(&objstm, xref, num, gen);
if (error)
return fz_rethrow(error, "cannot load object stream object (%d %d R)", num, gen);
 
count = fz_to_int(fz_dict_gets(objstm, "N"));
first = fz_to_int(fz_dict_gets(objstm, "First"));
 
numbuf = fz_calloc(count, sizeof(int));
ofsbuf = fz_calloc(count, sizeof(int));
 
error = pdf_open_stream(&stm, xref, num, gen);
if (error)
{
error = fz_rethrow(error, "cannot open object stream (%d %d R)", num, gen);
goto cleanupbuf;
}
 
for (i = 0; i < count; i++)
{
error = pdf_lex(&tok, stm, buf, cap, &n);
if (error || tok != PDF_TOK_INT)
{
error = fz_rethrow(error, "corrupt object stream (%d %d R)", num, gen);
goto cleanupstm;
}
numbuf[i] = atoi(buf);
 
error = pdf_lex(&tok, stm, buf, cap, &n);
if (error || tok != PDF_TOK_INT)
{
error = fz_rethrow(error, "corrupt object stream (%d %d R)", num, gen);
goto cleanupstm;
}
ofsbuf[i] = atoi(buf);
}
 
fz_seek(stm, first, 0);
 
for (i = 0; i < count; i++)
{
fz_seek(stm, first + ofsbuf[i], 0);
 
error = pdf_parse_stm_obj(&obj, xref, stm, buf, cap);
if (error)
{
error = fz_rethrow(error, "cannot parse object %d in stream (%d %d R)", i, num, gen);
goto cleanupstm;
}
 
if (numbuf[i] < 1 || numbuf[i] >= xref->len)
{
fz_drop_obj(obj);
error = fz_throw("object id (%d 0 R) out of range (0..%d)", numbuf[i], xref->len - 1);
goto cleanupstm;
}
 
if (xref->table[numbuf[i]].type == 'o' && xref->table[numbuf[i]].ofs == num)
{
if (xref->table[numbuf[i]].obj)
fz_drop_obj(xref->table[numbuf[i]].obj);
xref->table[numbuf[i]].obj = obj;
}
else
{
fz_drop_obj(obj);
}
}
 
fz_close(stm);
fz_free(ofsbuf);
fz_free(numbuf);
fz_drop_obj(objstm);
return fz_okay;
 
cleanupstm:
fz_close(stm);
cleanupbuf:
fz_free(ofsbuf);
fz_free(numbuf);
fz_drop_obj(objstm);
return error; /* already rethrown */
}
 
/*
* object loading
*/
 
fz_error
pdf_cache_object(pdf_xref *xref, int num, int gen)
{
fz_error error;
pdf_xref_entry *x;
int rnum, rgen;
 
if (num < 0 || num >= xref->len)
return fz_throw("object out of range (%d %d R); xref size %d", num, gen, xref->len);
 
x = &xref->table[num];
 
if (x->obj)
return fz_okay;
 
if (x->type == 'f')
{
x->obj = fz_new_null();
return fz_okay;
}
else if (x->type == 'n')
{
fz_seek(xref->file, x->ofs, 0);
 
error = pdf_parse_ind_obj(&x->obj, xref, xref->file, xref->scratch, sizeof xref->scratch,
&rnum, &rgen, &x->stm_ofs);
if (error)
return fz_rethrow(error, "cannot parse object (%d %d R)", num, gen);
 
if (rnum != num)
return fz_throw("found object (%d %d R) instead of (%d %d R)", rnum, rgen, num, gen);
 
if (xref->crypt)
pdf_crypt_obj(xref->crypt, x->obj, num, gen);
}
else if (x->type == 'o')
{
if (!x->obj)
{
error = pdf_load_obj_stm(xref, x->ofs, 0, xref->scratch, sizeof xref->scratch);
if (error)
return fz_rethrow(error, "cannot load object stream containing object (%d %d R)", num, gen);
if (!x->obj)
return fz_throw("object (%d %d R) was not found in its object stream", num, gen);
}
}
else
{
return fz_throw("assert: corrupt xref struct");
}
 
return fz_okay;
}
 
fz_error
pdf_load_object(fz_obj **objp, pdf_xref *xref, int num, int gen)
{
fz_error error;
 
error = pdf_cache_object(xref, num, gen);
if (error)
return fz_rethrow(error, "cannot load object (%d %d R) into cache", num, gen);
 
assert(xref->table[num].obj);
 
*objp = fz_keep_obj(xref->table[num].obj);
 
return fz_okay;
}
 
fz_obj *
pdf_resolve_indirect(fz_obj *ref)
{
if (fz_is_indirect(ref))
{
pdf_xref *xref = fz_get_indirect_xref(ref);
int num = fz_to_num(ref);
int gen = fz_to_gen(ref);
if (xref)
{
fz_error error = pdf_cache_object(xref, num, gen);
if (error)
{
fz_catch(error, "cannot load object (%d %d R) into cache", num, gen);
return ref;
}
if (xref->table[num].obj)
return xref->table[num].obj;
}
}
return ref;
}
 
/* Replace numbered object -- for use by pdfclean and similar tools */
void
pdf_update_object(pdf_xref *xref, int num, int gen, fz_obj *newobj)
{
pdf_xref_entry *x;
 
if (num < 0 || num >= xref->len)
{
fz_warn("object out of range (%d %d R); xref size %d", num, gen, xref->len);
return;
}
 
x = &xref->table[num];
 
if (x->obj)
fz_drop_obj(x->obj);
 
x->obj = fz_keep_obj(newobj);
x->type = 'n';
x->ofs = 0;
}
 
/*
* Convenience function to open a file then call pdf_open_xref_with_stream.
*/
 
fz_error
pdf_open_xref(pdf_xref **xrefp, const char *filename, char *password)
{
fz_error error;
fz_stream *file;
 
file = fz_open_file(filename);
if (!file)
return fz_throw("cannot open file '%s': %s", filename, strerror(errno));
 
error = pdf_open_xref_with_stream(xrefp, file, password);
if (error)
return fz_rethrow(error, "cannot load document '%s'", filename);
 
fz_close(file);
return fz_okay;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/snprintf.c
0,0 → 1,1025
/*
* snprintf.c - a portable implementation of snprintf
*
* AUTHOR
* Mark Martinec <mark.martinec@ijs.si>, April 1999.
*
* Copyright 1999, Mark Martinec. All rights reserved.
*
* TERMS AND CONDITIONS
* This program is free software; you can redistribute it and/or modify
* it under the terms of the "Frontier Artistic License" which comes
* with this Kit.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the Frontier Artistic License for more details.
*
* You should have received a copy of the Frontier Artistic License
* with this Kit in the file named LICENSE.txt .
* If not, I'll be glad to provide one.
*
* FEATURES
* - careful adherence to specs regarding flags, field width and precision;
* - good performance for large string handling (large format, large
* argument or large paddings). Performance is similar to system's sprintf
* and in several cases significantly better (make sure you compile with
* optimizations turned on, tell the compiler the code is strict ANSI
* if necessary to give it more freedom for optimizations);
* - return value semantics per ISO/IEC 9899:1999 ("ISO C99");
* - written in standard ISO/ANSI C - requires an ANSI C compiler.
*
* SUPPORTED CONVERSION SPECIFIERS AND DATA TYPES
*
* This snprintf only supports the following conversion specifiers:
* s, c, d, u, o, x, X, p (and synonyms: i, D, U, O - see below)
* with flags: '-', '+', ' ', '0' and '#'.
* An asterisk is supported for field width as well as precision.
*
* Length modifiers 'h' (short int), 'l' (long int),
* and 'll' (long long int) are supported.
* NOTE:
* If macro SNPRINTF_LONGLONG_SUPPORT is not defined (default) the
* length modifier 'll' is recognized but treated the same as 'l',
* which may cause argument value truncation! Defining
* SNPRINTF_LONGLONG_SUPPORT requires that your system's sprintf also
* handles length modifier 'll'. long long int is a language extension
* which may not be portable.
*
* Conversion of numeric data (conversion specifiers d, u, o, x, X, p)
* with length modifiers (none or h, l, ll) is left to the system routine
* sprintf, but all handling of flags, field width and precision as well as
* c and s conversions is done very carefully by this portable routine.
* If a string precision (truncation) is specified (e.g. %.8s) it is
* guaranteed the string beyond the specified precision will not be referenced.
*
* Length modifiers h, l and ll are ignored for c and s conversions (data
* types wint_t and wchar_t are not supported).
*
* The following common synonyms for conversion characters are supported:
* - i is a synonym for d
* - D is a synonym for ld, explicit length modifiers are ignored
* - U is a synonym for lu, explicit length modifiers are ignored
* - O is a synonym for lo, explicit length modifiers are ignored
* The D, O and U conversion characters are nonstandard, they are supported
* for backward compatibility only, and should not be used for new code.
*
* The following is specifically NOT supported:
* - flag ' (thousands' grouping character) is recognized but ignored
* - numeric conversion specifiers: f, e, E, g, G and synonym F,
* as well as the new a and A conversion specifiers
* - length modifier 'L' (long double) and 'q' (quad - use 'll' instead)
* - wide character/string conversions: lc, ls, and nonstandard
* synonyms C and S
* - writeback of converted string length: conversion character n
* - the n$ specification for direct reference to n-th argument
* - locales
*
* It is permitted for str_m to be zero, and it is permitted to specify NULL
* pointer for resulting string argument if str_m is zero (as per ISO C99).
*
* The return value is the number of characters which would be generated
* for the given input, excluding the trailing null. If this value
* is greater or equal to str_m, not all characters from the result
* have been stored in str, output bytes beyond the (str_m-1) -th character
* are discarded. If str_m is greater than zero it is guaranteed
* the resulting string will be null-terminated.
*
* NOTE that this matches the ISO C99, OpenBSD, and GNU C library 2.1,
* but is different from some older and vendor implementations,
* and is also different from XPG, XSH5, SUSv2 specifications.
* For historical discussion on changes in the semantics and standards
* of snprintf see printf(3) man page in the Linux programmers manual.
*
* Routines asprintf and vasprintf return a pointer (in the ptr argument)
* to a buffer sufficiently large to hold the resulting string. This pointer
* should be passed to free(3) to release the allocated storage when it is
* no longer needed. If sufficient space cannot be allocated, these functions
* will return -1 and set ptr to be a NULL pointer. These two routines are a
* GNU C library extensions (glibc).
*
* Routines asnprintf and vasnprintf are similar to asprintf and vasprintf,
* yet, like snprintf and vsnprintf counterparts, will write at most str_m-1
* characters into the allocated output string, the last character in the
* allocated buffer then gets the terminating null. If the formatted string
* length (the return value) is greater than or equal to the str_m argument,
* the resulting string was truncated and some of the formatted characters
* were discarded. These routines present a handy way to limit the amount
* of allocated memory to some sane value.
*
* AVAILABILITY
* http://www.ijs.si/software/snprintf/
*
* REVISION HISTORY
* 1999-04 V0.9 Mark Martinec
* - initial version, some modifications after comparing printf
* man pages for Digital Unix 4.0, Solaris 2.6 and HPUX 10,
* and checking how Perl handles sprintf (differently!);
* 1999-04-09 V1.0 Mark Martinec <mark.martinec@ijs.si>
* - added main test program, fixed remaining inconsistencies,
* added optional (long long int) support;
* 1999-04-12 V1.1 Mark Martinec <mark.martinec@ijs.si>
* - support the 'p' conversion (pointer to void);
* - if a string precision is specified
* make sure the string beyond the specified precision
* will not be referenced (e.g. by strlen);
* 1999-04-13 V1.2 Mark Martinec <mark.martinec@ijs.si>
* - support synonyms %D=%ld, %U=%lu, %O=%lo;
* - speed up the case of long format string with few conversions;
* 1999-06-30 V1.3 Mark Martinec <mark.martinec@ijs.si>
* - fixed runaway loop (eventually crashing when str_l wraps
* beyond 2^31) while copying format string without
* conversion specifiers to a buffer that is too short
* (thanks to Edwin Young <edwiny@autonomy.com> for
* spotting the problem);
* - added macros PORTABLE_SNPRINTF_VERSION_(MAJOR|MINOR)
* to snprintf.h
* 2000-02-14 V2.0 (never released) Mark Martinec <mark.martinec@ijs.si>
* - relaxed license terms: The Artistic License now applies.
* You may still apply the GNU GENERAL PUBLIC LICENSE
* as was distributed with previous versions, if you prefer;
* - changed REVISION HISTORY dates to use ISO 8601 date format;
* - added vsnprintf (patch also independently proposed by
* Caolan McNamara 2000-05-04, and Keith M Willenson 2000-06-01)
* 2000-06-27 V2.1 Mark Martinec <mark.martinec@ijs.si>
* - removed POSIX check for str_m<1; value 0 for str_m is
* allowed by ISO C99 (and GNU C library 2.1) - (pointed out
* on 2000-05-04 by Caolan McNamara, caolan@ csn dot ul dot ie).
* Besides relaxed license this change in standards adherence
* is the main reason to bump up the major version number;
* - added nonstandard routines asnprintf, vasnprintf, asprintf,
* vasprintf that dynamically allocate storage for the
* resulting string; these routines are not compiled by default,
* see comments where NEED_V?ASN?PRINTF macros are defined;
* - autoconf contributed by Caolan McNamara
* 2000-10-06 V2.2 Mark Martinec <mark.martinec@ijs.si>
* - BUG FIX: the %c conversion used a temporary variable
* that was no longer in scope when referenced,
* possibly causing incorrect resulting character;
* - BUG FIX: make precision and minimal field width unsigned
* to handle huge values (2^31 <= n < 2^32) correctly;
* also be more careful in the use of signed/unsigned/size_t
* internal variables - probably more careful than many
* vendor implementations, but there may still be a case
* where huge values of str_m, precision or minimal field
* could cause incorrect behaviour;
* - use separate variables for signed/unsigned arguments,
* and for short/int, long, and long long argument lengths
* to avoid possible incompatibilities on certain
* computer architectures. Also use separate variable
* arg_sign to hold sign of a numeric argument,
* to make code more transparent;
* - some fiddling with zero padding and "0x" to make it
* Linux compatible;
* - systematically use macros fast_memcpy and fast_memset
* instead of case-by-case hand optimization; determine some
* breakeven string lengths for different architectures;
* - terminology change: 'format' -> 'conversion specifier',
* 'C9x' -> 'ISO/IEC 9899:1999 ("ISO C99")',
* 'alternative form' -> 'alternate form',
* 'data type modifier' -> 'length modifier';
* - several comments rephrased and new ones added;
* - make compiler not complain about 'credits' defined but
* not used;
*/
 
 
/* Define HAVE_SNPRINTF if your system already has snprintf and vsnprintf.
*
* If HAVE_SNPRINTF is defined this module will not produce code for
* snprintf and vsnprintf, unless PREFER_PORTABLE_SNPRINTF is defined as well,
* causing this portable version of snprintf to be called portable_snprintf
* (and portable_vsnprintf).
*/
/* #define HAVE_SNPRINTF */
 
/* Define PREFER_PORTABLE_SNPRINTF if your system does have snprintf and
* vsnprintf but you would prefer to use the portable routine(s) instead.
* In this case the portable routine is declared as portable_snprintf
* (and portable_vsnprintf) and a macro 'snprintf' (and 'vsnprintf')
* is defined to expand to 'portable_v?snprintf' - see file snprintf.h .
* Defining this macro is only useful if HAVE_SNPRINTF is also defined,
* but does does no harm if defined nevertheless.
*/
/* #define PREFER_PORTABLE_SNPRINTF */
 
/* Define SNPRINTF_LONGLONG_SUPPORT if you want to support
* data type (long long int) and length modifier 'll' (e.g. %lld).
* If undefined, 'll' is recognized but treated as a single 'l'.
*
* If the system's sprintf does not handle 'll'
* the SNPRINTF_LONGLONG_SUPPORT must not be defined!
*
* This is off by default as (long long int) is a language extension.
*/
/* #define SNPRINTF_LONGLONG_SUPPORT */
 
/* Define NEED_SNPRINTF_ONLY if you only need snprintf, and not vsnprintf.
* If NEED_SNPRINTF_ONLY is defined, the snprintf will be defined directly,
* otherwise both snprintf and vsnprintf routines will be defined
* and snprintf will be a simple wrapper around vsnprintf, at the expense
* of an extra procedure call.
*/
/* #define NEED_SNPRINTF_ONLY */
 
/* Define NEED_V?ASN?PRINTF macros if you need library extension
* routines asprintf, vasprintf, asnprintf, vasnprintf respectively,
* and your system library does not provide them. They are all small
* wrapper routines around portable_vsnprintf. Defining any of the four
* NEED_V?ASN?PRINTF macros automatically turns off NEED_SNPRINTF_ONLY
* and turns on PREFER_PORTABLE_SNPRINTF.
*
* Watch for name conflicts with the system library if these routines
* are already present there.
*
* NOTE: vasprintf and vasnprintf routines need va_copy() from stdarg.h, as
* specified by C99, to be able to traverse the same list of arguments twice.
* I don't know of any other standard and portable way of achieving the same.
* With some versions of gcc you may use __va_copy(). You might even get away
* with "ap2 = ap", in this case you must not call va_end(ap2) !
* #define va_copy(ap2,ap) ap2 = ap
*/
/* #define NEED_ASPRINTF */
/* #define NEED_ASNPRINTF */
/* #define NEED_VASPRINTF */
/* #define NEED_VASNPRINTF */
 
 
/* Define the following macros if desired:
* SOLARIS_COMPATIBLE, SOLARIS_BUG_COMPATIBLE,
* HPUX_COMPATIBLE, HPUX_BUG_COMPATIBLE, LINUX_COMPATIBLE,
* DIGITAL_UNIX_COMPATIBLE, DIGITAL_UNIX_BUG_COMPATIBLE,
* PERL_COMPATIBLE, PERL_BUG_COMPATIBLE,
*
* - For portable applications it is best not to rely on peculiarities
* of a given implementation so it may be best not to define any
* of the macros that select compatibility and to avoid features
* that vary among the systems.
*
* - Selecting compatibility with more than one operating system
* is not strictly forbidden but is not recommended.
*
* - 'x'_BUG_COMPATIBLE implies 'x'_COMPATIBLE .
*
* - 'x'_COMPATIBLE refers to (and enables) a behaviour that is
* documented in a sprintf man page on a given operating system
* and actually adhered to by the system's sprintf (but not on
* most other operating systems). It may also refer to and enable
* a behaviour that is declared 'undefined' or 'implementation specific'
* in the man page but a given implementation behaves predictably
* in a certain way.
*
* - 'x'_BUG_COMPATIBLE refers to (and enables) a behaviour of system's sprintf
* that contradicts the sprintf man page on the same operating system.
*
* - I do not claim that the 'x'_COMPATIBLE and 'x'_BUG_COMPATIBLE
* conditionals take into account all idiosyncrasies of a particular
* implementation, there may be other incompatibilities.
*/
 
 
/* ============================================= */
/* NO USER SERVICABLE PARTS FOLLOWING THIS POINT */
/* ============================================= */
 
#define PORTABLE_SNPRINTF_VERSION_MAJOR 2
#define PORTABLE_SNPRINTF_VERSION_MINOR 2
 
#if defined(NEED_ASPRINTF) || defined(NEED_ASNPRINTF) || defined(NEED_VASPRINTF) || defined(NEED_VASNPRINTF)
# if defined(NEED_SNPRINTF_ONLY)
# undef NEED_SNPRINTF_ONLY
# endif
# if !defined(PREFER_PORTABLE_SNPRINTF)
# define PREFER_PORTABLE_SNPRINTF
# endif
#endif
 
#if defined(SOLARIS_BUG_COMPATIBLE) && !defined(SOLARIS_COMPATIBLE)
#define SOLARIS_COMPATIBLE
#endif
 
#if defined(HPUX_BUG_COMPATIBLE) && !defined(HPUX_COMPATIBLE)
#define HPUX_COMPATIBLE
#endif
 
#if defined(DIGITAL_UNIX_BUG_COMPATIBLE) && !defined(DIGITAL_UNIX_COMPATIBLE)
#define DIGITAL_UNIX_COMPATIBLE
#endif
 
#if defined(PERL_BUG_COMPATIBLE) && !defined(PERL_COMPATIBLE)
#define PERL_COMPATIBLE
#endif
 
#if defined(LINUX_BUG_COMPATIBLE) && !defined(LINUX_COMPATIBLE)
#define LINUX_COMPATIBLE
#endif
 
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <assert.h>
#include <errno.h>
 
#ifdef isdigit
#undef isdigit
#endif
#define isdigit(c) ((c) >= '0' && (c) <= '9')
 
/* For copying strings longer or equal to 'breakeven_point'
* it is more efficient to call memcpy() than to do it inline.
* The value depends mostly on the processor architecture,
* but also on the compiler and its optimization capabilities.
* The value is not critical, some small value greater than zero
* will be just fine if you don't care to squeeze every drop
* of performance out of the code.
*
* Small values favor memcpy, large values favor inline code.
*/
#if defined(__alpha__) || defined(__alpha)
# define breakeven_point 2 /* AXP (DEC Alpha) - gcc or cc or egcs */
#endif
#if defined(__i386__) || defined(__i386)
# define breakeven_point 12 /* Intel Pentium/Linux - gcc 2.96 */
#endif
#if defined(__hppa)
# define breakeven_point 10 /* HP-PA - gcc */
#endif
#if defined(__sparc__) || defined(__sparc)
# define breakeven_point 33 /* Sun Sparc 5 - gcc 2.8.1 */
#endif
 
/* some other values of possible interest: */
/* #define breakeven_point 8 */ /* VAX 4000 - vaxc */
/* #define breakeven_point 19 */ /* VAX 4000 - gcc 2.7.0 */
 
#ifndef breakeven_point
# define breakeven_point 6 /* some reasonable one-size-fits-all value */
#endif
 
#define fast_memcpy(d,s,n) \
{ register size_t nn = (size_t)(n); \
if (nn >= breakeven_point) memcpy((d), (s), nn); \
else if (nn > 0) { /* proc call overhead is worth only for large strings*/\
register char *dd; register const char *ss; \
for (ss=(s), dd=(d); nn>0; nn--) *dd++ = *ss++; } }
 
#define fast_memset(d,c,n) \
{ register size_t nn = (size_t)(n); \
if (nn >= breakeven_point) memset((d), (int)(c), nn); \
else if (nn > 0) { /* proc call overhead is worth only for large strings*/\
register char *dd; register const int cc=(int)(c); \
for (dd=(d); nn>0; nn--) *dd++ = cc; } }
 
/* prototypes */
 
#if defined(NEED_ASPRINTF)
int asprintf (char **ptr, const char *fmt, /*args*/ ...);
#endif
#if defined(NEED_VASPRINTF)
int vasprintf (char **ptr, const char *fmt, va_list ap);
#endif
#if defined(NEED_ASNPRINTF)
int asnprintf (char **ptr, size_t str_m, const char *fmt, /*args*/ ...);
#endif
#if defined(NEED_VASNPRINTF)
int vasnprintf (char **ptr, size_t str_m, const char *fmt, va_list ap);
#endif
 
#if defined(HAVE_SNPRINTF)
/* declare our portable snprintf routine under name portable_snprintf */
/* declare our portable vsnprintf routine under name portable_vsnprintf */
#else
/* declare our portable routines under names snprintf and vsnprintf */
#define portable_snprintf snprintf
#if !defined(NEED_SNPRINTF_ONLY)
#define portable_vsnprintf vsnprintf
#endif
#endif
 
#if !defined(HAVE_SNPRINTF) || defined(PREFER_PORTABLE_SNPRINTF)
int portable_snprintf(char *str, size_t str_m, const char *fmt, /*args*/ ...);
#if !defined(NEED_SNPRINTF_ONLY)
int portable_vsnprintf(char *str, size_t str_m, const char *fmt, va_list ap);
#endif
#endif
 
/* declarations */
 
static char credits[] = "\n\
@(#)snprintf.c, v2.2: Mark Martinec, <mark.martinec@ijs.si>\n\
@(#)snprintf.c, v2.2: Copyright 1999, Mark Martinec. Frontier Artistic License applies.\n\
@(#)snprintf.c, v2.2: http://www.ijs.si/software/snprintf/\n";
 
#if defined(NEED_ASPRINTF)
int asprintf(char **ptr, const char *fmt, /*args*/ ...) {
va_list ap;
size_t str_m;
int str_l;
 
*ptr = NULL;
va_start(ap, fmt); /* measure the required size */
str_l = portable_vsnprintf(NULL, (size_t)0, fmt, ap);
va_end(ap);
assert(str_l >= 0); /* possible integer overflow if str_m > INT_MAX */
*ptr = (char *) malloc(str_m = (size_t)str_l + 1);
if (*ptr == NULL) { errno = ENOMEM; str_l = -1; }
else {
int str_l2;
va_start(ap, fmt);
str_l2 = portable_vsnprintf(*ptr, str_m, fmt, ap);
va_end(ap);
assert(str_l2 == str_l);
}
return str_l;
}
#endif
 
#if defined(NEED_VASPRINTF)
int vasprintf(char **ptr, const char *fmt, va_list ap) {
size_t str_m;
int str_l;
 
*ptr = NULL;
{ va_list ap2;
va_copy(ap2, ap); /* don't consume the original ap, we'll need it again */
str_l = portable_vsnprintf(NULL, (size_t)0, fmt, ap2);/*get required size*/
va_end(ap2);
}
assert(str_l >= 0); /* possible integer overflow if str_m > INT_MAX */
*ptr = (char *) malloc(str_m = (size_t)str_l + 1);
if (*ptr == NULL) { errno = ENOMEM; str_l = -1; }
else {
int str_l2 = portable_vsnprintf(*ptr, str_m, fmt, ap);
assert(str_l2 == str_l);
}
return str_l;
}
#endif
 
#if defined(NEED_ASNPRINTF)
int asnprintf (char **ptr, size_t str_m, const char *fmt, /*args*/ ...) {
va_list ap;
int str_l;
 
*ptr = NULL;
va_start(ap, fmt); /* measure the required size */
str_l = portable_vsnprintf(NULL, (size_t)0, fmt, ap);
va_end(ap);
assert(str_l >= 0); /* possible integer overflow if str_m > INT_MAX */
if ((size_t)str_l + 1 < str_m) str_m = (size_t)str_l + 1; /* truncate */
/* if str_m is 0, no buffer is allocated, just set *ptr to NULL */
if (str_m == 0) { /* not interested in resulting string, just return size */
} else {
*ptr = (char *) malloc(str_m);
if (*ptr == NULL) { errno = ENOMEM; str_l = -1; }
else {
int str_l2;
va_start(ap, fmt);
str_l2 = portable_vsnprintf(*ptr, str_m, fmt, ap);
va_end(ap);
assert(str_l2 == str_l);
}
}
return str_l;
}
#endif
 
#if defined(NEED_VASNPRINTF)
int vasnprintf (char **ptr, size_t str_m, const char *fmt, va_list ap) {
int str_l;
 
*ptr = NULL;
{ va_list ap2;
va_copy(ap2, ap); /* don't consume the original ap, we'll need it again */
str_l = portable_vsnprintf(NULL, (size_t)0, fmt, ap2);/*get required size*/
va_end(ap2);
}
assert(str_l >= 0); /* possible integer overflow if str_m > INT_MAX */
if ((size_t)str_l + 1 < str_m) str_m = (size_t)str_l + 1; /* truncate */
/* if str_m is 0, no buffer is allocated, just set *ptr to NULL */
if (str_m == 0) { /* not interested in resulting string, just return size */
} else {
*ptr = (char *) malloc(str_m);
if (*ptr == NULL) { errno = ENOMEM; str_l = -1; }
else {
int str_l2 = portable_vsnprintf(*ptr, str_m, fmt, ap);
assert(str_l2 == str_l);
}
}
return str_l;
}
#endif
 
/*
* If the system does have snprintf and the portable routine is not
* specifically required, this module produces no code for snprintf/vsnprintf.
*/
#if !defined(HAVE_SNPRINTF) || defined(PREFER_PORTABLE_SNPRINTF)
 
#if !defined(NEED_SNPRINTF_ONLY)
int portable_snprintf(char *str, size_t str_m, const char *fmt, /*args*/ ...) {
va_list ap;
int str_l;
 
va_start(ap, fmt);
str_l = portable_vsnprintf(str, str_m, fmt, ap);
va_end(ap);
return str_l;
}
#endif
 
#if defined(NEED_SNPRINTF_ONLY)
int portable_snprintf(char *str, size_t str_m, const char *fmt, /*args*/ ...) {
#else
int portable_vsnprintf(char *str, size_t str_m, const char *fmt, va_list ap) {
#endif
 
#if defined(NEED_SNPRINTF_ONLY)
va_list ap;
#endif
size_t str_l = 0;
const char *p = fmt;
 
/* In contrast with POSIX, the ISO C99 now says
* that str can be NULL and str_m can be 0.
* This is more useful than the old: if (str_m < 1) return -1; */
 
#if defined(NEED_SNPRINTF_ONLY)
va_start(ap, fmt);
#endif
if (!p) p = "";
while (*p) {
if (*p != '%') {
/* if (str_l < str_m) str[str_l++] = *p++; -- this would be sufficient */
/* but the following code achieves better performance for cases
* where format string is long and contains few conversions */
const char *q = strchr(p+1,'%');
size_t n = !q ? strlen(p) : (q-p);
if (str_l < str_m) {
size_t avail = str_m-str_l;
fast_memcpy(str+str_l, p, (n>avail?avail:n));
}
p += n; str_l += n;
} else {
const char *starting_p;
size_t min_field_width = 0, precision = 0;
int zero_padding = 0, precision_specified = 0, justify_left = 0;
int alternate_form = 0, force_sign = 0;
int space_for_positive = 1; /* If both the ' ' and '+' flags appear,
the ' ' flag should be ignored. */
char length_modifier = '\0'; /* allowed values: \0, h, l, L */
char tmp[32];/* temporary buffer for simple numeric->string conversion */
 
const char *str_arg; /* string address in case of string argument */
size_t str_arg_l; /* natural field width of arg without padding
and sign */
unsigned char uchar_arg;
/* unsigned char argument value - only defined for c conversion.
N.B. standard explicitly states the char argument for
the c conversion is unsigned */
 
size_t number_of_zeros_to_pad = 0;
/* number of zeros to be inserted for numeric conversions
as required by the precision or minimal field width */
 
size_t zero_padding_insertion_ind = 0;
/* index into tmp where zero padding is to be inserted */
 
char fmt_spec = '\0';
/* current conversion specifier character */
 
str_arg = credits;/* just to make compiler happy (defined but not used)*/
str_arg = NULL;
starting_p = p; p++; /* skip '%' */
/* parse flags */
while (*p == '0' || *p == '-' || *p == '+' ||
*p == ' ' || *p == '#' || *p == '\'') {
switch (*p) {
case '0': zero_padding = 1; break;
case '-': justify_left = 1; break;
case '+': force_sign = 1; space_for_positive = 0; break;
case ' ': force_sign = 1;
/* If both the ' ' and '+' flags appear, the ' ' flag should be ignored */
#ifdef PERL_COMPATIBLE
/* ... but in Perl the last of ' ' and '+' applies */
space_for_positive = 1;
#endif
break;
case '#': alternate_form = 1; break;
case '\'': break;
}
p++;
}
/* If the '0' and '-' flags both appear, the '0' flag should be ignored. */
 
/* parse field width */
if (*p == '*') {
int j;
p++; j = va_arg(ap, int);
if (j >= 0) min_field_width = j;
else { min_field_width = -j; justify_left = 1; }
} else if (isdigit((int)(*p))) {
/* size_t could be wider than unsigned int;
make sure we treat argument like common implementations do */
unsigned int uj = *p++ - '0';
while (isdigit((int)(*p))) uj = 10*uj + (unsigned int)(*p++ - '0');
min_field_width = uj;
}
/* parse precision */
if (*p == '.') {
p++; precision_specified = 1;
if (*p == '*') {
int j = va_arg(ap, int);
p++;
if (j >= 0) precision = j;
else {
precision_specified = 0; precision = 0;
/* NOTE:
* Solaris 2.6 man page claims that in this case the precision
* should be set to 0. Digital Unix 4.0, HPUX 10 and BSD man page
* claim that this case should be treated as unspecified precision,
* which is what we do here.
*/
}
} else if (isdigit((int)(*p))) {
/* size_t could be wider than unsigned int;
make sure we treat argument like common implementations do */
unsigned int uj = *p++ - '0';
while (isdigit((int)(*p))) uj = 10*uj + (unsigned int)(*p++ - '0');
precision = uj;
}
}
/* parse 'h', 'l' and 'll' length modifiers */
if (*p == 'h' || *p == 'l') {
length_modifier = *p; p++;
if (length_modifier == 'l' && *p == 'l') { /* double l = long long */
#ifdef SNPRINTF_LONGLONG_SUPPORT
length_modifier = '2'; /* double l encoded as '2' */
#else
length_modifier = 'l'; /* treat it as a single 'l' */
#endif
p++;
}
}
fmt_spec = *p;
/* common synonyms: */
switch (fmt_spec) {
case 'i': fmt_spec = 'd'; break;
case 'D': fmt_spec = 'd'; length_modifier = 'l'; break;
case 'U': fmt_spec = 'u'; length_modifier = 'l'; break;
case 'O': fmt_spec = 'o'; length_modifier = 'l'; break;
default: break;
}
/* get parameter value, do initial processing */
switch (fmt_spec) {
case '%': /* % behaves similar to 's' regarding flags and field widths */
case 'c': /* c behaves similar to 's' regarding flags and field widths */
case 's':
length_modifier = '\0'; /* wint_t and wchar_t not supported */
/* the result of zero padding flag with non-numeric conversion specifier*/
/* is undefined. Solaris and HPUX 10 does zero padding in this case, */
/* Digital Unix and Linux does not. */
#if !defined(SOLARIS_COMPATIBLE) && !defined(HPUX_COMPATIBLE)
zero_padding = 0; /* turn zero padding off for string conversions */
#endif
str_arg_l = 1;
switch (fmt_spec) {
case '%':
str_arg = p; break;
case 'c': {
int j = va_arg(ap, int);
uchar_arg = (unsigned char) j; /* standard demands unsigned char */
str_arg = (const char *) &uchar_arg;
break;
}
case 's':
str_arg = va_arg(ap, const char *);
if (!str_arg) str_arg_l = 0;
/* make sure not to address string beyond the specified precision !!! */
else if (!precision_specified) str_arg_l = strlen(str_arg);
/* truncate string if necessary as requested by precision */
else if (precision == 0) str_arg_l = 0;
else {
/* memchr on HP does not like n > 2^31 !!! */
const char *q = memchr(str_arg, '\0',
precision <= 0x7fffffff ? precision : 0x7fffffff);
str_arg_l = !q ? precision : (q-str_arg);
}
break;
default: break;
}
break;
case 'd': case 'u': case 'o': case 'x': case 'X': case 'p': {
/* NOTE: the u, o, x, X and p conversion specifiers imply
the value is unsigned; d implies a signed value */
 
int arg_sign = 0;
/* 0 if numeric argument is zero (or if pointer is NULL for 'p'),
+1 if greater than zero (or nonzero for unsigned arguments),
-1 if negative (unsigned argument is never negative) */
 
int int_arg = 0; unsigned int uint_arg = 0;
/* only defined for length modifier h, or for no length modifiers */
 
long int long_arg = 0; unsigned long int ulong_arg = 0;
/* only defined for length modifier l */
 
void *ptr_arg = NULL;
/* pointer argument value -only defined for p conversion */
 
#ifdef SNPRINTF_LONGLONG_SUPPORT
long long int long_long_arg = 0;
unsigned long long int ulong_long_arg = 0;
/* only defined for length modifier ll */
#endif
if (fmt_spec == 'p') {
/* HPUX 10: An l, h, ll or L before any other conversion character
* (other than d, i, u, o, x, or X) is ignored.
* Digital Unix:
* not specified, but seems to behave as HPUX does.
* Solaris: If an h, l, or L appears before any other conversion
* specifier (other than d, i, u, o, x, or X), the behavior
* is undefined. (Actually %hp converts only 16-bits of address
* and %llp treats address as 64-bit data which is incompatible
* with (void *) argument on a 32-bit system).
*/
#ifdef SOLARIS_COMPATIBLE
# ifdef SOLARIS_BUG_COMPATIBLE
/* keep length modifiers even if it represents 'll' */
# else
if (length_modifier == '2') length_modifier = '\0';
# endif
#else
length_modifier = '\0';
#endif
ptr_arg = va_arg(ap, void *);
if (ptr_arg != NULL) arg_sign = 1;
} else if (fmt_spec == 'd') { /* signed */
switch (length_modifier) {
case '\0':
case 'h':
/* It is non-portable to specify a second argument of char or short
* to va_arg, because arguments seen by the called function
* are not char or short. C converts char and short arguments
* to int before passing them to a function.
*/
int_arg = va_arg(ap, int);
if (int_arg > 0) arg_sign = 1;
else if (int_arg < 0) arg_sign = -1;
break;
case 'l':
long_arg = va_arg(ap, long int);
if (long_arg > 0) arg_sign = 1;
else if (long_arg < 0) arg_sign = -1;
break;
#ifdef SNPRINTF_LONGLONG_SUPPORT
case '2':
long_long_arg = va_arg(ap, long long int);
if (long_long_arg > 0) arg_sign = 1;
else if (long_long_arg < 0) arg_sign = -1;
break;
#endif
}
} else { /* unsigned */
switch (length_modifier) {
case '\0':
case 'h':
uint_arg = va_arg(ap, unsigned int);
if (uint_arg) arg_sign = 1;
break;
case 'l':
ulong_arg = va_arg(ap, unsigned long int);
if (ulong_arg) arg_sign = 1;
break;
#ifdef SNPRINTF_LONGLONG_SUPPORT
case '2':
ulong_long_arg = va_arg(ap, unsigned long long int);
if (ulong_long_arg) arg_sign = 1;
break;
#endif
}
}
str_arg = tmp; str_arg_l = 0;
/* NOTE:
* For d, i, u, o, x, and X conversions, if precision is specified,
* the '0' flag should be ignored. This is so with Solaris 2.6,
* Digital UNIX 4.0, HPUX 10, Linux, FreeBSD, NetBSD; but not with Perl.
*/
#ifndef PERL_COMPATIBLE
if (precision_specified) zero_padding = 0;
#endif
if (fmt_spec == 'd') {
if (force_sign && arg_sign >= 0)
tmp[str_arg_l++] = space_for_positive ? ' ' : '+';
/* leave negative numbers for sprintf to handle,
to avoid handling tricky cases like (short int)(-32768) */
#ifdef LINUX_COMPATIBLE
} else if (fmt_spec == 'p' && force_sign && arg_sign > 0) {
tmp[str_arg_l++] = space_for_positive ? ' ' : '+';
#endif
} else if (alternate_form) {
if (arg_sign != 0 && (fmt_spec == 'x' || fmt_spec == 'X') )
{ tmp[str_arg_l++] = '0'; tmp[str_arg_l++] = fmt_spec; }
/* alternate form should have no effect for p conversion, but ... */
#ifdef HPUX_COMPATIBLE
else if (fmt_spec == 'p'
/* HPUX 10: for an alternate form of p conversion,
* a nonzero result is prefixed by 0x. */
#ifndef HPUX_BUG_COMPATIBLE
/* Actually it uses 0x prefix even for a zero value. */
&& arg_sign != 0
#endif
) { tmp[str_arg_l++] = '0'; tmp[str_arg_l++] = 'x'; }
#endif
}
zero_padding_insertion_ind = str_arg_l;
if (!precision_specified) precision = 1; /* default precision is 1 */
if (precision == 0 && arg_sign == 0
#if defined(HPUX_BUG_COMPATIBLE) || defined(LINUX_COMPATIBLE)
&& fmt_spec != 'p'
/* HPUX 10 man page claims: With conversion character p the result of
* converting a zero value with a precision of zero is a null string.
* Actually HP returns all zeroes, and Linux returns "(nil)". */
#endif
) {
/* converted to null string */
/* When zero value is formatted with an explicit precision 0,
the resulting formatted string is empty (d, i, u, o, x, X, p). */
} else {
char f[5]; int f_l = 0;
f[f_l++] = '%'; /* construct a simple format string for sprintf */
if (!length_modifier) { }
else if (length_modifier=='2') { f[f_l++] = 'l'; f[f_l++] = 'l'; }
else f[f_l++] = length_modifier;
f[f_l++] = fmt_spec; f[f_l++] = '\0';
if (fmt_spec == 'p') str_arg_l += sprintf(tmp+str_arg_l, f, ptr_arg);
else if (fmt_spec == 'd') { /* signed */
switch (length_modifier) {
case '\0':
case 'h': str_arg_l+=sprintf(tmp+str_arg_l, f, int_arg); break;
case 'l': str_arg_l+=sprintf(tmp+str_arg_l, f, long_arg); break;
#ifdef SNPRINTF_LONGLONG_SUPPORT
case '2': str_arg_l+=sprintf(tmp+str_arg_l,f,long_long_arg); break;
#endif
}
} else { /* unsigned */
switch (length_modifier) {
case '\0':
case 'h': str_arg_l+=sprintf(tmp+str_arg_l, f, uint_arg); break;
case 'l': str_arg_l+=sprintf(tmp+str_arg_l, f, ulong_arg); break;
#ifdef SNPRINTF_LONGLONG_SUPPORT
case '2': str_arg_l+=sprintf(tmp+str_arg_l,f,ulong_long_arg);break;
#endif
}
}
/* include the optional minus sign and possible "0x"
in the region before the zero padding insertion point */
if (zero_padding_insertion_ind < str_arg_l &&
tmp[zero_padding_insertion_ind] == '-') {
zero_padding_insertion_ind++;
}
if (zero_padding_insertion_ind+1 < str_arg_l &&
tmp[zero_padding_insertion_ind] == '0' &&
(tmp[zero_padding_insertion_ind+1] == 'x' ||
tmp[zero_padding_insertion_ind+1] == 'X') ) {
zero_padding_insertion_ind += 2;
}
}
{ size_t num_of_digits = str_arg_l - zero_padding_insertion_ind;
if (alternate_form && fmt_spec == 'o'
#ifdef HPUX_COMPATIBLE /* ("%#.o",0) -> "" */
&& (str_arg_l > 0)
#endif
#ifdef DIGITAL_UNIX_BUG_COMPATIBLE /* ("%#o",0) -> "00" */
#else
/* unless zero is already the first character */
&& !(zero_padding_insertion_ind < str_arg_l
&& tmp[zero_padding_insertion_ind] == '0')
#endif
) { /* assure leading zero for alternate-form octal numbers */
if (!precision_specified || precision < num_of_digits+1) {
/* precision is increased to force the first character to be zero,
except if a zero value is formatted with an explicit precision
of zero */
precision = num_of_digits+1; precision_specified = 1;
}
}
/* zero padding to specified precision? */
if (num_of_digits < precision)
number_of_zeros_to_pad = precision - num_of_digits;
}
/* zero padding to specified minimal field width? */
if (!justify_left && zero_padding) {
int n = min_field_width - (str_arg_l+number_of_zeros_to_pad);
if (n > 0) number_of_zeros_to_pad += n;
}
break;
}
default: /* unrecognized conversion specifier, keep format string as-is*/
zero_padding = 0; /* turn zero padding off for non-numeric convers. */
#ifndef DIGITAL_UNIX_COMPATIBLE
justify_left = 1; min_field_width = 0; /* reset flags */
#endif
#if defined(PERL_COMPATIBLE) || defined(LINUX_COMPATIBLE)
/* keep the entire format string unchanged */
str_arg = starting_p; str_arg_l = p - starting_p;
/* well, not exactly so for Linux, which does something inbetween,
* and I don't feel an urge to imitate it: "%+++++hy" -> "%+y" */
#else
/* discard the unrecognized conversion, just keep *
* the unrecognized conversion character */
str_arg = p; str_arg_l = 0;
#endif
if (*p) str_arg_l++; /* include invalid conversion specifier unchanged
if not at end-of-string */
break;
}
if (*p) p++; /* step over the just processed conversion specifier */
/* insert padding to the left as requested by min_field_width;
this does not include the zero padding in case of numerical conversions*/
if (!justify_left) { /* left padding with blank or zero */
int n = min_field_width - (str_arg_l+number_of_zeros_to_pad);
if (n > 0) {
if (str_l < str_m) {
size_t avail = str_m-str_l;
fast_memset(str+str_l, (zero_padding?'0':' '), (n>avail?avail:n));
}
str_l += n;
}
}
/* zero padding as requested by the precision or by the minimal field width
* for numeric conversions required? */
if (number_of_zeros_to_pad <= 0) {
/* will not copy first part of numeric right now, *
* force it to be copied later in its entirety */
zero_padding_insertion_ind = 0;
} else {
/* insert first part of numerics (sign or '0x') before zero padding */
int n = zero_padding_insertion_ind;
if (n > 0) {
if (str_l < str_m) {
size_t avail = str_m-str_l;
fast_memcpy(str+str_l, str_arg, (n>avail?avail:n));
}
str_l += n;
}
/* insert zero padding as requested by the precision or min field width */
n = number_of_zeros_to_pad;
if (n > 0) {
if (str_l < str_m) {
size_t avail = str_m-str_l;
fast_memset(str+str_l, '0', (n>avail?avail:n));
}
str_l += n;
}
}
/* insert formatted string
* (or as-is conversion specifier for unknown conversions) */
{ int n = str_arg_l - zero_padding_insertion_ind;
if (n > 0) {
if (str_l < str_m) {
size_t avail = str_m-str_l;
fast_memcpy(str+str_l, str_arg+zero_padding_insertion_ind,
(n>avail?avail:n));
}
str_l += n;
}
}
/* insert right padding */
if (justify_left) { /* right blank padding to the field width */
int n = min_field_width - (str_arg_l+number_of_zeros_to_pad);
if (n > 0) {
if (str_l < str_m) {
size_t avail = str_m-str_l;
fast_memset(str+str_l, ' ', (n>avail?avail:n));
}
str_l += n;
}
}
}
}
#if defined(NEED_SNPRINTF_ONLY)
va_end(ap);
#endif
if (str_m > 0) { /* make sure the string is null-terminated
even at the expense of overwriting the last character
(shouldn't happen, but just in case) */
str[str_l <= str_m-1 ? str_l : str_m-1] = '\0';
}
/* Return the number of characters formatted (excluding trailing null
* character), that is, the number of characters that would have been
* written to the buffer if it were large enough.
*
* The value of str_l should be returned, but str_l is of unsigned type
* size_t, and snprintf is int, possibly leading to an undetected
* integer overflow, resulting in a negative return value, which is illegal.
* Both XSH5 and ISO C99 (at least the draft) are silent on this issue.
* Should errno be set to EOVERFLOW and EOF returned in this case???
*/
return (int) str_l;
}
#endif
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/media/updf_newlib/pdf/snprintf.h
0,0 → 1,26
#ifndef _PORTABLE_SNPRINTF_H_
#define _PORTABLE_SNPRINTF_H_
 
#define PORTABLE_SNPRINTF_VERSION_MAJOR 2
#define PORTABLE_SNPRINTF_VERSION_MINOR 2
 
#ifdef HAVE_SNPRINTF
#include <stdio.h>
#else
extern int snprintf(char *, size_t, const char *, /*args*/ ...);
extern int vsnprintf(char *, size_t, const char *, va_list);
#endif
 
#if defined(HAVE_SNPRINTF) && defined(PREFER_PORTABLE_SNPRINTF)
extern int portable_snprintf(char *str, size_t str_m, const char *fmt, /*args*/ ...);
extern int portable_vsnprintf(char *str, size_t str_m, const char *fmt, va_list ap);
#define snprintf portable_snprintf
#define vsnprintf portable_vsnprintf
#endif
 
extern int asprintf (char **ptr, const char *fmt, /*args*/ ...);
extern int vasprintf (char **ptr, const char *fmt, va_list ap);
extern int asnprintf (char **ptr, size_t str_m, const char *fmt, /*args*/ ...);
extern int vasnprintf(char **ptr, size_t str_m, const char *fmt, va_list ap);
 
#endif
Property changes:
Added: svn:executable
+*
\ No newline at end of property