diff --git a/src/Makefile b/src/Makefile index a01cfc9..46f9303 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,2 +1,8 @@ -stst: stst.s scheme.c scheme_asm.s runtime-5.4.c collect-5.7.c libtoplevel.s libcxr.s -luuid libsymboltable-5.6.s libhandlers-5.5.s libcontrol-5.8.s libintelasm-5.8.s libcollect-5.3.s librecord-5.6.s libcore-5.7.s libio-5.8.s libwriter-5.7.s libtokenizer-5.7.s libexpand-5.8.s libinterpret-5.8.s libcafe-5.8.s libtrace-5.3.s libposix-5.3.s - gcc -Wall -o stst stst.s scheme.c scheme_asm.s runtime-5.4.c collect-5.7.c libtoplevel.s libcxr.s -luuid libsymboltable-5.6.s libhandlers-5.5.s libcontrol-5.8.s libintelasm-5.8.s libcollect-5.3.s librecord-5.6.s libcore-5.7.s libio-5.8.s libwriter-5.7.s libtokenizer-5.7.s libexpand-5.8.s libinterpret-5.8.s libcafe-5.8.s libtrace-5.3.s libposix-5.3.s + +all: ikarus.fasl + +ikarus.fasl: + echo '(load "compiler-6.1.ss")' | petite + +clean: + rm -f *.fasl diff --git a/src/build-date.tmp b/src/build-date.tmp index 5d0d1a5..fe1b341 100644 --- a/src/build-date.tmp +++ b/src/build-date.tmp @@ -1 +1 @@ -2006-07-27 +2006-07-28 diff --git a/src/collect-5.7.c b/src/collect-5.7.c deleted file mode 100644 index 5f7244a..0000000 --- a/src/collect-5.7.c +++ /dev/null @@ -1,839 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "scheme.h" - - - -typedef struct root_t{ - int count; - char** start; - struct root_t* next; -} root_t; - -void S_add_roots(pcb_t* pcb, int* f){ - int n = *f; - if(n == 0) return; - root_t* t = malloc(sizeof(root_t)); - if(t == NULL){ - fprintf(stderr, "Error mallocing\n"); - exit(-1); - } - t->count = n; - t->start = (char**)(f+1); - t->next = (root_t*) pcb->roots; - pcb->roots = (char*) t; - int i; - for(i=1; i<=n; i++){ - assert(f[i] == 0); - } -} - -void S_check_roots(pcb_t* pcb, int* f){ - int n = *f; - int i; - for(i=1; i<=n; i++){ - assert(f[i] != 0); - } -} - -/* S_collect is called from scheme under the following conditions: - * 1. An attempt is made to allocate a small object and the ap is above - * the red line. - * 2. The current frame of the call is dead, so, upon return from S_collect, - * the caller returns to its caller. - * 3. The frame-pointer of the caller to S_collect is saved at - * pcb->stack_extent. No variables are live at that frame except for - * the return point (at *(pcb->stack_extent)). - * 4. S_collect must return a new ap (in pcb->allocation_pointer) that has - * at least 2 pages of memory free. - * 5. S_collect must also update pcb->allocaton_red_line to be 2 pages below - * the real end of heap. - * 6. S_collect should not move the stack. - */ - -#define pagesize 4096 -#define pageshift 12 -#define minimum_heap_size (pagesize * 1024 * 4) -#define maximum_heap_size (pagesize * 1024 * 8) -#define minimum_stack_size (pagesize * 128) -#define align_to_page(x) (((x)/pagesize)*pagesize) -#define align_to_next_page(x) \ - (((pagesize - 1 + (unsigned int)(x)) >> pageshift) << pageshift) -#define align_to_prev_page(x) \ - ((((unsigned int)(x)) >> pageshift) << pageshift) - -static char* allocate_unprotected_space(int size); -static void deallocate_unprotected_space(char* p, int size); -static void deallocate_string_pages(char*); -static void copy_roots(pcb_t* pcb); -static char* move_object(char* x, pcb_t* pcb); - -pcb_t* S_collect(int req, pcb_t* pcb){ -#if 0 - fprintf(stderr, "S_collect entry %d (pcb=0x%08x)\n", req, (int)pcb); -#endif - char* heap_base = pcb->heap_base; -#if 0 - int heap_size = (int)pcb->heap_size; - fprintf(stderr, "heapsize=0x%08x (0x%08x .. 0x%08x)\n", - heap_size, - (int) heap_base, - (int) (heap_base + heap_size - 1)); -#endif - int used_space = (int)(pcb->allocation_pointer - heap_base); - { - int bytes = (int) pcb->allocated_bytes + (used_space & 0xFFFFF); - pcb->allocated_megs += (bytes >> 20); - pcb->allocated_bytes = (char*) (bytes & 0xFFFFF); -#if 0 - fprintf(stderr, "allocated %d megs and %d bytes so far\n", - (int) pcb->allocated_megs, - (int) pcb->allocated_bytes); -#endif - } - - int required_space = align_to_page(used_space + 2 * req + 2 * pagesize); - if(required_space < minimum_heap_size){ - required_space = minimum_heap_size; - } - if(required_space > maximum_heap_size){ - fprintf(stderr, "Maximum heapsize exceeded\n"); - exit(-1); - } - char* old_heap = pcb->heap_base; - int old_size = (int)pcb->heap_size; - char* old_string_pages = pcb->string_pages; - pcb->string_pages = 0; - char* new_heap = allocate_unprotected_space(maximum_heap_size); - pcb->allocation_pointer = new_heap; - pcb->allocation_redline = new_heap + maximum_heap_size - 2 * pagesize; - pcb->heap_base = new_heap; - pcb->heap_size = (char*) maximum_heap_size; - copy_roots(pcb); - char** p = (char**) new_heap; - while(p != (char**) pcb->allocation_pointer){ - *p = move_object(*p, pcb); - p++; - } - deallocate_unprotected_space(old_heap, old_size); - deallocate_string_pages(old_string_pages); - { - int free_space = - (int)pcb->allocation_redline - (int)pcb->allocation_pointer; - int diff = align_to_page(free_space - minimum_heap_size); - if(diff > 0){ - deallocate_unprotected_space( - pcb->heap_base + (int)pcb->heap_size - diff, - diff); - pcb->allocation_redline -= diff; - pcb->heap_size -= diff; - } - } -#if 0 - fprintf(stderr, "ap=0x%08x limit=0x%08x\n", - (int)pcb->allocation_pointer, - (int)pcb->heap_base+(int)pcb->heap_size-wordsize); -#endif - return pcb; -} - -#define fixnump(x) ((((int)(x)) & fx_mask) == fx_tag) -#define closurep(x) ((((int)(x)) & closure_mask) == closure_tag) -#define immediatep(x) ((((int)(x)) & 7) == 7) -#define tagof(x) (((int) (x)) & 7) -#define ref(x,t) (*((char**)(((char*)(x))+((int)(t))))) -#define align(x) ((((x)+object_alignment-1)>>align_shift)<base, p->end - p->base); - p=p->next; - } - p = (page_t*) old_string_pages; - while(p){ - page_t* n = p->next; - free(p); - p = n; - } -} - -#if 0 -static char* extend_pointer_ap(pcb_t* pcb, int size){ - if(pcb->pointer_base){ - page_t* p = make_page_t(); - p->base = pcb->pointer_base; - p->end = pcb->pointer_ap; - p->next = (page_t*) pcb->pointer_pages; - pcb->pointer_pages = (char*) p; - } - char* ap = allocate_unprotected_space(size); - pcb->pointer_base = ap; - pcb->pointer_ap = ap; - pcb->pointer_eap = ap + size; - return ap; -} -#endif - -static char* alloc_large_string(pcb_t* pcb, int size){ - char* ap = allocate_unprotected_space(size); - page_t* p = make_page_t(); - p->base = ap; - p->end = ap+size; - p->next = (page_t*) pcb->string_pages; - pcb->string_pages = (char*) p; - return ap; -} - -static char* extend_string_ap(pcb_t* pcb, int size){ - if(pcb->string_base){ - page_t* p = make_page_t(); - p->base = pcb->string_base; - p->end = pcb->string_ap; - p->next = (page_t*) pcb->string_pages; - pcb->string_pages = (char*) p; - } - char* ap = allocate_unprotected_space(size); - pcb->string_base = ap; - pcb->string_ap = ap; - pcb->string_eap = ap + size; - return ap; -} - -static char* move_string(char* s, pcb_t* pcb){ - int len = (int) ref(s, -string_tag); - int sz = align((len>>fx_shift)+disp_string_data+1); - if(sz < pagesize){ - char* ap = pcb->string_ap; - char* nap = ap + sz; - if(nap > pcb->string_eap){ - ap = extend_string_ap(pcb, pagesize); - pcb->string_eap = ap + pagesize; - nap = ap + sz; - } - pcb->string_ap = nap; - memcpy(ap, s-string_tag, sz); - ref(s,-string_tag) = (char*)-1; - ref(s,wordsize-string_tag) = ap+string_tag; - return ap + string_tag; - } - else { - char* ap = alloc_large_string(pcb, sz); - memcpy(ap, s-string_tag, sz); - ref(s,-string_tag) = (char*)-1; - ref(s,wordsize-string_tag) = ap+string_tag; - return ap + string_tag; - } -} - -static void munch_stack(char* fp, pcb_t* pcb, char* frame_base){ - while(fp != frame_base){ - assert(fp < frame_base); -#if 0 - fprintf(stderr, "copying frame at 0x%08x of 0x%08x\n", - (int)fp, (int)stack_base); -#endif - char* rp = ref(fp, 0); -#if 0 - fprintf(stderr, "return-point = 0x%08x\n", (int)rp); -#endif - char* rp_offset = ref(rp, disp_frame_offset); - assert(rp_offset == 0); - int framesize = (int) ref(rp, disp_frame_size); /* UGLY */ - assert(fixnump(framesize)); - assert(framesize >= 0); - if(framesize > 0){ - int bytes_in_mask = ((framesize>>fx_shift)+7)>>3; - char* mask = rp + disp_frame_size - bytes_in_mask; - fp = fp + framesize; - char** fpp = (char**) fp; - int i; - for(i=0; i 0); -#if 0 - /* move cp */ - { - char* cp = ref(fp, 2*wordsize); - assert(closurep(cp)); - ref(fp, 2*wordsize) = move_object(cp, pcb); - } -#endif - fp += framesize; - int i; - for(i=wordsize; i<(framesize); i+=wordsize){ - ref(fp, -i) = move_object(ref(fp,-i), pcb); - } - } - else { - fprintf(stderr, "Error: framesize is %d\n", framesize); - exit(-10); - } - } -} - -static char* move_stack(char* s, pcb_t* pcb, int sz){ - char* ns; - int asz = align(sz); - if(asz < pagesize){ - char* ap = pcb->string_ap; - char* nap = ap + asz; - if(nap > pcb->string_eap){ - ap = extend_string_ap(pcb, pagesize); - pcb->string_eap = ap + pagesize; - nap = ap + asz; - } - pcb->string_ap = nap; - ns = ap; - } - else { - ns = alloc_large_string(pcb, asz); - } - memcpy(ns, s, sz); - munch_stack(ns, pcb, ns+sz); - return ns; -} - - -static char* move_pointers(char* x, pcb_t* pcb, int size, int tag){ - int sz = align(size); - char* ap = pcb->allocation_pointer; - char* nap = ap + sz; - pcb->allocation_pointer = nap; - ref(nap, -wordsize) = 0; - memcpy(ap, x, size); - ref(x,0) = (char*)-1; - ref(x,wordsize) = ap + tag; - return ap + tag; -} - - -static char* move_continuation(char* x, pcb_t* pcb){ - int sz = (int) ref(x, disp_continuation_size); - char* top = ref(x, disp_continuation_top); - char* r = move_pointers(x, pcb, continuation_size, vector_tag); - ref(r, disp_continuation_top - vector_tag) = move_stack(top, pcb, sz); - return r; -} - -static char* move_code(char* x, pcb_t* pcb){ - int instrsize = (int) ref(x, disp_code_instrsize); - if(instrsize == 0){ - return (x + vector_tag); - } - int relocsize = (int) ref(x, disp_code_relocsize); - int reqspace = instrsize + relocsize + disp_code_data; - char* nx = allocate_unprotected_space(reqspace); - { - page_t* p = malloc(sizeof(page_t)); - if(p == NULL){ - fprintf(stderr, "failed to alloc a page_t\n"); - exit(-1); - } - p->next = (page_t*) pcb->string_pages; - pcb->string_pages = (char*) p; - p->base = nx; - p->end = nx + reqspace; - } - memcpy(nx, x, reqspace); - ref(x, 0) = (char*)-1; - ref(x, wordsize) = nx + vector_tag; - { - char* p = nx + disp_code_data + instrsize; - char* pe = p + relocsize; - while(p < pe){ - int r = (int) ref(p,0); - if(r == 0){ - p = pe; - } - else { - int rtag = r & 3; - if(rtag == 0){ - /* undisplaced pointer */ - int code_offset = r >> 2; - char* old_object = ref(nx, disp_code_data + code_offset); - char* new_object = move_object(old_object, pcb); - ref(nx, disp_code_data + code_offset) = new_object; - p += wordsize; - } - else if(rtag == 1){ - /* displaced pointer */ - int code_offset = r >> 2; - int object_offset = (int) ref(p, wordsize); - char* old_displaced_object = ref(nx, disp_code_data + code_offset); - char* old_object = old_displaced_object - object_offset; - char* new_object = move_object(old_object, pcb); - char* new_displaced_object = new_object + object_offset; - ref(nx, disp_code_data + code_offset) = new_displaced_object; - p += (2 * wordsize); - } - else if(rtag == 2){ - /* displaced relative pointer */ - int code_offset = r >> 2; - int relative_offset = (int) ref(p, wordsize); - char* old_relative_pointer = ref(nx, disp_code_data + code_offset); - char* old_relative_object = old_relative_pointer - relative_offset; - char* old_addr = x + disp_code_data + code_offset + wordsize; - char* old_object = old_relative_object + (unsigned int) old_addr; - char* new_object = move_object(old_object, pcb); - char* new_disp_object = new_object + relative_offset; - char* next_word = nx + disp_code_data + code_offset + wordsize; - char* new_relative_pointer = - new_disp_object - (unsigned int) next_word; - ref(next_word, -wordsize) = new_relative_pointer; - p += (2 * wordsize); - } - else { - fprintf(stderr, "invalid rtag %d in 0x%08x\n", rtag, r); - exit(-1); - } - } - } - } - int err = mprotect(nx, - align_to_next_page(reqspace), - PROT_READ | PROT_WRITE | PROT_EXEC); - if(err == -1){ - perror("Cannot set code executable"); - exit(-1); - } - return nx + vector_tag; -} - - -static char* move_object(char* x, pcb_t* pcb){ - if(fixnump(x)){ - return x; - } - else if(immediatep(x)){ - return x; - } - else { - int tag = tagof(x); - char* fst = ref(x, -tag); - if(fst == (char*)-1){ - return ref(x,wordsize-tag); - } - else if(tag == pair_tag){ - return(move_pointers(x-tag, pcb, pair_size, tag)); - } - else if(tag == closure_tag){ - //assert(ref(fst, -2*wordsize) == 0); - int size = (int) ref(fst, -wordsize); - assert(fixnump(size)); - assert(size > 0); - char* new_closure = move_pointers(x-tag, pcb, size, tag); - char* code_entry = ref(new_closure, -closure_tag); - char* code_object = code_entry - disp_code_data + vector_tag; - char* new_code_object = move_object(code_object, pcb); - char* new_code_entry = new_code_object + disp_code_data - vector_tag; - ref(new_closure, -closure_tag) = new_code_entry; - return new_closure; - } - else if(tag == symbol_tag){ - return (move_pointers(x-tag, pcb, symbol_size, tag)); - } - else if(tag == vector_tag){ - if(fixnump(fst)){ - return (move_pointers(x-tag, pcb, disp_vector_data + (int)fst, tag)); - } - else if(fst == (char*) continuation_tag){ - return (move_continuation(x-tag, pcb)); - } - else if(fst == (char*) code_tag){ - return (move_code(x-tag, pcb)); - } - else if(((int)fst & record_pmask) == record_ptag){ - int len; - { - char* rtd = fst; - char* rtd_fst = ref(rtd, -record_ptag); - if(rtd_fst == (char*) -1){ - rtd = ref(rtd, wordsize-record_ptag); - } - len = (int) ref(rtd, disp_record_data - record_ptag); - } - return (move_pointers(x-tag, pcb, disp_record_data + len, tag)); - } - else { - fprintf(stderr, "nonvec 0x%08x 0x%08x\n", (int)x, (int)fst); - exit(-1); - } - } - else if(tag == string_tag){ - return (move_string(x, pcb)); - } - else { - fprintf(stderr, "here tag=%d\n", tag); - exit(-1); - } - } -} - -static void copy_roots(pcb_t* pcb){ - /* first, the constants */ - root_t* r = (root_t*)pcb->roots; - while(r){ - int n = r->count; - char** f = r->start; - int i; - for(i=0; inext; - } - - /* next, the pcb-primitives */ - char** fst = &pcb->scheme_objects; - char** end = &pcb->scheme_objects_end; - fst++; - while(fst < end){ - *fst = move_object(*fst, pcb); - fst++; - } - /* next, the stack */ - char* fp = pcb->frame_pointer; - char* frame_base = pcb->frame_base; - munch_stack(fp, pcb, frame_base); -} - - - -static char* allocate_unprotected_space(int size){ - int aligned_size = ((size + pagesize - 1) / pagesize) * pagesize; - char* p = mmap(0, aligned_size, - PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE, - 0, 0); - if(p == MAP_FAILED){ - perror("allocate_unprotected_space failed to mmap"); - exit(-10); - } - return p; -} - - -static void deallocate_unprotected_space(char* p, int size){ - int status; - int aligned_size = ((size + pagesize - 1) / pagesize) * pagesize; - status = munmap(p, aligned_size); - if(status != 0){ - perror("deallocate_unprotected_space failed to unmap"); - exit(-10); - } -} - - -void S_stack_overflow(pcb_t* pcb){ -// fprintf(stderr, "stack overflow detected\n"); - char* stack_top = pcb->stack_top; - int stack_size = (int) pcb->stack_size; - char* fp = pcb->frame_pointer; - char* frame_base = pcb->frame_base; - assert(fp != frame_base); - char* rp = ref(fp, 0); - int framesize = (int) ref(rp, disp_frame_size); /* UGLY */ - assert(fixnump(framesize)); - assert(framesize >= 0); - if(framesize == 0){ - framesize = (int)ref(fp, wordsize); - assert(fixnump(framesize)); - } - // fprintf(stderr, "framesize = %d bytes\n", framesize); - { /* capture continuation */ - char* next_frame_top = fp + framesize; - if(next_frame_top == frame_base){ - fprintf(stderr, "continuation already captured\n"); - } else { - //fprintf(stderr, "capturing continuation ... "); - char* cont = pcb->allocation_pointer; - pcb->allocation_pointer += continuation_size; - ref(cont, 0) = (char*) continuation_tag; - ref(cont, disp_continuation_top) = next_frame_top; - ref(cont, disp_continuation_next) = pcb->next_continuation; - ref(cont, disp_continuation_size) = - frame_base - (int)next_frame_top; - pcb->next_continuation = cont + vector_tag; - //fprintf(stderr, "done (sz=0x%08x)\n", - // (int) ref(cont, disp_continuation_size)); - } - } - int req_stack_size = align_to_page(framesize * 4 + 2 * pagesize); - if(req_stack_size < minimum_stack_size){ - req_stack_size = minimum_stack_size; - } - char* new_stack = allocate_unprotected_space(req_stack_size); - char* new_frame_redline = new_stack + 2 * pagesize; - char* new_frame_base = new_stack + req_stack_size - wordsize; - ref(new_frame_base, 0) = ref(frame_base, 0); /* underflow handler */ - memcpy(new_frame_base - framesize, fp, framesize); - - pcb->stack_top = new_stack; - pcb->stack_size = (char*)req_stack_size; - pcb->frame_base = new_frame_base; - pcb->frame_pointer = new_frame_base - framesize; - pcb->frame_redline = new_frame_redline; - /* - fprintf(stderr, "stack=0x%08x .. 0x%08x (redline=0x%08x) fp=0x%08x\n", - (int) pcb->frame_base, - (int) pcb->stack_top, - (int) pcb->frame_redline, - (int) pcb->frame_pointer); - fprintf(stderr, "returning ... \n"); - */ - page_t* p = malloc(sizeof(page_t)); - if(p == NULL){ - fprintf(stderr, "cannot malloc page_t\n"); - exit(-1); - } - p->base = stack_top; - p->end = stack_top + stack_size; - p->next = (page_t*) pcb->string_pages; - pcb->string_pages = (char*) p; - //fprintf(stderr, "done\n"); - return; -} - -/* - On overflow: - - +--------------+ - | unused | - | area | - | | - +--------------+ - | rp | <-- frame pointer on overflow - +--------------+ - | frame | - | when | - | overflow | - | occured | - +--------------+ - | rp_next | <-- capture next conitnuation here - +--------------+ (unless we're at base already) - | ... | - | ... | - | ... | - +--------------+ - | underflow | - +--------------+ - - New stack: - - +--------------+ - | unused | - | area | - | | - | | - | | - | | - | | - | | - | | - | | - +--------------+ - | rp | <-- frame pointer on return - +--------------+ - | frame | - | when | - | overflow | - | occured | - +--------------+ - | underflow | - +--------------+ - - */ - -char* S_make_code(int fxcsize, int fxrsize, int fxclsize, pcb_t* pcb){ - int csize = fxcsize >> fx_shift; - csize = (((csize + (1 << fx_shift) - 1) >> fx_shift) << fx_shift); - int reqspace = csize + fxrsize + disp_code_data; - char* code = allocate_unprotected_space(reqspace); - { - page_t* p = malloc(sizeof(page_t)); - if(p == NULL){ - fprintf(stderr, "failed to allocate a page\n"); - exit(-1); - } - p->base = code; - p->end = code + reqspace; - p->next = (page_t*) pcb->string_pages; - pcb->string_pages = (char*) p; - } - memset(code, 0, reqspace); - ref(code, 0) = (char*)code_tag; - ref(code, disp_code_instrsize) = (char*) csize; - ref(code, disp_code_relocsize) = (char*) fxrsize; - ref(code, disp_code_closuresize) = (char*) fxclsize; - return(code + vector_tag); -} - -char* S_make_code_executable(char* x, pcb_t* pcb){ - int instrsize = (int) ref(x, disp_code_instrsize - vector_tag); - char* code_start = x + disp_code_data - vector_tag; - char* code_end = code_start + instrsize; - char* page_start = (char*) align_to_prev_page(code_start); - char* page_end = (char*) align_to_next_page(code_end); - int err = mprotect(page_start, - (int) (page_end - page_start), - PROT_READ | PROT_WRITE | PROT_EXEC); - if(err == -1){ - perror("Cannot set code executable"); - exit(-1); - } - return bool_t; -} - - - - -#if 0 -SUPER FAST HASH - Taken from - http://www.azillionmonkeys.com/qed/hash.html - -#endif -#undef get16bits -#if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \ - || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__) -#define get16bits(d) (*((const uint16_t *) (d))) -#endif - -#if !defined (get16bits) -#define get16bits(d) ((((const uint8_t *)(d))[1] << UINT32_C(8))\ - +((const uint8_t *)(d))[0]) -#endif - - -char* SuperFastHash (char* str) { - char* data = str + disp_string_data - string_tag; - int len = (int) ref(str, disp_string_length - string_tag); - len = len >> fx_shift; - - uint32_t hash = len, tmp; - int rem; - - if (len <= 0 || data == NULL) return 0; - - rem = len & 3; - len >>= 2; - - /* Main loop */ - for (;len > 0; len--) { - hash += get16bits (data); - tmp = (get16bits (data+2) << 11) ^ hash; - hash = (hash << 16) ^ tmp; - data += 2*sizeof (uint16_t); - hash += hash >> 11; - } - - /* Handle end cases */ - switch (rem) { - case 3: hash += get16bits (data); - hash ^= hash << 16; - hash ^= data[sizeof (uint16_t)] << 18; - hash += hash >> 11; - break; - case 2: hash += get16bits (data); - hash ^= hash << 11; - hash += hash >> 17; - break; - case 1: hash += *data; - hash ^= hash << 10; - hash += hash >> 1; - } - - /* Force "avalanching" of final 127 bits */ - hash ^= hash << 3; - hash += hash >> 5; - hash ^= hash << 4; - hash += hash >> 17; - hash ^= hash << 25; - hash += hash >> 6; - - return (char*)(hash<> fx_shift)){ - fprintf(stderr, "BUG: pid out of range in fork\n"); - exit(-1); - } - return (char*) fxpid; -} - -char* S_system(char* str){ - int status = system(str + disp_string_data - string_tag); - int fxstatus = status << fx_shift; - if(status != (fxstatus >> fx_shift)){ - fprintf(stderr, "BUG: rv out of range in system\n"); - exit(-1); - } - return (char*) fxstatus; -} diff --git a/src/compiler-6.0.ss b/src/compiler-6.0.ss index cc67adc..c3892a5 100644 --- a/src/compiler-6.0.ss +++ b/src/compiler-6.0.ss @@ -3888,8 +3888,3 @@ (system "cp stst petite-ikarus-fresh") - - - -(define (asm-helper-code) - ) diff --git a/src/compiler-6.1.ss b/src/compiler-6.1.ss new file mode 100644 index 0000000..76ea6c2 --- /dev/null +++ b/src/compiler-6.1.ss @@ -0,0 +1,3132 @@ + +;;; 6.1: added case-lambda, dropped lambda +;;; 6.0: basic compiler +;;; +(when (eq? "" "") + (load "chez-compat.ss") + (set! primitive-ref top-level-value) + (load "libexpand-6.1.ss") + ;(load "libinterpret-6.0.ss") + (load "record-case.ss") + ;(#%current-eval eval) + ) + +(define primitive-set! set-top-level-value!) + +(load "libassembler-compat-6.0.ss") ; defines make-code etc. +(load "libintelasm-6.0.ss") ; uses make-code, etc. +(load "libfasl-6.0.ss") ; uses code? etc. + + + +(load "tests-driver.ss") +(print-gensym #f) +(gensym-prefix "L_") + + +(define assembler-output (make-parameter #t)) + +(load "set-operations.ss") +;(load "tests-5.6-req.scm") +;(load "tests-5.3-req.scm") +;(load "tests-5.2-req.scm") +;(load "tests-5.1-req.scm") +;(load "tests-4.3-req.scm") +;(load "tests-4.2-req.scm") + +;(load "tests-4.1-req.scm") +;(load "tests-3.4-req.scm") + +;(load "tests-3.3-req.scm") +;(load "tests-3.2-req.scm") +;(load "tests-3.1-req.scm") +;(load "tests-2.9-req.scm") +;(load "tests-2.8-req.scm") +;(load "tests-2.6-req.scm") +;(load "tests-2.4-req.scm") +;(load "tests-2.3-req.scm") +;(load "tests-2.2-req.scm") +;(load "tests-2.1-req.scm") +;(load "tests-1.9-req.scm") +;(load "tests-1.8-req.scm") +;(load "tests-1.7-req.scm") +;(load "tests-1.6-req.scm") +;(load "tests-1.5-req.scm") +;(load "tests-1.4-req.scm") +;(load "tests-1.3-req.scm") +;(load "tests-1.2-req.scm") +;(load "tests-1.1-req.scm") + + +(define scheme-library-files + '(["libhandlers-6.0.ss" "libhandlers.fasl"] + ["libcontrol-6.1.ss" "libcontrol.fasl"] + ["libcollect-6.0.ss" "libcollect.fasl"] + ["librecord-6.1.ss" "librecord.fasl"] + ["libcxr-6.0.ss" "libcxr.fasl"] + ["libcore-6.1.ss" "libcore.fasl"] + ["libio-6.1.ss" "libio.fasl"] + ["libwriter-6.1.ss" "libwriter.fasl"] + ["libtokenizer-6.1.ss" "libtokenizer.fasl"] + ["libexpand-6.1.ss" "libexpand.fasl"] + ["libinterpret-6.1.ss" "libinterpret.fasl"] + ;["libintelasm-6.0.ss" "libintelasm.fasl"] + ["libcafe-6.1.ss" "libcafe.fasl"] +; ["libtrace-5.3.ss" "libtrace-5.3.s" "libtrace" ] + ["libposix-6.0.ss" "libposix.fasl"] + ["libtoplevel-6.0.ss" "libtoplevel.fasl"] + )) + +(define primitive? + (lambda (x) + (or (assq x open-coded-primitives) + (memq x public-primitives)))) + +(define open-coded-primitives +;;; these primitives, when found in operator position with the correct +;;; number of arguments, will be open-coded by the generator. If an +;;; incorrect number of args is detected, or if they appear in non-operator +;;; position, then they cannot be open-coded, and the pcb-primitives table +;;; is consulted for a reference of the pcb slot containing the primitive. +;;; If it's not found there, an error is signalled. +;;; +;;; prim-name args + '([$constant-ref 1 value] + [$constant-set! 2 effect] + [$pcb-ref 1 value] + [$pcb-set! 2 effect] + ;;; type predicates + [fixnum? 1 pred] + [immediate? 1 pred] + [boolean? 1 pred] + [char? 1 pred] + [pair? 1 pred] + [symbol? 1 pred] + [vector? 1 pred] + [string? 1 pred] + [procedure? 1 pred] + [null? 1 pred] + [eof-object? 1 pred] + [$unbound-object? 1 pred] + [$forward-ptr? 1 pred] + [not 1 pred] + [eq? 2 pred] + ;;; fixnum primitives + [$fxadd1 1 value] + [$fxsub1 1 value] + [$fx+ 2 value] + [$fx- 2 value] + [$fx* 2 value] + [$fxsll 2 value] + [$fxsra 2 value] + [$fxlogand 2 value] + [$fxlogor 2 value] + [$fxlogxor 2 value] + [$fxlognot 1 value] + [$fxquotient 2 value] + [$fxmodulo 2 value] + ;;; fixnum predicates + [$fxzero? 1 pred] + [$fx= 2 pred] + [$fx< 2 pred] + [$fx<= 2 pred] + [$fx> 2 pred] + [$fx>= 2 pred] + ;;; character predicates + [$char= 2 pred] + [$char< 2 pred] + [$char<= 2 pred] + [$char> 2 pred] + [$char>= 2 pred] + ;;; character conversion + [$fixnum->char 1 value] + [$char->fixnum 1 value] + ;;; lists/pairs + [cons 2 value] + [$car 1 value] + [$cdr 1 value] + [$set-car! 2 effect] + [$set-cdr! 2 effect] + ;;; vectors + [$make-vector 1 value] + [vector any value] + [$vector-length 1 value] + [$vector-ref 2 value] + [$vector-set! 3 effect] + ;;; strings + [$make-string 1 value] + [$string any value] + [$string-length 1 value] + [$string-ref 2 value] + [$string-set! 3 effect] + ;;; symbols + [$make-symbol 1 value] + [$symbol-value 1 value] + [$symbol-string 1 value] + [$symbol-unique-string 1 value] + [$set-symbol-value! 2 effect] + [$set-symbol-string! 2 effect] + [$set-symbol-unique-string! 2 effect] + [$symbol-plist 1 value] + [$set-symbol-plist! 2 effect] + [primitive-ref 1 value] + [primitive-set! 2 effect] + ;;; misc + [eof-object 0 value] + [void 0 value] + [$exit 1 effect] + [$fp-at-base 0 pred] + [$current-frame 0 value] + [$seal-frame-and-call 1 tail] + [$frame->continuation 1 value] + ;;; + ;;; records + ;;; + [$make-record 2 value] + [$record? 1 pred] + [$record-rtd 1 value] + [$record-ref 2 value] + [$record-set! 3 effect] + ;;; + ;;; hash tables + ;;; + [make-hash-table 0 value] + [hash-table? 1 pred] + ;;; + ;;; asm + ;;; + ;[code? 1 pred] + ;[$code-instr-size 1 value] + ;[$code-reloc-size 1 value] + ;[$code-closure-size 1 value] + ;[$code->closure 1 value] + ;[$set-code-byte! 3 effect] + ;[$set-code-word! 3 effect] + ;[$set-code-object! 4 effect] + ;[$set-code-object+offset! 5 effect] + ;[$set-code-object+offset/rel! 5 effect] + ;;; + [$make-call-with-values-procedure 0 value] + [$make-values-procedure 0 value] + [$install-underflow-handler 0 effect] + )) + +(define (primitive-context x) + (cond + [(assq x open-coded-primitives) => caddr] + [else (error 'primitive-context "unknown prim ~s" x)])) + + +;;; primitives table section +(define primitives-table + '(;;; system locations used by the C/Scheme interface + [$apply-nonprocedure-error-handler library] + [$incorrect-args-error-handler library] + [$multiple-values-error library] + [$intern library] + [do-overflow library] + [do-vararg-overflow library] + [do-stack-overflow library] + ;;; type predicates + [fixnum? public] + [immediate? public] + [boolean? public] + [char? public] + [null? public] + [pair? public] + [symbol? public] + [vector? public] + [string? public] + [procedure? public] + [eof-object? public] + [not public] + [eq? public] + [equal? public] + ;;; fixnum primitives + [fxadd1 public] + [fxsub1 public] + [fx+ public] + [fx- public] + [fx* public] + [fxsll public] + [fxsra public] + [fxlogor public] + [fxlogand public] + [fxlogxor public] + [fxlognot public] + [fxquotient public] + [fxremainder public] + [fxmodulo public] + ;;; fixnum predicates + [fxzero? public] + [fx= public] + [fx< public] + [fx<= public] + [fx> public] + [fx>= public] + ;;; characters + [char=? public] + [char? public] + [char>=? public] + [integer->char public] + [char->integer public] + ;;; lists + [cons public] + [car public] + [cdr public] + [caar public] + [cadr public] + [cdar public] + [cddr public] + [caaar public] + [caadr public] + [cadar public] + [caddr public] + [cdaar public] + [cdadr public] + [cddar public] + [cdddr public] + [caaaar public] + [caaadr public] + [caadar public] + [caaddr public] + [cadaar public] + [cadadr public] + [caddar public] + [cadddr public] + [cdaaar public] + [cdaadr public] + [cdadar public] + [cdaddr public] + [cddaar public] + [cddadr public] + [cdddar public] + [cddddr public] + [set-car! public] + [set-cdr! public] + [list public] + [list* ADDME] + [list? public] + [list-ref public] + [length public] + [make-list public] + [reverse public] + [append public] + [list-ref public] + [memq public] + [assq public] + [map public] + [for-each public] + [andmap public] + [ormap public] + ;;; vectors + [make-vector public] + [vector public] + [vector-length public] + [vector-ref public] + [vector-set! public] + [list->vector public] + [vector->list public] + ;;; strings + [make-string public] + [string public] + [string-length public] + [string-ref public] + [string-set! public] + [list->string public] + [string->list public] + [string-append public] + [substring public] + [string=? public] + [fixnum->string public] + ;;; symbols + [gensym public] + [gensym? public] + [symbol->string public] + [gensym->unique-string public] + [gensym-prefix public] + [gensym-count public] + [print-gensym public] + [string->symbol public] + [top-level-value public] + [top-level-bound? public] + [set-top-level-value! public] + [getprop public] + [putprop public] + [remprop public] + [property-list public] + [oblist public] + [uuid public] + ;;; eof + [eof-object public] + [void public] + ;;; control/debugging + [print-error public] + [error public] + [current-error-handler public] + [exit public] + [apply public] + [make-parameter public] + ;;; output + [output-port? public] + [console-output-port public] + [current-output-port public] + [standard-output-port public] + [standard-error-port public] + [open-output-file public] + [open-output-string public] + [with-output-to-file public] + [call-with-output-file public] + [with-input-from-file public] + [call-with-input-file public] + [get-output-string public] + [close-output-port public] + [flush-output-port public] + [write-char public] + [output-port-name public] + [newline public] + ;;; input + [input-port? public] + [standard-input-port public] + [console-input-port public] + [current-input-port public] + [open-input-file public] + [close-input-port public] + [reset-input-port! public] + [read-char public] + [peek-char public] + [unread-char public] + [input-port-name public] + ;;; writing/printing + [write public] + [display public] + [printf public] + [fprintf public] + [format public] + [read-token public] + [read public] + ;;; evaluation + [primitive? public] + [expand public] + [core-expand public] + [current-expand public] + [interpret public] + [eval public] + [current-eval public] + [load public] + [new-cafe public] + [collect public] + [call/cc public] + [call/cf library] + [dynamic-wind public] + [values public] + [call-with-values public] + [make-traced-procedure library] + [trace-symbol! library] + [untrace-symbol! library] + ;;; record + [$base-rtd library] + [record? public] + [record-rtd public] + [record-name public] + [record-printer public] + [record-length public] + [record-ref public] + [record-set! public] + ;;; record rtds + [make-record-type public] + [record-constructor public] + [record-predicate public] + [record-field-accessor public] + [record-field-mutator public] + ;;; asm + [make-code public] + [code? public] + [make-code-executable! public] + [code-instr-size public] + [code-reloc-size public] + [code-closure-size public] + [set-code-byte! public] + [set-code-word! public] + [set-code-object! public] + [set-code-foreign-object! public] + [set-code-object+offset! public] + [set-code-object+offset/rel! public] + [set-code-object/reloc/relative! public] + [code->closure public] + [list*->code* library] + ;;; + ;;; POSIX + ;;; + [fork public] + [posix-fork public] + [system public] + [$debug public] + [$underflow-misaligned-error public] + )) + +(define (primitive? x) + (cond + [(assq x primitives-table) #t] + [(assq x open-coded-primitives) #t] + [else #f])) + +(define (open-codeable? x) + (cond + [(assq x open-coded-primitives) #t] + [(assq x primitives-table) #f] + [else (error 'open-codeable "invalid primitive ~s" x)])) + +(define (open-coded-primitive-args x) + (cond + [(assq x open-coded-primitives) => cadr] + [else (error 'open-coded-primitive-args "invalid ~s" x)])) + +;;; end of primitives table section + + +(define-record constant (value)) +(define-record code-loc (label)) +(define-record foreign-label (label)) +(define-record var (name)) +(define-record cp-var (idx)) +(define-record frame-var (idx)) +(define-record new-frame (base-idx size body)) +(define-record save-cp (loc)) +(define-record eval-cp (check body)) +(define-record return (value)) +(define-record call-cp + (call-convention rp-convention base-idx arg-count live-mask)) +(define-record primcall (op arg*)) +(define-record primref (name)) +(define-record conditional (test conseq altern)) +(define-record bind (lhs* rhs* body)) +(define-record seq (e0 e1)) +(define-record function (arg* proper body)) +(define-record clambda-case (arg* proper body)) +(define-record clambda (cases)) +(define-record clambda-code (label cases free)) + +(define-record closure (code free*)) +(define-record funcall (op rand*)) +(define-record appcall (op rand*)) +(define-record forcall (op rand*)) +(define-record code-rec (arg* proper free* body)) + +(define-record codes (list body)) +(define-record assign (lhs rhs)) + +(define unique-var + (let ([counter 0]) + (lambda (x) + (let ([g (gensym (format "~a:~a" x counter))]) + (set! counter (fxadd1 counter)) + (make-var g))))) + +(define (make-bind^ lhs* rhs* body) + (if (null? lhs*) + body + (make-bind lhs* rhs* body))) + +(define (recordize x) + (define (gen-fml* fml*) + (cond + [(pair? fml*) + (cons (unique-var (car fml*)) + (gen-fml* (cdr fml*)))] + [(symbol? fml*) + (unique-var fml*)] + [else '()])) + (define (properize fml*) + (cond + [(pair? fml*) + (cons (car fml*) (properize (cdr fml*)))] + [(null? fml*) '()] + [else (list fml*)])) + (define (extend-env fml* nfml* env) + (cons (cons fml* nfml*) env)) + (define (quoted-sym x) + (if (and (list? x) + (fx= (length x) 2) + (eq? 'quote (car x)) + (symbol? (cadr x))) + (cadr x) + (error 'quoted-sym "not a quoted symbol ~s" x))) + (define (quoted-string x) + (if (and (list? x) + (fx= (length x) 2) + (eq? 'quote (car x)) + (string? (cadr x))) + (cadr x) + (error 'quoted-string "not a quoted string ~s" x))) + (define (lookup^ x lhs* rhs*) + (cond + [(pair? lhs*) + (if (eq? x (car lhs*)) + (car rhs*) + (lookup^ x (cdr lhs*) (cdr rhs*)))] + [(eq? x lhs*) rhs*] + [else #f])) + (define (lookup x env) + (cond + [(pair? env) + (or (lookup^ x (caar env) (cdar env)) + (lookup x (cdr env)))] + [else #f])) + (define (E x env) + (cond + [(pair? x) + (case (car x) + [(quote) (make-constant (cadr x))] + [(if) + (make-conditional + (E (cadr x) env) + (E (caddr x) env) + (E (cadddr x) env))] + [(set!) + (let ([lhs (cadr x)] [rhs (caddr x)]) + (make-assign + (or (lookup lhs env) + (error 'recordize "invalid assignment ~s" x)) + (E rhs env)))] + [(begin) + (let f ([a (cadr x)] [d (cddr x)]) + (cond + [(null? d) (E a env)] + [else + (make-seq + (E a env) + (f (car d) (cdr d)))]))] + [(case-lambda) + (let ([cls* + (map + (lambda (cls) + (let ([fml* (car cls)] [body (cadr cls)]) + (let ([nfml* (gen-fml* fml*)]) + (let ([body (E body (extend-env fml* nfml* env))]) + (make-clambda-case + (properize nfml*) + (list? fml*) + body))))) + (cdr x))]) + (make-clambda cls*))] + [(foreign-call) + (let ([name (quoted-string (cadr x))] [arg* (cddr x)]) + (make-forcall name + (map (lambda (x) (E x env)) arg*)))] + [(|#primitive|) + (let ([var (cadr x)]) + (if (primitive? var) + (make-primref var) + (error 'recordize "invalid primitive ~s" var)))] + [(top-level-value) + (let ([var (quoted-sym (cadr x))]) + (if (primitive? var) + (make-primref var) + (error 'recordize "invalid top-level var ~s" var)))] + [(memv) + (make-funcall + (make-primref 'memq) + (map (lambda (x) (E x env)) (cdr x)))] + [($apply) + (let ([proc (cadr x)] [arg* (cddr x)]) + (make-appcall + (E proc env) + (map (lambda (x) (E x env)) arg*)))] + [(void) + (make-constant (void))] + [else + (make-funcall + (E (car x) env) + (map (lambda (x) (E x env)) (cdr x)))])] + [(symbol? x) + (or (lookup x env) + (error 'recordize "invalid reference in ~s" x))] + [else (error 'recordize "invalid expression ~s" x)])) + (E x '())) + + +(define (unparse x) + (define (E-args proper x) + (if proper + (map E x) + (let f ([a (car x)] [d (cdr x)]) + (cond + [(null? d) (E a)] + [else (cons (E a) (f (car d) (cdr d)))])))) + (define (E x) + (record-case x + [(constant c) `(quote ,c)] + [(code-loc x) `(code-loc ,x)] + [(var x) (string->symbol (format "v:~a" x))] + [(primref x) x] + [(conditional test conseq altern) + `(if ,(E test) ,(E conseq) ,(E altern))] + [(primcall op arg*) `(,op . ,(map E arg*))] + [(bind lhs* rhs* body) + `(let ,(map (lambda (lhs rhs) (list (E lhs) (E rhs))) lhs* rhs*) + ,(E body))] + [(seq e0 e1) `(begin ,(E e0) ,(E e1))] + [(function args proper body) + `(lambda ,(E-args proper args) ,(E body))] + [(clambda-case args proper body) + `(clambda-case ,(E-args proper args) ,(E body))] + [(clambda cls*) + `(case-lambda . ,(map E cls*))] + [(clambda-code label clauses free) + `(code ,label . ,(map E clauses))] + [(closure code free*) + `(closure ,(E code) ,(map E free*))] + [(code-rec arg* proper free* body) + `(code-rec [arg: ,(E-args proper arg*)] + [free: ,(map E free*)] + ,(E body))] + [(codes list body) + `(codes ,(map E list) + ,(E body))] + [(funcall rator rand*) `(funcall ,(E rator) . ,(map E rand*))] + [(appcall rator rand*) `(appcall ,(E rator) . ,(map E rand*))] + [(forcall rator rand*) `(foreign-call ,rator . ,(map E rand*))] + [(assign lhs rhs) `(set! ,(E lhs) ,(E rhs))] + [(return x) `(return ,(E x))] + [(new-frame base-idx size body) + `(new-frame [base: ,base-idx] + [size: ,size] + ,(E body))] + [(frame-var idx) + (string->symbol (format "fv.~a" idx))] + [(cp-var idx) + (string->symbol (format "cp.~a" idx))] + [(save-cp expr) + `(save-cp ,(E expr))] + [(eval-cp check body) + `(eval-cp ,check ,(E body))] + [(call-cp call-convention rp-convention base-idx arg-count live-mask) + `(call-cp [conv: ,call-convention] + [rpconv: ,rp-convention] + [base-idx: ,base-idx] + [arg-count: ,arg-count] + [live-mask: ,live-mask])] + [(foreign-label x) `(foreign-label ,x)] + [else (error 'unparse "invalid record ~s" x)])) + (E x)) + +(define (optimize-direct-calls x) + (define who 'optimize-direct-calls) + (define (make-conses ls) + (cond + [(null? ls) (make-constant '())] + [else + (make-primcall 'cons + (list (car ls) (make-conses (cdr ls))))])) + (define (properize lhs* rhs*) + (cond + [(null? lhs*) (error who "improper improper")] + [(null? (cdr lhs*)) + (list (make-conses rhs*))] + [else (cons (car rhs*) (properize (cdr lhs*) (cdr rhs*)))])) + (define (inline-case cls rand*) + (record-case cls + [(clambda-case fml* proper body) + (if proper + (and (fx= (length fml*) (length rand*)) + (make-bind fml* rand* body)) + (and (fx<= (length fml*) (length rand*)) + (make-bind fml* (properize fml* rand*) body)))])) + (define (try-inline cls* rand* default) + (cond + [(null? cls*) default] + [(inline-case (car cls*) rand*)] + [else (try-inline (cdr cls*) rand* default)])) + (define (inline rator rand*) + (record-case rator + [(clambda cls*) + (try-inline cls* rand* + (make-funcall rator rand*))] +; [(function fml* proper body) +; (cond +; [proper +; (if (fx= (length fml*) (length rand*)) +; (make-bind fml* rand* body) +; (begin +; (warning 'compile "possible application error in ~s" +; (unparse (make-funcall rator rand*))) +; (make-funcall rator rand*)))] +; [else +; (if (fx<= (length fml*) (length rand*)) +; (make-bind fml* (properize fml* rand*) body) +; (begin +; (warning 'compile "possible application error in ~s" +; (unparse (make-funcall rator rand*))) +; (make-funcall rator rand*)))])] + [else (make-funcall rator rand*)])) + (define (Expr x) + (record-case x + [(constant) x] + [(var) x] + [(primref) x] + [(bind lhs* rhs* body) + (make-bind lhs* (map Expr rhs*) (Expr body))] + [(conditional test conseq altern) + (make-conditional + (Expr test) + (Expr conseq) + (Expr altern))] + [(seq e0 e1) + (make-seq (Expr e0) (Expr e1))] + [(function fml* proper body) + (make-function fml* proper (Expr body))] + [(clambda cls*) + (make-clambda + (map (lambda (x) + (record-case x + [(clambda-case fml* proper body) + (make-clambda-case fml* proper (Expr body))])) + cls*))] + [(primcall rator rand*) + (make-primcall rator (map Expr rand*))] + [(funcall rator rand*) + (inline (Expr rator) (map Expr rand*))] + [(appcall rator rand*) + (make-appcall (Expr rator) (map Expr rand*))] + [(forcall rator rand*) + (make-forcall rator (map Expr rand*))] + [(assign lhs rhs) + (make-assign lhs (Expr rhs))] + [else (error who "invalid expression ~s" (unparse x))])) + (Expr x)) + + + +(define (uncover-assigned x) + (define who 'uncover-assigned) + (define (Expr* x*) + (cond + [(null? x*) '()] + [else (union (Expr (car x*)) (Expr* (cdr x*)))])) + (define (Expr x) + (record-case x + [(constant) '()] + [(var) '()] + [(primref) '()] + [(bind lhs* rhs* body) + (union (Expr body) (Expr* rhs*))] + [(conditional test conseq altern) + (union (Expr test) (union (Expr conseq) (Expr altern)))] + [(seq e0 e1) (union (Expr e0) (Expr e1))] + [(clambda cls*) + (Expr* (map clambda-case-body cls*))] + [(function fml* proper body) (Expr body)] + [(primcall rator rand*) (Expr* rand*)] + [(funcall rator rand*) + (union (Expr rator) (Expr* rand*))] + [(appcall rator rand*) + (union (Expr rator) (Expr* rand*))] + [(forcall rator rand*) (Expr* rand*)] + [(assign lhs rhs) + (union (singleton lhs) (Expr rhs))] + [else (error who "invalid expression ~s" (unparse x))])) + (Expr x)) + +(define (rewrite-assignments assigned x) + (define who 'rewrite-assignments) + (define (fix lhs*) + (cond + [(null? lhs*) (values '() '() '())] + [else + (let ([x (car lhs*)]) + (let-values ([(lhs* a-lhs* a-rhs*) (fix (cdr lhs*))]) + (cond + [(memq x assigned) + (let ([t (make-var 'assignment-tmp)]) + (values (cons t lhs*) (cons x a-lhs*) (cons t a-rhs*)))] + [else + (values (cons x lhs*) a-lhs* a-rhs*)])))])) + (define (bind-assigned lhs* rhs* body) + (cond + [(null? lhs*) body] + [else + (make-bind lhs* + (map (lambda (rhs) (make-primcall 'vector (list rhs))) rhs*) + body)])) + (define (Expr x) + (record-case x + [(constant) x] + [(var) + (cond + [(memq x assigned) + (make-primcall '$vector-ref (list x (make-constant 0)))] + [else x])] + [(primref) x] + [(bind lhs* rhs* body) + (let-values ([(lhs* a-lhs* a-rhs*) (fix lhs*)]) + (make-bind lhs* (map Expr rhs*) + (bind-assigned a-lhs* a-rhs* (Expr body))))] + [(conditional test conseq altern) + (make-conditional (Expr test) (Expr conseq) (Expr altern))] + [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] + [(function fml* proper body) + (let-values ([(fml* a-lhs* a-rhs*) (fix fml*)]) + (make-function fml* proper + (bind-assigned a-lhs* a-rhs* (Expr body))))] + [(clambda cls*) + (make-clambda + (map (lambda (cls) + (record-case cls + [(clambda-case fml* proper body) + (let-values ([(fml* a-lhs* a-rhs*) (fix fml*)]) + (make-clambda-case fml* proper + (bind-assigned a-lhs* a-rhs* (Expr body))))])) + cls*))] + [(primcall op rand*) + (make-primcall op (map Expr rand*))] + [(forcall op rand*) + (make-forcall op (map Expr rand*))] + [(funcall rator rand*) + (make-funcall (Expr rator) (map Expr rand*))] + [(appcall rator rand*) + (make-appcall (Expr rator) (map Expr rand*))] + [(assign lhs rhs) + (unless (memq lhs assigned) + (error 'rewrite-assignments "not assigned ~s in ~s" lhs x)) + (make-primcall '$vector-set! (list lhs (make-constant 0) (Expr rhs)))] + [else (error who "invalid expression ~s" (unparse x))])) + (Expr x)) + + +(define (remove-assignments x) + (let ([assigned (uncover-assigned x)]) + (rewrite-assignments assigned x))) + + +(define (convert-closures prog) + (define who 'convert-closures) + (define (Expr* x*) + (cond + [(null? x*) (values '() '())] + [else + (let-values ([(a a-free) (Expr (car x*))] + [(d d-free) (Expr* (cdr x*))]) + (values (cons a d) (union a-free d-free)))])) + (define (Expr ex) + (record-case ex + [(constant) (values ex '())] + [(var) (values ex (singleton ex))] + [(primref) (values ex '())] + [(bind lhs* rhs* body) + (let-values ([(rhs* rhs-free) (Expr* rhs*)] + [(body body-free) (Expr body)]) + (values (make-bind lhs* rhs* body) + (union rhs-free (difference body-free lhs*))))] + [(conditional test conseq altern) + (let-values ([(test test-free) (Expr test)] + [(conseq conseq-free) (Expr conseq)] + [(altern altern-free) (Expr altern)]) + (values (make-conditional test conseq altern) + (union test-free (union conseq-free altern-free))))] + [(seq e0 e1) + (let-values ([(e0 e0-free) (Expr e0)] + [(e1 e1-free) (Expr e1)]) + (values (make-seq e0 e1) (union e0-free e1-free)))] + [(function fml* proper body) + (let-values ([(body body-free) (Expr body)]) + (let ([free (difference body-free fml*)]) + (values (make-closure (make-code-rec fml* proper free body) free) + free)))] + [(clambda cls*) + (let-values ([(cls* free) + (let f ([cls* cls*]) + (cond + [(null? cls*) (values '() '())] + [else + (record-case (car cls*) + [(clambda-case fml* proper body) + (let-values ([(body body-free) (Expr body)] + [(cls* cls*-free) (f (cdr cls*))]) + (values + (cons (make-clambda-case fml* proper body) + cls*) + (union (difference body-free fml*) + cls*-free)))])]))]) + (values (make-closure (make-clambda-code (gensym) cls* free) free) + free))] + [(primcall op rand*) + (let-values ([(rand* rand*-free) (Expr* rand*)]) + (values (make-primcall op rand*) rand*-free))] + [(forcall op rand*) + (let-values ([(rand* rand*-free) (Expr* rand*)]) + (values (make-forcall op rand*) rand*-free))] + [(funcall rator rand*) + (let-values ([(rator rat-free) (Expr rator)] + [(rand* rand*-free) (Expr* rand*)]) + (values (make-funcall rator rand*) + (union rat-free rand*-free)))] + [(appcall rator rand*) + (let-values ([(rator rat-free) (Expr rator)] + [(rand* rand*-free) (Expr* rand*)]) + (values (make-appcall rator rand*) + (union rat-free rand*-free)))] + [else (error who "invalid expression ~s" (unparse ex))])) + (let-values ([(prog free) (Expr prog)]) + (unless (null? free) + (error 'convert-closures "free vars ~s encountered in ~a" + free (unparse prog))) + prog)) + + +(define (lift-codes x) + (define who 'lift-codes) + (define all-codes '()) + (define (do-code x) + (record-case x + [(clambda-code label cls* free) + (let ([cls* (map + (lambda (x) + (record-case x + [(clambda-case fml* proper body) + (make-clambda-case fml* proper (E body))])) + cls*)]) + (let ([g (make-code-loc label)]) + (set! all-codes + (cons (make-clambda-code label cls* free) all-codes)) + g))])) + (define (E x) + (record-case x + [(constant) x] + [(var) x] + [(primref) x] + [(bind lhs* rhs* body) + (make-bind lhs* (map E rhs*) (E body))] + [(conditional test conseq altern) + (make-conditional (E test) (E conseq) (E altern))] + [(seq e0 e1) (make-seq (E e0) (E e1))] + [(closure c free) (make-closure (do-code c) free)] + [(primcall op rand*) (make-primcall op (map E rand*))] + [(forcall op rand*) (make-forcall op (map E rand*))] + [(funcall rator rand*) (make-funcall (E rator) (map E rand*))] + [(appcall rator rand*) (make-appcall (E rator) (map E rand*))] + [else (error who "invalid expression ~s" (unparse x))])) + (let ([x (E x)]) + (make-codes all-codes x))) + + + + +(define (syntactically-valid? op rand*) + (define (valid-arg-count? op rand*) + (let ([n (open-coded-primitive-args op)] [m (length rand*)]) + (cond + [(eq? n 'any) #t] + [(eq? n 'no-code) + (error 'syntactically-valid + "should not primcall non codable prim ~s" op)] + [(fixnum? n) + (cond + [(fx= n m) #t] + [else + (error 'compile + "Possible incorrect number of args in ~s" + (cons op (map unparse rand*))) + #f])] + [else (error 'do-primcall "BUG: what ~s" n)]))) + (define (check op pred?) + (lambda (arg) + (record-case arg + [(constant c) + (cond + [(pred? c) #t] + [else + (error 'compile "Possible argument error to primitive ~s" op) + #f])] + [(primref) + (cond + [(pred? (lambda (x) x)) #t] + [else + (error 'compile "Possible argument error to primitive ~s" op) + #f])] + [else #t]))) + (define (nonnegative-fixnum? n) + (and (fixnum? n) (fx>= n 0))) + (define (byte? n) + (and (fixnum? n) (fx<= 0 n) (fx<= n 127))) + (define (valid-arg-types? op rand*) + (case op + [(fixnum? immediate? boolean? char? vector? string? procedure? + null? pair? not cons eq? vector symbol? error eof-object eof-object? + void $unbound-object? code? hash-table? $forward-ptr?) + '#t] + [($fxadd1 $fxsub1 $fxzero? $fxlognot $fxlogor $fxlogand $fx+ $fx- $fx* + $fx= $fx< $fx<= $fx> $fx>= $fxquotient $fxmodulo $fxsll $fxsra $fxlogxor $exit) + (andmap (check op fixnum?) rand*)] + [($fixnum->char) + (andmap (check op byte?) rand*)] + [($char->fixnum $char= $char< $char<= $char> $char>= $string) + (andmap (check op char?) rand*)] + [($make-vector $make-string) + (andmap (check op nonnegative-fixnum?) rand*)] + [($car $cdr) + (andmap (check op pair?) rand*)] + [($vector-length) + (andmap (check op vector?) rand*)] + [($string-length) + (andmap (check op string?) rand*)] + [($set-car! $set-cdr!) + ((check op pair?) (car rand*))] + [($vector-ref $vector-set!) + (and ((check op vector?) (car rand*)) + ((check op nonnegative-fixnum?) (cadr rand*)))] + [($string-ref $string-set! + $string-ref-16+0 $string-ref-16+1 $string-ref-8+0 $string-ref-8+2) + (and ((check op string?) (car rand*)) + ((check op nonnegative-fixnum?) (cadr rand*)))] + [($symbol-string $symbol-unique-string) + (andmap (check op symbol?) rand*)] + [($constant-ref $set-constant! $intern $pcb-set! $pcb-ref $make-symbol + $symbol-value $set-symbol-value! $symbol-plist $set-symbol-plist! + $set-symbol-system-value! $set-symbol-system-value! + $set-symbol-unique-string! + $set-symbol-string! + $seal-frame-and-call $frame->continuation $code->closure + $code-instr-size $code-reloc-size $code-closure-size + $set-code-byte! $set-code-word! + $set-code-object! $set-code-object+offset! $set-code-object+offset/rel! + $make-record $record? $record-rtd $record-ref $record-set! + primitive-set! primitive-ref) + #t] + [else (error 'valid-arg-types? "unhandled op ~s" op)])) + (and (valid-arg-count? op rand*) + (or (null? rand*) + (valid-arg-types? op rand*)))) + + +;;; the output of simplify-operands differs from the input in that the +;;; operands to primcalls are all simple (variables, primrefs, or constants). +;;; funcalls to open-codable primrefs whos arguments are "ok" are converted to +;;; primcalls. + +(define (introduce-primcalls x) + (define who 'introduce-primcalls) + (define (simple? x) + (or (constant? x) (var? x) (primref? x))) + (define (Expr x) + (record-case x + [(constant) x] + [(var) x] + [(primref) x] + [(closure) x] + [(bind lhs* rhs* body) + (make-bind lhs* (map Expr rhs*) (Expr body))] + [(conditional test conseq altern) + (make-conditional (Expr test) (Expr conseq) (Expr altern))] + [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] + [(primcall op arg*) + (case op + ;[(values) + ; (if (fx= (length arg*) 1) + ; (Expr (car arg*)) + ; (begin + ; (warning 'compile "possible incorrect number of values") + ; (make-funcall (make-primref 'values) (map Expr arg*))))] + [else + (make-primcall op (map Expr arg*))])] + [(forcall op arg*) + (make-forcall op (map Expr arg*))] + [(funcall rator rand*) + (cond + [(and (primref? rator) + (open-codeable? (primref-name rator)) + (syntactically-valid? (primref-name rator) rand*)) + (Expr (make-primcall (primref-name rator) rand*))] + [else + (make-funcall (Expr rator) (map Expr rand*))])] + [(appcall op arg*) + (make-appcall (Expr op) (map Expr arg*))] + [else (error who "invalid expression ~s" (unparse x))])) + (define (Tail x) + (record-case x + [(constant) (make-return x)] + [(var) (make-return x)] + [(primref) (make-return x)] + [(closure) (make-return x)] + [(bind lhs* rhs* body) + (make-bind lhs* (map Expr rhs*) (Tail body))] + [(conditional test conseq altern) + (make-conditional (Expr test) (Tail conseq) (Tail altern))] + [(seq e0 e1) (make-seq (Expr e0) (Tail e1))] + [(primcall op arg*) + (case op + ;[(values) + ; (if (fx= (length arg*) 1) + ; (make-return (Expr (car arg*))) + ; (make-return* (map Expr arg*)))] + [else + (make-return (make-primcall op (map Expr arg*)))])] + [(forcall op arg*) + (make-return (make-forcall op (map Expr arg*)))] + [(funcall rator rand*) + (cond + [(and (primref? rator) + (open-codeable? (primref-name rator)) + (syntactically-valid? (primref-name rator) rand*)) + (Tail (make-primcall (primref-name rator) rand*))] + [else + (make-funcall (Expr rator) (map Expr rand*))])] + [(appcall op arg*) + (make-appcall (Expr op) (map Expr arg*))] + [else (error who "invalid expression ~s" (unparse x))])) + (define (CaseExpr x) + (record-case x + [(clambda-case fml* proper body) + (make-clambda-case fml* proper (Tail body))])) + (define (CodeExpr x) + (record-case x + [(clambda-code L cases free) + (make-clambda-code L (map CaseExpr cases) free)])) + (define (CodesExpr x) + (record-case x + [(codes list body) + (make-codes (map CodeExpr list) (Tail body))])) + (CodesExpr x)) + + +(define (simplify-operands x) + (define who 'simplify-operands) + (define (simple? x) + (or (constant? x) (var? x) (primref? x))) + (define (simplify arg lhs* rhs* k) + (if (simple? arg) + (k arg lhs* rhs*) + (let ([v (unique-var 'tmp)]) + (k v (cons v lhs*) (cons (Expr arg) rhs*))))) + (define (simplify* arg* lhs* rhs* k) + (cond + [(null? arg*) (k '() lhs* rhs*)] + [else + (simplify (car arg*) lhs* rhs* + (lambda (a lhs* rhs*) + (simplify* (cdr arg*) lhs* rhs* + (lambda (d lhs* rhs*) + (k (cons a d) lhs* rhs*)))))])) + (define (Expr x) + (record-case x + [(constant) x] + [(var) x] + [(primref) x] + [(closure) x] + [(bind lhs* rhs* body) + (make-bind lhs* (map Expr rhs*) (Expr body))] + [(conditional test conseq altern) + (make-conditional (Expr test) (Expr conseq) (Expr altern))] + [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] + [(primcall op arg*) + (simplify* arg* '() '() + (lambda (arg* lhs* rhs*) + (make-bind^ lhs* rhs* + (make-primcall op arg*))))] + [(forcall op arg*) + (make-forcall op (map Expr arg*))] + [(funcall rator rand*) + (make-funcall (Expr rator) (map Expr rand*))] + [(appcall op arg*) + (make-appcall (Expr op) (map Expr arg*))] + [else (error who "invalid expression ~s" (unparse x))])) + (define (Tail x) + (record-case x + [(return v) (make-return (Expr v))] + [(bind lhs* rhs* body) + (make-bind lhs* (map Expr rhs*) (Tail body))] + [(conditional test conseq altern) + (make-conditional (Expr test) (Tail conseq) (Tail altern))] + [(seq e0 e1) (make-seq (Expr e0) (Tail e1))] + [(funcall rator rand*) + (make-funcall (Expr rator) (map Expr rand*))] + [(appcall op arg*) + (make-appcall (Expr op) (map Expr arg*))] + [else (error who "invalid expression ~s" (unparse x))])) + (define (CaseExpr x) + (record-case x + [(clambda-case fml* proper body) + (make-clambda-case fml* proper (Tail body))])) + (define (CodeExpr x) + (record-case x + [(clambda-code L clauses free) + (make-clambda-code L (map CaseExpr clauses) free)])) + (define (CodesExpr x) + (record-case x + [(codes list body) + (make-codes (map CodeExpr list) (Tail body))])) + (CodesExpr x)) + + +(define (insert-stack-overflow-checks x) + (define who 'insert-stack-overflow-checks) + (define (insert-check body) + (make-seq + (make-conditional + (make-primcall '$fp-overflow '()) + (make-funcall (make-primref 'do-stack-overflow) '()) + (make-primcall 'void '())) + body)) + (define (Expr x) + (record-case x + [(constant) #f] + [(var) #f] + [(primref) #f] + [(closure code free*) #f] + [(bind lhs* rhs* body) + (or (ormap Expr rhs*) (Expr body))] + [(conditional test conseq altern) + (or (Expr test) (Expr conseq) (Expr altern))] + [(seq e0 e1) (or (Expr e0) (Expr e1))] + [(primcall op arg*) (ormap Expr arg*)] + [(forcall op arg*) (ormap Expr arg*)] + [(funcall rator arg*) #t] + [(appcall rator arg*) #t] + [else (error who "invalid expression ~s" (unparse x))])) + (define (Tail x) + (record-case x + [(return v) (Expr v)] + [(bind lhs* rhs* body) + (or (ormap Expr rhs*) (Tail body))] + [(conditional test conseq altern) + (or (Expr test) (Tail conseq) (Tail altern))] + [(seq e0 e1) (or (Expr e0) (Tail e1))] + [(funcall rator arg*) (or (Expr rator) (ormap Expr arg*))] + [(appcall rator arg*) (or (Expr rator) (ormap Expr arg*))] + [else (error who "invalid tail expression ~s" (unparse x))])) + (define (CaseExpr x) + (record-case x + [(clambda-case fml* proper body) + (if (Tail body) + (make-clambda-case fml* proper (insert-check body)) + x)])) + (define (CodeExpr x) + (record-case x + [(clambda-code L cases free) + (make-clambda-code L (map CaseExpr cases) free)])) + (define (CodesExpr x) + (record-case x + [(codes list body) + (make-codes (map CodeExpr list) + (if (Tail body) + (insert-check body) + body))])) + (CodesExpr x)) + + +(define (insert-allocation-checks x) + (define who 'insert-allocation-checks) + (define (check-bytes n var body) + (make-seq + (make-conditional + (make-primcall '$ap-check-bytes + (list (make-constant n) var)) + (make-funcall (make-primref 'do-overflow) + (list + (make-primcall '$fx+ + (list (make-constant n) var)))) + (make-primcall 'void '())) + body)) + (define (check-words n var body) + (make-seq + (make-conditional + (make-primcall '$ap-check-words + (list (make-constant n) var)) + (make-funcall (make-primref 'do-overflow-words) + (list + (make-primcall '$fx+ + (list (make-constant n) var)))) + (make-primcall 'void '())) + body)) + (define (check-const n body) + (make-seq + (make-conditional + (make-primcall '$ap-check-const + (list (make-constant n))) + (make-funcall (make-primref 'do-overflow) + (list (make-constant n))) + (make-primcall 'void '())) + body)) + (define (Expr x) + (record-case x + [(constant) x] + [(var) x] + [(primref) x] + [(closure code free*) + (check-const (fx+ disp-closure-data (fx* (length free*) wordsize)) x)] + [(bind lhs* rhs* body) + (make-bind lhs* (map Expr rhs*) (Expr body))] + [(conditional test conseq altern) + (make-conditional (Expr test) (Expr conseq) (Expr altern))] + [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] + [(primcall op arg*) + (let ([x (make-primcall op (map Expr arg*))]) + (case op + [(cons) (check-const pair-size x)] + [($make-symbol) (check-const symbol-size x)] + [(make-hash-table) (check-const hash-table-size x)] + [($frame->continuation $code->closure) + (check-const (fx+ disp-closure-data (fx* (length arg*) wordsize)) x)] + [($make-string) + (record-case (car arg*) + [(constant i) + (check-const (fx+ i (fx+ disp-string-data 1)) x)] + [else + (check-bytes (fxadd1 disp-string-data) (car arg*) x)])] + [($string) + (check-const (fx+ (length arg*) (fx+ disp-string-data 1)) x)] + [($make-vector) + (record-case (car arg*) + [(constant i) + (check-const (fx+ (fx* i wordsize) disp-vector-data) x)] + [else + (check-words (fxadd1 disp-vector-data) (car arg*) x)])] + [($make-record) + (record-case (cadr arg*) + [(constant i) + (check-const (fx+ (fx* i wordsize) disp-record-data) x)] + [else + (check-words (fxadd1 disp-record-data) (cadr arg*) x)])] + [(vector) + (check-const (fx+ (fx* (length arg*) wordsize) disp-vector-data) x)] + [else x]))] + [(forcall op arg*) + (make-forcall op (map Expr arg*))] + [(funcall rator rand*) + (make-funcall (Expr rator) (map Expr rand*))] + [(appcall op arg*) + (make-appcall (Expr op) (map Expr arg*))] + [else (error who "invalid expression ~s" (unparse x))])) + (define (Tail x) + (record-case x + [(return v) (make-return (Expr v))] + [(bind lhs* rhs* body) + (make-bind lhs* (map Expr rhs*) (Tail body))] + [(conditional test conseq altern) + (make-conditional (Expr test) (Tail conseq) (Tail altern))] + [(seq e0 e1) (make-seq (Expr e0) (Tail e1))] + [(funcall rator rand*) + (make-funcall (Expr rator) (map Expr rand*))] + [(appcall op arg*) + (make-appcall (Expr op) (map Expr arg*))] + [else (error who "invalid expression ~s" (unparse x))])) + (define (CaseExpr x) + (record-case x + [(clambda-case fml* proper body) + (make-clambda-case fml* proper (Tail body))])) + (define (CodeExpr x) + (record-case x + [(clambda-code L cases free) + (make-clambda-code L (map CaseExpr cases) free)])) + (define (CodesExpr x) + (record-case x + [(codes list body) + (make-codes (map CodeExpr list) (Tail body))])) + (CodesExpr x)) + + +(define (remove-local-variables x) + (define who 'remove-local-variables) + (define (simple* x* r) + (map (lambda (x) + (cond + [(assq x r) => cdr] + [else + (when (var? x) (error who "unbound var ~s" x)) + x])) + x*)) + (define (env->mask r sz) + (let ([s (make-vector (fxsra (fx+ sz 7) 3) 0)]) + (for-each + (lambda (idx) + (let ([q (fxsra idx 3)] + [r (fxlogand idx 7)]) + (vector-set! s q + (fxlogor (vector-ref s q) (fxsll 1 r))))) + r) + s)) + (define (do-new-frame op rand* si r call-convention rp-convention orig-live) + (make-new-frame (fxadd1 si) (fx+ (length rand*) 2) + (let f ([r* rand*] [nsi (fx+ si 2)] [live orig-live]) + (cond + [(null? r*) + (make-seq + (make-seq + (make-save-cp (make-frame-var si)) + (case call-convention + [(normal apply) + (make-eval-cp #t (Expr op nsi r (cons si live)))] + [(foreign) + (make-eval-cp #f (make-foreign-label op))] + [else (error who "invalid convention ~s" convention)])) + (make-call-cp call-convention + rp-convention + (fxadd1 si) ; frame size + (length rand*) ; argc + (env->mask (cons si orig-live) ; cp and everything before it + (fxadd1 si))))] ; mask-size ~~ frame size + [else + (make-seq + (make-assign (make-frame-var nsi) + (Expr (car r*) nsi r live)) + (f (cdr r*) (fxadd1 nsi) (cons nsi live)))])))) + (define (nop) (make-primcall 'void '())) + (define (do-bind lhs* rhs* body si r live k) + (let f ([lhs* lhs*] [rhs* rhs*] [si si] [nr r] [live live]) + (cond + [(null? lhs*) (k body si nr live)] + [else + (let ([v (make-frame-var si)]) + (make-seq + (make-assign v (Expr (car rhs*) si r live)) + (f (cdr lhs*) (cdr rhs*) (fxadd1 si) + (cons (cons (car lhs*) v) nr) + (cons si live))))]))) + (define (Tail x si r live) + (record-case x + [(return v) (make-return (Expr v si r live))] + [(bind lhs* rhs* body) + (do-bind lhs* rhs* body si r live Tail)] + [(conditional test conseq altern) + (make-conditional + (Expr test si r live) + (Tail conseq si r live) + (Tail altern si r live))] + [(seq e0 e1) (make-seq (Effect e0 si r live) (Tail e1 si r live))] + [(primcall op arg*) + (case op +; [(values) (make-primcall op (simple* arg* r))] + [else (make-return (make-primcall op (simple* arg* r)))])] + [(funcall op rand*) + (do-new-frame op rand* si r 'normal 'tail live)] + [(appcall op rand*) + (do-new-frame op rand* si r 'apply 'tail live)] + [else (error who "invalid expression ~s" (unparse x))])) + (define (Effect x si r live) + (record-case x + [(constant) (nop)] + [(var) (nop)] + [(primref) (nop)] + [(closure code free*) (nop)] + [(bind lhs* rhs* body) + (do-bind lhs* rhs* body si r live Effect)] + [(conditional test conseq altern) + (make-conditional + (Expr test si r live) + (Effect conseq si r live) + (Effect altern si r live))] + [(seq e0 e1) (make-seq (Effect e0 si r live) (Effect e1 si r live))] + [(primcall op arg*) + (make-primcall op (simple* arg* r))] + [(forcall op rand*) + (do-new-frame op rand* si r 'foreign 'effect live)] + [(funcall op rand*) + (do-new-frame op rand* si r 'normal 'effect live)] + [(appcall op rand*) + (do-new-frame op rand* si r 'apply 'effect live)] + [else (error who "invalid effect expression ~s" (unparse x))])) + (define (Expr x si r live) + (record-case x + [(constant) x] + [(var) + (cond + [(assq x r) => cdr] + [else (error who "unbound var ~s" x)])] + [(primref) x] + [(closure code free*) + (make-closure code (simple* free* r))] + [(bind lhs* rhs* body) + (do-bind lhs* rhs* body si r live Expr)] + [(conditional test conseq altern) + (make-conditional + (Expr test si r live) + (Expr conseq si r live) + (Expr altern si r live))] + [(seq e0 e1) (make-seq (Effect e0 si r live) (Expr e1 si r live))] + [(primcall op arg*) + (make-primcall op (simple* arg* r))] + [(forcall op rand*) + (do-new-frame op rand* si r 'foreign 'value live)] + [(funcall op rand*) + (do-new-frame op rand* si r 'normal 'value live)] + [(appcall op rand*) + (do-new-frame op rand* si r 'apply 'value live)] + [else (error who "invalid expression ~s" (unparse x))])) + (define (bind-fml* fml* r) + (let f ([si 1] [fml* fml*]) + (cond + [(null? fml*) (values '() si r '())] + [else + (let-values ([(nfml* nsi r live) (f (fxadd1 si) (cdr fml*))]) + (let ([v (make-frame-var si)]) + (values (cons v nfml*) + nsi + (cons (cons (car fml*) v) r) + (cons si live))))]))) + (define (bind-free* free*) + (let f ([free* free*] [idx 0] [r '()]) + (cond + [(null? free*) r] + [else + (f (cdr free*) (fxadd1 idx) + (cons (cons (car free*) (make-cp-var idx)) r))]))) + (define CaseExpr + (lambda (r) + (lambda (x) + (record-case x + [(clambda-case fml* proper body) + (let-values ([(fml* si r live) (bind-fml* fml* r)]) + (make-clambda-case fml* proper (Tail body si r live)))])))) + (define (CodeExpr x) + (record-case x + [(clambda-code L cases free) + (let ([r (bind-free* free)]) + (make-clambda-code L (map (CaseExpr r) cases) free))])) + (define (CodesExpr x) + (record-case x + [(codes list body) + (make-codes (map CodeExpr list) + (Tail body 1 '() '()))])) + (CodesExpr x)) + + +(begin + (define fx-shift 2) + (define fx-mask #x03) + (define fx-tag 0) + (define bool-f #x2F) + (define bool-t #x3F) + (define bool-mask #xEF) + (define bool-tag bool-f) + (define bool-shift 4) + (define nil #x4F) + (define eof #x5F) ; double check + (define unbound #x6F) ; double check + (define void-object #x7F) ; double check + (define wordsize 4) + (define char-shift 8) + (define char-tag #x0F) + (define char-mask #xFF) + (define pair-mask 7) + (define pair-tag 1) + (define disp-car 0) + (define disp-cdr 4) + (define pair-size 8) + + (define symbol-mask 7) + (define symbol-tag 2) + (define disp-symbol-string 0) + (define disp-symbol-unique-string 4) + (define disp-symbol-value 8) + (define disp-symbol-plist 12) + (define disp-symbol-system-value 16) + (define disp-symbol-system-plist 20) + (define symbol-size 24) + (define vector-tag 5) + (define vector-mask 7) + (define disp-vector-length 0) + (define disp-vector-data 4) + (define string-mask 7) + (define string-tag 6) + (define disp-string-length 0) + (define disp-string-data 4) + (define closure-mask 7) + (define closure-tag 3) + (define disp-closure-data 4) + (define disp-closure-code 0) + (define continuation-size 16) + (define continuation-tag #x1F) + (define disp-continuation-top 4) + (define disp-continuation-size 8) + (define disp-continuation-next 12) + (define code-tag #x2F) + (define disp-code-instrsize 4) + (define disp-code-relocsize 8) + (define disp-code-closuresize 12) + (define disp-code-data 16) + (define record-ptag vector-tag) + (define record-pmask vector-mask) + (define disp-record-rtd 0) + (define disp-record-data 4) + (define hash-table-tag #x3F) + (define disp-htable-count 4) + (define disp-htable-size 8) + (define disp-htable-mem 12) + (define hash-table-size 16) + (define disp-frame-size -17) + (define disp-frame-offset -13) + (define disp-multivalue-rp -9) + (define object-alignment 8) + (define align-shift 3) + (define pagesize 4096)) + +(begin + (define (mem off val) + (cond + [(fixnum? off) (list 'disp (int off) val)] + [(register? off) (list 'disp off val)] + [else (error 'mem "invalid disp ~s" off)])) + (define (int x) (list 'int x)) + (define (obj x) (list 'obj x)) + (define (byte x) (list 'byte x)) + (define (byte-vector x) (list 'byte-vector x)) + (define (movzbl src targ) (list 'movzbl src targ)) + (define (sall src targ) (list 'sall src targ)) + (define (sarl src targ) (list 'sarl src targ)) + (define (shrl src targ) (list 'shrl src targ)) + (define (notl src) (list 'notl src)) + (define (pushl src) (list 'pushl src)) + (define (popl src) (list 'popl src)) + (define (orl src targ) (list 'orl src targ)) + (define (xorl src targ) (list 'xorl src targ)) + (define (andl src targ) (list 'andl src targ)) + (define (movl src targ) (list 'movl src targ)) + (define (movb src targ) (list 'movb src targ)) + (define (addl src targ) (list 'addl src targ)) + (define (imull src targ) (list 'imull src targ)) + (define (idivl src) (list 'idivl src)) + (define (subl src targ) (list 'subl src targ)) + (define (push src) (list 'push src)) + (define (pop targ) (list 'pop targ)) + (define (sete targ) (list 'sete targ)) + (define (call targ) (list 'call targ)) + (define (tail-indirect-cpr-call) + (jmp (mem (fx- disp-closure-code closure-tag) cpr))) + (define (indirect-cpr-call) + (call (mem (fx- disp-closure-code closure-tag) cpr))) + (define (negl targ) (list 'negl targ)) + (define (label x) (list 'label x)) + (define (label-address x) (list 'label-address x)) + (define (ret) '(ret)) + (define (cltd) '(cltd)) + (define (cmpl arg1 arg2) (list 'cmpl arg1 arg2)) + (define (je label) (list 'je label)) + (define (jne label) (list 'jne label)) + (define (jle label) (list 'jle label)) + (define (jge label) (list 'jge label)) + (define (jg label) (list 'jg label)) + (define (jl label) (list 'jl label)) + (define (jb label) (list 'jb label)) + (define (ja label) (list 'ja label)) + (define (jmp label) (list 'jmp label)) + (define edi '%edx) ; closure pointer + (define esi '%esi) ; pcb + (define ebp '%ebp) ; allocation pointer + (define esp '%esp) ; stack base pointer + (define al '%al) + (define ah '%ah) + (define bh '%bh) + (define cl '%cl) + (define eax '%eax) + (define ebx '%ebx) + (define ecx '%ecx) + (define edx '%edx) + (define apr '%ebp) + (define fpr '%esp) + (define cpr '%edi) + (define pcr '%esi) + (define register? symbol?) + (define (argc-convention n) + (fx- 0 (fxsll n fx-shift)))) + + +(define pcb-ref + (lambda (x) + (case x + [(allocation-pointer) (mem 0 pcr)] + [(allocation-redline) (mem 4 pcr)] + [(frame-pointer) (mem 8 pcr)] + [(frame-base) (mem 12 pcr)] + [(frame-redline) (mem 16 pcr)] + [(next-continuation) (mem 20 pcr)] + [(system-stack) (mem 24 pcr)] + [else (error 'pcb-ref "invalid arg ~s" x)]))) + +(define (primref-loc op) + (unless (symbol? op) (error 'primref-loc "not a symbol ~s" op)) + (mem (fx- disp-symbol-system-value symbol-tag) + (obj op))) + +(define (generate-code x) + (define who 'generate-code) + (define (rp-label x) + (case x + [(value) (label-address SL_multiple_values_error_rp)] + [(effect) (label-address SL_multiple_values_ignore_rp)] + [else (error who "invalid rp-convention ~s" x)])) + (define (align n) + (fxsll (fxsra (fx+ n (fxsub1 object-alignment)) align-shift) align-shift)) + (define unique-label + (lambda () + (label (gensym)))) + (define (constant-val x) + (cond + [(fixnum? x) (obj x)] + [(boolean? x) (int (if x bool-t bool-f))] + [(null? x) (int nil)] + [(char? x) (int (fx+ (fxsll (char->integer x) char-shift) char-tag))] + [(eq? x (void)) (int void-object)] + [else (obj x)])) + (define (cond-branch op Lt Lf ac) + (define (opposite x) + (cadr (assq x '([je jne] [jl jge] [jle jg] [jg jle] [jge jl])))) + (unless (or Lt Lf) + (error 'cond-branch "no labels")) + (cond + [(not Lf) (cons (list op Lt) ac)] + [(not Lt) (cons (list (opposite op) Lf) ac)] + [else (list* (list op Lt) (jmp Lf) ac)])) + (define (indirect-type-pred pri-mask pri-tag sec-mask sec-tag rand* Lt Lf ac) + (cond + [(and Lt Lf) + (list* (movl (Simple (car rand*)) eax) + (movl eax ebx) + (andl (int pri-mask) ebx) + (cmpl (int pri-tag) ebx) + (jne Lf) + (movl (mem (fx- 0 pri-tag) eax) ebx) + (if sec-mask + (andl (int sec-mask) ebx) + '(nop)) + (cmpl (int sec-tag) ebx) + (jne Lf) + (jmp Lt) + ac)] + [Lf + (list* (movl (Simple (car rand*)) eax) + (movl eax ebx) + (andl (int pri-mask) ebx) + (cmpl (int pri-tag) ebx) + (jne Lf) + (movl (mem (fx- 0 pri-tag) eax) ebx) + (if sec-mask + (andl (int sec-mask) ebx) + '(nop)) + (cmpl (int sec-tag) ebx) + (jne Lf) + ac)] + [Lt + (let ([L_END (unique-label)]) + (list* (movl (Simple (car rand*)) eax) + (movl eax ebx) + (andl (int pri-mask) ebx) + (cmpl (int pri-tag) ebx) + (jne L_END) + (movl (mem (fx- 0 pri-tag) eax) ebx) + (if sec-mask + (andl (int sec-mask) ebx) + '(nop)) + (cmpl (int sec-tag) ebx) + (je Lt) + L_END + ac))] + [else ac])) + (define (type-pred mask tag rand* Lt Lf ac) + (cond + [mask + (list* + (movl (Simple (car rand*)) eax) + (andl (int mask) eax) + (cmpl (int tag) eax) + (cond-branch 'je Lt Lf ac))] + [else + (let ([v (Simple (car rand*))]) + (cond + [(memq (car v) '(mem register)) + (list* + (cmpl (int tag) (Simple (car rand*))) + (cond-branch 'je Lt Lf ac))] + [else + (list* + (movl (Simple (car rand*)) eax) + (cmpl (int tag) eax) + (cond-branch 'je Lt Lf ac))]))])) + (define (compare-and-branch op rand* Lt Lf ac) + (define (opposite x) + (cadr (assq x '([je je] [jl jg] [jle jge] [jg jl] [jge jle])))) + (cond + [(and (constant? (car rand*)) (constant? (cadr rand*))) + (list* + (movl (Simple (car rand*)) eax) + (cmpl (Simple (cadr rand*)) eax) + (cond-branch op Lt Lf ac))] + [(constant? (cadr rand*)) + (list* + (cmpl (Simple (cadr rand*)) (Simple (car rand*))) + (cond-branch op Lt Lf ac))] + [(constant? (car rand*)) + (list* + (cmpl (Simple (car rand*)) (Simple (cadr rand*))) + (cond-branch (opposite op) Lt Lf ac))] + [else + (list* + (movl (Simple (car rand*)) eax) + (cmpl (Simple (cadr rand*)) eax) + (cond-branch op Lt Lf ac))])) + (define (do-pred-prim op rand* Lt Lf ac) + (case op + [(fixnum?) (type-pred fx-mask fx-tag rand* Lt Lf ac)] + [(pair?) (type-pred pair-mask pair-tag rand* Lt Lf ac)] + [(char?) (type-pred char-mask char-tag rand* Lt Lf ac)] + [(string?) (type-pred string-mask string-tag rand* Lt Lf ac)] + [(symbol?) (type-pred symbol-mask symbol-tag rand* Lt Lf ac)] + [(procedure?) (type-pred closure-mask closure-tag rand* Lt Lf ac)] + [(boolean?) (type-pred bool-mask bool-tag rand* Lt Lf ac)] + [(null?) (type-pred #f nil rand* Lt Lf ac)] + [($unbound-object?) (type-pred #f unbound rand* Lt Lf ac)] + [($forward-ptr?) (type-pred #f -1 rand* Lt Lf ac)] + [(not) (type-pred #f bool-f rand* Lt Lf ac)] + [(eof-object?) (type-pred #f eof rand* Lt Lf ac)] + [($fxzero?) (type-pred #f 0 rand* Lt Lf ac)] + [($fx= $char= eq?) (compare-and-branch 'je rand* Lt Lf ac)] + [($fx< $char<) (compare-and-branch 'jl rand* Lt Lf ac)] + [($fx<= $char<=) (compare-and-branch 'jle rand* Lt Lf ac)] + [($fx> $char>) (compare-and-branch 'jg rand* Lt Lf ac)] + [($fx>= $char>=) (compare-and-branch 'jge rand* Lt Lf ac)] + [(vector?) + (indirect-type-pred vector-mask vector-tag fx-mask fx-tag + rand* Lt Lf ac)] + [($record?) + (indirect-type-pred record-pmask record-ptag record-pmask record-ptag + rand* Lt Lf ac)] + [(code?) + (indirect-type-pred vector-mask vector-tag #f code-tag + rand* Lt Lf ac)] + [(hash-table?) + (indirect-type-pred vector-mask vector-tag #f hash-table-tag + rand* Lt Lf ac)] + [(immediate?) + (cond + [(and Lt Lf) + (list* (movl (Simple (car rand*)) eax) + (movl eax ebx) + (andl (int fx-mask) ebx) + (cmpl (int 0) ebx) + (je Lt) + (andl (int 7) eax) + (cmpl (int 7) eax) + (je Lt) + (jmp Lf) + ac)] + [Lt + (list* (movl (Simple (car rand*)) eax) + (movl eax ebx) + (andl (int fx-mask) ebx) + (cmpl (int 0) ebx) + (je Lt) + (andl (int 7) eax) + (cmpl (int 7) eax) + (je Lt) + ac)] + [Lf + (let ([Ljoin (unique-label)]) + (list* + (movl (Simple (car rand*)) eax) + (movl eax ebx) + (andl (int fx-mask) ebx) + (cmpl (int 0) ebx) + (je Ljoin) + (andl (int 7) eax) + (cmpl (int 7) eax) + (jne Lf) + Ljoin + ac))] + [else ac])] + [($ap-check-words) + (record-case (car rand*) + [(constant i) + (list* (movl (pcb-ref 'allocation-redline) eax) + (subl (Simple (cadr rand*)) eax) + (subl (int i) eax) + (cmpl eax apr) + (cond-branch 'jge Lt Lf ac))] + [else (error who "ap-check-words")])] + [($ap-check-bytes) + (record-case (car rand*) + [(constant i) + (list* (movl (Simple (cadr rand*)) eax) + (negl eax) + (addl (pcb-ref 'allocation-redline) eax) + (subl (int i) eax) + (cmpl eax apr) + (cond-branch 'jge Lt Lf ac))] + [else (error who "ap-check-bytes")])] + [($ap-check-const) + (record-case (car rand*) + [(constant i) + (if (fx< i pagesize) + (list* + (cmpl (pcb-ref 'allocation-redline) apr) + (cond-branch 'jge Lt Lf ac)) + (list* + (movl (pcb-ref 'allocation-redline) eax) + (subl (int i) eax) + (cmpl eax apr) + (cond-branch 'jge Lt Lf ac)))] + [else (error who "ap-check-const")])] + [($fp-at-base) + (list* + (movl (pcb-ref 'frame-base) eax) + (subl (int wordsize) eax) + (cmpl eax fpr) + (cond-branch 'je Lt Lf ac))] + [($fp-overflow) + (list* (cmpl (pcb-ref 'frame-redline) fpr) + (cond-branch 'jle Lt Lf ac))] + [($vector-ref) + (do-value-prim op rand* + (do-simple-test eax Lt Lf ac))] + [(cons void $fxadd1 $fxsub1) + ;;; always true + (do-effect-prim op rand* + (cond + [(not Lt) ac] + [else (cons (jmp Lt) ac)]))] + [else + (error 'pred-prim "HERE unhandled ~s" op)])) + (define (do-pred->value-prim op rand* ac) + (case op + [else + (let ([Lf (unique-label)] [Lj (unique-label)]) + (do-pred-prim op rand* #f Lf + (list* (movl (constant-val #t) eax) + (jmp Lj) + Lf + (movl (constant-val #f) eax) + Lj + ac)))])) + (define (indirect-ref arg* off ac) + (list* + (movl (Simple (car arg*)) eax) + (movl (mem off eax) eax) + ac)) + (define (do-value-prim op arg* ac) + (case op + [(eof-object) (cons (movl (int eof) eax) ac)] + [(void) (cons (movl (int void-object) eax) ac)] + [($fxadd1) + (list* (movl (Simple (car arg*)) eax) + (addl (constant-val 1) eax) + ac)] + [($fxsub1) + (list* (movl (Simple (car arg*)) eax) + (addl (constant-val -1) eax) + ac)] + [($fx+) + (list* (movl (Simple (car arg*)) eax) + (addl (Simple (cadr arg*)) eax) + ac)] + [($fx-) + (list* (movl (Simple (car arg*)) eax) + (subl (Simple (cadr arg*)) eax) + ac)] + [($fx*) + (cond + [(constant? (car arg*)) + (record-case (car arg*) + [(constant c) + (unless (fixnum? c) + (error who "invalid arg ~s to fx*" c)) + (list* (movl (Simple (cadr arg*)) eax) + (imull (int c) eax) + ac)])] + [(constant? (cadr arg*)) + (record-case (cadr arg*) + [(constant c) + (unless (fixnum? c) + (error who "invalid arg ~s to fx*" c)) + (list* (movl (Simple (car arg*)) eax) + (imull (int c) eax) + ac)])] + [else + (list* (movl (Simple (car arg*)) eax) + (sarl (int fx-shift) eax) + (imull (Simple (cadr arg*)) eax) + ac)])] + [($fxquotient) + (list* (movl (Simple (car arg*)) eax) + (movl (Simple (cadr arg*)) ecx) + (cltd) + (idivl ecx) + (sall (int fx-shift) eax) + ac)] + [($fxmodulo) + (list* (movl (Simple (car arg*)) eax) + (movl (Simple (cadr arg*)) ebx) + (movl eax ecx) + (xorl ebx ecx) + (sarl (int (fxsub1 (fx* wordsize 8))) ecx) + (andl ebx ecx) + (cltd) + (idivl ebx) + (movl edx eax) + (addl ecx eax) + ac)] + [($fxlogor) + (list* (movl (Simple (car arg*)) eax) + (orl (Simple (cadr arg*)) eax) + ac)] + [($fxlogand) + (list* (movl (Simple (car arg*)) eax) + (andl (Simple (cadr arg*)) eax) + ac)] + [($fxlogxor) + (list* (movl (Simple (car arg*)) eax) + (xorl (Simple (cadr arg*)) eax) + ac)] + [($fxsra) + (record-case (cadr arg*) + [(constant i) + (unless (fixnum? i) (error who "invalid arg to fxsra")) + (list* (movl (Simple (car arg*)) eax) + (sarl (int (fx+ i fx-shift)) eax) + (sall (int fx-shift) eax) + ac)] + [else + (list* (movl (Simple (car arg*)) eax) + (movl (Simple (cadr arg*)) ecx) + (sarl (int fx-shift) ecx) + (sarl (int fx-shift) eax) + (sarl cl eax) + (sall (int fx-shift) eax) + ac)])] + [($fxsll) + (record-case (cadr arg*) + [(constant i) + (unless (fixnum? i) (error who "invalid arg to fxsll")) + (list* (movl (Simple (car arg*)) eax) + (sall (int i) eax) + ac)] + [else + (list* (movl (Simple (car arg*)) eax) + (movl (Simple (cadr arg*)) ecx) + (sarl (int fx-shift) ecx) + (sall cl eax) + ac)])] + [($fixnum->char) + (list* (movl (Simple (car arg*)) eax) + (sall (int (fx- char-shift fx-shift)) eax) + (orl (int char-tag) eax) + ac)] + [($char->fixnum) + (list* (movl (Simple (car arg*)) eax) + (sarl (int (fx- char-shift fx-shift)) eax) + ac)] + [($fxlognot) + (list* (movl (Simple (car arg*)) eax) + (orl (int fx-mask) eax) + (notl eax) + ac)] + [($car) (indirect-ref arg* (fx- disp-car pair-tag) ac)] + [($cdr) (indirect-ref arg* (fx- disp-cdr pair-tag) ac)] + [($vector-length) + (indirect-ref arg* (fx- disp-vector-length vector-tag) ac)] + [($string-length) + (indirect-ref arg* (fx- disp-string-length string-tag) ac)] + [($symbol-string) + (indirect-ref arg* (fx- disp-symbol-string symbol-tag) ac)] + [($symbol-unique-string) + (indirect-ref arg* (fx- disp-symbol-unique-string symbol-tag) ac)] + [($symbol-value) + (indirect-ref arg* (fx- disp-symbol-value symbol-tag) ac)] + [(primitive-ref) + (indirect-ref arg* (fx- disp-symbol-system-value symbol-tag) ac)] + [($symbol-plist) + (indirect-ref arg* (fx- disp-symbol-plist symbol-tag) ac)] + [($record-rtd) + (indirect-ref arg* (fx- disp-record-rtd record-ptag) ac)] + [($constant-ref) + (list* (movl (Simple (car arg*)) eax) ac)] + [($vector-ref) + (list* (movl (Simple (car arg*)) ebx) + (addl (Simple (cadr arg*)) ebx) + (movl (mem (fx- disp-vector-data vector-tag) ebx) eax) + ac)] + [($record-ref) + (list* (movl (Simple (car arg*)) ebx) + (addl (Simple (cadr arg*)) ebx) + (movl (mem (fx- disp-record-data record-ptag) ebx) eax) + ac)] + [($string-ref) + (list* (movl (Simple (cadr arg*)) ebx) + (sarl (int fx-shift) ebx) + (addl (Simple (car arg*)) ebx) + (movl (int char-tag) eax) + (movb (mem (fx- disp-string-data string-tag) ebx) ah) + ac)] + [($make-string) + (list* (movl (Simple (car arg*)) ebx) + (movl ebx (mem disp-string-length apr)) + (movl apr eax) + (addl (int string-tag) eax) + (sarl (int fx-shift) ebx) + (addl ebx apr) + (movb (int 0) (mem disp-string-data apr)) + (addl (int (fx+ disp-string-data object-alignment)) apr) + (sarl (int align-shift) apr) + (sall (int align-shift) apr) + ac)] + [($make-vector) + (list* (movl (Simple (car arg*)) ebx) + (movl ebx (mem disp-vector-length apr)) + (movl apr eax) + (addl (int vector-tag) eax) + (addl ebx apr) + (addl (int (fx+ disp-vector-data (fxsub1 object-alignment))) apr) + (sarl (int align-shift) apr) + (sall (int align-shift) apr) + ac)] + [($make-record) + (list* (movl (Simple (car arg*)) eax) + (movl eax (mem disp-record-rtd apr)) + (movl apr eax) + (addl (int record-ptag) eax) + (addl (Simple (cadr arg*)) apr) + (addl (int (fx+ disp-record-data (fxsub1 object-alignment))) apr) + (sarl (int align-shift) apr) + (sall (int align-shift) apr) + ac)] + [(cons) + (list* (movl (Simple (car arg*)) eax) + (movl (Simple (cadr arg*)) ebx) + (movl eax (mem disp-car apr)) + (movl apr eax) + (movl ebx (mem disp-cdr apr)) + (addl (int pair-tag) eax) + (addl (int (align pair-size)) apr) + ac)] + [($make-symbol) + (list* (movl (Simple (car arg*)) eax) + (movl eax (mem disp-symbol-string apr)) + (movl (int 0) (mem disp-symbol-unique-string apr)) + (movl (int unbound) (mem disp-symbol-value apr)) + (movl (int nil) (mem disp-symbol-plist apr)) + (movl (int unbound) (mem disp-symbol-system-value apr)) + (movl (int nil) (mem disp-symbol-system-plist apr)) + (movl apr eax) + (addl (int symbol-tag) eax) + (addl (int (align symbol-size)) apr) + ac)] + [(make-hash-table) + (list* (movl (int hash-table-tag) (mem 0 apr)) + (movl (int 0) (mem disp-htable-count apr)) + (movl (int 0) (mem disp-htable-size apr)) + (movl (int 0) (mem disp-htable-mem apr)) + (movl apr eax) + (addl (int vector-tag) eax) + (addl (int hash-table-size) apr) + ac)] + [(vector) + (let f ([arg* arg*] [idx disp-vector-data]) + (cond + [(null? arg*) + (list* (movl apr eax) + (addl (int vector-tag) eax) + (movl (int (fx- idx disp-vector-data)) + (mem disp-vector-length apr)) + (addl (int (align idx)) apr) + ac)] + [else + (list* (movl (Simple (car arg*)) eax) + (movl eax (mem idx apr)) + (f (cdr arg*) (fx+ idx wordsize)))]))] + ;[($pcb-ref) + ; (let ([loc (car arg*)]) + ; (record-case loc + ; [(constant i) + ; (unless (fixnum? i) (error who "invalid loc ~s" loc)) + ; (list* (movl (mem (fx* i wordsize) pcr) eax) ac)] + ; [else (error who "invalid loc ~s" loc)]))] + [($string) + (let f ([arg* arg*] [idx disp-string-data]) + (cond + [(null? arg*) + (list* (movb (int 0) (mem idx apr)) + (movl apr eax) + (addl (int string-tag) eax) + (movl (int (fx* (fx- idx disp-string-data) wordsize)) + (mem disp-string-length apr)) + (addl (int (align (fxadd1 idx))) apr) + ac)] + [else + (record-case (car arg*) + [(constant c) + (unless (char? c) (error who "invalid arg to string ~s" x)) + (list* (movb (int (char->integer c)) (mem idx apr)) + (f (cdr arg*) (fxadd1 idx)))] + [else + (list* (movl (Simple (car arg*)) ebx) + (movb bh (mem idx apr)) + (f (cdr arg*) (fxadd1 idx)))])]))] + [($current-frame) + (list* (movl (pcb-ref 'next-continuation) eax) + ac)] + [($seal-frame-and-call) + (list* (movl (Simple (car arg*)) cpr) ; proc + (movl (pcb-ref 'frame-base) eax) + ; eax=baseofstack + (movl (mem (fx- 0 wordsize) eax) ebx) ; underflow handler + (movl ebx (mem (fx- 0 wordsize) fpr)) ; set + ; create a new cont record + (movl (int continuation-tag) (mem 0 apr)) + (movl fpr (mem disp-continuation-top apr)) + ; compute the size of the captured frame + (movl eax ebx) + (subl fpr ebx) + (subl (int wordsize) ebx) + ; and store it + (movl ebx (mem disp-continuation-size apr)) + ; load next cont + (movl (pcb-ref 'next-continuation) ebx) + ; and store it + (movl ebx (mem disp-continuation-next apr)) + ; adjust ap + (movl apr eax) + (addl (int vector-tag) eax) + (addl (int continuation-size) apr) + ; store new cont in current-cont + (movl eax (pcb-ref 'next-continuation)) + ; adjust fp + (movl fpr (pcb-ref 'frame-base)) + (subl (int wordsize) fpr) + ; tail-call f + (movl eax (mem (fx- 0 wordsize) fpr)) + (movl (int (argc-convention 1)) eax) + (tail-indirect-cpr-call) + ac)] + [($code-instr-size) + (indirect-ref arg* (fx- disp-code-instrsize vector-tag) + (cons (sall (int fx-shift) eax) ac))] + [($code-reloc-size) + (indirect-ref arg* (fx- disp-code-relocsize vector-tag) ac)] + [($code-closure-size) + (indirect-ref arg* (fx- disp-code-closuresize vector-tag) ac)] + [($set-car! $set-cdr! $vector-set! $string-set! $exit + $set-symbol-value! $set-symbol-plist! + $set-code-byte! $set-code-word! primitive-set! + $set-code-object! $set-code-object+offset! $set-code-object+offset/rel! + $record-set!) + (do-effect-prim op arg* + (cons (movl (int void-object) eax) ac))] + [(fixnum? immediate? $fxzero? boolean? char? pair? vector? string? symbol? + procedure? null? not eof-object? $fx= $fx< $fx<= $fx> $fx>= eq? + $char= $char< $char<= $char> $char>= $unbound-object? code? hash-table? + $record?) + (do-pred->value-prim op arg* ac)] + [($code->closure) + (list* + (movl (Simple (car arg*)) eax) + (addl (int (fx- disp-code-data vector-tag)) eax) + (movl eax (mem 0 apr)) + (movl apr eax) + (addl (int closure-tag) eax) + (addl (int (align disp-closure-data)) apr) + ac)] + [($frame->continuation) + (NonTail + (make-closure (make-code-loc SL_continuation_code) arg*) + ac)] + [($make-call-with-values-procedure) + (NonTail + (make-closure (make-code-loc SL_call_with_values) arg*) + ac)] + [($make-values-procedure) + (NonTail + (make-closure (make-code-loc SL_values) arg*) + ac)] + [else + (error 'value-prim "unhandled ~s" op)])) + (define (do-effect-prim op arg* ac) + (case op + [($vector-set!) + (list* (movl (Simple (car arg*)) ebx) + (addl (Simple (cadr arg*)) ebx) + (movl (Simple (caddr arg*)) eax) + (movl eax (mem (fx- disp-vector-data vector-tag) ebx)) + ac)] + [($string-set!) + (list* (movl (Simple (cadr arg*)) eax) + (sarl (int fx-shift) eax) + (addl (Simple (car arg*)) eax) + (movl (Simple (caddr arg*)) ebx) + (movb bh (mem (fx- disp-string-data string-tag) eax)) + ac)] +; [($set-constant!) +; (NonTail (cadr arg*) +; (list* (movl eax (Simple (car arg*))) ac))] + [($set-car!) + (list* (movl (Simple (car arg*)) eax) + (movl (Simple (cadr arg*)) ebx) + (movl ebx (mem (fx- disp-car pair-tag) eax)) + ac)] + [($set-cdr!) + (list* (movl (Simple (car arg*)) eax) + (movl (Simple (cadr arg*)) ebx) + (movl ebx (mem (fx- disp-cdr pair-tag) eax)) + ac)] + [($set-symbol-value!) + (list* (movl (Simple (car arg*)) eax) + (movl (Simple (cadr arg*)) ebx) + (movl ebx (mem (fx- disp-symbol-value symbol-tag) eax)) + ac)] + [(primitive-set!) + (list* (movl (Simple (car arg*)) eax) + (movl (Simple (cadr arg*)) ebx) + (movl ebx (mem (fx- disp-symbol-system-value symbol-tag) eax)) + ac)] + [($set-symbol-plist!) + (list* (movl (Simple (car arg*)) eax) + (movl (Simple (cadr arg*)) ebx) + (movl ebx (mem (fx- disp-symbol-plist symbol-tag) eax)) + ac)] + [($set-symbol-unique-string!) + (list* (movl (Simple (car arg*)) eax) + (movl (Simple (cadr arg*)) ebx) + (movl ebx (mem (fx- disp-symbol-unique-string symbol-tag) eax)) + ac)] + [($set-symbol-string!) + (list* (movl (Simple (car arg*)) eax) + (movl (Simple (cadr arg*)) ebx) + (movl ebx (mem (fx- disp-symbol-string symbol-tag) eax)) + ac)] + [($record-set!) + (list* (movl (Simple (car arg*)) ebx) + (addl (Simple (cadr arg*)) ebx) + (movl (Simple (caddr arg*)) eax) + (movl eax (mem (fx- disp-record-data record-ptag) ebx)) + ac)] + [($set-code-byte!) + (list* (movl (Simple (cadr arg*)) eax) + (sarl (int fx-shift) eax) + (addl (Simple (car arg*)) eax) + (movl (Simple (caddr arg*)) ebx) + (sarl (int fx-shift) ebx) + (movb bl (mem (fx- disp-code-data vector-tag) eax)) + ac)] + [($set-code-word!) + (list* (movl (Simple (cadr arg*)) eax) + (sarl (int fx-shift) eax) + (addl (Simple (car arg*)) eax) + (movl (Simple (caddr arg*)) ebx) + (movl ebx (mem (fx- disp-code-data vector-tag) eax)) + ac)] + [($set-code-object!) + (let ([code (car arg*)] [object (cadr arg*)] + [code-offset (caddr arg*)] [reloc-idx (cadddr arg*)]) + (list* + (movl (Simple code) eax) + (movl (Simple object) ebx) + (movl (Simple code-offset) edx) + (movl edx ecx) + (sarl (int fx-shift) edx) + (addl eax edx) + (movl ebx (mem (fx- disp-code-data vector-tag) edx)) + (addl (mem (fx- disp-code-instrsize vector-tag) eax) eax) + (addl (Simple reloc-idx) eax) + (movl ecx (mem (fx- disp-code-data vector-tag) eax)) + ac))] + [($set-code-object+offset!) + (let ([code (car arg*)] [object (cadr arg*)] + [code-offset (caddr arg*)] [object-offset (cadddr arg*)] + [reloc-idx (car (cddddr arg*))]) + (list* + (movl (Simple code) eax) + (movl (Simple object-offset) ebx) ; ebx = fxdisp + (sarl (int fx-shift) ebx) ; ebx = disp in bytes + (movl ebx ecx) ; ecx = disp in bytes + (addl (Simple object) ecx) ; ecx = object + disp + (movl (Simple code-offset) edx) ; edx = fx codeoffset + (sarl (int fx-shift) edx) ; edx = codeoffset in bytes + (addl eax edx) + (movl ecx (mem (fx- disp-code-data vector-tag) edx)) + (subl eax edx) + (addl (mem (fx- disp-code-instrsize vector-tag) eax) eax) + (addl (Simple reloc-idx) eax) + (sall (int fx-shift) edx) + (orl (int 1) edx) + (movl edx (mem (fx- disp-code-data vector-tag) eax)) + (movl ebx (mem (fx- (fx+ disp-code-data wordsize) vector-tag) eax)) + ac))] + [($set-code-object+offset/rel!) + (let ([code (car arg*)] [object (cadr arg*)] + [code-offset (caddr arg*)] [object-offset (cadddr arg*)] + [reloc-idx (car (cddddr arg*))]) + (list* + (movl (Simple code) eax) + (movl (Simple object-offset) ebx) + (sarl (int fx-shift) ebx) + (movl (Simple code-offset) ecx) + (orl (int 2) ecx) + (movl (mem (fx- disp-code-instrsize vector-tag) eax) edx) + (addl (Simple reloc-idx) edx) + (addl eax edx) + (movl ecx (mem (fx- disp-code-data vector-tag) edx)) + (movl ebx (mem (fx- (fx+ wordsize disp-code-data) vector-tag) edx)) + (sarl (int fx-shift) ecx) ; code offset in bytes + (addl eax ecx) + (addl (int (fx- (fx+ wordsize disp-code-data) vector-tag)) ecx) + ; ecx points to next word in stream + (addl (Simple object) ebx) ; ebx is object+objectoffset + (subl ecx ebx) ; ebx is relative offset + (movl ebx (mem (fx- 0 wordsize) ecx)) + ac))] + [(cons void $fxadd1 $fxsub1) + (let f ([arg* arg*]) + (cond + [(null? arg*) ac] + [else + (Effect (car arg*) (f (cdr arg*)))]))] + [else + (error 'do-effect-prim "unhandled op ~s" op)])) + (define (do-simple-test x Lt Lf ac) + (unless (or Lt Lf) + (error 'Pred "no labels")) + (cond + [(not Lt) + (list* (cmpl (int bool-f) x) (je Lf) ac)] + [(not Lf) + (list* (cmpl (int bool-f) x) (jne Lt) ac)] + [else + (list* (cmpl (int bool-f) x) (je Lf) (jmp Lt) ac)])) + (define (Simple x) + (record-case x + [(cp-var i) + (mem (fx+ (fx* i wordsize) (fx- disp-closure-data closure-tag)) cpr)] + [(frame-var i) (mem (fx* i (fx- 0 wordsize)) fpr)] + [(constant c) (constant-val c)] + [(code-loc label) (label-address label)] + [(primref op) (primref-loc op)] + [else (error 'Simple "what ~s" x)])) + (define (frame-adjustment offset) + (fx* (fxsub1 offset) (fx- 0 wordsize))) + (define (NonTail x ac) + (record-case x + [(constant c) + (cons (movl (constant-val c) eax) ac)] + [(frame-var) + (cons (movl (Simple x) eax) ac)] + [(cp-var) + (cons (movl (Simple x) eax) ac)] + [(foreign-label L) + (cons (movl (list 'foreign-label L) eax) ac)] + [(primref c) + (cons (movl (primref-loc c) eax) ac)] + [(closure label arg*) + (let f ([arg* arg*] [off disp-closure-data]) + (cond + [(null? arg*) + (list* (movl (Simple label) (mem 0 apr)) + (movl apr eax) + (addl (int (align off)) apr) + (addl (int closure-tag) eax) + ac)] + [else + (list* (movl (Simple (car arg*)) eax) + (movl eax (mem off apr)) + (f (cdr arg*) (fx+ off wordsize)))]))] + [(conditional test conseq altern) + (let ([Lj (unique-label)] [Lf (unique-label)]) + (Pred test #f Lf + (NonTail conseq + (list* (jmp Lj) Lf (NonTail altern (cons Lj ac))))))] + [(seq e0 e1) + (Effect e0 (NonTail e1 ac))] + [(primcall op rand*) + (do-value-prim op rand* ac)] + [(new-frame base-idx size body) + (NonTail body ac)] + [(call-cp call-convention rp-convention offset size mask) + (let ([L_CALL (unique-label)]) + (case call-convention + [(normal) + (list* (addl (int (frame-adjustment offset)) fpr) + (movl (int (argc-convention size)) eax) + (jmp L_CALL) + ; NEW FRAME + `(byte-vector ,mask) + `(int ,(fx* offset wordsize)) + `(current-frame-offset) + (rp-label rp-convention) + `(byte 0) ; padding for indirect calls only + `(byte 0) ; direct calls are ok + L_CALL + (indirect-cpr-call) + (movl (mem 0 fpr) cpr) + (subl (int (frame-adjustment offset)) fpr) + ac)] + [(apply) are-we-ever-here? + (list* (addl (int (frame-adjustment offset)) fpr) + (movl (int (argc-convention size)) eax) + (jmp L_CALL) + ; NEW FRAME + (byte-vector mask) + `(int ,(fx* offset wordsize)) + `(current-frame-offset) + (rp-label rp-convention) + L_CALL + (call (label SL_apply)) + (movl (mem 0 fpr) cpr) + (subl (int (frame-adjustment offset)) fpr) + ac)] + [(foreign) + (list* (addl (int (frame-adjustment offset)) fpr) + (movl (int (argc-convention size)) eax) + (jmp L_CALL) + ; NEW FRAME + (byte-vector mask) + `(int ,(fx* offset wordsize)) + `(current-frame-offset) + (rp-label rp-convention) ; should be 0, since C has 1 rv + L_CALL + (call (label SL_foreign_call)) + (movl (mem 0 fpr) cpr) + (subl (int (frame-adjustment offset)) fpr) + ac)] + [else (error who "invalid convention ~s for call-cp" convention)]))] + [else (error 'NonTail "invalid expression ~s" x)])) + (define (Pred x Lt Lf ac) + (record-case x + [(frame-var i) + (do-simple-test (idx->frame-loc i) Lt Lf ac)] + [(cp-var i) + (do-simple-test (Simple x) Lt Lf ac)] + [(constant c) + (if c + (if Lt (cons (jmp Lt) ac) ac) + (if Lf (cons (jmp Lf) ac) ac))] + [(primcall op rand*) + (do-pred-prim op rand* Lt Lf ac)] + [(conditional test conseq altern) + (cond + [(not Lt) + (let ([Lj^ (unique-label)] [Lf^ (unique-label)]) + (Pred test #f Lf^ + (Pred conseq Lj^ Lf + (cons Lf^ + (Pred altern #f Lf + (cons Lj^ ac))))))] + [(not Lf) + (let ([Lj^ (unique-label)] [Lf^ (unique-label)]) + (Pred test #f Lf^ + (Pred conseq Lt Lj^ + (cons Lf^ + (Pred altern Lt #f + (cons Lj^ ac))))))] + [else + (let ([Lf^ (unique-label)]) + (Pred test #f Lf^ + (Pred conseq Lt Lf + (cons Lf^ + (Pred altern Lt Lf ac)))))])] + [(seq e0 e1) + (Effect e0 (Pred e1 Lt Lf ac))] + [(new-frame) + (NonTail x (do-simple-test eax Lt Lf ac))] + [else (error 'Pred "invalid expression ~s" x)])) + (define (idx->frame-loc i) + (mem (fx* i (fx- 0 wordsize)) fpr)) + (define (Effect x ac) + (record-case x + [(constant) ac] + [(primcall op rand*) + (do-effect-prim op rand* ac)] + [(conditional test conseq altern) + (let ([Lf (unique-label)] [Ljoin (unique-label)]) + (Pred test #f Lf + (Effect conseq + (list* (jmp Ljoin) Lf (Effect altern (cons Ljoin ac))))))] + [(seq e0 e1) + (Effect e0 (Effect e1 ac))] + [(assign loc val) + (record-case loc + [(frame-var i) + (NonTail val + (cons (movl eax (idx->frame-loc i)) ac))] + [else (error who "invalid assign loc ~s" loc)])] + [(eval-cp check body) + (NonTail body + (cond + [check + (list* + (movl eax cpr) + (andl (int closure-mask) eax) + (cmpl (int closure-tag) eax) + (jne (label SL_nonprocedure)) + ac)] + [else + (list* + (movl eax cpr) + ac)]))] + [(save-cp loc) + (record-case loc + [(frame-var i) + (cons (movl cpr (idx->frame-loc i)) ac)] + [else (error who "invalid cpr loc ~s" x)])] + [(new-frame) (NonTail x ac)] + [(frame-var) ac] + [else (error 'Effect "invalid expression ~s" x)])) + (define (Tail x ac) + (record-case x + [(return x) + (NonTail x (cons (ret) ac))] + [(conditional test conseq altern) + (let ([L (unique-label)]) + (Pred test #f L + (Tail conseq + (cons L (Tail altern ac)))))] + [(seq e0 e1) + (Effect e0 (Tail e1 ac))] + [(new-frame idx size body) + (Tail body ac)] + [(call-cp call-convention rp-convention idx argc mask) + (unless (eq? rp-convention 'tail) + (error who "nontail rp (~s) in tail context" rp-convention)) + (let f ([i 0]) + (cond + [(fx= i argc) + (case call-convention + [(normal) + (list* + (movl (int (argc-convention argc)) eax) + (tail-indirect-cpr-call) + ac)] + [(apply) + (list* + (movl (int (argc-convention argc)) eax) + (jmp (label SL_apply)) + ac)] + [else (error who "invalid conv ~s in tail call-cpr" convention)])] + [else + (list* (movl (mem (fx* (fx+ idx (fxadd1 i)) + (fx- 0 wordsize)) fpr) + eax) + (movl eax (mem (fx* (fx+ i 1) (fx- 0 wordsize)) fpr)) + (f (fxadd1 i)))]))] + [else (error 'Tail "invalid expression ~s" x)])) + (define (handle-vararg fml-count ac) + (define CONTINUE_LABEL (unique-label)) + (define DONE_LABEL (unique-label)) + (define CONS_LABEL (unique-label)) + (define LOOP_HEAD (unique-label)) + (define L_CALL (unique-label)) + (list* (cmpl (int (argc-convention (fxsub1 fml-count))) eax) + (jg (label SL_invalid_args)) + (jl CONS_LABEL) + (movl (int nil) ebx) + (jmp DONE_LABEL) + CONS_LABEL + (movl (pcb-ref 'allocation-redline) ebx) + (addl eax ebx) + (addl eax ebx) + (cmpl ebx apr) + (jle LOOP_HEAD) + ; overflow + (addl eax esp) ; advance esp to cover args + (pushl cpr) ; push current cp + (pushl eax) ; push argc + (negl eax) ; make argc positive + (addl (int (fx* 4 wordsize)) eax) ; add 4 words to adjust frame size + (pushl eax) ; push frame size + (addl eax eax) ; double the number of args + (movl eax (mem (fx* -2 wordsize) fpr)) ; pass it as first arg + (movl (int (argc-convention 1)) eax) ; setup argc + (movl (primref-loc 'do-vararg-overflow) cpr) ; load handler + (jmp L_CALL) ; go to overflow handler + ; NEW FRAME + (int 0) ; if the framesize=0, then the framesize is dynamic + '(current-frame-offset) + (int 0) ; multiarg rp + (byte 0) + (byte 0) + L_CALL + (indirect-cpr-call) + (popl eax) ; pop framesize and drop it + (popl eax) ; reload argc + (popl cpr) ; reload cp + (subl eax fpr) ; readjust fp + LOOP_HEAD + (movl (int nil) ebx) + CONTINUE_LABEL + (movl ebx (mem disp-cdr apr)) + (movl (mem fpr eax) ebx) + (movl ebx (mem disp-car apr)) + (movl apr ebx) + (addl (int pair-tag) ebx) + (addl (int pair-size) apr) + (addl (int (fxsll 1 fx-shift)) eax) + (cmpl (int (fx- 0 (fxsll fml-count fx-shift))) eax) + (jle CONTINUE_LABEL) + DONE_LABEL + (movl ebx (mem (fx- 0 (fxsll fml-count fx-shift)) fpr)) + ac)) + (define (Entry check? x ac) + (record-case x + [(clambda-case fml* proper body) + (let ([ac (Tail body ac)]) + (cond + [(and proper check?) + (list* (cmpl (int (argc-convention (length fml*))) eax) + (jne (label SL_invalid_args)) + ac)] + [proper ac] + [else + (handle-vararg (length fml*) ac)]))])) + (define make-dispatcher + (lambda (j? L L* x x* ac) + (cond + [(null? L*) (if j? (cons (jmp (label L)) ac) ac)] + [else + (record-case x + [(clambda-case fml* proper _) + (cond + [proper + (list* (cmpl (int (argc-convention (length fml*))) eax) + (je (label L)) + (make-dispatcher #t + (car L*) (cdr L*) (car x*) (cdr x*) ac))] + [else + (list* (cmpl (int (argc-convention (fxsub1 (length fml*)))) eax) + (jle (label L)) + (make-dispatcher #t + (car L*) (cdr L*) (car x*) (cdr x*) ac))])])]))) + (define (handle-cases x x*) + (let ([L* (map (lambda (_) (gensym)) x*)] + [L (gensym)]) + (make-dispatcher #f L L* x x* + (let f ([x x] [x* x*] [L L] [L* L*]) + (cond + [(null? x*) + (cons (label L) (Entry 'check x '()))] + [else + (cons (label L) + (Entry #f x + (f (car x*) (cdr x*) (car L*) (cdr L*))))]))))) + (define (CodeExpr x) + (record-case x + [(clambda-code L cases free) + (list* + (fx+ disp-closure-data (fx* wordsize (length free))) + (label L) + (handle-cases (car cases) (cdr cases)))])) + (record-case x + [(codes list body) + (cons (cons 0 (Tail body '())) + (map CodeExpr list))])) + + +(define SL_nonprocedure (gensym "SL_nonprocedure")) +(define SL_invalid_args (gensym "SL_invalid_args")) +(define SL_foreign_call (gensym "SL_foreign_call")) +(define SL_continuation_code (gensym "SL_continuation_code")) +(define SL_multiple_values_error_rp (gensym "SL_multiple_values_error_rp")) +(define SL_multiple_values_ignore_rp (gensym "SL_multiple_ignore_error_rp")) +(define SL_underflow_multiple_values (gensym "SL_underflow_multiple_values")) +(define SL_underflow_handler (gensym "SL_underflow_handler")) +(define SL_scheme_exit (gensym "SL_scheme_exit")) +(define SL_apply (gensym "SL_apply")) +(define SL_values (gensym "SL_values")) +(define SL_call_with_values (gensym "SL_call_with_values")) + +(list*->code* + (list + (let ([L_cwv_done (gensym)] + [L_cwv_loop (gensym)] + [L_cwv_multi_rp (gensym)] + [L_cwv_call (gensym)] + ) + (list disp-closure-data + (label SL_call_with_values) + (cmpl (int (argc-convention 2)) eax) + (jne (label SL_invalid_args)) + (movl (mem (fx- 0 wordsize) fpr) ebx) ; producer + (movl ebx cpr) + (andl (int closure-mask) ebx) + (cmpl (int closure-tag) ebx) + (jne (label SL_nonprocedure)) + (movl (int (argc-convention 0)) eax) + (subl (int (fx* wordsize 2)) fpr) + (jmp (label L_cwv_call)) + ; MV NEW FRAME + (byte-vector '#(#b110)) + (int (fx* wordsize 3)) + '(current-frame-offset) + (label-address L_cwv_multi_rp) + (byte 0) + (byte 0) + (label L_cwv_call) + (indirect-cpr-call) + ;;; one value returned + (addl (int (fx* wordsize 2)) fpr) + (movl (mem (fx* -2 wordsize) fpr) ebx) ; consumer + (movl ebx cpr) + (movl eax (mem (fx- 0 wordsize) fpr)) + (movl (int (argc-convention 1)) eax) + (andl (int closure-mask) ebx) + (cmpl (int closure-tag) ebx) + (jne (label SL_nonprocedure)) + (tail-indirect-cpr-call) + ;;; multiple values returned + (label L_cwv_multi_rp) + ; because values does not pop the return point + ; we have to adjust fp one more word here + (addl (int (fx* wordsize 3)) fpr) + (movl (mem (fx* -2 wordsize) fpr) cpr) ; consumer + (cmpl (int (argc-convention 0)) eax) + (je (label L_cwv_done)) + (movl (int (fx* -4 wordsize)) ebx) + (addl fpr ebx) ; ebx points to first value + (movl ebx ecx) + (addl eax ecx) ; ecx points to the last value + (label L_cwv_loop) + (movl (mem 0 ebx) edx) + (movl edx (mem (fx* 3 wordsize) ebx)) + (subl (int wordsize) ebx) + (cmpl ecx ebx) + (jge (label L_cwv_loop)) + (label L_cwv_done) + (movl cpr ebx) + (andl (int closure-mask) ebx) + (cmpl (int closure-tag) ebx) + (jne (label SL_nonprocedure)) + (tail-indirect-cpr-call))) + + (let ([L_values_one_value (gensym)] + [L_values_many_values (gensym)]) + (list disp-closure-data + (label SL_values) + (cmpl (int (argc-convention 1)) eax) + (je (label L_values_one_value)) + (label L_values_many_values) + (movl (mem 0 fpr) ebx) ; return point + (jmp (mem disp-multivalue-rp ebx)) ; go + (label L_values_one_value) + (movl (mem (fx- 0 wordsize) fpr) eax) + (ret))) + + (let ([L_apply_done (gensym)] + [L_apply_loop (gensym)]) + (list 0 + (label SL_apply) + (movl (mem fpr eax) ebx) + (cmpl (int nil) ebx) + (je (label L_apply_done)) + (label L_apply_loop) + (movl (mem (fx- disp-car pair-tag) ebx) ecx) + (movl (mem (fx- disp-cdr pair-tag) ebx) ebx) + (movl ecx (mem fpr eax)) + (subl (int wordsize) eax) + (cmpl (int nil) ebx) + (jne (label L_apply_loop)) + (label L_apply_done) + (addl (int wordsize) eax) + (tail-indirect-cpr-call))) + + (list 0 + (label SL_nonprocedure) + (movl cpr (mem (fx- 0 wordsize) fpr)) ; first arg + (movl (primref-loc '$apply-nonprocedure-error-handler) cpr) + (movl (int (argc-convention 1)) eax) + (tail-indirect-cpr-call)) + + (list 0 + (label SL_multiple_values_error_rp) + (movl (primref-loc '$multiple-values-error) cpr) + (tail-indirect-cpr-call)) + + (list 0 + (label SL_multiple_values_ignore_rp) + (ret)) + + (list 0 + (label SL_invalid_args) + ;;; + (movl cpr (mem (fx- 0 wordsize) fpr)) ; first arg + (negl eax) + (movl eax (mem (fx- 0 (fx* 2 wordsize)) fpr)) + (movl (primref-loc '$incorrect-args-error-handler) cpr) + (movl (int (argc-convention 2)) eax) + (tail-indirect-cpr-call)) + + (let ([Lset (gensym)] [Lloop (gensym)]) + (list 0 + (label SL_foreign_call) + (movl fpr (pcb-ref 'frame-pointer)) + (movl apr (pcb-ref 'allocation-pointer)) + (movl fpr ebx) + (movl (pcb-ref 'system-stack) esp) + (pushl pcr) + (cmpl (int 0) eax) + (je (label Lset)) + (label Lloop) + (movl (mem ebx eax) ecx) + (pushl ecx) + (addl (int 4) eax) + (cmpl (int 0) eax) + (jne (label Lloop)) + (label Lset) + ; FOREIGN NEW FRAME + (call cpr) + (movl (pcb-ref 'frame-pointer) fpr) + (movl (pcb-ref 'allocation-pointer) apr) + (ret))) + + (let ([L_cont_zero_args (gensym)] + [L_cont_mult_args (gensym)] + [L_cont_one_arg (gensym)] + [L_cont_mult_move_args (gensym)] + [L_cont_mult_copy_loop (gensym)]) + (list + (fx+ disp-closure-data wordsize) + (label SL_continuation_code) + (movl (mem (fx- disp-closure-data closure-tag) cpr) ebx) ; captured-k + (movl ebx (pcb-ref 'next-continuation)) ; set + (movl (pcb-ref 'frame-base) ebx) + (cmpl (int (argc-convention 1)) eax) + (jg (label L_cont_zero_args)) + (jl (label L_cont_mult_args)) + (label L_cont_one_arg) + (movl (mem (fx- 0 wordsize) fpr) eax) + (movl ebx fpr) + (subl (int wordsize) fpr) + (ret) + (label L_cont_zero_args) + (subl (int wordsize) ebx) + (movl ebx fpr) + (movl (mem 0 ebx) ebx) ; return point + (jmp (mem disp-multivalue-rp ebx)) ; go + (label L_cont_mult_args) + (subl (int wordsize) ebx) + (cmpl ebx fpr) + (jne (label L_cont_mult_move_args)) + (movl (mem 0 ebx) ebx) + (jmp (mem disp-multivalue-rp ebx)) + (label L_cont_mult_move_args) + ; move args from fpr to ebx + (movl (int 0) ecx) + (label L_cont_mult_copy_loop) + (subl (int wordsize) ecx) + (movl (mem fpr ecx) edx) + (movl edx (mem ebx ecx)) + (cmpl ecx eax) + (jne (label L_cont_mult_copy_loop)) + (movl ebx fpr) + (movl (mem 0 ebx) ebx) + (jmp (mem disp-multivalue-rp ebx)) + )) + )) + + + +(define (compile-program original-program) + (let* (;;; + [p (expand original-program)] + [p (recordize p)] + ;[f (pretty-print (unparse p))] + [p (optimize-direct-calls p)] + [p (remove-assignments p)] + [p (convert-closures p)] + [p (lift-codes p)] + ;[p (lift-complex-constants p)] + [p (introduce-primcalls p)] + [p (simplify-operands p)] + ;[f (pretty-print (unparse p))] + [p (insert-stack-overflow-checks p)] + [p (insert-allocation-checks p)] + [p (remove-local-variables p)] + ;[f (pretty-print (unparse p))] + [ls* (generate-code p)] + [f (when (assembler-output) + (for-each + (lambda (ls) + (for-each (lambda (x) (printf " ~s\n" x)) ls)) + ls*))] + [code* (list*->code* ls*)]) + (fasl-write (car code*) (compile-port)))) + + +(define compile-expr + (lambda (expr output-file) + (let ([op (open-output-file output-file 'replace)]) + (parameterize ([compile-port op]) + (compile-program expr)) + (close-output-port op)))) + +(define compile-file + (lambda (input-file output-file) + (let ([ip (open-input-file input-file)] + [op (open-output-file output-file 'replace)]) + (parameterize ([compile-port op]) + (let f () + (let ([x (read ip)]) + (unless (eof-object? x) + (compile-program x) + (f))))) + (close-input-port ip) + (close-output-port op)))) + + +(parameterize ([assembler-output #f]) + (for-each + (lambda (x) + (printf "compiling ~a ...\n" x) + (compile-file (car x) (cadr x))) + scheme-library-files)) + +(system "rm -f ikarus.fasl") + +(for-each + (lambda (x) + (system (format "cat ~a >> ikarus.fasl" (cadr x)))) + scheme-library-files) + + + +(define replace-safe-prims-with-unsafe + (lambda (x) + (define prims + '([fx+ $fx+] [fx- $fx-] [fx* $fx*] [fxadd1 $fxadd1] [fxsub1 $fxsub1] + [fxlogand $fxlogand] [fxlogor $fxlogor] [fxlognot $fxlognot] + [fx= $fx=] [fx< $fx<] [fx<= $fx<=] [fx> $fx>] [fx>= $fx>=] + [fxzero? $fxzero?] + [fixnum->char $fixnum->char] [char->fixnum $char->fixnum] + [char= $char=] + [char< $char<] [char> $char>] [char<= $char<=] [char>= $char>=] + [car $car] [cdr $cdr] [set-car! $set-car!] [set-cdr! $set-cdr!] + [vector-length $vector-length] [vector-ref $vector-ref] + [vector-set! $vector-set!] [make-vector $make-vector] + [string-length $string-length] [string-ref $string-ref] + [string-set! $string-set!] [make-string $make-string] + )) + (define (E x) + (cond + [(pair? x) (cons (E (car x)) (E (cdr x)))] + [(symbol? x) + (cond + [(assq x prims) => cadr] + [else x])] + [else x])) + (E x))) + +(parameterize ([input-filter + (lambda (x) + `(begin (write (eval ',x)) (newline) (exit 0)))]) + (test-all)) + +(define (get-date) + (system "date +\"%F\" > build-date.tmp") + (let ([ip (open-input-file "build-date.tmp")]) + (list->string + (let f () + (let ([x (read-char ip)]) + (if (char= x #\newline) + '() + (cons x (f)))))))) + +(compile-expr + `(begin + (display ,(format "Petite Ikarus Scheme (Build ~a)\n" (get-date))) + (display "Copyright (c) 2006 Abdulaziz Ghuloum\n\n") + (new-cafe)) + "petite-ikarus.fasl") diff --git a/src/dump b/src/dump deleted file mode 100644 index 0d67796..0000000 --- a/src/dump +++ /dev/null @@ -1,19933 +0,0 @@ -Script started on Sat 22 Jul 2006 03:35:56 PM EDT -aghuloum@titus:~/compiler-1$ runtime/ikarus ..  / ikarus.fasl petite-ikarus.fasl -Petite Ikarus Scheme (Build 2006-07-22) -Copyright (c) 2006 Abdulaziz Ghuloum - -> (load "compiler-6.0.ss") -size=4, asize=8 -size=16, asize=16 -size=40, asize=40 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=4, asize=8 -size=16, asize=16 -size=12, asize=16 -size=20, asize=24 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=4, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=4, asize=8 -size=12, asize=16 -size=20, asize=24 -size=12, asize=16 -size=4, asize=8 -size=8, asize=8 -size=12, asize=16 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=4, asize=8 -size=12, asize=16 -size=4, asize=8 -size=8, asize=8 -size=4, asize=8 -size=12, asize=16 -size=12, asize=16 -size=4, asize=8 -size=4, asize=8 -size=8, asize=8 -size=4, asize=8 -size=16, asize=16 -size=24, asize=24 -size=8, asize=8 -size=20, asize=24 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=20, asize=24 -size=16, asize=16 -size=12, asize=16 -size=4, asize=8 -size=12, asize=16 -size=8, asize=8 -size=4, asize=8 -size=20, asize=24 -size=4, asize=8 -size=12, asize=16 -size=8, asize=8 -size=4, asize=8 -size=12, asize=16 -size=12, asize=16 -size=20, asize=24 -size=12, asize=16 -size=4, asize=8 -size=4, asize=8 -size=4, asize=8 -size=12, asize=16 -size=8, asize=8 -size=4, asize=8 -size=12, asize=16 -size=4, asize=8 -size=12, asize=16 -size=8, asize=8 -size=4, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=4, asize=8 -size=4, asize=8 -size=12, asize=16 -size=8, asize=8 -size=4, asize=8 -size=8, asize=8 -size=4, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=20, asize=24 -size=20, asize=24 -size=4, asize=8 -size=20, asize=24 -size=12, asize=16 -size=20, asize=24 -size=8, asize=8 -size=12, asize=16 -size=20, asize=24 -size=20, asize=24 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=4, asize=8 -size=12, asize=16 -size=40, asize=40 -size=20, asize=24 -size=4, asize=8 -size=20, asize=24 -size=12, asize=16 -size=4, asize=8 -size=12, asize=16 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=4, asize=8 -size=4, asize=8 -size=4, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=4, asize=8 -size=12, asize=16 -size=20, asize=24 -size=4, asize=8 -size=20, asize=24 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=20, asize=24 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=4, asize=8 -size=20, asize=24 -size=12, asize=16 -size=20, asize=24 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=4, asize=8 -size=12, asize=16 -size=8, asize=8 -size=4, asize=8 -size=12, asize=16 -size=8, asize=8 -size=20, asize=24 -size=4, asize=8 -size=8, asize=8 -size=16, asize=16 -size=4, asize=8 -size=12, asize=16 -size=4, asize=8 -size=20, asize=24 -size=12, asize=16 -size=4, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=4, asize=8 -size=4, asize=8 -size=8, asize=8 -size=20, asize=24 -size=12, asize=16 -size=20, asize=24 -size=8, asize=8 -size=12, asize=16 -size=4, asize=8 -size=20, asize=24 -size=4, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=20, asize=24 -size=12, asize=16 -size=8, asize=8 -size=4, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=20, asize=24 -size=12, asize=16 -size=8, asize=8 -size=20, asize=24 -size=4, asize=8 -size=12, asize=16 -size=12, asize=16 -size=4, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=4, asize=8 -size=12, asize=16 -size=12, asize=16 -size=4, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=4, asize=8 -size=8, asize=8 -size=12, asize=16 -size=4, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=4, asize=8 -size=20, asize=24 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=4, asize=8 -size=8, asize=8 -size=12, asize=16 -size=36, asize=40 -size=4, asize=8 -size=12, asize=16 -size=20, asize=24 -size=12, asize=16 -size=20, asize=24 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=20, asize=24 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=20, asize=24 -size=12, asize=16 -size=4, asize=8 -size=16, asize=16 -size=4, asize=8 -size=12, asize=16 -size=12, asize=16 -size=4, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=4, asize=8 -size=20, asize=24 -size=56, asize=56 -size=8, asize=8 -size=4, asize=8 -size=4, asize=8 -size=20, asize=24 -size=12, asize=16 -size=4, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=4, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=20, asize=24 -size=4, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=20, asize=24 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=20, asize=24 -size=12, asize=16 -size=20, asize=24 -size=4, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=4, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=4, asize=8 -size=4, asize=8 -size=16, asize=16 -size=8, asize=8 -size=4, asize=8 -size=4, asize=8 -size=12, asize=16 -size=20, asize=24 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=20, asize=24 -size=24, asize=24 -size=4, asize=8 -size=44, asize=48 -size=12, asize=16 -size=4, asize=8 -size=4, asize=8 -size=20, asize=24 -size=8, asize=8 -size=4, asize=8 -size=4, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=4, asize=8 -size=4, asize=8 -size=12, asize=16 -size=4, asize=8 -size=4, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=4, asize=8 -size=12, asize=16 -size=4, asize=8 -size=4, asize=8 -size=8, asize=8 -size=4, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=4, asize=8 -size=16, asize=16 -size=4, asize=8 -size=4, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=20, asize=24 -size=12, asize=16 -size=20, asize=24 -size=4, asize=8 -size=12, asize=16 -size=4, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=20, asize=24 -size=20, asize=24 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=4, asize=8 -size=4, asize=8 -size=4, asize=8 -size=16, asize=16 -size=4, asize=8 -size=12, asize=16 -size=4, asize=8 -size=8, asize=8 -size=8, asize=8 -size=4, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=20, asize=24 -size=20, asize=24 -size=12, asize=16 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=4, asize=8 -size=12, asize=16 -size=8, asize=8 -size=20, asize=24 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=4, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=4, asize=8 -size=4, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=4, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=20, asize=24 -size=4, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=4, asize=8 -size=16, asize=16 -size=12, asize=16 -size=20, asize=24 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=4, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=20, asize=24 -size=16, asize=16 -size=16, asize=16 -size=20, asize=24 -size=4, asize=8 -size=20, asize=24 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=4, asize=8 -size=4, asize=8 -size=4, asize=8 -size=8, asize=8 -size=12, asize=16 -size=4, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=4, asize=8 -size=4, asize=8 -size=4, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=4, asize=8 -size=4, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=20, asize=24 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=4, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=48, asize=48 -size=4, asize=8 -size=4, asize=8 -size=4, asize=8 -size=4, asize=8 -size=4, asize=8 -size=4, asize=8 -size=4, asize=8 -size=4, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=4, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=28, asize=32 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=4, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=4, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=4, asize=8 -size=4, asize=8 -size=4, asize=8 -size=4, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=4, asize=8 -size=4, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=24, asize=24 -size=36, asize=40 -size=4, asize=8 -size=132, asize=136 -size=12, asize=16 -size=4, asize=8 -size=20, asize=24 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=4, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=4, asize=8 -size=4, asize=8 -size=4, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=4, asize=8 -size=4, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=60, asize=64 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=20, asize=24 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=4, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=20, asize=24 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=4, asize=8 -size=12, asize=16 -size=20, asize=24 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=4, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=4, asize=8 -size=4, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=4, asize=8 -size=4, asize=8 -size=12, asize=16 -size=8, asize=8 -size=28, asize=32 -size=12, asize=16 -size=4, asize=8 -size=4, asize=8 -size=4, asize=8 -size=12, asize=16 -size=20, asize=24 -size=28, asize=32 -size=12, asize=16 -size=28, asize=32 -size=36, asize=40 -size=32, asize=32 -size=24, asize=24 -size=32, asize=32 -size=24, asize=24 -size=24, asize=24 -size=28, asize=32 -size=20, asize=24 -size=20, asize=24 -size=12, asize=16 -size=40, asize=40 -size=12, asize=16 -size=48, asize=48 -size=20, asize=24 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=88, asize=88 -size=4, asize=8 -size=4, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=4, asize=8 -size=28, asize=32 -size=4, asize=8 -size=20, asize=24 -size=4, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=20, asize=24 -size=20, asize=24 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=20, asize=24 -size=20, asize=24 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=24, asize=24 -size=4, asize=8 -size=8, asize=8 -size=4, asize=8 -size=4, asize=8 -size=4, asize=8 -size=48, asize=48 -size=4, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=24, asize=24 -size=12, asize=16 -size=12, asize=16 -size=4, asize=8 -size=4, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=4, asize=8 -size=4, asize=8 -size=4, asize=8 -size=4, asize=8 -size=4, asize=8 -size=8, asize=8 -size=4, asize=8 -size=4, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=4, asize=8 -size=4, asize=8 -size=28, asize=32 -size=4, asize=8 -size=4, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -ptr chunk 0xa7671fe0 .. 0xa7674000 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=4, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=4, asize=8 -size=24, asize=24 -size=4, asize=8 -size=4, asize=8 -size=4, asize=8 -size=16, asize=16 -size=44, asize=48 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=36, asize=40 -size=16, asize=16 -size=36, asize=40 -size=16, asize=16 -size=4, asize=8 -size=4, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=4, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=36, asize=40 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=36, asize=40 -size=4, asize=8 -size=24, asize=24 -size=36, asize=40 -size=8, asize=8 -size=12, asize=16 -size=36, asize=40 -size=52, asize=56 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=28, asize=32 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -ptr chunk 0xa7633b30 .. 0xa7634000 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -ptr chunk 0xa7643640 .. 0xa7644000 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -ptr chunk 0xa76534d0 .. 0xa7653ff8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=4, asize=8 -size=4, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=4, asize=8 -size=4, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=16, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -ptr chunk 0xa7623fa8 .. 0xa7624000 -size=12, asize=16 -size=12, asize=16 -size=8, asize=8 -size=12, asize=16 -size=12, asize=16 -allocated pages is now 2219 -allocated mallc is now 14876 -Segmentation fault -aghuloum@titus:~/compiler-1$ exit - -Script done on Sat 22 Jul 2006 03:36:54 PM EDT diff --git a/src/dynamic-load/Makefile b/src/dynamic-load/Makefile deleted file mode 100644 index 99a6be3..0000000 --- a/src/dynamic-load/Makefile +++ /dev/null @@ -1,12 +0,0 @@ - -all: library1.so library2.so client - -library1.so: library1.c - gcc -Wall -shared -o library1.so library1.c - -library2.so: library2.c - gcc -Wall -shared -o library2.so library2.c - -client: client.c - gcc -Wall -ldl -o client client.c - diff --git a/src/dynamic-load/client b/src/dynamic-load/client deleted file mode 100755 index c9e9851..0000000 Binary files a/src/dynamic-load/client and /dev/null differ diff --git a/src/dynamic-load/client.c b/src/dynamic-load/client.c deleted file mode 100644 index ce0e934..0000000 --- a/src/dynamic-load/client.c +++ /dev/null @@ -1,36 +0,0 @@ - -#include -#include -#include - -void do_lib(char* libname){ - fprintf(stderr, "loading %s... ", libname); - void* dh = dlopen(libname, RTLD_NOW | RTLD_LOCAL); - if(dh == NULL){ - fprintf(stderr, "failed: %s\n", dlerror()); - exit(-1); - } - fprintf(stderr, "0x%08x\n", (int)dh); - - fprintf(stderr, "loading library_print ... "); - int(*my_print)(char*) = dlsym(dh, "library_print"); - if(my_print == NULL){ - fprintf(stderr, "failed: %s\n", dlerror()); - exit(-1); - } - fprintf(stderr, "0x%08x\n", (int)my_print); - - fprintf(stderr, "Calling it ... "); - my_print("Hello There"); - fprintf(stderr, "done\n"); -} - -int main(int argc, char** argv){ - do_lib("./library1.so"); - do_lib("./library2.so"); - do_lib("./library1.so"); - return 0; -} - - - diff --git a/src/dynamic-load/library1.c b/src/dynamic-load/library1.c deleted file mode 100644 index 65fd3f5..0000000 --- a/src/dynamic-load/library1.c +++ /dev/null @@ -1,8 +0,0 @@ - -#include - -int library_print(char* x){ - fprintf(stderr, "LIB1: %s\n", x); - return 0; -} - diff --git a/src/dynamic-load/library2.c b/src/dynamic-load/library2.c deleted file mode 100644 index 093f592..0000000 --- a/src/dynamic-load/library2.c +++ /dev/null @@ -1,8 +0,0 @@ - -#include - -int library_print(char* x){ - fprintf(stderr, "LIB2: %s\n", x); - return 0; -} - diff --git a/src/ikarus.fasl b/src/ikarus.fasl index 0c5c112..61bc83d 100644 Binary files a/src/ikarus.fasl and b/src/ikarus.fasl differ diff --git a/src/libassembler-5.8.ss b/src/libassembler-5.8.ss deleted file mode 100644 index fb65570..0000000 --- a/src/libassembler-5.8.ss +++ /dev/null @@ -1,132 +0,0 @@ - -;;; -;;; the interface for creating and managing code objects -;;; - -($pcb-set! make-code - (lambda (code-size reloc-size closure-size) - (unless (and (fixnum? code-size) (fx> code-size 0)) - (error 'make-code "invalid code size ~s" code-size)) - (unless (and (fixnum? reloc-size) (fx>= reloc-size 0)) - (error 'make-code "invalid relocation table size ~s" reloc-size)) - (unless (and (fixnum? closure-size) (fx>= closure-size 0)) - (error 'make-code "invalid closure size ~s" closure-size)) - (foreign-call "S_make_code" code-size reloc-size closure-size))) - -($pcb-set! make-code-executable! - (lambda (x) - (unless (code? x) (error 'make-code-executable! "~s is not a code" x)) - (unless (foreign-call "S_make_code_executable" x) - (error 'make-code-executable "Failed!")))) - -($pcb-set! code-instr-size - (lambda (x) - (unless (code? x) - (error 'code-instr-size "~s is not a code" x)) - ($code-instr-size x))) - -($pcb-set! code-reloc-size - (lambda (x) - (unless (code? x) - (error 'code-reloc-size "~s is not a code" x)) - ($code-reloc-size x))) - -($pcb-set! code-closure-size - (lambda (x) - (unless (code? x) - (error 'code-closure-size "~s is not a code" x)) - ($code-closure-size x))) - -($pcb-set! code? - (lambda (x) - (code? x))) - -($pcb-set! code->closure - (lambda (x) - (unless (code? x) (error 'code->closure "~s is not a code")) - (unless ($fx= ($code-closure-size x) 1) - (error 'code->closure "code contains free variables")) - ($code->closure x))) - - -($pcb-set! set-code-byte! - (lambda (x i b) - (unless (code? x) (error 'set-code-byte! "~s is not a code" x)) - (unless (and (fixnum? i) ($fx>= i 0)) - (error 'set-code-byte! "~s is not a valid index" i)) - (unless (and (fixnum? b) ($fx>= b 0) ($fx<= b 255)) - (error 'set-code-byte! "~s is not a valid byte" b)) - (unless ($fx< i ($code-instr-size x)) - (error 'set-code-byte! "~s is out of range for a code of size ~s" - i - ($code-instr-size x))) - ($set-code-byte! x i b))) - -($pcb-set! set-code-word! - (lambda (x i w) - (unless (code? x) (error 'set-code-word! "~s is not a code" x)) - (unless (and (fixnum? i) ($fx>= i 0)) - (error 'set-code-word! "~s is not a valid index" i)) - (unless (and ($fx< i ($code-instr-size x)) - ($fx< ($fx+ i 3) ($code-instr-size x))) - (error 'set-code-word! "~s is out of range for a code of size ~s" - i - ($code-instr-size x))) - ($set-code-word! x i w))) - - -($pcb-set! set-code-object! - (lambda (code object code-offset reloc-index) - (unless (code? code) - (error 'set-code-object! "~s is not a code" code)) - (unless (and (fixnum? code-offset) - ($fx> code-offset 0) - ($fx< code-offset ($code-instr-size code)) - ($fx< ($fx+ code-offset 3) ($code-instr-size code))) - (error 'set-code-object! "~s is not a valid code offset" code-offset)) - (unless (and (fixnum? reloc-index) - ($fx>= reloc-index 0) - ($fx< reloc-index ($code-reloc-size code))) - (error 'set-code-object! "~s is not a valid reloc index" reloc-index)) - ($set-code-object! code object code-offset reloc-index))) - -($pcb-set! set-code-object+offset! - (lambda (code object code-offset object-offset reloc-index) - (unless (code? code) - (error 'set-code-object+offset! "~s is not a code" code)) - (unless (and (fixnum? code-offset) - ($fx> code-offset 0) - ($fx< code-offset ($code-instr-size code)) - ($fx< ($fx+ code-offset 3) ($code-instr-size code))) - (error 'set-code-object+offset! - "~s is not a valid code offset" code-offset)) - (unless (and (fixnum? reloc-index) - ($fx>= reloc-index 0) - ($fx< reloc-index ($fx- ($code-reloc-size code) 1))) - (error 'set-code-object+offset! - "~s is not a valid reloc index" reloc-index)) - ($set-code-object+offset! code object - code-offset object-offset reloc-index))) - - -($pcb-set! set-code-object+offset/rel! - (lambda (code object code-offset object-offset reloc-index) - (unless (code? code) - (error 'set-code-object+offset/rel! "~s is not a code" code)) - (unless (and (fixnum? code-offset) - ($fx> code-offset 0) - ($fx< code-offset ($code-instr-size code)) - ($fx< ($fx+ code-offset 3) ($code-instr-size code))) - (error 'set-code-object+offset/rel! - "~s is not a valid code offset" code-offset)) - (unless (and (fixnum? reloc-index) - ($fx>= reloc-index 0) - ($fx< reloc-index ($fx- ($code-reloc-size code) 1))) - (error 'set-code-object+offset/rel! - "~s is not a valid reloc index" reloc-index)) - ($set-code-object+offset/rel! code object - code-offset object-offset reloc-index))) - - -($pcb-set! set-code-object/reloc/relative! - (lambda args (error 'set-code-object/reloc/relative! "not yet"))) diff --git a/src/libcafe-5.8.ss b/src/libcafe-6.1.ss similarity index 71% rename from src/libcafe-5.8.ss rename to src/libcafe-6.1.ss index 787be9b..25eedff 100644 --- a/src/libcafe-5.8.ss +++ b/src/libcafe-6.1.ss @@ -30,6 +30,7 @@ (with-error-handler (lambda args (reset-input-port! (console-input-port)) + (display "repl catch\n" (console-output-port)) (apply print-error args) (k (void))) (lambda () @@ -51,22 +52,22 @@ v*))))])))))) (wait eval escape-k))) - ($pcb-set! new-cafe - (lambda args - (let ([eval - (if (null? args) - (current-eval) - (if (null? (cdr args)) - (let ([f (car args)]) - (if (procedure? f) - f - (error 'new-cafe "not a procedure ~s" f))) - (error 'new-cafe "too many arguments")))]) - (dynamic-wind - (lambda () (set! eval-depth (fxadd1 eval-depth))) - (lambda () - (call/cc - (lambda (k) - (wait eval k)))) - (lambda () (set! eval-depth (fxsub1 eval-depth)))))))) + (define new-cafe + (lambda (eval) + (dynamic-wind + (lambda () (set! eval-depth (fxadd1 eval-depth))) + (lambda () + (call/cc + (lambda (k) + (wait eval k)))) + (lambda () (set! eval-depth (fxsub1 eval-depth)))))) + + (primitive-set! 'new-cafe + (case-lambda + [() (new-cafe (current-eval))] + [(p) + (unless (procedure? p) + (error 'new-cafe "~s is not a procedure" p)) + (new-cafe p)])) + ) diff --git a/src/libcafe.fasl b/src/libcafe.fasl index c526843..bd2f5f8 100644 Binary files a/src/libcafe.fasl and b/src/libcafe.fasl differ diff --git a/src/libcollect-5.3.ss b/src/libcollect-5.3.ss deleted file mode 100644 index ff3329f..0000000 --- a/src/libcollect-5.3.ss +++ /dev/null @@ -1,23 +0,0 @@ - -;($pcb-set! do-overflow -; (lambda () -; ($do-overflow 4096))) - -($pcb-set! do-overflow - (lambda () - (foreign-call "S_collect" 4096) - (void))) - -($pcb-set! collect - (lambda () - (do-overflow))) - -($pcb-set! do-overflow-with-byte-count - (lambda (n) - (foreign-call "S_collect" n) - (void))) - -($pcb-set! do-stack-overflow - (lambda () - (foreign-call "S_stack_overflow"))) - diff --git a/src/libcollect.fasl b/src/libcollect.fasl index ad92d05..5fd12db 100644 Binary files a/src/libcollect.fasl and b/src/libcollect.fasl differ diff --git a/src/libcontrol-5.8.ss b/src/libcontrol-6.1.ss similarity index 59% rename from src/libcontrol-5.8.ss rename to src/libcontrol-6.1.ss index 79fb832..cb58cf1 100644 --- a/src/libcontrol-5.8.ss +++ b/src/libcontrol-6.1.ss @@ -60,14 +60,28 @@ (unwind* winders tail) (rewind* new tail)))) +;;; (define call/cc +;;; (lambda (f) +;;; (primitive-call/cc +;;; (lambda (k) +;;; (let ([save winders]) +;;; (f (lambda v* +;;; (unless (eq? save winders) (do-wind save)) +;;; (apply k v*)))))))) + (define call/cc (lambda (f) (primitive-call/cc (lambda (k) (let ([save winders]) - (f (lambda v* - (unless (eq? save winders) (do-wind save)) - (apply k v*)))))))) + (f (case-lambda + [(v) (unless (eq? save winders) (do-wind save)) (k v)] + [() (unless (eq? save winders) (do-wind save)) (k)] + [(v1 v2 . v*) + (unless (eq? save winders) (do-wind save)) + (apply k v1 v2 v*)]))))))) + + ;;; (define dynamic-wind ;;; (lambda (in body out) @@ -78,18 +92,36 @@ ;;; (out) ;;; v))) +;;; (define dynamic-wind +;;; (lambda (in body out) +;;; (in) +;;; (set! winders (cons (cons in out) winders)) +;;; (call-with-values +;;; body +;;; (lambda v* +;;; (set! winders (cdr winders)) +;;; (out) +;;; (apply values v*))))) + (define dynamic-wind (lambda (in body out) (in) (set! winders (cons (cons in out) winders)) (call-with-values body - (lambda v* - (set! winders (cdr winders)) - (out) - (apply values v*))))) + (case-lambda + [(v) (set! winders (cdr winders)) (out) v] + [() (set! winders (cdr winders)) (out) (values)] + [(v1 v2 . v*) + (set! winders (cdr winders)) + (out) + (apply values v1 v2 v*)])))) - ($pcb-set! call/cf call-with-current-frame) - ($pcb-set! call/cc call/cc) - ($pcb-set! dynamic-wind dynamic-wind)) + + + (primitive-set! 'call/cf call-with-current-frame) + (primitive-set! 'call/cc call/cc) + (primitive-set! 'dynamic-wind dynamic-wind) + ;($install-underflow-handler) + (void)) diff --git a/src/libcontrol.fasl b/src/libcontrol.fasl index 267a552..3d74a00 100644 Binary files a/src/libcontrol.fasl and b/src/libcontrol.fasl differ diff --git a/src/libcore-5.7.ss b/src/libcore-6.1.ss similarity index 58% rename from src/libcore-5.7.ss rename to src/libcore-6.1.ss index 4bf788c..bed6703 100644 --- a/src/libcore-5.7.ss +++ b/src/libcore-6.1.ss @@ -1,80 +1,83 @@ -($pcb-set! error - (lambda args - (foreign-call "S_error" args))) +;;; 6.1: added uses of case-lambda to replace the ugly code +;;; 6.0: basic version working -($pcb-set! exit - (lambda args - (if (null? args) - ($exit 0) - (if (null? ($cdr args)) - ($exit ($car args)) - (error 'exit "too many arguments"))))) -($pcb-set! eof-object +(primitive-set! 'call-with-values + ($make-call-with-values-procedure)) + +(primitive-set! 'values + ($make-values-procedure)) + +(primitive-set! 'exit + (case-lambda + [() (exit 0)] + [(status) (foreign-call "exit" status)])) + +(primitive-set! 'eof-object (lambda () (eof-object))) -($pcb-set! void +(primitive-set! 'void (lambda () (void))) -($pcb-set! eof-object? +(primitive-set! 'eof-object? (lambda (x) (eof-object? x))) -($pcb-set! fxadd1 +(primitive-set! 'fxadd1 (lambda (n) (unless (fixnum? n) (error 'fxadd1 "~s is not a fixnum" n)) ($fxadd1 n))) -($pcb-set! fxsub1 +(primitive-set! 'fxsub1 (lambda (n) (unless (fixnum? n) (error 'fxsub1 "~s is not a fixnum" n)) ($fxsub1 n))) -($pcb-set! integer->char +(primitive-set! 'integer->char (lambda (n) (unless (fixnum? n) (error 'integer->char "~s is not a fixnum" n)) (unless (and ($fx>= n 0) - ($fx<= n 127)) - (error 'integer->char "~s is out of range[0..127]" n)) + ($fx<= n 255)) + (error 'integer->char "~s is out of range[0..255]" n)) ($fixnum->char n))) -($pcb-set! char->integer +(primitive-set! 'char->integer (lambda (x) (unless (char? x) (error 'char->integer "~s is not a character" x)) ($char->fixnum x))) -($pcb-set! fxlognot +(primitive-set! 'fxlognot (lambda (x) (unless (fixnum? x) (error 'fxlognot "~s is not a fixnum" x)) ($fxlognot x))) -($pcb-set! fixnum? (lambda (x) (fixnum? x))) -($pcb-set! immediate? (lambda (x) (immediate? x))) +(primitive-set! 'fixnum? (lambda (x) (fixnum? x))) +(primitive-set! 'immediate? (lambda (x) (immediate? x))) -($pcb-set! fxzero? +(primitive-set! 'fxzero? (lambda (x) (unless (fixnum? x) (error 'fxzero? "~s is not a fixnum" x)) ($fxzero? x))) -($pcb-set! boolean? (lambda (x) (boolean? x))) +(primitive-set! 'boolean? (lambda (x) (boolean? x))) -($pcb-set! char? (lambda (x) (char? x))) +(primitive-set! 'char? (lambda (x) (char? x))) -($pcb-set! vector? (lambda (x) (vector? x))) +(primitive-set! 'vector? (lambda (x) (vector? x))) -($pcb-set! string? (lambda (x) (string? x))) +(primitive-set! 'string? (lambda (x) (string? x))) -($pcb-set! procedure? (lambda (x) (procedure? x))) +(primitive-set! 'procedure? (lambda (x) (procedure? x))) -($pcb-set! null? (lambda (x) (null? x))) +(primitive-set! 'null? (lambda (x) (null? x))) -($pcb-set! pair? (lambda (x) (pair? x))) +(primitive-set! 'pair? (lambda (x) (pair? x))) (let () (define fill! @@ -84,37 +87,51 @@ [else ($vector-set! v i fill) (fill! v ($fx+ i 1) n fill)]))) - ($pcb-set! make-vector - (lambda (n . opt) - (unless (and (fixnum? n) ($fx>= n 0)) - (error 'make-vector "~s is not a valid size" n)) - (let ([fill (if (null? opt) - #f - (if (null? ($cdr opt)) - ($car opt) - (error 'make-vector "too many arguments")))]) - (let ([v ($make-vector n)]) - (fill! v 0 n fill)))))) + (define make-vector + (case-lambda + [(n) (make-vector n (void))] + [(n fill) + (unless (and (fixnum? n) (fx>= n 0)) + (error 'make-vector "~s is not a valid length" n)) + (fill! ($make-vector n) 0 n fill)])) + (primitive-set! 'make-vector make-vector)) -($pcb-set! vector-length +(primitive-set! 'vector-length (lambda (x) (unless (vector? x) (error 'vector-length "~s is not a vector" x)) ($vector-length x))) -($pcb-set! make-string - (lambda (x) - (unless (and (fixnum? x) ($fx>= x 0)) - (error 'make-string "~s is not a valid size" x)) - ($make-string x))) - -($pcb-set! string-length +(let () + (define fill! + (lambda (s i n c) + (cond + [($fx= i n) s] + [else + ($string-set! s i c) + (fill! s ($fx+ i 1) n c)]))) + (define make-string + (case-lambda + [(n) + (unless (and (fixnum? n) (fx>= n 0)) + (error 'make-string "~s is not a valid length" n)) + ($make-string n)] + [(n c) + (unless (and (fixnum? n) (fx>= n 0)) + (error 'make-string "~s is not a valid length" n)) + (unless (char? c) + (error 'make-string "~s is not a character" c)) + (fill! ($make-string n) 0 n c)])) + (primitive-set! 'make-string make-string)) + + +(primitive-set! 'string-length (lambda (x) (unless (string? x) (error 'string-length "~s is not a string" x)) ($string-length x))) -($pcb-set! string->list +(primitive-set! 'string->list (lambda (x) (unless (string? x) (error 'string->list "~s is not a string" x)) @@ -125,6 +142,7 @@ (let ([i ($fxsub1 i)]) (f x i (cons ($string-ref x i) ac)))])))) + (let () (define bstring=? (lambda (s1 s2 i j) @@ -137,7 +155,7 @@ [(null? s*) #f] [(string? ($car s*)) (check-strings-and-return-false ($cdr s*))] - [else (error 'string=? "~s is not a string" ($car s*))]))) + [else (err ($car s*))]))) (define strings=? (lambda (s s* n) (or (null? s*) @@ -148,13 +166,27 @@ (and (strings=? s ($cdr s*) n) (bstring=? s a 0 n)) (check-strings-and-return-false ($cdr s*))))))) - ($pcb-set! string=? - (lambda (s . s*) - (if (string? s) - (strings=? s s* ($string-length s)) - (error 'string=? "~s is not a string" s))))) + (define (err x) + (error 'string=? "~s is not a string" x)) + (primitive-set! 'string=? + (case-lambda + [(s s1) + (if (string? s) + (if (string? s1) + (let ([n ($string-length s)]) + (and ($fx= n ($string-length s1)) + (bstring=? s s1 0 n))) + (err s1)) + (err s))] + [(s . s*) + (if (string? s) + (strings=? s s* ($string-length s)) + (err s))]))) + + (let () + ;; FIXME: make nonconsing on 0,1,2, and 3 args (define length* (lambda (s* n) (cond @@ -179,11 +211,11 @@ (let ([j ($fx+ i n)]) (fill-string s a i j 0) (fill-strings s ($cdr s*) j))))]))) - ($pcb-set! string-append - (lambda s* - (let ([n (length* s* 0)]) - (let ([s ($make-string n)]) - (fill-strings s s* 0)))))) + (primitive-set! 'string-append + (lambda s* + (let ([n (length* s* 0)]) + (let ([s ($make-string n)]) + (fill-strings s s* 0)))))) (let () @@ -194,7 +226,7 @@ [else ($string-set! d di ($string-ref s si)) (fill s d ($fxadd1 si) sj ($fxadd1 di))]))) - ($pcb-set! substring + (primitive-set! 'substring (lambda (s n m) (unless (string? s) (error 'substring "~s is not a string" s)) @@ -212,9 +244,9 @@ "" (fill s ($make-string len) n m 0))))))) -($pcb-set! not (lambda (x) (not x))) +(primitive-set! 'not (lambda (x) (not x))) -($pcb-set! symbol->string +(primitive-set! 'symbol->string (lambda (x) (unless (symbol? x) (error 'symbol->string "~s is not a symbol" x)) @@ -226,7 +258,7 @@ (gensym-count ($fxadd1 ct)) str)))))) -($pcb-set! gensym? +(primitive-set! 'gensym? (lambda (x) (and (symbol? x) (let ([s ($symbol-unique-string x)]) @@ -247,7 +279,7 @@ (string-set! str j ($fixnum->char ($fx+ r ($char->fixnum #\0)))) (values str ($fxadd1 j))))))]))) - ($pcb-set! fixnum->string + (primitive-set! 'fixnum->string (lambda (x) (unless (fixnum? x) (error 'fixnum->string "~s is not a fixnum" x)) (cond @@ -264,7 +296,7 @@ ($string-set! str 0 #\-) str))])))) -($pcb-set! top-level-value +(primitive-set! 'top-level-value (lambda (x) (unless (symbol? x) (error 'top-level-value "~s is not a symbol" x)) @@ -273,21 +305,36 @@ (error 'top-level-value "unbound variable ~s" x)) v))) -($pcb-set! top-level-bound? +(primitive-set! 'top-level-bound? (lambda (x) (unless (symbol? x) (error 'top-level-bound? "~s is not a symbol" x)) (not ($unbound-object? ($symbol-value x))))) -($pcb-set! set-top-level-value! +(primitive-set! 'set-top-level-value! (lambda (x v) (unless (symbol? x) (error 'set-top-level-value! "~s is not a symbol" x)) ($set-symbol-value! x v))) -($pcb-set! symbol? (lambda (x) (symbol? x))) +(primitive-set! 'symbol? (lambda (x) (symbol? x))) -($pcb-set! fx+ +(primitive-set! 'primitive? + (lambda (x) + (unless (symbol? x) + (error 'primitive? "~s is not a symbol" x)) + (procedure? (primitive-ref x)))) + +(primitive-set! 'primitive-ref + (lambda (x) + (unless (symbol? x) + (error 'primitive-ref "~s is not a symbol" x)) + (let ([v (primitive-ref x)]) + (unless (procedure? v) + (error 'primitive-ref "~s is not a primitive" x)) + v))) + +(primitive-set! 'fx+ (lambda (x y) (unless (fixnum? x) (error 'fx+ "~s is not a fixnum" x)) @@ -295,7 +342,7 @@ (error 'fx+ "~s is not a fixnum" y)) ($fx+ x y))) -($pcb-set! fx- +(primitive-set! 'fx- (lambda (x y) (unless (fixnum? x) (error 'fx- "~s is not a fixnum" x)) @@ -303,7 +350,7 @@ (error 'fx- "~s is not a fixnum" y)) ($fx- x y))) -($pcb-set! fx* +(primitive-set! 'fx* (lambda (x y) (unless (fixnum? x) (error 'fx* "~s is not a fixnum" x)) @@ -313,7 +360,7 @@ -($pcb-set! fxquotient +(primitive-set! 'fxquotient (lambda (x y) (unless (fixnum? x) (error 'fxquotient "~s is not a fixnum" x)) @@ -324,7 +371,7 @@ ($fxquotient x y))) -($pcb-set! fxremainder +(primitive-set! 'fxremainder (lambda (x y) (unless (fixnum? x) (error 'fxremainder "~s is not a fixnum" x)) @@ -336,7 +383,7 @@ ($fx- x ($fx* q y))))) -($pcb-set! fxmodulo +(primitive-set! 'fxmodulo (lambda (x y) (unless (fixnum? x) (error 'fxmodulo "~s is not a fixnum" x)) @@ -347,7 +394,7 @@ ($fxmodulo x y))) -($pcb-set! fxlogor +(primitive-set! 'fxlogor (lambda (x y) (unless (fixnum? x) (error 'fxlogor "~s is not a fixnum" x)) @@ -355,7 +402,7 @@ (error 'fxlogor "~s is not a fixnum" y)) ($fxlogor x y))) -($pcb-set! fxlogxor +(primitive-set! 'fxlogxor (lambda (x y) (unless (fixnum? x) (error 'fxlogxor "~s is not a fixnum" x)) @@ -363,7 +410,7 @@ (error 'fxlogxor "~s is not a fixnum" y)) ($fxlogxor x y))) -($pcb-set! fxlogand +(primitive-set! 'fxlogand (lambda (x y) (unless (fixnum? x) (error 'fxlogand "~s is not a fixnum" x)) @@ -371,7 +418,7 @@ (error 'fxlogand "~s is not a fixnum" y)) ($fxlogand x y))) -($pcb-set! fxsra +(primitive-set! 'fxsra (lambda (x y) (unless (fixnum? x) (error 'fxsra "~s is not a fixnum" x)) @@ -381,7 +428,7 @@ (error 'fxsra "negative shift not allowed, got ~s" y)) ($fxsra x y))) -($pcb-set! fxsll +(primitive-set! 'fxsll (lambda (x y) (unless (fixnum? x) (error 'fxsll "~s is not a fixnum" x)) @@ -391,7 +438,7 @@ (error 'fxsll "negative shift not allowed, got ~s" y)) ($fxsll x y))) -($pcb-set! fx= +(primitive-set! 'fx= (lambda (x y) (unless (fixnum? x) (error 'fx= "~s is not a fixnum" x)) @@ -399,7 +446,7 @@ (error 'fx= "~s is not a fixnum" y)) ($fx= x y))) -($pcb-set! fx< +(primitive-set! 'fx< (lambda (x y) (unless (fixnum? x) (error 'fx< "~s is not a fixnum" x)) @@ -407,7 +454,7 @@ (error 'fx< "~s is not a fixnum" y)) ($fx< x y))) -($pcb-set! fx<= +(primitive-set! 'fx<= (lambda (x y) (unless (fixnum? x) (error 'fx<= "~s is not a fixnum" x)) @@ -415,7 +462,7 @@ (error 'fx<= "~s is not a fixnum" y)) ($fx<= x y))) -($pcb-set! fx> +(primitive-set! 'fx> (lambda (x y) (unless (fixnum? x) (error 'fx> "~s is not a fixnum" x)) @@ -423,7 +470,7 @@ (error 'fx> "~s is not a fixnum" y)) ($fx> x y))) -($pcb-set! fx>= +(primitive-set! 'fx>= (lambda (x y) (unless (fixnum? x) (error 'fx>= "~s is not a fixnum" x)) @@ -431,63 +478,211 @@ (error 'fx>= "~s is not a fixnum" y)) ($fx>= x y))) -($pcb-set! char= - (lambda (x y) - (unless (char? x) - (error 'char= "~s is not a character" x)) - (unless (char? y) - (error 'char= "~s is not a character" y)) - ($char= x y))) - -($pcb-set! char< - (lambda (x y) - (unless (char? x) - (error 'char< "~s is not a character" x)) - (unless (char? y) - (error 'char< "~s is not a character" y)) - ($char< x y))) - -($pcb-set! char<= - (lambda (x y) - (unless (char? x) - (error 'char<= "~s is not a character" x)) - (unless (char? y) - (error 'char<= "~s is not a character" y)) - ($char<= x y))) - -($pcb-set! char> - (lambda (x y) - (unless (char? x) - (error 'char> "~s is not a character" x)) - (unless (char? y) - (error 'char> "~s is not a character" y)) - ($char> x y))) - -($pcb-set! char>= - (lambda (x y) - (unless (char? x) - (error 'char>= "~s is not a character" x)) - (unless (char? y) - (error 'char>= "~s is not a character" y)) - ($char>= x y))) -($pcb-set! cons (lambda (x y) (cons x y))) +(primitive-set! 'char=? + (let () + (define (err x) + (error 'char=? "~s is not a character" x)) + (case-lambda + [(c1 c2) + (if (char? c1) + (if (char? c2) + ($char= c1 c2) + (err c2)) + (err c1))] + [(c1 c2 c3) + (if (char? c1) + (if (char? c2) + (if (char? c3) + (and ($char= c1 c2) + ($char= c2 c3)) + (err c3)) + (err c2)) + (err c1))] + [(c1 . c*) + (if (char? c1) + (let f ([c* c*]) + (or (null? c*) + (let ([c2 ($car c*)]) + (if (char? c2) + (if ($char= c1 c2) + (f ($cdr c*)) + (let g ([c* ($cdr c*)]) + (if (null? c*) + #f + (if (char? ($car c*)) + (g ($cdr c*)) + (err ($car c*)))))) + (err c2))))) + (err c1))]))) -($pcb-set! eq? (lambda (x y) (eq? x y))) -($pcb-set! set-car! +(primitive-set! 'char? + (let () + (define (err x) + (error 'char>? "~s is not a character" x)) + (case-lambda + [(c1 c2) + (if (char? c1) + (if (char? c2) + ($char> c1 c2) + (err c2)) + (err c1))] + [(c1 c2 c3) + (if (char? c1) + (if (char? c2) + (if (char? c3) + (and ($char> c1 c2) + ($char> c2 c3)) + (err c3)) + (err c2)) + (err c1))] + [(c1 . c*) + (if (char? c1) + (let f ([c1 c1] [c* c*]) + (or (null? c*) + (let ([c2 ($car c*)]) + (if (char? c2) + (if ($char> c1 c2) + (f c2 ($cdr c*)) + (let g ([c* ($cdr c*)]) + (if (null? c*) + #f + (if (char? ($car c*)) + (g ($cdr c*)) + (err ($car c*)))))) + (err c2))))) + (err c1))]))) + +(primitive-set! 'char>=? + (let () + (define (err x) + (error 'char>=? "~s is not a character" x)) + (case-lambda + [(c1 c2) + (if (char? c1) + (if (char? c2) + ($char>= c1 c2) + (err c2)) + (err c1))] + [(c1 c2 c3) + (if (char? c1) + (if (char? c2) + (if (char? c3) + (and ($char>= c1 c2) + ($char>= c2 c3)) + (err c3)) + (err c2)) + (err c1))] + [(c1 . c*) + (if (char? c1) + (let f ([c1 c1] [c* c*]) + (or (null? c*) + (let ([c2 ($car c*)]) + (if (char? c2) + (if ($char>= c1 c2) + (f c2 ($cdr c*)) + (let g ([c* ($cdr c*)]) + (if (null? c*) + #f + (if (char? ($car c*)) + (g ($cdr c*)) + (err ($car c*)))))) + (err c2))))) + (err c1))]))) + + +(primitive-set! 'cons (lambda (x y) (cons x y))) + +(primitive-set! 'eq? (lambda (x y) (eq? x y))) + +(primitive-set! 'set-car! (lambda (x y) (unless (pair? x) (error 'set-car! "~s is not a pair" x)) ($set-car! x y))) -($pcb-set! set-cdr! +(primitive-set! 'set-cdr! (lambda (x y) (unless (pair? x) (error 'set-cdr! "~s is not a pair" x)) ($set-cdr! x y))) -($pcb-set! vector-ref +(primitive-set! 'vector-ref (lambda (v i) (unless (vector? v) (error 'vector-ref "~s is not a vector" v)) @@ -498,7 +693,7 @@ (error 'vector-ref "index ~s is out of range for ~s" i v)) ($vector-ref v i))) -($pcb-set! string-ref +(primitive-set! 'string-ref (lambda (s i) (unless (string? s) (error 'string-ref "~s is not a string" s)) @@ -509,7 +704,7 @@ (error 'string-ref "index ~s is out of range for ~s" i s)) ($string-ref s i))) -($pcb-set! vector-set! +(primitive-set! 'vector-set! (lambda (v i c) (unless (vector? v) (error 'vector-set! "~s is not a vector" v)) @@ -521,7 +716,7 @@ ($vector-set! v i c))) -($pcb-set! string-set! +(primitive-set! 'string-set! (lambda (s i c) (unless (string? s) (error 'string-set! "~s is not a string" s)) @@ -534,7 +729,8 @@ (error 'string-set! "~s is not a character" c)) ($string-set! s i c))) -($pcb-set! vector +(primitive-set! 'vector + ;;; FIXME: add case-lambda (letrec ([length (lambda (ls n) (cond @@ -549,32 +745,30 @@ (loop v ($cdr ls) ($fx+ i 1) n)]))]) (lambda ls (let ([n (length ls 0)]) - (let ([v ($make-vector n)]) + (let ([v (make-vector n)]) (loop v ls 0 n)))))) -(letrec ([length - (lambda (ls n) - (cond - [(null? ls) n] - [else (length ($cdr ls) ($fx+ n 1))]))] - [loop - (lambda (s ls i n) - (cond - [($fx= i n) s] - [else - (let ([c ($car ls)]) - (unless (char? c) - (error 'string "~s is not a character" c)) - ($string-set! s i c) - (loop s ($cdr ls) ($fx+ i 1) n))]))]) - (let ([f - (lambda ls - (let ([n (length ls 0)]) - (let ([s ($make-string n)]) - (loop s ls 0 n))))]) - ($pcb-set! string f))) +(primitive-set! 'string + ;;; FIXME: add case-lambda + (letrec ([length + (lambda (ls n) + (cond + [(null? ls) n] + [(char? ($car ls)) (length ($cdr ls) ($fx+ n 1))] + [else (error 'string "~s is not a character" ($car ls))]))] + [loop + (lambda (s ls i n) + (cond + [($fx= i n) s] + [else + ($string-set! s i ($car ls)) + (loop s ($cdr ls) ($fx+ i 1) n)]))]) + (lambda ls + (let ([n (length ls 0)]) + (let ([s (make-string n)]) + (loop s ls 0 n)))))) -($pcb-set! list? +(primitive-set! 'list? (letrec ([race (lambda (h t) (if (pair? h) @@ -588,7 +782,7 @@ -($pcb-set! reverse +(primitive-set! 'reverse (letrec ([race (lambda (h t ls ac) (if (pair? h) @@ -606,7 +800,7 @@ (lambda (x) (race x x x '())))) -($pcb-set! memq +(primitive-set! 'memq (letrec ([race (lambda (h t ls x) (if (pair? h) @@ -628,7 +822,7 @@ (lambda (x ls) (race ls ls ls x)))) -($pcb-set! list->string +(primitive-set! 'list->string (letrec ([race (lambda (h t ls n) (if (pair? h) @@ -658,7 +852,7 @@ (let ([s ($make-string n)]) (fill s 0 ls)))))) -($pcb-set! length +(primitive-set! 'length (letrec ([race (lambda (h t ls n) (if (pair? h) @@ -677,7 +871,7 @@ (race ls ls ls 0)))) -($pcb-set! list-ref +(primitive-set! 'list-ref (lambda (list index) (define f (lambda (ls i) @@ -697,20 +891,76 @@ -($pcb-set! apply - (letrec ([fix - (lambda (arg arg*) - (cond - [(null? arg*) - (if (list? arg) - arg - (error 'apply "~s is not a list" arg))] - [else - (cons arg (fix ($car arg*) ($cdr arg*)))]))]) - (lambda (f arg . arg*) - ($apply f (fix arg arg*))))) +;(primitive-set! 'apply +; (letrec ([fix +; (lambda (arg arg*) +; (cond +; [(null? arg*) +; (if (list? arg) +; arg +; (error 'apply "last arg is not a list"))] +; [else +; (cons arg (fix ($car arg*) ($cdr arg*)))]))]) +; (lambda (f arg . arg*) +; (unless (procedure? f) +; (error 'apply "APPLY ~s ~s ~s" f arg arg*)) +; ($apply f (fix arg arg*))))) +; + +;(primitive-set! 'apply +; (letrec ([fix +; (lambda (arg arg*) +; (cond +; [(null? arg*) +; (if (list? arg) +; arg +; (error 'apply "last arg is not a list"))] +; [else +; (cons arg (fix ($car arg*) ($cdr arg*)))]))]) +; (lambda (f arg . arg*) +; (unless (procedure? f) +; (error 'apply "APPLY ~s ~s ~s" f arg arg*)) +; (let ([args (fix arg arg*)]) +; ($apply f args))))) + +(primitive-set! 'apply + (let () + (define (err f ls) + (if (procedure? f) + (error 'apply "not a list") + (error 'apply "~s is not a procedure" f))) + (define (fixandgo f a0 a1 ls p d) + (cond + [(null? ($cdr d)) + (let ([last ($car d)]) + ($set-cdr! p last) + (if (and (procedure? f) (list? last)) + ($apply f a0 a1 ls) + (err f last)))] + [else (fixandgo f a0 a1 ls d ($cdr d))])) + (define apply + (case-lambda + [(f ls) + (if (and (procedure? f) (list? ls)) + ($apply f ls) + (err f ls))] + [(f a0 ls) + (if (and (procedure? f) (list? ls)) + ($apply f a0 ls) + (err f ls))] + [(f a0 a1 ls) + (if (and (procedure? f) (list? ls)) + ($apply f a0 a1 ls) + (err f ls))] + [(f a0 a1 . ls) + (fixandgo f a0 a1 ls ls ($cdr ls))])) + apply)) + + + + -($pcb-set! assq +(primitive-set! 'assq (letrec ([race (lambda (x h t ls) (if (pair? h) @@ -738,24 +988,25 @@ (lambda (x ls) (race x ls ls ls)))) -($pcb-set! string->symbol +(primitive-set! 'string->symbol (lambda (x) (unless (string? x) (error 'string->symbol "~s is not a string" x)) - ($intern x))) + (foreign-call "ik_intern_string" x))) -($pcb-set! gensym - (lambda args - (if (null? args) - ($make-symbol #f) - (if (null? ($cdr args)) - (let ([a ($car args)]) - (if (string? a) - ($make-symbol a) - (error 'gensym "~s is not a string" a))) - (error 'gensym "too many arguments"))))) +(primitive-set! 'oblist + (lambda () + (foreign-call "ik_oblist"))) -($pcb-set! putprop +(primitive-set! 'gensym + (case-lambda + [() ($make-symbol #f)] + [(s) + (if (string? s) + ($make-symbol s) + (error 'gensym "~s is not a string" s))])) + +(primitive-set! 'putprop (lambda (x k v) (unless (symbol? x) (error 'putprop "~s is not a symbol" x)) (unless (symbol? k) (error 'putprop "~s is not a symbol" k)) @@ -765,7 +1016,7 @@ [else ($set-symbol-plist! x (cons (cons k v) p))])))) -($pcb-set! getprop +(primitive-set! 'getprop (lambda (x k) (unless (symbol? x) (error 'getprop "~s is not a symbol" x)) (unless (symbol? k) (error 'getprop "~s is not a symbol" k)) @@ -774,7 +1025,7 @@ [(assq k p) => cdr] [else #f])))) -($pcb-set! remprop +(primitive-set! 'remprop (lambda (x k) (unless (symbol? x) (error 'remprop "~s is not a symbol" x)) (unless (symbol? k) (error 'remprop "~s is not a symbol" k)) @@ -793,7 +1044,7 @@ [else (f p ($cdr p))]))))])))))) -($pcb-set! property-list +(primitive-set! 'property-list (lambda (x) (unless (symbol? x) (error 'property-list "~s is not a symbol" x)) @@ -808,37 +1059,52 @@ (f ($symbol-plist x) '())))) -($pcb-set! make-parameter - (letrec ([make-param-no-guard - (lambda (x) - (lambda args - (if (null? args) - x - (if (null? ($cdr args)) - (set! x ($car args)) - (error #f "too many arguments to parameter")))))] - [make-param-with-guard - (lambda (x g) - (let ([f - (lambda args - (if (null? args) - x - (if (null? ($cdr args)) - (set! x (g ($car args))) - (error #f "too many arguments to parameter"))))]) - (if (procedure? g) - (begin (set! x (g x)) f) - (error 'make-parameter "not a procedure ~s" g))))]) - (lambda args - (if (pair? args) - (let ([x ($car args)] [args ($cdr args)]) - (if (null? args) - (make-param-no-guard x) - (let ([g ($car args)]) - (if (null? ($cdr args)) - (make-param-with-guard x g) - (error 'make-parameter "too many arguments"))))) - (error 'make-parameter "insufficient arguments"))))) +;;X (primitive-set! 'make-parameter +;;X (letrec ([make-param-no-guard +;;X (lambda (x) +;;X (lambda args +;;X (if (null? args) +;;X x +;;X (if (null? ($cdr args)) +;;X (set! x ($car args)) +;;X (error #f "too many arguments to parameter")))))] +;;X [make-param-with-guard +;;X (lambda (x g) +;;X (let ([f +;;X (lambda args +;;X (if (null? args) +;;X x +;;X (if (null? ($cdr args)) +;;X (set! x (g ($car args))) +;;X (error #f "too many arguments to parameter"))))]) +;;X (if (procedure? g) +;;X (begin (set! x (g x)) f) +;;X (error 'make-parameter "not a procedure ~s" g))))]) +;;X (lambda args +;;X (if (pair? args) +;;X (let ([x ($car args)] [args ($cdr args)]) +;;X (if (null? args) +;;X (make-param-no-guard x) +;;X (let ([g ($car args)]) +;;X (if (null? ($cdr args)) +;;X (make-param-with-guard x g) +;;X (error 'make-parameter "too many arguments"))))) +;;X (error 'make-parameter "insufficient arguments"))))) +;;X + +(primitive-set! 'make-parameter + (case-lambda + [(x) + (case-lambda + [() x] + [(v) (set! x v)])] + [(x guard) + (unless (procedure? guard) + (error 'make-parameter "~s is not a procedure" guard)) + (set! x (guard x)) + (case-lambda + [() x] + [(v) (set! x (guard v))])])) (let () (define vector-loop @@ -870,7 +1136,7 @@ (and ($fx= n ($string-length y)) (string-loop x y 0 n))))] [else #f]))) - ($pcb-set! equal? equal?)) + (primitive-set! 'equal? equal?)) (let () @@ -889,7 +1155,6 @@ (if (null? h) n (error who "improper list"))))) - (define map1 (lambda (f a d n) (cond @@ -903,7 +1168,6 @@ (cons (f a) '()) (error who "list was altered"))] [else (error who "list was altered")]))) - (define map2 (lambda (f a1 a2 d1 d2 n) (cond @@ -926,33 +1190,80 @@ (error who "list was altered"))] [else (error who "length mismatch")])] [else (error who "list was altered")]))) + (define cars + (lambda (ls*) + (cond + [(null? ls*) '()] + [else + (let ([a (car ls*)]) + (cond + [(pair? a) + (cons (car a) (cars (cdr ls*)))] + [else + (error 'map "length mismatch")]))]))) + (define cdrs + (lambda (ls*) + (cond + [(null? ls*) '()] + [else + (let ([a (car ls*)]) + (cond + [(pair? a) + (cons (cdr a) (cdrs (cdr ls*)))] + [else + (error 'map "length mismatch")]))]))) + (define mapm + (lambda (f ls ls* n) + (cond + [(null? ls) + (if (andmap null? ls*) + (if (fxzero? n) + '() + (error 'map "lists were mutated during operation")) + (error 'map "length mismatch"))] + [(fxzero? n) + (error 'map "lists were mutated during operation")] + [else + (cons + (apply f (car ls) (cars ls*)) + (mapm f (cdr ls) (cdrs ls*) (fxsub1 n)))]))) + (primitive-set! 'map + (case-lambda + [(f ls) + (unless (procedure? f) + (error who "~s is not a procedure" f)) + (cond + [(pair? ls) + (let ([d ($cdr ls)]) + (map1 f ($car ls) d (len d d 0)))] + [(null? ls) '()] + [else (error who "improper list")])] + [(f ls ls2) + (unless (procedure? f) + (error who "~s is not a procedure" f)) + (cond + [(pair? ls) + (if (pair? ls2) + (let ([d ($cdr ls)]) + (map2 f ($car ls) ($car ls2) d ($cdr ls2) (len d d 0))) + (error who "length mismatch"))] + [(null? ls) + (if (null? ls2) + '() + (error who "length mismatch"))] + [else (error who "not a list")])] + [(f ls . ls*) + (unless (procedure? f) + (error who "~s is not a procedure" f)) + (cond + [(pair? ls) + (let ([n (len ls ls 0)]) + (mapm f ls ls* n))] + [(null? ls) + (if (andmap null? ls*) + '() + (error who "length mismatch"))])]))) - ($pcb-set! map - (lambda (f ls . ls*) - (unless (procedure? f) - (error who "~s is not a procedure" f)) - (cond - [(null? ls*) - (cond - [(pair? ls) - (let ([d ($cdr ls)]) - (map1 f ($car ls) d (len d d 0)))] - [(null? ls) '()] - [else (error who "improper list")])] - [(null? ($cdr ls*)) - (let ([ls2 ($car ls*)]) - (cond - [(pair? ls) - (if (pair? ls2) - (let ([d ($cdr ls)]) - (map2 f ($car ls) ($car ls2) d ($cdr ls2) (len d d 0))) - (error who "length mismatch"))] - [(null? ls) - (if (null? ls2) - '() - (error who "length mismatch"))] - [else (error who "not a list")]))] - [else (error who "vararg not supported yet")])))) (let () (define who 'for-each) @@ -970,7 +1281,6 @@ (if (null? h) n (error who "improper list"))))) - (define for-each1 (lambda (f a d n) (cond @@ -985,7 +1295,6 @@ (f a) (error who "list was altered"))] [else (error who "list was altered")]))) - (define for-each2 (lambda (f a1 a2 d1 d2 n) (cond @@ -1009,34 +1318,33 @@ (error who "list was altered"))] [else (error who "length mismatch")])] [else (error who "list was altered")]))) - - ($pcb-set! for-each - (lambda (f ls . ls*) - (unless (procedure? f) - (error who "~s is not a procedure" f)) - (cond - [(null? ls*) - (cond - [(pair? ls) - (let ([d ($cdr ls)]) - (for-each1 f ($car ls) d (len d d 0)))] - [(null? ls) (void)] - [else (error who "improper list")])] - [(null? ($cdr ls*)) - (let ([ls2 ($car ls*)]) - (cond - [(pair? ls) - (if (pair? ls2) - (let ([d ($cdr ls)]) - (for-each2 f - ($car ls) ($car ls2) d ($cdr ls2) (len d d 0))) - (error who "length mismatch"))] - [(null? ls) - (if (null? ls2) - (void) - (error who "length mismatch"))] - [else (error who "not a list")]))] - [else (error who "vararg not supported yet")])))) + (primitive-set! 'for-each + (case-lambda + [(f ls) + (unless (procedure? f) + (error who "~s is not a procedure" f)) + (cond + [(pair? ls) + (let ([d ($cdr ls)]) + (for-each1 f ($car ls) d (len d d 0)))] + [(null? ls) (void)] + [else (error who "improper list")])] + [(f ls ls2) + (unless (procedure? f) + (error who "~s is not a procedure" f)) + (cond + [(pair? ls) + (if (pair? ls2) + (let ([d ($cdr ls)]) + (for-each2 f + ($car ls) ($car ls2) d ($cdr ls2) (len d d 0))) + (error who "length mismatch"))] + [(null? ls) + (if (null? ls2) + (void) + (error who "length mismatch"))] + [else (error who "not a list")])] + [_ (error who "vararg not supported yet")]))) @@ -1056,7 +1364,6 @@ (if (null? h) n (error who "improper list"))))) - (define andmap1 (lambda (f a d n) (cond @@ -1070,20 +1377,18 @@ (f a) (error who "list was altered"))] [else (error who "list was altered")]))) - - ($pcb-set! andmap - (lambda (f ls . ls*) - (unless (procedure? f) - (error who "~s is not a procedure" f)) - (cond - [(null? ls*) - (cond - [(pair? ls) - (let ([d ($cdr ls)]) - (andmap1 f ($car ls) d (len d d 0)))] - [(null? ls) #t] - [else (error who "improper list")])] - [else (error who "vararg not supported yet")])))) + (primitive-set! 'andmap + (case-lambda + [(f ls) + (unless (procedure? f) + (error who "~s is not a procedure" f)) + (cond + [(pair? ls) + (let ([d ($cdr ls)]) + (andmap1 f ($car ls) d (len d d 0)))] + [(null? ls) #t] + [else (error who "improper list")])] + [_ (error who "vararg not supported yet")]))) (let () @@ -1102,7 +1407,6 @@ (if (null? h) n (error who "improper list"))))) - (define ormap1 (lambda (f a d n) (cond @@ -1116,20 +1420,18 @@ (f a) (error who "list was altered"))] [else (error who "list was altered")]))) - - ($pcb-set! ormap - (lambda (f ls . ls*) - (unless (procedure? f) - (error who "~s is not a procedure" f)) - (cond - [(null? ls*) - (cond - [(pair? ls) - (let ([d ($cdr ls)]) - (ormap1 f ($car ls) d (len d d 0)))] - [(null? ls) #f] - [else (error who "improper list")])] - [else (error who "vararg not supported yet")])))) + (primitive-set! 'ormap + (case-lambda + [(f ls) + (unless (procedure? f) + (error who "~s is not a procedure" f)) + (cond + [(pair? ls) + (let ([d ($cdr ls)]) + (ormap1 f ($car ls) d (len d d 0)))] + [(null? ls) #f] + [else (error who "improper list")])] + [_ (error who "vararg not supported yet")]))) @@ -1163,12 +1465,12 @@ [else (revcons (reverse ls ls ls '()) (append ($car ls*) ($cdr ls*)))]))) - ($pcb-set! append + (primitive-set! 'append (lambda (ls . ls*) (append ls ls*)))) -($pcb-set! list->vector +(primitive-set! 'list->vector (letrec ([race (lambda (h t ls n) (if (pair? h) @@ -1193,7 +1495,7 @@ (fill v ($fxadd1 i) (cdr ls)))]))]) (lambda (ls) (let ([n (race ls ls ls 0)]) - (let ([v ($make-vector n)]) + (let ([v (make-vector n)]) (fill v 0 ls)))))) @@ -1204,7 +1506,7 @@ [($fx< i 0) ls] [else (f v ($fxsub1 i) (cons ($vector-ref v i) ls))]))) - ($pcb-set! vector->list + (primitive-set! 'vector->list (lambda (v) (if (vector? v) (let ([n ($vector-length v)]) @@ -1220,28 +1522,25 @@ [($fxzero? n) ls] [else (f ($fxsub1 n) fill (cons fill ls))]))) - ($pcb-set! make-list - (lambda (n . args) - (let ([fill - (if (null? args) - (void) - (if (null? (cdr args)) - (car args) - (error 'make-list "too many arguments")))]) - (if (fixnum? n) - (if ($fx>= n 0) - (f n fill '()) - (error 'make-list "negative size ~s" n)) - (error 'make-list "invalid size ~s" n)))))) + (primitive-set! 'make-list + (case-lambda + [(n) + (if (and (fixnum? n) ($fx>= n 0)) + (f n (void) '()) + (error 'make-list "~s is not a valid length" n))] + [(n fill) + (if (and (fixnum? n) ($fx>= n 0)) + (f n fill '()) + (error 'make-list "~s is not a valid length" n))]))) -($pcb-set! list (lambda x x)) +(primitive-set! 'list (lambda x x)) -($pcb-set! uuid +(primitive-set! 'uuid (lambda () (let ([s (make-string 36)]) - (foreign-call "S_uuid" s)))) + (foreign-call "ik_uuid" s)))) -($pcb-set! gensym->unique-string +(primitive-set! 'gensym->unique-string (lambda (x) (unless (symbol? x) (error 'gensym->unique-string "~s is not a gensym" x)) @@ -1255,7 +1554,7 @@ ($set-symbol-unique-string! x id) id)])))) -($pcb-set! gensym-prefix +(primitive-set! 'gensym-prefix (make-parameter "g" (lambda (x) @@ -1263,7 +1562,7 @@ (error 'gensym-prefix "~s is not a string" x)) x))) -($pcb-set! gensym-count +(primitive-set! 'gensym-count (make-parameter 0 (lambda (x) @@ -1271,7 +1570,7 @@ (error 'gensym-count "~s is not a valid count" x)) x))) -($pcb-set! print-gensym +(primitive-set! 'print-gensym (make-parameter #t (lambda (x) @@ -1279,4 +1578,19 @@ (error 'print-gensym "~s is not a boolean" x)) x))) +(primitive-set! 'make-hash-table + (lambda () + (make-hash-table))) + +(primitive-set! 'hash-table? + (lambda (x) + (hash-table? x))) + +(primitive-set! 'get-hash-table + (lambda (h k v) + (foreign-call "ik_get_hash_table" h k v))) + +(primitive-set! 'put-hash-table! + (lambda (h k v) + (foreign-call "ik_put_hash_table" h k v))) diff --git a/src/libcore.fasl b/src/libcore.fasl index 68dc57f..ae5112e 100644 Binary files a/src/libcore.fasl and b/src/libcore.fasl differ diff --git a/src/libcxr.fasl b/src/libcxr.fasl index e08fb66..8ef6c94 100644 Binary files a/src/libcxr.fasl and b/src/libcxr.fasl differ diff --git a/src/libexpand-5.8.ss b/src/libexpand-6.1.ss similarity index 97% rename from src/libexpand-5.8.ss rename to src/libexpand-6.1.ss index caad16d..5d7b137 100644 --- a/src/libexpand-5.8.ss +++ b/src/libexpand-6.1.ss @@ -1,4 +1,6 @@ +;;; 6.1: case-lambda +;;; ;;; Extended: cond case ;;; @@ -19,11 +21,11 @@ ;;; | ;;; | ( . ) ;;; ::= void | memv | top-level-value | set-top-level-value! -;;; | $pcb-set! | foreign-call | $apply +;;; | primitive-set! '| foreign-call | $apply ;;; ;;; ;;; Handled keywords: -;;; Core: lambda set! if quote begin define +;;; Core: case-lambda lambda set! if quote begin define ;;; Extended: let let* letrec letrec* when unless or and cond case ;;; define-record record-case @@ -40,9 +42,6 @@ (lambda (x val) (list 'set-top-level-value! (build-constant x) val))) - (define build-pcb-set! - (lambda (x val) - (list '$pcb-set! x val))) (define build-foreign-call (lambda (name rand*) (cons 'foreign-call @@ -92,7 +91,10 @@ (list 'if test conseq altern))) (define build-function (lambda (fml* body) - (list 'lambda fml* body))) + (build-case-lambda (list (list fml* body))))) + (define build-case-lambda + (lambda (cases) + (cons 'case-lambda cases))) (define build-assignments (lambda (lhs* rhs* body) (cond @@ -372,14 +374,21 @@ ;;; (define E-lambda (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) + (build-case-lambda + (list ((lambda-clause env x) d))))) + (define (lambda-clause env x) + (lambda (d) + (unless (and (list? d) (fx>= (length d) 2)) (syntax-error x)) (let ([fml* (car d)] [body* (cdr d)]) (verify-fml* fml* x) (let ([nfml* (gen-fml* fml*)]) (let ([env (extend-env-fml* fml* nfml* env)]) - (build-function - nfml* - (E-internal body* env x))))))) + (list nfml* (E-internal body* env x))))))) + (define E-case-lambda + (lambda (d env x) + (unless (fx>= (length d) 1) (syntax-error x)) + (build-case-lambda + (map (lambda-clause env x) d)))) (define verify-fml* (lambda (fml* x) (let ([g (gensym)]) @@ -841,13 +850,6 @@ (build-lexical-reference v) (build-constant x))))])))) ;;; - (define E-pcb-set! - (lambda (d env x) - (unless (fx= (length d) 2) (syntax-error x)) - (let ([name (car d)] [val (cadr d)]) - (unless (symbol? name) (syntax-error x)) - (build-pcb-set! (build-constant name) (E val env))))) - ;;; (define E-foreign-call (lambda (d env x) (unless (fx>= (length d) 1) (syntax-error x)) @@ -902,6 +904,7 @@ [(eq? a 'set!) (E-set! d env x)] [(eq? a 'begin) (E-begin d env x)] [(eq? a 'lambda) (E-lambda d env x)] + [(eq? a 'case-lambda) (E-case-lambda d env x)] [(eq? a 'let) (E-let d env x)] [(eq? a 'letrec) (E-letrec d env x)] [(eq? a 'let*) (E-let* d env x)] @@ -918,7 +921,6 @@ [(eq? a 'record-case) (E-record-case d env x)] [(eq? a 'foreign-call) (E-foreign-call d env x)] [(eq? a '|#primitive|) (E-primref d env x)] - [(eq? a '$pcb-set!) (E-pcb-set! d env x)] [(eq? a '$apply) (E-apply d env x)] [else (syntax-error x)])] [else @@ -1047,9 +1049,9 @@ (E* d empty-env))]))] [else (syntax-error x)]))) ;;; - ($pcb-set! core-expand E-top) + (primitive-set! 'core-expand E-top) ;;; - ($pcb-set! current-expand + (primitive-set! 'current-expand (make-parameter core-expand (lambda (x) @@ -1057,7 +1059,7 @@ (error 'current-expand "~s is not a procedure" x)) x))) ;;; - ($pcb-set! expand + (primitive-set! 'expand (lambda (x) ((current-expand) x))) ;;; @@ -1065,7 +1067,7 @@ (lambda (x) (putprop x *keyword* x)) '(lambda set! let let* letrec letrec* if quote when unless set! begin - define or and cond case $pcb-set! foreign-call $apply |#primitive| + case-lambda define or and cond case foreign-call $apply |#primitive| define-record record-case quasiquote unquote unquote-splicing let-values parameterize ))) diff --git a/src/libexpand.fasl b/src/libexpand.fasl index 57af79e..d4b1398 100644 Binary files a/src/libexpand.fasl and b/src/libexpand.fasl differ diff --git a/src/libhandlers-5.5.ss b/src/libhandlers-5.5.ss deleted file mode 100644 index 2d19620..0000000 --- a/src/libhandlers-5.5.ss +++ /dev/null @@ -1,16 +0,0 @@ - - -($pcb-set! $apply-nonprocedure-error-handler - (lambda (x) - (error 'apply "~s is not a procedure" x))) - -($pcb-set! $incorrect-args-error-handler - (lambda (p n) - (error 'apply "incorrect number of argument (~s) to ~s" n p))) - -($pcb-set! $multiple-values-error - (lambda args - (error 'apply - "incorrect number of values ~s returned to single value context" - args))) - diff --git a/src/libhandlers.fasl b/src/libhandlers.fasl index 02fb853..3411db0 100644 Binary files a/src/libhandlers.fasl and b/src/libhandlers.fasl differ diff --git a/src/libintelasm-5.8.ss b/src/libintelasm-5.8.ss deleted file mode 100644 index c6460cd..0000000 --- a/src/libintelasm-5.8.ss +++ /dev/null @@ -1,883 +0,0 @@ - -;;; -;;; assuming the existence of a code manager, this file defines an assember -;;; that takes lists of assembly code and produces a list of code objects -;;; - - ;;; add - ;;; and - ;;; cmp - ;;; call - ;;; cltd - ;;; idiv - ;;; imull - ;;; ja - ;;; jae - ;;; jb - ;;; jbe - ;;; je - ;;; jg - ;;; jge - ;;; jl - ;;; jle - ;;; jne - ;;; jmp - ;;; movb - ;;; movl - ;;; negl - ;;; notl - ;;; orl - ;;; popl - ;;; pushl - ;;; ret - ;;; sall - ;;; sarl - ;;; sete - ;;; setg - - -(let () - -(define fold - (lambda (f init ls) - (cond - [(null? ls) init] - [else - (f (car ls) (fold f init (cdr ls)))]))) - -(define convert-instructions - (lambda (ls) - (fold convert-instruction '() ls))) - -(define register-mapping - '([%eax 32 0] - [%ecx 32 1] - [%edx 32 2] - [%ebx 32 3] - [%esp 32 4] - [%ebp 32 5] - [%esi 32 6] - [%edi 32 7] - [%al 8 0] - [%cl 8 1] - [%dl 8 2] - [%bl 8 3] - [%ah 8 4] - [%ch 8 5] - [%dh 8 6] - [%bh 8 7] - [/0 0 0] - [/1 0 1] - [/2 0 2] - [/3 0 3] - [/4 0 4] - [/5 0 5] - [/6 0 6] - [/7 0 7] - )) - -(define register-index - (lambda (x) - (cond - [(assq x register-mapping) => caddr] - [else (error 'register-index "not a register ~s" x)]))) - -(define reg32? - (lambda (x) - (cond - [(assq x register-mapping) => - (lambda (x) (fx= (cadr x) 32))] - [else #f]))) - -(define reg8? - (lambda (x) - (cond - [(assq x register-mapping) => - (lambda (x) (fx= (cadr x) 8))] - [else #f]))) - -(define reg? - (lambda (x) - (assq x register-mapping))) - -(define check-len - (lambda (x) - (define instr-len - '([ret] - [movl s d] - [movb s d] - [addl s d] - [subl s d] - [sall s d] - [sarl s d] - [andl s d] - [orl s d] - [cmpl s d] - [imull s d] - [notl d] - [negl d] - [idivl d] - [pushl d] - [popl d] - [jmp d] - [call d] - [ja d] - [jae d] - [jb d] - [jbe d] - [je d] - [jg d] - [jge d] - [jl d] - [jle d] - [jna d] - [jnae d] - [jnb d] - [jnbe d] - [jne d] - [jng d] - [jnge d] - [jnl d] - [jnle d] - [seta d] - [setae d] - [setb d] - [setbe d] - [sete d] - [setg d] - [setge d] - [setl d] - [setle d] - [setna d] - [setnae d] - [setnb d] - [setnbe d] - [setne d] - [setng d] - [setnge d] - [setnl d] - [setnle d] - [cltd] - [byte x] - [byte-vector x] - [int x] - [label x] - [label-address x] - [current-frame-offset] - )) - (cond - [(assq (car x) instr-len) => - (lambda (p) - (unless (fx= (length x) (length p)) - (error 'assembler "invalid instruction format ~s" x)))] - [else (error 'assembler "unknown instruction ~s" x)]))) - -(define with-args - (lambda (ls f) - (apply f (cdr ls)))) - -(define byte - (lambda (x) - (cons 'byte (fxlogand x 255)))) - - -(define word - (lambda (x) - (cons 'word x))) - -(define reloc-word - (lambda (x) - (cons 'reloc-word x))) - -(define reloc-word+ - (lambda (x d) - (list* 'reloc-word+ x d))) - -(define list*-aux - (lambda (ls ls*) - (cond - [(null? ls*) ls] - [else (cons ls (list*-aux (car ls*) (cdr ls*)))]))) - -(define list* - (lambda (ls . ls*) - (list*-aux ls ls*))) - -(define byte? - (lambda (x) - (and (fixnum? x) - (fx<= x 127) - (fx<= -128 x)))) - -(define mem? - (lambda (x) - (and (list? x) - (fx= (length x) 3) - (eq? (car x) 'disp) - (or (imm? (cadr x)) - (reg? (cadr x))) - (or (imm? (caddr x)) - (reg? (caddr x)))))) - -(define small-disp? - (lambda (x) - (and (mem? x) - (byte? (cadr x))))) - - -(define CODE - (lambda (n ac) - (cons (byte n) ac))) - -(define CODE+r - (lambda (n r ac) - (cons (byte (fxlogor n (register-index r))) ac))) - -(define ModRM - (lambda (mod reg r/m ac) - (cons (byte (fxlogor - (register-index r/m) - (fxlogor - (fxsll (register-index reg) 3) - (fxsll mod 6)))) - (if (and (not (fx= mod 3)) (eq? r/m '%esp)) - (cons (byte #x24) ac) - ac)))) - -(define IMM32 - (lambda (n ac) - (cond - [(int? n) - (let ([n (cadr n)]) - (list* (byte n) - (byte (fxsra n 8)) - (byte (fxsra n 16)) - (byte (fxsra n 24)) - ac))] - [(obj? n) - (let ([v (cadr n)]) - (if (immediate? v) - (cons (word v) ac) - (cons (reloc-word v) ac)))] - [(obj+? n) - (let ([v (cadr n)] [d (caddr n)]) - (cons (reloc-word+ v d) ac))] - [(label-address? n) - (cons (cons 'label-addr (label-name n)) ac)] - [(foreign? n) - (cons (cons 'foreign-label (label-name n)) ac)] - [else (error 'IMM32 "invalid ~s" n)]))) - - -(define IMM8 - (lambda (n ac) - (cond - [(int? n) - (let ([n (cadr n)]) - (list* (byte n) ac))] - [else (error 'IMM8 "invalid ~s" n)]))) - - -(define imm? - (lambda (x) - (or (int? x) - (obj? x) - (obj+? x) - (label-address? x) - (foreign? x)))) - -(define foreign? - (lambda (x) - (and (pair? x) (eq? (car x) 'foreign-label)))) - - -(define imm8? - (lambda (x) - (and (int? x) (byte? (cadr x))))) - -(define label? - (lambda (x) - (cond - [(and (pair? x) (eq? (car x) 'label)) - (let ([d (cdr x)]) - (unless (and (null? (cdr d)) - (symbol? (car d))) - (error 'assemble "invalid label ~s" x))) - #t] - [else #f]))) - -(define label-address? - (lambda (x) - (cond - [(and (pair? x) (eq? (car x) 'label-address)) - (let ([d (cdr x)]) - (unless (and (null? (cdr d)) - (or (symbol? (car d)) - (string? (car d)))) - (error 'assemble "invalid label-address ~s" x))) - #t] - [else #f]))) - -(define label-name - (lambda (x) (cadr x))) - -(define int? - (lambda (x) - (and (pair? x) (eq? (car x) 'int)))) - -(define obj? - (lambda (x) - (and (pair? x) (eq? (car x) 'obj)))) - -(define obj+? - (lambda (x) - (and (pair? x) (eq? (car x) 'obj+)))) - -(define CODErri - (lambda (c d s i ac) - (cond - [(imm8? i) - (CODE c (ModRM 1 d s (IMM8 i ac)))] - [(reg? i) - (CODE c (ModRM i d s ac))] - [else - (CODE c (ModRM 2 d s (IMM32 i ac)))]))) - -(define CODErr - (lambda (c d s ac) - (CODE c (ModRM 3 d s ac)))) - -(define CODEri - (lambda (c d i ac) - (CODE+r c d (IMM32 i ac)))) - - -(define RegReg - (lambda (r1 r2 r3 ac) - (cond - [(eq? r3 '%esp) (error 'assembler "BUG: invalid src %esp")] - [(eq? r1 '%ebp) (error 'assembler "BUG: invalid src %ebp")] - [else - (list* - (byte (fxlogor 4 (fxsll (register-index r1) 3))) - (byte (fxlogor (register-index r2) - (fxsll (register-index r3) 4))) - ac)]))) - - -#;(define CODErd - (lambda (c r1 disp ac) - (with-args disp - (lambda (i/r r2) - (if (reg? i/r) - (CODE c (RegReg r1 i/r r2 ac)) - (CODErri c r1 r2 i/r ac)))))) - - -(define IMM32*2 - (lambda (i1 i2 ac) - (cond - [(and (int? i1) (obj? i2)) - (let ([d (cadr i1)] [v (cadr i2)]) - (cons (reloc-word+ v d) ac))] - [else (error 'assemble "IMM32*2 ~s ~s" i1 i2)]))) - - -(define CODErd - (lambda (c r1 disp ac) - (with-args disp - (lambda (a1 a2) - (cond - [(and (reg? a1) (reg? a2)) - (CODE c (RegReg r1 a1 a2 ac))] - [(and (imm? a1) (reg? a2)) - (CODErri c r1 a2 a1 ac)] - [(and (imm? a1) (imm? a2)) - (CODE c - (ModRM 0 r1 '/5 - (IMM32*2 a1 a2 ac)))] - [else (error 'CODErd "unhandled ~s" disp)]))))) - -(define CODEdi - (lambda (c disp n ac) - (with-args disp - (lambda (i r) - (CODErri c '/0 r i (IMM32 n ac)))))) - -(define convert-instruction - (lambda (a ac) - (define who 'assemble) - (check-len a) - (case (car a) - [(ret) (CODE #xC3 ac)] - [(cltd) (CODE #x99 ac)] - [(movl) - (with-args a - (lambda (src dst) - (cond - [(and (imm? src) (reg? dst)) (CODEri #xB8 dst src ac)] - [(and (imm? src) (mem? dst)) (CODEdi #xC7 dst src ac)] - [(and (reg? src) (reg? dst)) (CODErr #x89 src dst ac)] - [(and (reg? src) (mem? dst)) (CODErd #x89 src dst ac)] - [(and (mem? src) (reg? dst)) (CODErd #x8B dst src ac)] - [else (error who "invalid ~s" a)])))] - [(movb) - (with-args a - (lambda (src dst) - (cond - [(and (imm8? src) (reg8? dst)) (CODEri #xB0 dst src ac)] - [(and (imm8? src) (mem? dst)) (CODEdi #xC6 dst src ac)] - [(and (reg8? src) (reg8? dst)) (CODErr #x88 src dst ac)] - [(and (reg8? src) (mem? dst)) (CODErd #x88 src dst ac)] - [(and (mem? src) (reg8? dst)) (CODErd #x8A dst src ac)] - [else (error who "invalid ~s" a)])))] - [(addl) - (with-args a - (lambda (src dst) - (cond - ;;; add imm -> reg - [(and (imm8? src) (reg? dst)) - (CODE #x83 (ModRM 3 '/0 dst (IMM8 src ac)))] - [(and (imm? src) (eq? dst '%eax)) - (CODE #x05 (IMM32 src ac))] - [(and (imm? src) (reg? dst)) - (CODE #x81 (ModRM 3 '/0 dst (IMM32 src ac)))] - ;;; add reg -> reg - [(and (reg? src) (reg? dst)) - (CODE #x01 (ModRM 3 src dst ac))] - ;;; add mem -> reg - [(and (mem? src) (reg? dst)) - (CODErd #x03 dst src ac)] - ;;; add imm -> mem (not needed) - ;;; add reg -> mem (not needed) - [else (error who "invalid ~s" a)])))] - [(subl) - (with-args a - (lambda (src dst) - (cond - ;;; imm -> reg - [(and (imm8? src) (reg? dst)) - (CODE #x83 (ModRM 3 '/5 dst (IMM8 src ac)))] - [(and (imm? src) (eq? dst '%eax)) - (CODE #x2D (IMM32 src ac))] - [(and (imm? src) (reg? dst)) - (CODE #x81 (ModRM 3 '/5 dst (IMM32 src ac)))] - ;;; reg -> reg - [(and (reg? src) (reg? dst)) - (CODE #x29 (ModRM 3 src dst ac))] - ;;; mem -> reg - [(and (mem? src) (reg? dst)) - (CODErd #x2B dst src ac)] - ;;; imm -> mem (not needed) - ;;; reg -> mem (not needed) - [else (error who "invalid ~s" a)])))] - [(sall) - (with-args a - (lambda (src dst) - (cond - [(and (equal? '(int 1) src) (reg? dst)) - (CODE #xD1 (ModRM 3 '/4 dst ac))] - [(and (imm8? src) (reg? dst)) - (CODE #xC1 (ModRM 3 '/4 dst (IMM8 src ac)))] - [(and (eq? src '%cl) (reg? dst)) - (CODE #xD3 (ModRM 3 '/4 dst ac))] - [else (error who "invalid ~s" a)])))] - [(sarl) - (with-args a - (lambda (src dst) - (cond - [(and (equal? '(int 1) src) (reg? dst)) - (CODE #xD1 (ModRM 3 '/7 dst ac))] - [(and (imm8? src) (reg? dst)) - (CODE #xC1 (ModRM 3 '/7 dst (IMM8 src ac)))] - [(and (eq? src '%cl) (reg? dst)) - (CODE #xD3 (ModRM 3 '/7 dst ac))] - [else (error who "invalid ~s" a)])))] - [(andl) ; similar to add - (with-args a - (lambda (src dst) - (cond - ;;; and imm -> reg - [(and (imm8? src) (reg? dst)) - (CODE #x83 (ModRM 3 '/4 dst (IMM8 src ac)))] - [(and (imm? src) (eq? dst '%eax)) - (CODE #x25 (IMM32 src ac))] - [(and (imm? src) (reg? dst)) - (CODE #x81 (ModRM 3 '/4 dst (IMM32 src ac)))] - ;;; and reg -> reg - [(and (reg? src) (reg? dst)) - (CODE #x21 (ModRM 3 src dst ac))] - ;;; and mem -> reg - [(and (mem? src) (reg? dst)) - (CODErd #x23 dst src ac)] - [else (error who "invalid ~s" a)])))] - [(orl) ; similar to add - (with-args a - (lambda (src dst) - (cond - ;;; or imm -> reg - [(and (imm8? src) (reg? dst)) - (CODE #x83 (ModRM 3 '/1 dst (IMM8 src ac)))] - [(and (imm? src) (eq? dst '%eax)) - (CODE #x0D (IMM32 src ac))] - [(and (imm? src) (reg? dst)) - (CODE #x81 (ModRM 3 '/1 dst (IMM32 src ac)))] - ;;; or reg -> reg - [(and (reg? src) (reg? dst)) - (CODE #x09 (ModRM 3 src dst ac))] - ;;; or mem -> reg - [(and (mem? src) (reg? dst)) - (CODErd #x0B dst src ac)] - [else (error who "invalid ~s" a)])))] - [(cmpl) - (with-args a - (lambda (src dst) - (cond - [(and (imm8? src) (reg? dst)) - (CODE #x83 (ModRM 3 '/7 dst (IMM8 src ac)))] - [(and (imm? src) (eq? dst '%eax)) - (CODE #x3D (IMM32 src ac))] - [(and (reg? src) (reg? dst)) - (CODE #x39 (ModRM 3 src dst ac))] - [(and (mem? src) (reg? dst)) - (CODErd #x3B dst src ac)] - [(and (imm8? src) (mem? dst)) - (CODErd #x83 '/7 dst (IMM8 src ac))] - [(and (imm? src) (mem? dst)) - (CODErd #x81 '/7 dst (IMM32 src ac))] - [else (error who "invalid ~s" a)])))] - [(imull) - (with-args a - (lambda (src dst) - (cond - [(and (imm8? src) (reg? dst)) - (CODE #x6B (ModRM 3 dst dst (IMM8 src ac)))] - [(and (imm? src) (reg? dst)) - (CODE #x69 (ModRM 3 dst dst (IMM32 src ac)))] - [(and (reg? src) (reg? dst)) - (CODE #x0F (CODE #xAF (ModRM 3 dst src ac)))] - [(and (mem? src) (reg? dst)) - (CODE #x0F (CODErd #xAF dst src ac))] - [else (error who "invalid ~s" a)])))] - [(idivl) - (with-args a - (lambda (dst) - (cond - [(reg? dst) - (CODErr #xF7 '/7 dst ac)] - [(mem? dst) - (CODErd #xF7 '/7 dst ac)] - [else (error who "invalid ~s" a)])))] - [(pushl) - (with-args a - (lambda (dst) - (cond - [(imm8? dst) - (CODE #x6A (IMM8 dst ac))] - [(imm? dst) - (CODE #x68 (IMM32 dst ac))] - [(reg? dst) - (CODE+r #x50 dst ac)] - [(mem? dst) - (CODErd #xFF '/6 dst ac)] - [else (error who "invalid ~s" a)])))] - [(popl) - (with-args a - (lambda (dst) - (cond - [(reg? dst) - (CODE+r #x58 dst ac)] - [(mem? dst) - (CODErd #x8F '/0 dst ac)] - [else (error who "invalid ~s" a)])))] - [(notl) - (with-args a - (lambda (dst) - (cond - [(reg? dst) - (CODE #xF7 (ModRM 3 '/2 dst ac))] - [(mem? dst) - (CODErd #xF7 '/7 dst ac)] - [else (error who "invalid ~s" a)])))] - [(negl) - (with-args a - (lambda (dst) - (cond - [(reg? dst) - (CODE #xF7 (ModRM 3 '/3 dst ac))] - [else (error who "invalid ~s" a)])))] - [(jmp) - (with-args a - (lambda (dst) - (cond - [(label? dst) - (CODE #xE9 (cons (cons 'relative (label-name dst)) ac))] - [(imm? dst) - (CODE #xE9 (IMM32 dst ac))] - [(mem? dst) - (CODErd #xFF '/4 dst ac)] - [else (error who "invalid jmp in ~s" a)])))] - [(call) - (with-args a - (lambda (dst) - (cond - [(imm? dst) - (CODE #xE8 (IMM32 dst ac))] - [(label? dst) - (CODE #xE8 (cons (cons 'relative (label-name dst)) ac))] - [(mem? dst) - (CODErd #xFF '/2 dst ac)] - [(reg? dst) - (CODE #xFF (ModRM 3 '/2 dst ac))] - [else (error who "invalid jmp in ~s" a)])))] - [(seta setae setb setbe sete setg setge setl setle - setna setnae setnb setnbe setne setng setnge setnl setnle) - (let* ([table - '([seta #x97] [setna #x96] - [setae #x93] [setnae #x92] - [setb #x92] [setnb #x93] - [setbe #x96] [setnbe #x97] - [setg #x9F] [setng #x9E] - [setge #x9D] [setnge #x9C] - [setl #x9C] [setnl #x9D] - [setle #x9E] [setnle #x9F] - [sete #x94] [setne #x95])] - [lookup - (lambda (x) - (cond - [(assq x table) => cadr] - [else (error who "invalid cset ~s" x)]))]) - (with-args a - (lambda (dst) - (cond - [(reg8? dst) - (CODE #x0F - (CODE (lookup (car a)) - (ModRM 3 '/0 dst ac)))] - [else (error who "invalid ~s" a)]))))] - [(ja jae jb jbe je jg jge jl jle - jna jnae jnb jnbe jne jng jnge jnl jnle) - (let* ([table - '([je #x84] [jne #x85] - [ja #x87] [jna #x86] - [jae #x83] [jnae #x82] - [jb #x82] [jnb #x83] - [jbe #x86] [jnbe #x87] - [jg #x8F] [jng #x8E] - [jge #x8D] [jnge #x8C] - [jl #x8C] [jnl #x8D] - [jle #x8E] [jnle #x8F])] - [lookup - (lambda (x) - (cond - [(assq x table) => cadr] - [else (error who "invalid cmp ~s" x)]))]) - (with-args a - (lambda (dst) - (cond - [(imm? dst) - (CODE #x0F (CODE (lookup (car a)) (IMM32 dst ac)))] - [(label? dst) - (CODE #x0F - (CODE (lookup (car a)) - (cons (cons 'relative (label-name dst)) ac)))] - [else (error who "invalid ~s" a)]))))] - [(byte) - (with-args a - (lambda (x) - (unless (byte? x) (error who "invalid instruction ~s" a)) - (cons (byte x) ac)))] - [(byte-vector) - (with-args a - (lambda (x) (append (map byte (vector->list x)) ac)))] - [(int) (IMM32 a ac)] - [(label) - (with-args a - (lambda (L) - (unless (symbol? L) (error who "invalid instruction ~s" a)) - (cons (cons 'label L) ac)))] - [(label-address) - (with-args a - (lambda (L) - (unless (symbol? L) (error who "invalid instruction ~s" a)) - (cons (cons 'label-addr L) ac)))] - [(current-frame-offset) - (cons '(current-frame-offset) ac)] - [else - (error who "unknown instruction ~s" a)]))) - -(define diff - (lambda (ls x) - (cond - [(eq? ls x) '()] - [else (cons (car ls) (diff (cdr ls) x))]))) - -(define hex-table - '#(#\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 - #\8 #\9 #\A #\B #\C #\D #\E #\F)) - -(define write/x - (lambda (x) - (case (car x) - [(byte) - (display "0x") - (display (vector-ref hex-table (fxsra (cdr x) 4))) - (display (vector-ref hex-table (fxlogand (cdr x) 15))) - (display " ")] - [else (write x)]))) - -(define convert-instruction** - (let ([convert-instruction convert-instruction]) - (lambda (x ac) - (display "Convert ") - (write x) - (newline) - (let ([nc (convert-instruction x ac)]) - (for-each write/x (diff nc ac)) - (newline) - nc)))) - - -(define compute-code-size - (lambda (ls) - (fold (lambda (x ac) - (case (car x) - [(byte) (fx+ ac 1)] - [(word reloc-word reloc-word+ label-addr foreign-label - relative current-frame-offset) - (fx+ ac 4)] - [(label) ac] - [else (error 'compute-code-size "unknown instr ~s" x)])) - 0 - ls))) - - -(define compute-reloc-size - (lambda (ls) - (fold (lambda (x ac) - (case (car x) - [(reloc-word foreign-label) (fx+ ac 4)] - [(reloc-word+) (fx+ ac 8)] - [(relative label-addr) (fx+ ac 8)] - [(word byte label current-frame-offset) ac] - [else (error 'compute-reloc-size "unknown instr ~s" x)])) - 0 - ls))) - -(define set-label-loc! - (lambda (x loc) - (when (getprop x '*label-loc*) - (error 'compile "label ~s is already defined" x)) - (putprop x '*label-loc* loc))) - -(define label-loc - (lambda (x) - (or (getprop x '*label-loc*) - (error 'compile "undefined label ~s" x)))) - - -(define unset-label-loc! - (lambda (x) - (remprop x '*label-loc*))) - - -(define whack-instructions - (lambda (x ls) - (define f - (lambda (ls idx reloc) - (cond - [(null? ls) reloc] - [else - (let ([a (car ls)]) - (case (car a) - [(byte) - (set-code-byte! x idx (cdr a)) - (f (cdr ls) (fx+ idx 1) reloc)] - [(reloc-word reloc-word+) - (f (cdr ls) (fx+ idx 4) (cons (cons idx a) reloc))] - [(relative label-addr foreign-label) - (f (cdr ls) (fx+ idx 4) (cons (cons idx a) reloc))] - [(word) - (let ([v (cdr a)]) - (set-code-word! x idx v) - (f (cdr ls) (fx+ idx 4) reloc))] - [(current-frame-offset) - (set-code-word! x idx idx) - (f (cdr ls) (fx+ idx 4) reloc)] - [(label) - (set-label-loc! (cdr a) (cons x idx)) - (f (cdr ls) idx reloc)] - [else - (error 'whack-instructions "unknown instr ~s" a)]))]))) - (f ls 0 '()))) - -(define wordsize 4) - -(define whack-reloc - (lambda (code) - (define reloc-idx 0) - (lambda (r) - (let ([idx (car r)] [type (cadr r)] [v (cddr r)]) - (case type - [(reloc-word) - (set-code-object! code v idx reloc-idx) - (set! reloc-idx (fxadd1 reloc-idx))] - [(foreign-label) - (set-code-foreign-object! code v idx reloc-idx) - (set! reloc-idx (fxadd1 reloc-idx))] - [(reloc-word+) - (let ([obj (car v)] [disp (cdr v)]) - (set-code-object+offset! code obj idx disp reloc-idx) - (set! reloc-idx (fx+ reloc-idx 2)))] - [(label-addr) - (let ([loc (label-loc v)]) - (let ([obj (car loc)] [off (cdr loc)]) - (set-code-object+offset! - code obj idx (fx+ off 11) reloc-idx))) - (set! reloc-idx (fx+ reloc-idx 2))] - [(relative) - (let ([loc (label-loc v)]) - (let ([obj (car loc)] [off (cdr loc)]) - (set-code-object+offset/rel! - code obj idx (fx+ off 11) reloc-idx))) - (set! reloc-idx (fx+ reloc-idx 2))] - [else (error 'whack-reloc "invalid reloc type ~s" type)])) - ))) - - -;;; (define list->code -;;; (lambda (ls) -;;; (let ([ls (convert-instructions ls)]) -;;; (let ([n (compute-code-size ls)] -;;; [m (compute-reloc-size ls)]) -;;; (let ([x (make-code n m 1)]) -;;; (let ([reloc* (whack-instructions x ls)]) -;;; (for-each (whack-reloc x) reloc*)) -;;; (make-code-executable! x) -;;; x))))) - -(define list*->code* - (lambda (ls*) - (let ([closure-size* (map car ls*)] - [ls* (map cdr ls*)]) - (let ([ls* (map convert-instructions ls*)]) - (let ([n* (map compute-code-size ls*)] - [m* (map compute-reloc-size ls*)]) - (let ([code* (map (lambda (n m c) (make-code n m c)) - n* - m* - closure-size*)]) - (let ([reloc** (map whack-instructions code* ls*)]) - (for-each - (lambda (code reloc*) - (for-each (whack-reloc code) reloc*)) - code* reloc**) - (for-each make-code-executable! code*) - code*))))))) - -(define list->code - (lambda (ls) - (car (list*->code* (list ls))))) - -($pcb-set! list*->code* list*->code*) -) diff --git a/src/libintelasm-6.0.ss b/src/libintelasm-6.0.ss index 83f9e0d..5f984c6 100644 --- a/src/libintelasm-6.0.ss +++ b/src/libintelasm-6.0.ss @@ -762,17 +762,6 @@ (display " ")] [else (write x)]))) -(define convert-instruction** - (let ([convert-instruction convert-instruction]) - (lambda (x ac) - (display "Convert ") - (write x) - (newline) - (let ([nc (convert-instruction x ac)]) - (for-each write/x (diff nc ac)) - (newline) - nc)))) - (define compute-code-size (lambda (ls) diff --git a/src/libintelasm.fasl b/src/libintelasm.fasl deleted file mode 100644 index b9227d9..0000000 Binary files a/src/libintelasm.fasl and /dev/null differ diff --git a/src/libinterpret-5.8.ss b/src/libinterpret-6.1.ss similarity index 64% rename from src/libinterpret-5.8.ss rename to src/libinterpret-6.1.ss index 5a4820d..f4172f2 100644 --- a/src/libinterpret-5.8.ss +++ b/src/libinterpret-6.1.ss @@ -1,4 +1,9 @@ +;;; Changes: +;;; 6.1: adding case-lambda, dropping lambda +;;; 6.0: basic version working +;;; + ;;; Expand : Scheme -> Core Scheme ;;; ;;; ::= (quote datum) @@ -6,7 +11,7 @@ ;;; | (if ) ;;; | (set! ) ;;; | (begin ...) -;;; | (lambda ...) +;;; | (case-lambda ( ) ( ) ...) ;;; | ( ...) ;;; | (primref ) ;;; | ( ...) @@ -64,9 +69,9 @@ [(null? ls) (if (fx= i j) v - (error 'apply "incorrect number of arguments to procedure"))] + (error 'apply1 "incorrect number of arguments to procedure"))] [(fx= i j) - (error 'apply "incorrect number of arguments to procedure")] + (error 'apply2 "incorrect number of arguments to procedure")] [else (vector-set! v i (car ls)) (whack-proper v (cdr ls) (fxadd1 i) j)]))) @@ -76,7 +81,7 @@ (cond [(fx= i j) (vector-set! v i ls) v] [(null? ls) - (error 'apply "incorrect number of arguments to procedure")] + (error 'apply3 "incorrect number of arguments to procedure")] [else (vector-set! v i (car ls)) (whack-improper v (cdr ls) (fxadd1 i) j)]))) @@ -143,7 +148,49 @@ [(eq? a 'begin) (unless (fx>= (length d) 1) (syntax-error x)) (C*->last (car d) (cdr d) env)] + [(eq? a 'case-lambda) + (unless (fx>= (length d) 1) (syntax-error x)) + (let () + (define generate + (lambda (d) + (cond + [(null? d) + (lambda (n args renv) + (error 'apply + "incorrect number of arguments ~s to procedure" + n))] + [else + (let ([k (generate (cdr d))] + [a (car d)]) + (let ([fml (car a)] [body* (cdr a)]) + (let ([env (extend-env fml env)] + [n (fml-length fml x)]) + (let ([body* + (C*->last (car body*) (cdr body*) env)]) + (if (list? fml) + (lambda (m args renv) + (if (fx= n m) + (body* (cons (list->vector args) renv)) + (k m args renv))) + (let ([q (fxsub1 n)]) + (lambda (m args renv) + (if (fx>= m q) + (let ([v (make-vector n)]) + (let f ([i 0] [args args]) + (cond + [(fx= i q) + (vector-set! v q args)] + [else + (vector-set! v i (car args)) + (f (fxadd1 i) (cdr args))])) + (body* (cons v renv))) + (k m args renv)))))))))]))) + (let ([dispatch (generate d)]) + (lambda (renv) + (lambda args + (dispatch (length args) args renv)))))] [(eq? a 'lambda) + (syntax-error x) (unless (fx>= (length d) 2) (syntax-error x)) (let ([fml* (car d)] [body* (cdr d)]) (let ([env (extend-env fml* env)] @@ -186,7 +233,7 @@ (if (top-level-bound? sym) (top-level-value sym) (error #f "~s is unbound" sym))))))] - [(memq a '(set-top-level-value! $pcb-set!)) + [(memq a '(set-top-level-value!)) (unless (fx= (length d) 2) (syntax-error x)) (let ([qsym (car d)] [val (C (cadr d) env)]) (unless (and (pair? qsym) @@ -206,40 +253,64 @@ [(eq? a '|#primitive|) (unless (fx= (length d) 1) (syntax-error x)) (let ([sym (car d)]) - (let ([prim (primitive sym)]) + (let ([prim (primitive-ref sym)]) (if (procedure? prim) (lambda (renv) prim) (syntax-error x))))] [(memq a '(foreign-call $apply)) (error 'interpret "~a form is not supported" a)] + ;;; [else + ;;; (let ([rator (C a env)] [n (length d)]) + ;;; (cond + ;;; [(fx= n 0) + ;;; (lambda (renv) + ;;; (let ([p (rator renv)]) + ;;; (p)))] + ;;; [(fx= n 1) + ;;; (let ([arg1 (C (car d) env)]) + ;;; (lambda (renv) + ;;; (let ([p (rator renv)]) + ;;; (p (arg1 renv)))))] + ;;; [(fx= n 2) + ;;; (let ([arg1 (C (car d) env)] + ;;; [arg2 (C (cadr d) env)]) + ;;; (lambda (renv) + ;;; (let ([p (rator renv)]) + ;;; (p (arg1 renv) (arg2 renv)))))] + ;;; [else + ;;; (let ([arg* (C*->list (car d) (cdr d) env)]) + ;;; (lambda (renv) + ;;; (apply (rator renv) (arg* renv))))]))] [else (let ([rator (C a env)] [n (length d)]) (cond [(fx= n 0) (lambda (renv) - ((rator renv)))] - [(fx= n 1) - (let ([arg1 (C (car d) env)]) - (lambda (renv) - ((rator renv) (arg1 renv))))] - [(fx= n 2) - (let ([arg1 (C (car d) env)] - [arg2 (C (cadr d) env)]) - (lambda (renv) - ((rator renv) (arg1 renv) (arg2 renv))))] + (apply (rator renv) '()))] + ;[(fx= n 1) + ; (let ([arg1 (C (car d) env)]) + ; (lambda (renv) + ; ((rator renv) (arg1 renv))))] + ;[(fx= n 2) + ; (let ([arg1 (C (car d) env)] + ; [arg2 (C (cadr d) env)]) + ; (lambda (renv) + ; ((rator renv) (arg1 renv) (arg2 renv))))] [else (let ([arg* (C*->list (car d) (cdr d) env)]) (lambda (renv) - (apply (rator renv) (arg* renv))))]))]))] + (apply (rator renv) (arg* renv))))]))] + + ))] [else (syntax-error x)]))) ;;; - ($pcb-set! interpret + (primitive-set! 'interpret (lambda (x) (let ([x (expand x)]) (let ([p (C x '())]) (p '()))))) ;;; - ($pcb-set! current-eval + (primitive-set! 'current-eval (make-parameter interpret (lambda (f) @@ -247,7 +318,7 @@ (error 'current-eval "~s is not a procedure" f)) f))) ;;; - ($pcb-set! eval + (primitive-set! 'eval (lambda (x) ((current-eval) x)))) diff --git a/src/libinterpret.fasl b/src/libinterpret.fasl index f42f19a..5b620f2 100644 Binary files a/src/libinterpret.fasl and b/src/libinterpret.fasl differ diff --git a/src/libio-5.8.ss b/src/libio-6.1.ss similarity index 56% rename from src/libio-5.8.ss rename to src/libio-6.1.ss index 9991b80..b66ce45 100644 --- a/src/libio-5.8.ss +++ b/src/libio-6.1.ss @@ -58,7 +58,7 @@ (define open-output-string (lambda () (vector output-port-id - "*string-port*" + '*string-port* '() #t (make-string 4096) @@ -92,56 +92,39 @@ (let ([idx (string-length buf)]) (let ([str (f (cdr ls) (fx+ n idx))]) (fill str buf n 0 idx))))]))))) - (define open-output-file - (lambda (filename . rest) - (unless (string? filename) - (error 'open-output-file "invalid filename ~s" filename)) - (let ([mode - (let ([fst - (cond - [(null? rest) 'error] - [(null? (cdr rest)) (car rest)] - [else - (error 'open-output-file "too many arguments")])] - [mode-map - '([error . 0] [append . 1] [replace . 2] [truncate . 3])]) - (cond - [(assq fst mode-map) => cdr] - [else (error 'open-output-file "invalid mode ~s" fst)]))]) - (let ([fh (foreign-call "S_open_file" filename mode)]) - (fd->port fh filename))))) - (define write-char - (lambda (c . port) - (let ([port + (lambda (name mode) + (unless (string? name) + (error 'open-output-file "~s is not a valid file name" name)) + (let ([mode (cond - [(null? port) (current-output-port)] - [(null? (cdr port)) - (let ([p (car port)]) - (if (output-port? p) - p - (error 'write-char "not a port: ~s" p)))] + [(assq mode '([error 0] [append 1] [replace 2] [truncate 3])) + => cadr] [else - (error 'write-char "too many arguments")])]) - (unless (char? c) - (error 'write-char "not a char: ~s" c)) - (unless (output-port-open? port) - (error 'write-char "port ~s closed" port)) - (let ([idx (output-port-index port)] [size (output-port-size port)]) - (if (fx< idx size) - (begin - (string-set! (output-port-buffer port) idx c) - (set-output-port-index! port (fxadd1 idx)) - (when (char= c #\newline) - (flush-output-port port))) - (begin - (flush-output-port port) - (write-char c port))))))) + (error 'open-output-file "~s is not a valid mode" mode)])]) + (let ([fh (foreign-call "ik_open_file" name mode)]) + (fd->port fh name))))) + (define write-char + (lambda (c port) + (unless (char? c) + (error 'write-char "not a char: ~s" c)) + (unless (output-port-open? port) + (error 'write-char "port ~s closed" port)) + (let ([idx (output-port-index port)] [size (output-port-size port)]) + (if (fx< idx size) + (begin + (string-set! (output-port-buffer port) idx c) + (set-output-port-index! port (fxadd1 idx)) + (when ($char= c #\newline) + (flush-output-port port))) + (begin + (flush-output-port port) + (write-char c port)))))) (define fd-flush-proc (lambda (port) (let ([idx (output-port-index port)]) (when (fx> idx 0) - (foreign-call "S_write" + (foreign-call "ik_write" (output-port-fd port) idx (output-port-buffer port)))) @@ -161,72 +144,79 @@ (lambda (port) (let ([idx (output-port-index port)]) (when (fx> idx 0) - (foreign-call "S_write" + (foreign-call "ik_write" (output-port-fd port) idx (output-port-buffer port)))) - (foreign-call "S_close" (output-port-fd port)))) + (foreign-call "ik_close" (output-port-fd port)))) (define flush-output-port - (lambda port - (let ([port - (cond - [(null? port) (current-output-port)] - [(null? (cdr port)) - (let ([p (car port)]) - (if (output-port? p) - p - (error 'flush-output-port "not a port: ~s" p)))] - [else - (error 'flush-output-port "too many arguments")])]) - (unless (output-port-open? port) - (error 'flush-output-port "port ~s closed" port)) - ((output-port-flush-proc port) port)))) + (lambda (port) + (unless (output-port-open? port) + (error 'flush-output-port "port ~s closed" port)) + ((output-port-flush-proc port) port))) (define close-output-port (lambda (port) - (unless (output-port? port) - (error 'close-output-port "not a port ~s" port)) (when (output-port-open? port) ((output-port-close-proc port) port) (set-output-port-open?! port #f)))) ;;; init section - ($pcb-set! close-output-port close-output-port) - ($pcb-set! output-port? output-port?) - ($pcb-set! open-output-file open-output-file) - ($pcb-set! write-char write-char) - ($pcb-set! flush-output-port flush-output-port) - ($pcb-set! standard-output-port + (primitive-set! 'close-output-port + (case-lambda + [() (close-output-port (current-output-port))] + [(p) + (unless (output-port? p) + (error 'close-output-port "~s is not an output port" p)) + (close-output-port p)])) + (primitive-set! 'output-port? output-port?) + (primitive-set! 'open-output-file + (case-lambda + [(filename) (open-output-file filename 'error)] + [(filename mode) (open-output-file filename mode)])) + (primitive-set! 'write-char + (case-lambda + [(c) (write-char c (current-output-port))] + [(c p) + (unless (output-port? p) + (error 'write-char "~s is not an output port" p)) + (write-char c p)])) + (primitive-set! 'flush-output-port + (case-lambda + [() (flush-output-port (current-output-port))] + [(p) + (unless (output-port? p) + (error 'flush-output-port "~s is not an output port" p)) + (flush-output-port p)])) + (primitive-set! 'standard-output-port (let ([p (fd->port 1 '*stdout*)]) (lambda () p))) - ($pcb-set! standard-error-port + (primitive-set! 'standard-error-port (let ([p (fd->port 2 '*stderr*)]) (lambda () p))) - ($pcb-set! current-output-port + (primitive-set! 'current-output-port (make-parameter (standard-output-port) (lambda (p) (unless (output-port? p) (error 'current-output-port "not a port ~s" p)) p))) - ($pcb-set! console-output-port + (primitive-set! 'console-output-port (make-parameter (standard-output-port) (lambda (p) (unless (output-port? p) (error 'console-output-port "not a port ~s" p)) p))) - ($pcb-set! newline - (lambda args - (if (null? args) - (write-char #\newline (current-output-port)) - (if (null? (cdr args)) - (let ([p (car args)]) - (if (output-port? p) - (write-char #\newline p) - (error 'newline "not an output port ~s" p))) - (error 'newline "too many arguments"))))) - ($pcb-set! open-output-string open-output-string) - ($pcb-set! get-output-string get-output-string) - ($pcb-set! output-port-name + (primitive-set! 'newline + (case-lambda + [() (write-char #\newline (current-output-port))] + [(p) + (unless (output-port? p) + (error 'newline "~s is not an output port" p)) + (write-char #\newline p)])) + + (primitive-set! 'open-output-string open-output-string) + (primitive-set! 'get-output-string get-output-string) + (primitive-set! 'output-port-name (lambda (x) (if (output-port? x) (output-port-name x) @@ -296,7 +286,7 @@ (lambda (filename) (unless (string? filename) (error 'open-input-file "not a string: ~s" filename)) - (let ([fd (foreign-call "S_open_file" filename 4)]) + (let ([fd (foreign-call "ik_open_file" filename 4)]) (fd->port fd filename)))) (define close-input-port (lambda port @@ -309,80 +299,62 @@ p (error 'close-input-port "not an input port: ~s" p))) (error 'close-input-port "too many arguments")))]) - (foreign-call "S_close" (input-port-fd port)) + (foreign-call "ik_close" (input-port-fd port)) (void)))) (define read-char - (lambda port - (let ([port - (if (null? port) - (current-input-port) - (if (null? ($cdr port)) - (let ([p ($car port)]) - (if (input-port? p) - p - (error 'read-char "not an input port: ~s" p))) - (error 'read-char "too many arguments")))]) - (unless (input-port-open? port) - (error 'read-char "port closed")) - (cond - [(input-port-returned-char port) => - (lambda (c) - (set-input-port-returned-char! port #f) - c)] - [else - (let ([idx (input-port-index port)] - [size (input-port-size port)] - [buf (input-port-buffer port)]) - (if ($fx< idx size) - (let ([c ($string-ref buf idx)]) - (set-input-port-index! port ($fxadd1 idx)) - c) - (let ([bytes - (foreign-call "S_read" - (input-port-fd port) - buf - ($string-length buf))]) - (set-input-port-size! port bytes) - (if ($fxzero? bytes) - (begin - (set-input-port-index! port 0) - (eof-object)) - (begin - (let ([c ($string-ref buf 0)]) - (set-input-port-index! port 1) - c))))))])))) + (lambda (port) + (unless (input-port-open? port) + (error 'read-char "port closed")) + (cond + [(input-port-returned-char port) => + (lambda (c) + (set-input-port-returned-char! port #f) + c)] + [else + (let ([idx (input-port-index port)] + [size (input-port-size port)] + [buf (input-port-buffer port)]) + (if ($fx< idx size) + (let ([c ($string-ref buf idx)]) + (set-input-port-index! port ($fxadd1 idx)) + c) + (let ([bytes + (foreign-call "ik_read" + (input-port-fd port) + buf + ($string-length buf))]) + (set-input-port-size! port bytes) + (if ($fxzero? bytes) + (begin + (set-input-port-index! port 0) + (eof-object)) + (begin + (let ([c ($string-ref buf 0)]) + (set-input-port-index! port 1) + c))))))]))) (define peek-char - (lambda port - (let ([port - (if (null? port) - (current-input-port) - (if (null? (cdr port)) - (let ([p (car port)]) - (if (input-port? p) - p - (error 'peek-char "not an input port: ~s" p))) - (error 'peek-char "too many arguments")))]) - (unless (input-port-open? port) - (error 'peek-char "port closed")) - (cond - [(input-port-returned-char port) => - (lambda (c) c)] - [else - (let ([idx (input-port-index port)] - [size (input-port-size port)] - [buf (input-port-buffer port)]) - (if (fx< idx size) - (string-ref buf idx) - (let ([bytes - (foreign-call "S_read" - (input-port-fd port) - buf - ($string-length buf))]) - (set-input-port-size! port bytes) - (set-input-port-index! port 0) - (if (fxzero? bytes) - (eof-object) - (string-ref buf 0)))))])))) + (lambda (port) + (unless (input-port-open? port) + (error 'peek-char "port closed")) + (cond + [(input-port-returned-char port) => + (lambda (c) c)] + [else + (let ([idx (input-port-index port)] + [size (input-port-size port)] + [buf (input-port-buffer port)]) + (if (fx< idx size) + (string-ref buf idx) + (let ([bytes + (foreign-call "ik_read" + (input-port-fd port) + buf + ($string-length buf))]) + (set-input-port-size! port bytes) + (set-input-port-index! port 0) + (if (fxzero? bytes) + (eof-object) + (string-ref buf 0)))))]))) (define reset-input-port! (lambda (p) (unless (input-port? p) @@ -391,52 +363,67 @@ (set-input-port-size! p 0) (set-input-port-returned-char! p #f))) (define unread-char - (lambda (c . port) - (let ([port - (if (null? port) - (current-input-port) - (if (null? (cdr port)) - (let ([p (car port)]) - (if (input-port? p) - p - (error 'unread-char "not an input port: ~s" p))) - (error 'unread-char "too many arguments")))]) - (unless (char? c) - (error 'unread-char "not a character ~s" c)) - (unless (input-port-open? port) - (error 'unread-char "port closed")) - (when (input-port-returned-char port) - (error 'unread-char "cannot unread twice")) - (set-input-port-returned-char! port c)))) - ($pcb-set! open-input-file open-input-file) - ($pcb-set! close-input-port close-input-port) - ($pcb-set! input-port? input-port?) - ($pcb-set! read-char read-char) - ($pcb-set! unread-char unread-char) - ($pcb-set! peek-char peek-char) - ($pcb-set! standard-input-port + (lambda (c port) + (unless (char? c) + (error 'unread-char "not a character ~s" c)) + (unless (input-port-open? port) + (error 'unread-char "port closed")) + (when (input-port-returned-char port) + (error 'unread-char "cannot unread twice")) + (set-input-port-returned-char! port c))) + (primitive-set! 'open-input-file open-input-file) + (primitive-set! 'close-input-port + (case-lambda + [() (close-input-port (current-input-port))] + [(p) + (unless (input-port? p) + (error 'close-input-port "~s is not an input port" p)) + (close-input-port p)])) + (primitive-set! 'input-port? input-port?) + (primitive-set! 'read-char + (case-lambda + [() (read-char (current-input-port))] + [(p) + (unless (input-port? p) + (error 'read-char "~s is not an input port" p)) + (read-char p)])) + (primitive-set! 'peek-char + (case-lambda + [() (peek-char (current-input-port))] + [(p) + (unless (input-port? p) + (error 'peek-char "~s is not an input port" p)) + (peek-char p)])) + (primitive-set! 'unread-char + (case-lambda + [(c) (unread-char c (current-input-port))] + [(c p) + (unless (input-port? p) + (error 'unread-char "~s is not an input port" p)) + (unread-char c p)])) + (primitive-set! 'standard-input-port (let ([p (fd->port 0 '*stdin*)]) (lambda () p))) - ($pcb-set! current-input-port + (primitive-set! 'current-input-port (make-parameter (standard-input-port) (lambda (x) (unless (input-port? x) (error 'current-input-port "not an input port ~s" x)) x))) - ($pcb-set! console-input-port + (primitive-set! 'console-input-port (make-parameter (standard-input-port) (lambda (x) (unless (input-port? x) (error 'console-input-port "not an input port ~s" x)) x))) - ($pcb-set! input-port-name + (primitive-set! 'input-port-name (lambda (x) (if (input-port? x) (input-port-name x) (error 'input-port-name "~s is not an input port" x)))) - ($pcb-set! reset-input-port! reset-input-port!)) + (primitive-set! 'reset-input-port! reset-input-port!)) -($pcb-set! with-output-to-file +(primitive-set! 'with-output-to-file (lambda (name proc . args) (unless (string? name) (error 'with-output-to-file "~s is not a string" name)) @@ -455,7 +442,7 @@ (close-output-port p) (set! shot #t))))))) -($pcb-set! call-with-output-file +(primitive-set! 'call-with-output-file (lambda (name proc . args) (unless (string? name) (error 'call-with-output-file "~s is not a string" name)) @@ -472,7 +459,7 @@ (close-output-port p) (set! shot #t)))))) -($pcb-set! with-input-from-file +(primitive-set! 'with-input-from-file (lambda (name proc . args) (unless (string? name) (error 'with-input-from-file "~s is not a string" name)) @@ -491,7 +478,7 @@ (close-input-port p) (set! shot #t))))))) -($pcb-set! call-with-input-file +(primitive-set! 'call-with-input-file (lambda (name proc . args) (unless (string? name) (error 'call-with-input-file "~s is not a string" name)) diff --git a/src/libio.fasl b/src/libio.fasl index 02438a3..cb4d708 100644 Binary files a/src/libio.fasl and b/src/libio.fasl differ diff --git a/src/libposix-5.7.ss b/src/libposix-5.7.ss deleted file mode 100644 index 0a5292a..0000000 --- a/src/libposix-5.7.ss +++ /dev/null @@ -1,23 +0,0 @@ - -($pcb-set! posix-fork - (lambda () - (foreign-call "S_fork"))) - -($pcb-set! fork - (lambda (parent-proc child-proc) - (let ([pid (posix-fork)]) - (cond - [(fx= pid 0) (child-proc)] - [(fx= pid -1) - (error 'fork "failed")] - [else (parent-proc pid)])))) - -($pcb-set! system - (lambda (x) - (unless (string? x) - (error 'system "~s is not a string" x)) - (let ([rv (foreign-call "S_system" x)]) - (if (fx= rv -1) - (error 'system "failed") - rv)))) - diff --git a/src/libposix-6.0.ss b/src/libposix-6.0.ss new file mode 100644 index 0000000..0c4c6a9 --- /dev/null +++ b/src/libposix-6.0.ss @@ -0,0 +1,23 @@ + +;;; ($pcb-set! posix-fork +;;; (lambda () +;;; (foreign-call "S_fork"))) +;;; +;;; ($pcb-set! fork +;;; (lambda (parent-proc child-proc) +;;; (let ([pid (posix-fork)]) +;;; (cond +;;; [(fx= pid 0) (child-proc)] +;;; [(fx= pid -1) +;;; (error 'fork "failed")] +;;; [else (parent-proc pid)])))) + +(primitive-set! 'system + (lambda (x) + (unless (string? x) + (error 'system "~s is not a string" x)) + (let ([rv (foreign-call "ik_system" x)]) + (if (fx= rv -1) + (error 'system "failed") + rv)))) + diff --git a/src/librecord-5.6.ss b/src/librecord-6.1.ss similarity index 83% rename from src/librecord-5.6.ss rename to src/librecord-6.1.ss index 01c6f0d..f843013 100644 --- a/src/librecord-5.6.ss +++ b/src/librecord-6.1.ss @@ -2,25 +2,17 @@ (let () - (define record-type-rtd - (let ([rtd ($make-record #f 4)]) - ($record-set! rtd -1 rtd) - ($record-set! rtd 0 4) - ($record-set! rtd 1 "record-type") - ($record-set! rtd 2 '(length name fields printer)) - ($record-set! rtd 3 #f) - rtd)) (define rtd? (lambda (x) (and ($record? x) - (eq? ($record-rtd x) record-type-rtd)))) + (eq? ($record-rtd x) $base-rtd)))) - (define rtd-length + (define rtd-name (lambda (rtd) ($record-ref rtd 0))) - (define rtd-name + (define rtd-length (lambda (rtd) ($record-ref rtd 1))) @@ -32,14 +24,14 @@ (lambda (rtd) ($record-ref rtd 3))) - (define set-rtd-length! - (lambda (rtd n) - ($record-set! rtd 0 n))) - (define set-rtd-name! (lambda (rtd name) - ($record-set! rtd 1 name))) + ($record-set! rtd 0 name))) + (define set-rtd-length! + (lambda (rtd n) + ($record-set! rtd 1 n))) + (define set-rtd-fields! (lambda (rtd fields) ($record-set! rtd 2 fields))) @@ -50,9 +42,9 @@ (define make-rtd (lambda (name fields printer) - (let ([rtd ($make-record record-type-rtd 4)]) - ($record-set! rtd 0 (length fields)) - ($record-set! rtd 1 name) + (let ([rtd ($make-record $base-rtd 4)]) + ($record-set! rtd 0 name) + ($record-set! rtd 1 (length fields)) ($record-set! rtd 2 fields) ($record-set! rtd 3 printer) rtd))) @@ -202,21 +194,23 @@ (error 'record-set! "index ~s is out of range for ~s" i x)) ($record-set! x i v)))) - ($pcb-set! make-record-type make-record-type) - ($pcb-set! record-constructor record-constructor) - ($pcb-set! record-predicate record-predicate) - ($pcb-set! record-field-accessor record-field-accessor) - ($pcb-set! record-field-mutator record-field-mutator) + (primitive-set! 'make-record-type make-record-type) + (primitive-set! 'record-constructor record-constructor) + (primitive-set! 'record-predicate record-predicate) + (primitive-set! 'record-field-accessor record-field-accessor) + (primitive-set! 'record-field-mutator record-field-mutator) - ($pcb-set! record? record?) - ($pcb-set! record-rtd record-rtd) - ($pcb-set! record-name record-name) - ($pcb-set! record-printer record-printer) - ($pcb-set! record-length record-length) - ($pcb-set! record-ref record-ref) - ($pcb-set! record-set! record-set!) + (primitive-set! 'record? record?) + (primitive-set! 'record-rtd record-rtd) + (primitive-set! 'record-name record-name) + (primitive-set! 'record-printer record-printer) + (primitive-set! 'record-length record-length) + (primitive-set! 'record-ref record-ref) + (primitive-set! 'record-set! record-set!) - (set-rtd-printer! record-type-rtd + (set-rtd-fields! $base-rtd '(name fields length printer)) + (set-rtd-name! $base-rtd "base-rtd") + (set-rtd-printer! $base-rtd (lambda (x p) (unless (rtd? x) (error 'record-type-printer "not an rtd")) diff --git a/src/librecord.fasl b/src/librecord.fasl index a0282a1..5439b5d 100644 Binary files a/src/librecord.fasl and b/src/librecord.fasl differ diff --git a/src/libsymboltable-5.6.ss b/src/libsymboltable-5.6.ss deleted file mode 100644 index ea36284..0000000 --- a/src/libsymboltable-5.6.ss +++ /dev/null @@ -1,93 +0,0 @@ -(let () -;;; (define hash-loop -;;; (lambda (str i j h) -;;; (cond -;;; [($fx= i j) h] -;;;; ($fxlogxor h ($fxsra h 15))] -;;; [else -;;; (hash-loop str ($fxadd1 i) j -;;; ($fxlogxor -;;; ($char->fixnum ($string-ref str i)) -;;; ($fxlogxor -;;; ($fxsll h 5) -;;; ($fxsra h 23))))]))) - (define hash-loop - (lambda (str i j h) - (cond - [($fx= i j) - (let* ([h ($fx+ h ($fxsll h 3))] - [h ($fxlogxor h ($fxsra h 11))] - [h ($fx+ h ($fxsll h 15))]) - h)] - [else - (hash-loop str ($fxadd1 i) j - (let ([h ($fx+ h ($char->fixnum ($string-ref str i)))]) - (let ([h ($fx+ h ($fxsll h 10))]) - ($fxlogxor h ($fxsra h 6)))))]))) - (define hash-function - (lambda (str) - (let ([n ($string-length str)]) - (hash-loop str 0 n 0)))) - (define str= - (lambda (s1 s2 i n) - (or ($fx= i n) - (and ($char= ($string-ref s1 i) ($string-ref s2 i)) - (str= s1 s2 ($fxadd1 i) n))))) - (define bucket-lookup - (lambda (str strlen ls) - (if (null? ls) - '#f - (let ([a ($car ls)]) - (let ([str2 ($symbol-string a)]) - (if (and ($fx= ($string-length str2) strlen) - (str= str str2 0 strlen)) - a - (bucket-lookup str strlen ($cdr ls)))))))) - (define intern - (lambda (str htable) - (let ([h (hash-function str)]) - (let ([idx ($fxlogand h ($fx- ($vector-length htable) 1))]) - (let ([bucket ($vector-ref htable idx)]) - (or (bucket-lookup str ($string-length str) bucket) - (let ([sym ($make-symbol str)]) - ($vector-set! htable idx (cons sym bucket)) - ($set-symbol-unique-string! sym #f) - sym))))))) - (define old-intern - (lambda (str htable) - (or (bucket-lookup str ($string-length str) ($vector-ref htable 0)) - (let ([sym ($make-symbol str)]) - ($vector-set! htable 0 (cons sym ($vector-ref htable 0))) - sym)))) - (define init-vec - (lambda (v i n) - (unless ($fx= i n) - ($vector-set! v i '()) - (init-vec v ($fxadd1 i) n)))) - - (define revappend - (lambda (ls ac) - (cond - [(null? ls) ac] - [else (revappend ($cdr ls) (cons ($car ls) ac))]))) - - (define vec->list - (lambda (v i j ls) - (cond - [($fx= i j) ls] - [else - (vec->list v ($fxadd1 i) j - (revappend ($vector-ref v i) ls))]))) - - (define hash-vec ($make-vector 4096)) - - (init-vec hash-vec 0 4096) - - ($pcb-set! $intern - (lambda (str) - (intern str hash-vec))) - - ($pcb-set! oblist - (lambda () - (vec->list hash-vec 0 4096 '())))) - diff --git a/src/libtokenizer-5.7.ss b/src/libtokenizer-6.1.ss similarity index 82% rename from src/libtokenizer-5.7.ss rename to src/libtokenizer-6.1.ss index 057b247..57aaeac 100644 --- a/src/libtokenizer-5.7.ss +++ b/src/libtokenizer-6.1.ss @@ -1,7 +1,7 @@ (let () (define char-whitespace? (lambda (c) - (or (char= #\space c) + (or ($char= #\space c) (memq ($char->fixnum c) '(9 10 11 12 13))))) (define delimiter? (lambda (c) @@ -9,7 +9,7 @@ (memq c '(#\( #\) #\[ #\] #\' #\` #\, #\"))))) (define digit? (lambda (c) - (and (char<= #\0 c) (char<= c #\9)))) + (and ($char<= #\0 c) ($char<= c #\9)))) (define char->num (lambda (c) (fx- ($char->fixnum c) ($char->fixnum #\0)))) @@ -18,15 +18,15 @@ (or (letter? c) (special-initial? c)))) (define letter? (lambda (c) - (or (and (char<= #\a c) (char<= c #\z)) - (and (char<= #\A c) (char<= c #\Z))))) + (or (and ($char<= #\a c) ($char<= c #\z)) + (and ($char<= #\A c) ($char<= c #\Z))))) (define af? (lambda (c) - (or (and (char<= #\a c) (char<= c #\f)) - (and (char<= #\A c) (char<= c #\F))))) + (or (and ($char<= #\a c) ($char<= c #\f)) + (and ($char<= #\A c) ($char<= c #\F))))) (define af->num (lambda (c) - (if (and (char<= #\a c) (char<= c #\f)) + (if (and ($char<= #\a c) ($char<= c #\f)) (fx+ 10 (fx- ($char->fixnum c) ($char->fixnum #\a))) (fx+ 10 (fx- ($char->fixnum c) ($char->fixnum #\A)))))) (define special-initial? @@ -77,9 +77,9 @@ (cons 'datum (tokenize-hex (char->num c) p))] [(af? c) (cons 'datum (tokenize-hex (af->num c) p))] - [(char= c #\-) + [($char= c #\-) (cons 'datum (fx- 0 (tokenize-hex 0 p)))] - [(char= c #\+) + [($char= c #\+) (cons 'datum (tokenize-hex 0 p))] [else (unread-char c p) @@ -104,14 +104,14 @@ (cond [(eof-object? c) (error 'tokenize "end-of-file while inside a string")] - [(char= #\" c) ls] - [(char= #\\ c) + [($char= #\" c) ls] + [($char= #\\ c) (let ([c (read-char p)]) (cond - [(char= #\" c) (tokenize-string (cons #\" ls) p)] - [(char= #\\ c) (tokenize-string (cons #\\ ls) p)] - [(char= #\n c) (tokenize-string (cons #\newline ls) p)] - [(char= #\t c) (tokenize-string (cons #\tab ls) p)] + [($char= #\" c) (tokenize-string (cons #\" ls) p)] + [($char= #\\ c) (tokenize-string (cons #\\ ls) p)] + [($char= #\n c) (tokenize-string (cons #\newline ls) p)] + [($char= #\t c) (tokenize-string (cons #\tab ls) p)] [else (error 'tokenize "invalid string escape \\~a" c)]))] [else (tokenize-string (cons c ls) p)])))) @@ -148,13 +148,13 @@ (cond [(eof-object? c) 'dot] [(delimiter? c) 'dot] - [(char= c #\.) ; this is second dot + [($char= c #\.) ; this is second dot (read-char p) (let ([c (read-char p)]) (cond [(eof-object? c) (error 'tokenize "invalid syntax .. near end of file")] - [(char= c #\.) ; this is the third + [($char= c #\.) ; this is the third (let ([c (peek-char p)]) (cond [(eof-object? c) '(datum . ...)] @@ -180,7 +180,7 @@ (cond [(eof-object? c) (error 'tokenize "invalid eof in the middle of #\\~a" str)] - [(char= c (string-ref str i)) + [($char= c (string-ref str i)) (tokenize-char* (fxadd1 i) str p d)] [else (error 'tokenize @@ -191,7 +191,7 @@ (cond [(eof-object? c) (cons 'datum (string-ref str 0))] [(delimiter? c) (cons 'datum (string-ref str 0))] - [(char= (string-ref str 1) c) + [($char= (string-ref str 1) c) (read-char p) (tokenize-char* 2 str p d)] [else (error 'tokenize "invalid syntax near #\\~a~a" @@ -202,13 +202,13 @@ (cond [(eof-object? c) (error 'tokenize "invalid #\\ near end of file")] - [(char= #\s c) + [($char= #\s c) (tokenize-char-seq p "space" '(datum . #\space))] - [(char= #\n c) + [($char= #\n c) (tokenize-char-seq p "newline" '(datum . #\newline))] - [(char= #\t c) + [($char= #\t c) (tokenize-char-seq p "tab" '(datum . #\tab))] - [(char= #\r c) + [($char= #\r c) (tokenize-char-seq p "return" '(datum . #\return))] [else (let ([n (peek-char p)]) @@ -226,17 +226,17 @@ (let ([c (read-char p)]) (cond [(eof-object? c) (multiline-error)] - [(char= #\| c) + [($char= #\| c) (let ([c (read-char p)]) (cond [(eof-object? c) (multiline-error)] - [(char= #\# c) (void)] + [($char= #\# c) (void)] [else (multiline-comment p)]))] - [(char= #\# c) + [($char= #\# c) (let ([c (read-char p)]) (cond [(eof-object? c) (multiline-error)] - [(char= #\| c) + [($char= #\| c) (multiline-comment p) (multiline-comment p)] [else @@ -247,8 +247,8 @@ (let ([c (read-char p)]) (cond [(eof-object? c) ac] - [(char= #\0 c) (read-binary (fxsll ac 1) (cons c chars) p)] - [(char= #\1 c) (read-binary (fx+ (fxsll ac 1) 1) (cons c chars) p)] + [($char= #\0 c) (read-binary (fxsll ac 1) (cons c chars) p)] + [($char= #\1 c) (read-binary (fx+ (fxsll ac 1) 1) (cons c chars) p)] [(delimiter? c) (unread-char c p) ac] [else (unread-char c) @@ -259,67 +259,67 @@ (let ([c (read-char p)]) (cond [(eof-object? c) (error 'tokenize "invalid # near end of file")] - [(char= c #\t) + [($char= c #\t) (let ([c (peek-char p)]) (cond [(eof-object? c) '(datum . #t)] [(delimiter? c) '(datum . #t)] [else (error 'tokenize "invalid syntax near #t")]))] - [(char= c #\f) + [($char= c #\f) (let ([c (peek-char p)]) (cond [(eof-object? c) '(datum . #f)] [(delimiter? c) '(datum . #f)] [else (error 'tokenize "invalid syntax near #f")]))] - [(char= #\\ c) (tokenize-char p)] - [(char= #\( c) 'vparen] - [(char= #\x c) (tokenize-hex-init p)] - [(char= #\' c) '(macro . syntax)] - [(char= #\; c) 'hash-semi] - [(char= #\% c) '(macro . |#primitive|)] - [(char= #\| c) (multiline-comment p) (tokenize p)] - [(char= #\b c) + [($char= #\\ c) (tokenize-char p)] + [($char= #\( c) 'vparen] + [($char= #\x c) (tokenize-hex-init p)] + [($char= #\' c) '(macro . syntax)] + [($char= #\; c) 'hash-semi] + [($char= #\% c) '(macro . |#primitive|)] + [($char= #\| c) (multiline-comment p) (tokenize p)] + [($char= #\b c) (let ([c (read-char p)]) (cond [(eof-object? c) (error 'tokenize "invalid eof while reading #b")] - [(char= #\- c) + [($char= #\- c) (let ([c (read-char p)]) (cond [(eof-object? c) (error 'tokenize "invalid eof while reading #b-")] - [(char= #\0 c) + [($char= #\0 c) (cons 'datum (fx- 0 (read-binary 0 '(#\0 #\-) p)))] - [(char= #\1 c) + [($char= #\1 c) (cons 'datum (fx- 0 (read-binary 1 '(#\1 #\-) p)))] [else (unread-char c p) (error 'tokenize "invalid binary syntax #b-~a" c)]))] - [(char= #\0 c) + [($char= #\0 c) (cons 'datum (read-binary 0 '(#\0) p))] - [(char= #\1 c) + [($char= #\1 c) (cons 'datum (read-binary 1 '(#\1) p))] [else (unread-char c p) (error 'tokenize "invalid syntax #b~a" c)] ))] - [(char= #\! c) + [($char= #\! c) (let ([e (read-char p)]) (when (eof-object? e) (error 'tokenize "invalid eof near #!")) - (unless (char= #\e e) + (unless ($char= #\e e) (error 'tokenize "invalid syntax near #!~a" e)) (let ([o (read-char p)]) (when (eof-object? o) (error 'tokenize "invalid eof near #!e")) - (unless (char= #\o o) + (unless ($char= #\o o) (error 'tokenize "invalid syntax near #!e~a" o)) (let ([f (read-char p)]) (when (eof-object? f) (error 'tokenize "invalid syntax near #!eo")) - (unless (char= #\f f) + (unless ($char= #\f f) (error 'tokenize "invalid syntax near #!eo~a" f)) (cons 'datum (eof-object)))))] [else @@ -331,13 +331,13 @@ (cond [(eof-object? c) (error 'tokenize "unexpected eof while reading symbol")] - [(char= #\\ c) + [($char= #\\ c) (let ([c (read-char p)]) (cond [(eof-object? c) (error 'tokenize "unexpected eof while reading symbol")] [else (tokenize-bar p (cons c ac))]))] - [(char= #\| c) ac] + [($char= #\| c) ac] [else (tokenize-bar p (cons c ac))])))) (define tokenize (lambda (p) @@ -345,39 +345,39 @@ (cond [(eof-object? c) (eof-object)] [(char-whitespace? c) (tokenize p)] - [(char= #\( c) 'lparen] - [(char= #\) c) 'rparen] - [(char= #\[ c) 'lbrack] - [(char= #\] c) 'rbrack] - [(char= #\' c) '(macro . quote)] - [(char= #\` c) '(macro . quasiquote)] - [(char= #\, c) + [($char= #\( c) 'lparen] + [($char= #\) c) 'rparen] + [($char= #\[ c) 'lbrack] + [($char= #\] c) 'rbrack] + [($char= #\' c) '(macro . quote)] + [($char= #\` c) '(macro . quasiquote)] + [($char= #\, c) (let ([c (peek-char p)]) (cond [(eof-object? c) '(macro . unquote)] - [(char= c #\@) + [($char= c #\@) (read-char p) '(macro . unquote-splicing)] [else '(macro . unquote)]))] - [(char= #\# c) (tokenize-hash p)] + [($char= #\# c) (tokenize-hash p)] [(digit? c) (cons 'datum (tokenize-number (char->num c) p))] [(initial? c) (let ([ls (reverse (tokenize-identifier (cons c '()) p))]) (cons 'datum (string->symbol (list->string ls))))] - [(char= #\" c) + [($char= #\" c) (let ([ls (tokenize-string '() p)]) (cons 'datum (list->string (reverse ls))))] - [(char= #\; c) + [($char= #\; c) (skip-comment p) (tokenize p)] - [(char= #\+ c) + [($char= #\+ c) (tokenize-plus p)] - [(char= #\- c) + [($char= #\- c) (tokenize-minus p)] - [(char= #\. c) + [($char= #\. c) (tokenize-dot p)] - [(char= #\| c) + [($char= #\| c) (let ([ls (reverse (tokenize-bar p '()))]) (cons 'datum (string->symbol (list->string ls))))] [else @@ -481,29 +481,20 @@ ;;; ;;;--------------------------------------------------------------* INIT *--- ;;; - ($pcb-set! read-token - (lambda p - (if (null? p) - (tokenize (current-input-port)) - (if (null? (cdr p)) - (let ([a (car p)]) - (if (input-port? a) - (tokenize a) - (error 'read-token - "not an input port: ~s ~s ~s" - (vector? a) (vector-length a) a))) - (error 'read-token "too many arguments"))))) - ($pcb-set! read - (lambda p - (if (null? p) - (read (current-input-port)) - (if (null? (cdr p)) - (let ([a (car p)]) - (if (input-port? a) - (read a) - (error 'read "not an input port: ~s" a))) - (error 'read "too many arguments"))))) - + (primitive-set! 'read-token + (case-lambda + [() (tokenize (current-input-port))] + [(p) + (if (input-port? p) + (tokenize p) + (error 'read-token "~s is not an input port" p))])) + (primitive-set! 'read + (case-lambda + [() (read (current-input-port))] + [(p) + (if (input-port? p) + (read p) + (error 'read "~s is not an input port" p))])) (let () (define read-and-eval (lambda (p) @@ -511,7 +502,7 @@ (unless (eof-object? x) (eval x) (read-and-eval p))))) - ($pcb-set! load + (primitive-set! 'load (lambda (x) (unless (string? x) (error 'load "~s is not a string" x)) diff --git a/src/libtokenizer.fasl b/src/libtokenizer.fasl index 99415df..352e050 100644 Binary files a/src/libtokenizer.fasl and b/src/libtokenizer.fasl differ diff --git a/src/libtoplevel.fasl b/src/libtoplevel.fasl index 72b2448..6d6ebdd 100644 Binary files a/src/libtoplevel.fasl and b/src/libtoplevel.fasl differ diff --git a/src/libtrace-5.3.ss b/src/libtrace-5.3.ss deleted file mode 100644 index 59eb326..0000000 --- a/src/libtrace-5.3.ss +++ /dev/null @@ -1,89 +0,0 @@ - -(let () - (define k* '()) - - (define display-prefix - (lambda (ls t) - (unless (null? ls) - (display (if t "|" " ")) - (display-prefix (cdr ls) (not t))))) - - (define display-trace - (lambda (k* v) - (display-prefix k* #t) - (write v) - (newline))) - - (define make-traced-procedure - (lambda (name proc) - (lambda args - (call/cf - (lambda (f) - (cond - [(memq f k*) => - (lambda (ls) - (display-trace ls (cons name args)) - (apply proc args))] - [else - (display-trace (cons 1 k*) (cons name args)) - (dynamic-wind - (lambda () (set! k* (cons f k*))) - (lambda () - (let ([v - (call/cf - (lambda (nf) - (set! f nf) - (set-car! k* nf) - (apply proc args)))]) - (display-trace k* v) - v)) - (lambda () (set! k* (cdr k*))))])))))) - - (define traced-symbols '()) - - (define trace-symbol! - (lambda (s) - (cond - [(assq s traced-symbols) => - (lambda (pr) - (let ([a (cdr pr)] [v (top-level-value s)]) - (unless (eq? (cdr a) v) - (unless (procedure? v) - (error 'trace - "the top-level value of ~s is ~s (not a procedure)" - s v)) - (let ([p (make-traced-procedure s v)]) - (set-car! a v) - (set-cdr! a p) - (set-top-level-value! s p)))))] - [else - (unless (top-level-bound? s) - (error 'trace "~s is unbound" s)) - (let ([v (top-level-value s)]) - (unless (procedure? v) - (error 'trace "the top-level value of ~s is ~s (not a procedure)" - s v)) - (let ([p (make-traced-procedure s v)]) - (set! traced-symbols - (cons (cons s (cons v p)) traced-symbols)) - (set-top-level-value! s p)))]))) - - (define untrace-symbol! - (lambda (s) - (define loop - (lambda (ls) - (cond - [(null? ls) '()] - [(eq? s (caar ls)) - (let ([a (cdar ls)]) - (when (eq? (cdr a) (top-level-value s)) - (set-top-level-value! s (car a))) - (cdr ls))] - [else (cons (car ls) (loop (cdr ls)))]))) - (set! traced-symbols (loop traced-symbols)))) - - ($pcb-set! make-traced-procedure make-traced-procedure) - ($pcb-set! trace-symbol! trace-symbol!) - ($pcb-set! untrace-symbol! untrace-symbol!)) - - diff --git a/src/libwriter-5.7.ss b/src/libwriter-6.1.ss similarity index 86% rename from src/libwriter-5.7.ss rename to src/libwriter-6.1.ss index d8a4696..9528868 100644 --- a/src/libwriter-5.7.ss +++ b/src/libwriter-6.1.ss @@ -11,16 +11,19 @@ (if m (let ([i ($char->fixnum x)]) (write-char #\# p) - (write-char #\\ p) (cond [(fx< i (vector-length char-table)) + (write-char #\\ p) (write-char* (vector-ref char-table i) p)] [(fx< i 127) + (write-char #\\ p) (write-char x p)] [(fx= i 127) + (write-char #\\ p) (write-char* "del" p)] [else - (error 'writer "invalid character index ~s" i)])) + (write-char #\+ p) + (write-fixnum i p)])) (write-char x p)))) (define write-list (lambda (x p m) @@ -140,10 +143,10 @@ (unless (fx= i n) (let ([c (string-ref x i)]) (cond - [(or (char= #\" c) (char= #\\ c)) + [(or ($char= #\" c) ($char= #\\ c)) (write-char #\\ p) (write-char c p)] - [(char= #\tab c) + [($char= #\tab c) (write-char #\\ p) (write-char #\t p)] [else @@ -246,24 +249,23 @@ (if (procedure? printer) (printer x p) (write-record x p m)))] - [(code? x) - (write-char* "#" p)] + ;[(code? x) + ; (write-char* "#" p)] + [(hash-table? x) + (write-char* "#" p)] + [($unbound-object? x) + (write-char* "#" p)] + [($forward-ptr? x) + (write-char* "#" p)] [else (write-char* "#" p)]))) - (define generic-writer - (lambda (who) - (lambda (x . p) - (let ([port - (if (null? p) - (current-output-port) - (if (null? (cdr p)) - (let ([p (car p)]) - (if (output-port? p) - p - (error who "not an output port ~s" p))) - (error who "too many arguments")))]) - (writer x port (eq? who 'write)) - (flush-output-port port))))) + + (define (write x p) + (writer x p #t) + (flush-output-port p)) + (define (display x p) + (writer x p #f) + (flush-output-port p)) ;;; (define formatter (lambda (who p fmt args) @@ -271,21 +273,21 @@ (unless (fx= i (string-length fmt)) (let ([c (string-ref fmt i)]) (cond - [(char= c #\~) + [($char= c #\~) (let ([i (fxadd1 i)]) (when (fx= i (string-length fmt)) (error who "invalid ~~ at end of format string ~s" fmt)) (let ([c (string-ref fmt i)]) (cond - [(char= c #\~) + [($char= c #\~) (write-char #\~ p) (f (fxadd1 i) args)] - [(char= c #\a) + [($char= c #\a) (when (null? args) (error who "insufficient arguments")) (display (car args) p) (f (fxadd1 i) (cdr args))] - [(char= c #\s) + [($char= c #\s) (when (null? args) (error who "insufficient arguments")) (write (car args) p) @@ -318,7 +320,6 @@ (formatter 'format p fmt args) (get-output-string p)))) - (define print-error (lambda (who fmt . args) (unless (string? fmt) @@ -333,24 +334,36 @@ ;;; - ($pcb-set! format format) - ($pcb-set! printf printf) - ($pcb-set! fprintf fprintf) - ($pcb-set! display (generic-writer 'display)) - ($pcb-set! write (generic-writer 'write)) - ($pcb-set! print-error print-error) - ($pcb-set! current-error-handler + (primitive-set! 'format format) + (primitive-set! 'printf printf) + (primitive-set! 'fprintf fprintf) + (primitive-set! 'write + (case-lambda + [(x) (write x (current-output-port))] + [(x p) + (unless (output-port? p) + (error 'write "~s is not an output port" p)) + (write x p)])) + (primitive-set! 'display + (case-lambda + [(x) (display x (current-output-port))] + [(x p) + (unless (output-port? p) + (error 'display "~s is not an output port" p)) + (display x p)])) + (primitive-set! 'print-error print-error) + (primitive-set! 'current-error-handler (make-parameter (lambda args (apply print-error args) - (display "exiting\n") - (flush-output-port) + (display "exiting\n" (console-output-port)) + (flush-output-port (console-output-port)) (exit -100)) (lambda (x) (if (procedure? x) x (error 'current-error-handler "~s is not a procedure" x))))) - ($pcb-set! error + (primitive-set! 'error (lambda args (apply (current-error-handler) args)))) diff --git a/src/libwriter.fasl b/src/libwriter.fasl index b25badc..7d727f7 100644 Binary files a/src/libwriter.fasl and b/src/libwriter.fasl differ diff --git a/src/petite-ikarus.fasl b/src/petite-ikarus.fasl index d2aabc2..c5eb91c 100644 Binary files a/src/petite-ikarus.fasl and b/src/petite-ikarus.fasl differ diff --git a/src/record-case.ss b/src/record-case.ss index 124e619..b928871 100644 --- a/src/record-case.ss +++ b/src/record-case.ss @@ -10,7 +10,7 @@ #'(i . i*))])) (define (generate-body ctxt cls*) (syntax-case cls* (else) - [() #'(error #f "unmatched ~s" v)] + [() (with-syntax ([x x]) #'(error #f "unmatched ~s in ~s" v #'x))] [([else b b* ...]) #'(begin b b* ...)] [([(rec-name rec-field* ...) b b* ...] . rest) (identifier? #'rec-name) (with-syntax ([altern (generate-body ctxt #'rest)] diff --git a/src/runtime-5.4.c b/src/runtime-5.4.c deleted file mode 100644 index 283aabc..0000000 --- a/src/runtime-5.4.c +++ /dev/null @@ -1,421 +0,0 @@ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "scheme.h" -#define mask(x,m) (((int)(x)) & (int)(m)) -#define unshift(n) (((int)(n)) >> fx_shift) -#define shift(n) ((ptr)((n) << fx_shift)) -#define ref(x,i) (*((ptr*)((x)+(i)))) -#define pagesize 4096 - -static void install_handlers(); - -static char* char_string[128] = { - "#\\nul","#\\soh","#\\stx","#\\etx","#\\eot","#\\enq","#\\ack","#\\bel", - "#\\bs", "#\\tab","#\\lf", "#\\vt", "#\\ff", "#\\cr", "#\\so", "#\\si", - "#\\dle","#\\dc1","#\\dc2","#\\dc3","#\\dc4","#\\nak","#\\syn","#\\etb", - "#\\can","#\\em", "#\\sub","#\\esc","#\\fs", "#\\gs", "#\\rs", "#\\us", - "#\\space","#\\!","#\\\"","#\\#","#\\$","#\\%","#\\&","#\\'", - "#\\(","#\\)","#\\*","#\\+","#\\,","#\\-","#\\.","#\\/", - "#\\0","#\\1","#\\2","#\\3","#\\4","#\\5","#\\6","#\\7", - "#\\8","#\\9","#\\:","#\\;","#\\<","#\\=","#\\>","#\\?", - "#\\@","#\\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","#\\[","#\\\\","#\\]","#\\^","#\\_", - "#\\`","#\\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","#\\{","#\\|","#\\}","#\\~","#\\del"}; - -static ptr s_car(ptr x){ - ptr* p = (ptr*)(x - pair_tag); - return p[0]; -} -static ptr s_cdr(ptr x){ - ptr* p = (ptr*)(x - pair_tag); - return p[1]; -} - -static void print_object(ptr x); - -static void print_rest(ptr x){ - while(1){ - if (x == empty_list) { - return; - } else if(mask(x,pair_mask) == pair_tag){ - printf(" "); - print_object(s_car(x)); - x = s_cdr(x); - } else { - printf(" . "); - print_object(x); - return; - } - } -} - -static void print_vector(ptr p){ - int len = (int) ref(p, disp_vector_length - vector_tag); - int i; - printf("#("); - if(len > 0){ - print_object(ref(p, disp_vector_data - vector_tag)); - for(i=disp_vector_data; i> char_shift) & 127]); - } else if(((int)x & pair_mask) == pair_tag){ - printf("("); - print_object(s_car(x)); - print_rest(s_cdr(x)); - printf(")"); - } else if(mask(x, vector_mask) == vector_tag){ - print_vector(x); - } else if(mask(x, string_mask) == string_tag){ - print_string(x); - } else if(mask(x, symbol_mask) == symbol_tag){ - print_symbol(x); - } else { - printf("#", (int)x); - } -} - -static void print_ptr(ptr x){ - print_object(x); - printf("\n"); - return; - print_ptr(x); -} - -static char* allocate_unprotected_space(int size){ - int aligned_size = ((size + pagesize - 1) / pagesize) * pagesize; - char* p = mmap(0, aligned_size, - PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE, - 0, 0); - if(p == MAP_FAILED){ - perror("allocate_unprotected_space failed to mmap"); - exit(-10); - } - return p; -} - - - -static char* allocate_protected_space(int size){ - int status; - int aligned_size = ((size + pagesize - 1) / pagesize) * pagesize; - char* p = mmap(0, aligned_size + 2*pagesize, - PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE, - 0, 0); - if(p == MAP_FAILED){ - perror("allocate_protected_space failed to mmap"); - exit(-10); - } - status = mprotect(p, pagesize, PROT_NONE); - if(status != 0){ - perror("allocate_protected_space failed to protect"); - exit(-10); - } - status = mprotect(p+pagesize+aligned_size, pagesize, PROT_NONE); - if(status != 0){ - perror("allocate_protected_space failed to protect"); - exit(-10); - } - return (p + pagesize); -} - -static void deallocate_unprotected_space(char* p, int size){ - int status; - int aligned_size = ((size + pagesize - 1) / pagesize) * pagesize; - status = munmap(p, aligned_size); - if(status != 0){ - perror("deallocate_unprotected_space failed to unmap"); - exit(-10); - } -} - -static void deallocate_protected_space(char* p, int size){ - int status; - int aligned_size = ((size + pagesize - 1) / pagesize) * pagesize; - status = munmap(p-pagesize, aligned_size + 2*pagesize); - if(status != 0){ - perror("deallocate_protected_space failed to unmap"); - exit(-10); - } -} - -char* global_heap_start; -char* global_heap_end; -char* global_stak_start; -char* global_stak_end; - -int main(int argc, char** argv){ - install_handlers(); - if (pagesize != getpagesize()){ - fprintf(stderr, "Pagesize Mismatch\n"); - exit(-1); - } - int stak_size = (256 * pagesize); /* holds 128k cells */ - int heap_size = (640 * pagesize); /* holds 1M cells */ - char* heap = allocate_unprotected_space(heap_size); - char* stak = allocate_unprotected_space(stak_size); - global_heap_start = heap; - global_stak_start = stak; - global_heap_end = heap+heap_size; - global_stak_end = stak+stak_size; - pcb_t* pcb = (pcb_t*) allocate_protected_space(sizeof(pcb_t)); - pcb->heap_base = heap; - pcb->heap_size = (char*) heap_size; - pcb->allocation_pointer = heap; - pcb->allocation_redline = heap + heap_size - 2 * pagesize; - pcb->stack_top = stak; - pcb->stack_size = (char*) stak_size; - pcb->frame_redline = stak + 2 * pagesize; - pcb->frame_base = stak + stak_size - wordsize; -#if 0 - fprintf(stderr, "stack=0x%08x .. 0x%08x (redline=0x%08x)\n", - (int) pcb->frame_base, - (int) pcb->stack_top, - (int) pcb->frame_redline); -#endif - scheme_main(pcb); -#if 0 - fprintf(stderr, "%d bytes used\n", pcb->allocation_pointer - heap); -#endif - deallocate_unprotected_space(stak, stak_size); - deallocate_unprotected_space(pcb->heap_base, (int) pcb->heap_size); - deallocate_protected_space((char*)pcb, sizeof(pcb_t)); - return 0; -} - - -ptr S_error(ptr args){ - if(mask(args,pair_mask) != pair_tag){ - fprintf(stderr, "Error in Error: no arguments\n"); - exit(-1); - } - ptr fst = ref(args, disp_car - pair_tag); - if(fst == bool_f){ - fprintf(stderr, "Error\n"); - exit(0); - } - if(mask(fst, symbol_mask) == symbol_tag){ - ptr str = ref(fst, disp_symbol_string - symbol_tag); - fprintf(stderr, "Error in %s\n", str+disp_string_data-string_tag); - exit(0); - } - fprintf(stderr, "Invalid argument 0x%08x to S_error\n", (int)fst); - exit(-1); -} - -/* - * From the manpages: - * - * int open(const char *pathname, int flags); - * int open(const char *pathname, int flags, mode_t mode); - * flags = (O_RDONLY | O_WRONLY | O_RDWR) ? O_CREAT ? O_TRUNC ? O_APPEND - * return -1 on failure - * - * int unlink(const char *pathname); - */ - -ptr S_open_file(ptr str, ptr flagptr){ - int flags; - int f = unshift(flagptr); - char* path = str + disp_string_data - string_tag; - if(f == 0){ - flags = O_WRONLY; - } else if(f == 1){ - flags = O_WRONLY | O_APPEND; - } else if(f == 2){ - unlink(path); - flags = O_WRONLY | O_CREAT; - } else if(f == 3){ - flags = O_WRONLY | O_TRUNC; - } else if(f == 4){ - flags = O_RDONLY; - } else { - fprintf(stderr, "Error in S_open_file: invalid mode 0x%08x\n", - (int)flagptr); - exit(-10); - } - int fd = open(path, flags, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); - if(fd == -1){ - fprintf(stderr, "Cannot open %s\n", path); - perror("S_open_file"); - exit(-10); - } - if(fd != unshift(shift(fd))){ - fprintf(stderr, "fd %d too big\n", fd); - exit(-10); - } - return shift(fd); -} - -ptr S_write(ptr fdptr, ptr idx, ptr str){ - int fd = unshift(fdptr); - int len = unshift(idx); - char* buf = str+disp_string_data-string_tag; - int bytes = write(fd, buf, len); - if(bytes != len){ - perror("S_write"); - exit(-10); - } - return bool_t; -} - -ptr S_read(ptr fdptr, ptr bufptr, ptr lenptr){ - int fd = unshift(fdptr); - int len = unshift(lenptr); - char* buf = bufptr+disp_string_data-string_tag; - int bytes = read(fd, buf, len); - if(bytes == -1){ - perror("S_read"); - exit(-10); - } - return shift(bytes); -} - -ptr S_close(ptr fd){ - int err = close(unshift(fd)); - if(err != 0){ - perror("S_close"); - exit(-10); - } - return bool_t; -} - -/* - * From the manpage: - * - * int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); - * int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); - * int sigpending(sigset_t *set); - * int sigsuspend(const sigset_t *mask); - -struct sigaction { - void (*sa_handler)(int); - void (*sa_sigaction)(int, siginfo_t *, void *); - sigset_t sa_mask; - int sa_flags; - void (*sa_restorer)(void); -} - -siginfo_t { - int si_signo; - int si_errno; - int si_code; - pid_t si_pid; - uid_t si_uid; - int si_status; - clock_t si_utime; - clock_t si_stime; - sigval_t si_value; - int si_int; - void * si_ptr; - void * si_addr; - int si_band; - int si_fd; -} -si_code: -SEGV_MAPERR | address not mapped to object -SEGV_ACCERR | invalid permissions for mapped object - -*/ - -void segv_handler(int signum, siginfo_t * info, void* ctxt){ - fprintf(stderr, "segv cought\n"); - fprintf(stderr, "address of fault = 0x%08x\n", (int) info->si_addr); - fprintf(stderr, "heap is 0x%08x .. 0x%08x\n", - (int) global_heap_start, - (int) global_heap_end - 1); - fprintf(stderr, "stak is 0x%08x .. 0x%08x\n", - (int) global_stak_start, - (int) global_stak_end - 1); - fprintf(stderr, "caused by: %s\n", - (info->si_code == SEGV_MAPERR) - ? "unmapped object" - : "invalid permission"); - - exit(-10); -} - -static void install_handlers(){ - return; - stack_t ss; - ss.ss_sp = malloc(SIGSTKSZ); - if (ss.ss_sp == NULL){ - fprintf(stderr, "Error allocating altstack\n"); - exit(-10); - } - ss.ss_size = SIGSTKSZ; - ss.ss_flags = 0; - if (sigaltstack(&ss, NULL) == -1) { - fprintf(stderr, "Error installing altstack\n"); - exit(-10); - } - - struct sigaction act; - sigset_t set; - sigemptyset(&set); - act.sa_sigaction = segv_handler; - act.sa_flags = SA_RESTART | SA_SIGINFO | SA_ONSTACK; - act.sa_mask = set; - int err = sigaction(SIGSEGV, &act, NULL); - if(err){ - perror("installing handlers failed"); - exit(-10); - } -} - diff --git a/src/runtime/Makefile b/src/runtime/Makefile index 1eadc73..3551b1b 100644 --- a/src/runtime/Makefile +++ b/src/runtime/Makefile @@ -35,3 +35,6 @@ ikarus-hash-tables.o: ikarus-hash-tables.c ikarus.h ikarus.h: ikarus-data.h touch ikarus.h + +clean: + rm -f *.o ikarus diff --git a/src/runtime/dump b/src/runtime/dump deleted file mode 100644 index 227caa5..0000000 --- a/src/runtime/dump +++ /dev/null @@ -1,133 +0,0 @@ -SYM 0x080492fc -SYM 0x080492fc -SYM 0x080492fc -SYM 0x080492fc -SYM 0x0804b03d -SYM 0x0804b03d -SYM 0x0804935d -SYM 0x080492fc -SYM 0xa7e4b3d0 -SYM 0xa7e4b3d0 -SYM 0x0804ad75 -SYM 0x0804acdf -SYM 0x08049394 -SYM 0x080494c4 -SYM 0x08049460 -SYM 0x080495f2 -SYM 0x08049460 -SYM 0x080494c4 -SYM 0x080495f2 -SYM 0x080493fd -SYM 0x080493fd -ik_collect entry 16384 (pcb=0x0804e008) -current heap is 0xa7a1e000 + 4194304 = 0xa7e1e000 -add_code_entry 0xa7508018 (pre=0xa7508000) -add_code_entry 0xa727e018 (pre=0xa727e000) -add_code_entry 0xa70e5018 (pre=0xa70e5000) -add_code_entry 0xa70e2018 (pre=0xa70e2000) -add_code_entry 0xa70f3018 (pre=0xa70f3000) -add_code_entry 0xa761b018 (pre=0xa761b000) -collect loop entering -scan_code 0xa761b008 -add_code_entry 0xa761a018 (pre=0xa761a000) -add_code_entry 0xa7619018 (pre=0xa7619000) -add_code_entry 0xa7618018 (pre=0xa7618000) -scan_code done -scan_code 0xa7618008 -scan_code done -scan_code 0xa7619008 -scan_code done -scan_code 0xa761a008 -scan_code done -scan_code 0xa70f3008 -add_code_entry 0xa70fb018 (pre=0xa70fb000) -add_code_entry 0xa70f9018 (pre=0xa70f9000) -add_code_entry 0xa70f8018 (pre=0xa70f8000) -scan_code done -scan_code 0xa70f8008 -scan_code done -scan_code 0xa70f9008 -scan_code done -scan_code 0xa70fb008 -scan_code done -scan_code 0xa70e2008 -add_code_entry 0xa70fa018 (pre=0xa70fa000) -scan_code done -scan_code 0xa70fa008 -scan_code done -scan_code 0xa70e5008 -add_code_entry 0xa70e4018 (pre=0xa70e4000) -add_code_entry 0xa70e3018 (pre=0xa70e3000) -add_code_entry 0xa70e1018 (pre=0xa70e1000) -add_code_entry 0xa70e0018 (pre=0xa70e0000) -add_code_entry 0xa70df018 (pre=0xa70df000) -add_code_entry 0xa70de018 (pre=0xa70de000) -add_code_entry 0xa70dd018 (pre=0xa70dd000) -add_code_entry 0xa70dc018 (pre=0xa70dc000) -add_code_entry 0xa70db018 (pre=0xa70db000) -add_code_entry 0xa70da018 (pre=0xa70da000) -add_code_entry 0xa70d8018 (pre=0xa70d8000) -add_code_entry 0xa70d6018 (pre=0xa70d6000) -add_code_entry 0xa70d5018 (pre=0xa70d5000) -add_code_entry 0xa70d4018 (pre=0xa70d4000) -add_code_entry 0xa70d3018 (pre=0xa70d3000) -scan_code done -scan_code 0xa70d3008 -scan_code done -scan_code 0xa70d4008 -scan_code done -scan_code 0xa70d5008 -scan_code done -scan_code 0xa70d6008 -scan_code done -scan_code 0xa70d8008 -add_code_entry 0xa70d7018 (pre=0xa70d7000) -scan_code done -scan_code 0xa70d7008 -scan_code done -scan_code 0xa70da008 -add_code_entry 0xa70d9018 (pre=0xa70d9000) -scan_code done -scan_code 0xa70d9008 -scan_code done -scan_code 0xa70db008 -scan_code done -scan_code 0xa70dc008 -scan_code done -scan_code 0xa70dd008 -scan_code done -scan_code 0xa70de008 -scan_code done -scan_code 0xa70df008 -scan_code done -scan_code 0xa70e0008 -scan_code done -scan_code 0xa70e1008 -scan_code done -scan_code 0xa70e3008 -scan_code done -scan_code 0xa70e4008 -scan_code done -scan_code 0xa727e008 -add_code_entry 0xa7282018 (pre=0xa7282000) -add_code_entry 0xa7280018 (pre=0xa7280000) -add_code_entry 0xa727f018 (pre=0xa727f000) -scan_code done -scan_code 0xa727f008 -scan_code done -scan_code 0xa7280008 -scan_code done -scan_code 0xa7282008 -scan_code done -scan_code 0xa7508008 -add_code_entry 0xa7507018 (pre=0xa7507000) -add_code_entry 0xa7506018 (pre=0xa7506000) -add_code_entry 0xa7505018 (pre=0xa7505000) -scan_code done -scan_code 0xa7505008 -scan_code done -scan_code 0xa7506008 -scan_code done -scan_code 0xa7507008 -scan_code done -collect loop exiting diff --git a/src/runtime/ikarus b/src/runtime/ikarus index b433dbf..433613a 100755 Binary files a/src/runtime/ikarus and b/src/runtime/ikarus differ diff --git a/src/runtime/ikarus-collect.c b/src/runtime/ikarus-collect.c index c9ccc6b..9c7af60 100644 --- a/src/runtime/ikarus-collect.c +++ b/src/runtime/ikarus-collect.c @@ -16,6 +16,17 @@ #define maximum_heap_size (pagesize * 1024 * 8) #define minimum_stack_size (pagesize * 128) +#define accounting 1 + +static int pair_count = 0; +static int symbol_count = 0; +static int closure_count = 0; +static int vector_count = 0; +static int record_count = 0; +static int continuation_count = 0; +static int string_count = 0; +static int htable_count = 0; + typedef struct qupages_t{ ikp p; /* pointer to the scan start */ ikp q; /* pointer to the scan end */ @@ -162,7 +173,6 @@ init_gc(gc_t* gc){ ikpcb* ik_collect(int req, ikpcb* pcb); ikpcb* ik_collect_vararg(int req, ikpcb* pcb){ - fprintf(stderr, "VARARG COLLECT req=%d\n", req); return ik_collect(req, pcb); } @@ -223,12 +233,35 @@ ik_collect(int req, ikpcb* pcb){ // fprintf(stderr, "heap base=0x%08x end=0x%08x\n", // (int)pcb->heap_base, // (int)pcb->heap_base + pcb->heap_size); - bzero(pcb->heap_base, pcb->heap_size); +// bzero(pcb->heap_base, pcb->heap_size); // memset(pcb->heap_base, -1, pcb->heap_size); - fprintf(stderr, "allocated %d pages and %d bytes (heap=0x%08x .. 0x%08x) (ht=%d)\n", - total_allocated_pages, total_malloced, - (int)pcb->heap_base, (int)pcb->heap_base+pcb->heap_size, - hash_table_count); +// fprintf(stderr, "allocated %d pages and %d bytes (heap=0x%08x .. 0x%08x) (ht=%d)\n", +// total_allocated_pages, total_malloced, +// (int)pcb->heap_base, (int)pcb->heap_base+pcb->heap_size, +// hash_table_count); + + if(accounting){ + fprintf(stderr, + "[%d cons|%d sym|%d cls|%d vec|%d rec|%d cck|%d str|%d htb]\n", + pair_count, + symbol_count, + closure_count, + vector_count, + record_count, + continuation_count, + string_count, + htable_count); + pair_count = 0; + symbol_count = 0; + closure_count = 0; + vector_count = 0; + record_count = 0; + continuation_count = 0; + string_count = 0; + htable_count = 0; + } + + return pcb; } @@ -438,20 +471,14 @@ static void collect_stack(gc_t* gc, ikp top, ikp end){ } else if(framesize == 0){ framesize = (int)ref(top, wordsize); - fprintf(stderr, "special frame of size %d\n", framesize); if(framesize <= 0){ fprintf(stderr, "invalid redirected framesize=%d\n", framesize); exit(-1); } ikp base = top + framesize - wordsize; while(base > top){ - fprintf(stderr, "obj at 0x%08x = 0x%08x\n", - (int)base, (int)ref(base,0)); ikp new_obj = add_object(gc,ref(base,0)); ref(base,0) = new_obj; - if(tagof(new_obj) == string_tag){ - fprintf(stderr, "STRING %s\n", string_data(new_obj)); - } base -= wordsize; } } else { @@ -510,6 +537,9 @@ add_object(gc_t* gc, ikp x){ ref(y,off_cdr) = snd; ref(x,off_car) = forward_ptr; ref(x,off_cdr) = y; + if(accounting){ + pair_count++; + } return y; } else if(tag == symbol_tag){ @@ -522,6 +552,9 @@ add_object(gc_t* gc, ikp x){ ref(y, off_symbol_system_plist) = ref(x, off_symbol_system_plist); ref(x, -symbol_tag) = forward_ptr; ref(x, wordsize-symbol_tag) = y; + if(accounting){ + symbol_count++; + } return y; } else if(tag == closure_tag){ @@ -540,6 +573,9 @@ add_object(gc_t* gc, ikp x){ ref(y,-closure_tag) = add_code_entry(gc, ref(y,-closure_tag)); ref(x,-closure_tag) = forward_ptr; ref(x,wordsize-closure_tag) = y; + if(accounting){ + closure_count++; + } return y; } else if(tag == vector_tag){ @@ -555,6 +591,9 @@ add_object(gc_t* gc, ikp x){ memcpy(y-vector_tag, x-vector_tag, size + disp_vector_data); ref(x,-vector_tag) = forward_ptr; ref(x,wordsize-vector_tag) = y; + if(accounting){ + vector_count++; + } return y; } else if(tagof(fst) == rtd_tag){ @@ -569,6 +608,9 @@ add_object(gc_t* gc, ikp x){ memcpy(y-vector_tag, x-vector_tag, size+wordsize); ref(x,-vector_tag) = forward_ptr; ref(x,wordsize-vector_tag) = y; + if(accounting){ + record_count++; + } return y; } else if(fst == code_tag){ @@ -594,6 +636,9 @@ add_object(gc_t* gc, ikp x){ ref(y, off_continuation_top) = new_top; ref(y, off_continuation_size) = (ikp) size; ref(y, off_continuation_next) = next; + if(accounting){ + continuation_count++; + } return y; } else if(fst == htable_tag){ @@ -614,6 +659,9 @@ add_object(gc_t* gc, ikp x){ p->next = gc->htables_queue; gc->htables_queue = p; } + if(accounting){ + htable_count++; + } return y; } else { @@ -635,10 +683,14 @@ add_object(gc_t* gc, ikp x){ strlen + 1); ref(x, -string_tag) = forward_ptr; ref(x, wordsize-string_tag) = new_str; + if(accounting){ + string_count++; + } return new_str; } else { - fprintf(stderr, "unhandled string with fst=0x%08x\n", (int)fst); + fprintf(stderr, "unhandled string 0x%08x with fst=0x%08x\n", + (int)x, (int)fst); exit(-1); } } @@ -742,7 +794,7 @@ rehash_hash_table(gc_t* gc, ikbucket** table, int size){ ikp new_val = add_object(gc, q->val); q->key = new_key; q->val = new_val; - int idx = inthash(new_key) & (size-1); + int idx = inthash((int)new_key) & (size-1); q->next = table[idx]; table[idx] = q; q = next; @@ -759,7 +811,6 @@ collect_loop(gc_t* gc){ { /* scan the pending pointer pages */ qupages_t* qu = gc->ptr_queue; if(qu){ - fprintf(stderr, "PTRQUEUE\n"); done = 0; gc->ptr_queue = 0; do{ diff --git a/src/runtime/ikarus-data.h b/src/runtime/ikarus-data.h index 7dc9d26..d8020c7 100644 --- a/src/runtime/ikarus-data.h +++ b/src/runtime/ikarus-data.h @@ -143,16 +143,18 @@ #define off_record_data (disp_record_data - record_tag) #define rtd_tag record_tag -#define disp_rtd_rtd 0 -#define disp_rtd_name 4 -#define disp_rtd_length 8 -#define disp_rtd_field 12 -#define rtd_size 16 +#define disp_rtd_rtd 0 +#define disp_rtd_name 4 +#define disp_rtd_length 8 +#define disp_rtd_fields 12 +#define disp_rtd_printer 16 +#define rtd_size 20 -#define off_rtd_rtd (disp_rtd_rtd - rtd_tag) -#define off_rtd_name (disp_rtd_name - rtd_tag) -#define off_rtd_length (disp_rtd_length - rtd_tag) -#define off_rtd_field (disp_rtd_field - rtd_tag) +#define off_rtd_rtd (disp_rtd_rtd - rtd_tag) +#define off_rtd_name (disp_rtd_name - rtd_tag) +#define off_rtd_length (disp_rtd_length - rtd_tag) +#define off_rtd_fields (disp_rtd_fields - rtd_tag) +#define off_rtd_printer (disp_rtd_printer - rtd_tag) #define continuation_tag ((ikp)0x1F) #define disp_continuation_top 4 diff --git a/src/runtime/ikarus-exec.c b/src/runtime/ikarus-exec.c index c28d62e..b0fa1ff 100644 --- a/src/runtime/ikarus-exec.c +++ b/src/runtime/ikarus-exec.c @@ -25,7 +25,6 @@ ikp ik_exec_code(ikpcb* pcb, ikp code_ptr){ exit(-1); } if(framesize < k->size){ - fprintf(stderr, "SPLIT "); cont* nk = (cont*) ik_alloc(pcb, sizeof(cont)); nk->tag = k->tag; nk->next = k->next; @@ -34,7 +33,6 @@ ikp ik_exec_code(ikpcb* pcb, ikp code_ptr){ k->size = framesize; k->next = vector_tag + (ikp)nk; } - fprintf(stderr, "UF\n"); pcb->next_k = k->next; ikp fbase = pcb->frame_base - wordsize; ikp new_fbase = fbase - framesize; diff --git a/src/runtime/ikarus-fasl.c b/src/runtime/ikarus-fasl.c index 92311e1..cc42983 100644 --- a/src/runtime/ikarus-fasl.c +++ b/src/runtime/ikarus-fasl.c @@ -72,6 +72,7 @@ void ik_fasl_load(ikpcb* pcb, char* fasl_file){ ik_print(val); } } + if(p.memp != p.memq){ fprintf(stderr, "fasl-read did not reach eof!\n"); exit(-10); diff --git a/src/runtime/ikarus-hash-tables.c b/src/runtime/ikarus-hash-tables.c index c58454e..bed016c 100644 --- a/src/runtime/ikarus-hash-tables.c +++ b/src/runtime/ikarus-hash-tables.c @@ -4,17 +4,6 @@ /* from http://www.concentric.net/~Ttwang/tech/inthash.htm */ -int -inthash(int key) { - key += ~(key << 15); - key ^= (key >> 10); - key += (key << 3); - key ^= (key >> 6); - key += ~(key << 11); - key ^= (key >> 16); - return key; -} - ikp ik_get_hash_table(ikp ht, ikp k, ikp def, ikpcb* pcb){ ikp size = ref(ht, off_htable_size); diff --git a/src/runtime/ikarus-main.c b/src/runtime/ikarus-main.c index cf6c2a0..d5f6f7e 100644 --- a/src/runtime/ikarus-main.c +++ b/src/runtime/ikarus-main.c @@ -16,7 +16,6 @@ int main(int argc, char** argv){ exit(-1); } ikpcb* pcb = ik_make_pcb(); - fprintf(stderr, "MAIN PCB=0x%08x\n", (int)pcb); int i; for(i=1; icodes); codes->next = codes; codes->prev = codes; - // pcb->underflow_handler = ik_underflow_handler; - // pcb->return_point = ik_return_point; - + + /* initialize base rtd */ + { + ikp s = ik_cstring_to_symbol("$base-rtd", pcb); + ikp r = ik_alloc(pcb, align(rtd_size)) + rtd_tag; + ref(r, off_rtd_rtd) = r; + ref(r, off_rtd_length) = (ikp) (rtd_size-wordsize); + ref(r, off_rtd_name) = 0; + ref(r, off_rtd_fields) = 0; + ref(r, off_rtd_printer) = 0; + ref(s, off_symbol_system_value) = r; + ref(s, off_symbol_value) = r; + } return pcb; } @@ -261,3 +271,7 @@ ikp ik_close(ikp fd){ return true_object; } +ikp +ik_system(ikp str){ + return fix(system(string_data(str))); +} diff --git a/src/runtime/ikarus-symbol-table.c b/src/runtime/ikarus-symbol-table.c index 003d66a..06be03e 100644 --- a/src/runtime/ikarus-symbol-table.c +++ b/src/runtime/ikarus-symbol-table.c @@ -104,3 +104,13 @@ ikp ik_intern_string(ikp str, ikpcb* pcb){ return sym; } +ikp +ik_cstring_to_symbol(char* str, ikpcb* pcb){ + int n = strlen(str); + int size = n + disp_string_data + 1; + ikp s = ik_alloc(pcb, align(size)) + string_tag; + ref(s, off_string_length) = fix(n); + memcpy(s+off_string_data, str, n+1); + ikp sym = ik_intern_string(s, pcb); + return sym; +} diff --git a/src/runtime/ikarus.h b/src/runtime/ikarus.h index 1e101e5..51ffb36 100644 --- a/src/runtime/ikarus.h +++ b/src/runtime/ikarus.h @@ -8,6 +8,21 @@ extern int total_allocated_pages; extern int total_malloced; extern int hash_table_count; + +static int +inthash(int key) { + key += ~(key << 15); + key ^= (key >> 10); + key += (key << 3); + key ^= (key >> 6); + key += ~(key << 11); + key ^= (key >> 16); + return key; + return inthash(key); +} + + + typedef unsigned char* ikp; void ik_error(ikp args); @@ -96,6 +111,9 @@ void ik_print(ikp x); void ik_fprint(FILE*, ikp x); ikp ik_intern_string(ikp, ikpcb*); + +ikp ik_cstring_to_symbol(char*, ikpcb*); + ikp ik_asm_enter(ikpcb*, ikp code_object, ikp arg); ikp ik_asm_reenter(ikpcb*, ikp code_object, ikp val); ikp ik_underflow_handler(ikpcb*); diff --git a/src/runtime/tmp.fasl b/src/runtime/tmp.fasl deleted file mode 100644 index 6350f0d..0000000 Binary files a/src/runtime/tmp.fasl and /dev/null differ diff --git a/src/runtime/typescript b/src/runtime/typescript deleted file mode 100644 index 62f73e9..0000000 --- a/src/runtime/typescript +++ /dev/null @@ -1,10 +0,0 @@ -Script started on Sat 22 Jul 2006 03:35:23 PM EDT -aghuloum@titus:~/compiler-1/runtime$ rlwrap runtime/ikarus ikarus.fasl petite-ika arus.fasl  aghuloum@titus:~/compiler-1/runtime$ gdb runtime/ikarus -  aghuloum@titus:~/compiler-1/runtime$ gdb runtime/ikarus                  ./ikarus ../ikarus.fasl ../petite-ikarus.fas sl -Petite Ikarus Scheme (Build 2006-07-22) -Copyright (c) 2006 Abdulaziz Ghuloum - -> (load -aghuloum@titus:~/compiler-1/runtime$ exit - -Script done on Sat 22 Jul 2006 03:35:46 PM EDT diff --git a/src/scheme.c b/src/scheme.c deleted file mode 100644 index 1f5a036..0000000 --- a/src/scheme.c +++ /dev/null @@ -1,99 +0,0 @@ -/* automatically generated, do not edit */ -#include "scheme.h" -#include -ptr scheme_main(pcb_t* pcb){ -extern void S_add_roots(pcb_t*,int*); -extern void S_check_roots(pcb_t*,int*); -extern void SL_values(); -extern void SL_call_with_values(); -extern void libsymboltable_entry(pcb_t*); -extern int libsymboltable_constant_count; -extern void libhandlers_entry(pcb_t*); -extern int libhandlers_constant_count; -extern void libcontrol_entry(pcb_t*); -extern int libcontrol_constant_count; -extern void libintelasm_entry(pcb_t*); -extern int libintelasm_constant_count; -extern void libcollect_entry(pcb_t*); -extern int libcollect_constant_count; -extern void librecord_entry(pcb_t*); -extern int librecord_constant_count; -extern void libcore_entry(pcb_t*); -extern int libcore_constant_count; -extern void libio_entry(pcb_t*); -extern int libio_constant_count; -extern void libwriter_entry(pcb_t*); -extern int libwriter_constant_count; -extern void libtokenizer_entry(pcb_t*); -extern int libtokenizer_constant_count; -extern void libexpand_entry(pcb_t*); -extern int libexpand_constant_count; -extern void libinterpret_entry(pcb_t*); -extern int libinterpret_constant_count; -extern void libcafe_entry(pcb_t*); -extern int libcafe_constant_count; -extern void libtrace_entry(pcb_t*); -extern int libtrace_constant_count; -extern void libposix_entry(pcb_t*); -extern int libposix_constant_count; -extern void libtoplevel_entry(pcb_t*); -extern void libcxr_entry(pcb_t*); -char** ap = (char**) pcb->allocation_pointer; -ap[0] = (char*) SL_values; -ap[1] = 0; -pcb->prim_208 = ((char*)ap) + closure_tag; -ap += 2; -ap[0] = (char*) SL_call_with_values; -ap[1] = 0; -pcb->prim_209 = ((char*)ap) + closure_tag; -ap += 2; -pcb->allocation_pointer = (char*)ap; - S_add_roots(pcb, &libsymboltable_constant_count); - libsymboltable_entry(pcb); - S_check_roots(pcb, &libsymboltable_constant_count); - S_add_roots(pcb, &libhandlers_constant_count); - libhandlers_entry(pcb); - S_check_roots(pcb, &libhandlers_constant_count); - S_add_roots(pcb, &libcontrol_constant_count); - libcontrol_entry(pcb); - S_check_roots(pcb, &libcontrol_constant_count); - S_add_roots(pcb, &libintelasm_constant_count); - libintelasm_entry(pcb); - S_check_roots(pcb, &libintelasm_constant_count); - S_add_roots(pcb, &libcollect_constant_count); - libcollect_entry(pcb); - S_check_roots(pcb, &libcollect_constant_count); - S_add_roots(pcb, &librecord_constant_count); - librecord_entry(pcb); - S_check_roots(pcb, &librecord_constant_count); - S_add_roots(pcb, &libcore_constant_count); - libcore_entry(pcb); - S_check_roots(pcb, &libcore_constant_count); - S_add_roots(pcb, &libio_constant_count); - libio_entry(pcb); - S_check_roots(pcb, &libio_constant_count); - S_add_roots(pcb, &libwriter_constant_count); - libwriter_entry(pcb); - S_check_roots(pcb, &libwriter_constant_count); - S_add_roots(pcb, &libtokenizer_constant_count); - libtokenizer_entry(pcb); - S_check_roots(pcb, &libtokenizer_constant_count); - S_add_roots(pcb, &libexpand_constant_count); - libexpand_entry(pcb); - S_check_roots(pcb, &libexpand_constant_count); - S_add_roots(pcb, &libinterpret_constant_count); - libinterpret_entry(pcb); - S_check_roots(pcb, &libinterpret_constant_count); - S_add_roots(pcb, &libcafe_constant_count); - libcafe_entry(pcb); - S_check_roots(pcb, &libcafe_constant_count); - S_add_roots(pcb, &libtrace_constant_count); - libtrace_entry(pcb); - S_check_roots(pcb, &libtrace_constant_count); - S_add_roots(pcb, &libposix_constant_count); - libposix_entry(pcb); - S_check_roots(pcb, &libposix_constant_count); - libcxr_entry(pcb); - libtoplevel_entry(pcb); - return scheme_entry(pcb); -} diff --git a/src/scheme.h b/src/scheme.h deleted file mode 100644 index 7c097f8..0000000 --- a/src/scheme.h +++ /dev/null @@ -1,305 +0,0 @@ -/* automatically generated, do not edit */ -#ifndef SCHEME_H -#define SCHEME_H -typedef char* ptr; -#define fx_shift 2 -#define fx_mask 3 -#define fx_tag 0 -#define bool_f ((ptr)47) -#define bool_t ((ptr)63) -#define bool_mask 239 -#define bool_tag 47 -#define bool_shift 4 -#define empty_list ((ptr)79) -#define wordsize 4 -#define char_shift 8 -#define char_tag 15 -#define char_mask 255 -#define pair_mask 7 -#define pair_tag 1 -#define disp_car 0 -#define disp_cdr 4 -#define pair_size 8 -#define symbol_mask 7 -#define symbol_tag 2 -#define disp_symbol_string 0 -#define disp_symbol_value 8 -#define symbol_size 16 -#define vector_tag 5 -#define vector_mask 7 -#define disp_vector_length 0 -#define disp_vector_data 4 -#define string_mask 7 -#define string_tag 6 -#define disp_string_length 0 -#define disp_string_data 4 -#define closure_mask 7 -#define closure_tag 3 -#define disp_closure_data 4 -#define disp_closure_code 0 -#define record_pmask 7 -#define record_ptag 5 -#define disp_record_data 4 -#define disp_record_rtd 0 -#define continuation_tag 31 -#define disp_continuation_top 4 -#define disp_continuation_size 8 -#define disp_continuation_next 12 -#define continuation_size 16 -#define code_tag 47 -#define disp_code_instrsize 4 -#define disp_code_relocsize 8 -#define disp_code_closuresize 12 -#define disp_code_data 16 -#define disp_frame_offset -13 -#define disp_frame_size -17 -#define object_alignment 8 -#define align_shift 3 -typedef struct { - ptr system_stack; - ptr stack_top; - ptr stack_size; - ptr frame_base; - ptr frame_redline; - ptr frame_pointer; - ptr heap_base; - ptr heap_size; - ptr allocation_redline; - ptr allocation_pointer; - ptr roots; - ptr string_base; - ptr string_ap; - ptr string_eap; - ptr string_pages; - ptr allocated_megs; - ptr allocated_bytes; - ptr reclaimed_megs; - ptr reclaimed_bytes; - ptr scheme_objects; - ptr next_continuation; - ptr prim_21; - ptr prim_22; - ptr prim_23; - ptr prim_24; - ptr prim_25; - ptr prim_26; - ptr prim_27; - ptr prim_28; - ptr prim_29; - ptr prim_30; - ptr prim_31; - ptr prim_32; - ptr prim_33; - ptr prim_34; - ptr prim_35; - ptr prim_36; - ptr prim_37; - ptr prim_38; - ptr prim_39; - ptr prim_40; - ptr prim_41; - ptr prim_42; - ptr prim_43; - ptr prim_44; - ptr prim_45; - ptr prim_46; - ptr prim_47; - ptr prim_48; - ptr prim_49; - ptr prim_50; - ptr prim_51; - ptr prim_52; - ptr prim_53; - ptr prim_54; - ptr prim_55; - ptr prim_56; - ptr prim_57; - ptr prim_58; - ptr prim_59; - ptr prim_60; - ptr prim_61; - ptr prim_62; - ptr prim_63; - ptr prim_64; - ptr prim_65; - ptr prim_66; - ptr prim_67; - ptr prim_68; - ptr prim_69; - ptr prim_70; - ptr prim_71; - ptr prim_72; - ptr prim_73; - ptr prim_74; - ptr prim_75; - ptr prim_76; - ptr prim_77; - ptr prim_78; - ptr prim_79; - ptr prim_80; - ptr prim_81; - ptr prim_82; - ptr prim_83; - ptr prim_84; - ptr prim_85; - ptr prim_86; - ptr prim_87; - ptr prim_88; - ptr prim_89; - ptr prim_90; - ptr prim_91; - ptr prim_92; - ptr prim_93; - ptr prim_94; - ptr prim_95; - ptr prim_96; - ptr prim_97; - ptr prim_98; - ptr prim_99; - ptr prim_100; - ptr prim_101; - ptr prim_102; - ptr prim_103; - ptr prim_104; - ptr prim_105; - ptr prim_106; - ptr prim_107; - ptr prim_108; - ptr prim_109; - ptr prim_110; - ptr prim_111; - ptr prim_112; - ptr prim_113; - ptr prim_114; - ptr prim_115; - ptr prim_116; - ptr prim_117; - ptr prim_118; - ptr prim_119; - ptr prim_120; - ptr prim_121; - ptr prim_122; - ptr prim_123; - ptr prim_124; - ptr prim_125; - ptr prim_126; - ptr prim_127; - ptr prim_128; - ptr prim_129; - ptr prim_130; - ptr prim_131; - ptr prim_132; - ptr prim_133; - ptr prim_134; - ptr prim_135; - ptr prim_136; - ptr prim_137; - ptr prim_138; - ptr prim_139; - ptr prim_140; - ptr prim_141; - ptr prim_142; - ptr prim_143; - ptr prim_144; - ptr prim_145; - ptr prim_146; - ptr prim_147; - ptr prim_148; - ptr prim_149; - ptr prim_150; - ptr prim_151; - ptr prim_152; - ptr prim_153; - ptr prim_154; - ptr prim_155; - ptr prim_156; - ptr prim_157; - ptr prim_158; - ptr prim_159; - ptr prim_160; - ptr prim_161; - ptr prim_162; - ptr prim_163; - ptr prim_164; - ptr prim_165; - ptr prim_166; - ptr prim_167; - ptr prim_168; - ptr prim_169; - ptr prim_170; - ptr prim_171; - ptr prim_172; - ptr prim_173; - ptr prim_174; - ptr prim_175; - ptr prim_176; - ptr prim_177; - ptr prim_178; - ptr prim_179; - ptr prim_180; - ptr prim_181; - ptr prim_182; - ptr prim_183; - ptr prim_184; - ptr prim_185; - ptr prim_186; - ptr prim_187; - ptr prim_188; - ptr prim_189; - ptr prim_190; - ptr prim_191; - ptr prim_192; - ptr prim_193; - ptr prim_194; - ptr prim_195; - ptr prim_196; - ptr prim_197; - ptr prim_198; - ptr prim_199; - ptr prim_200; - ptr prim_201; - ptr prim_202; - ptr prim_203; - ptr prim_204; - ptr prim_205; - ptr prim_206; - ptr prim_207; - ptr prim_208; - ptr prim_209; - ptr prim_210; - ptr prim_211; - ptr prim_212; - ptr prim_213; - ptr prim_214; - ptr prim_215; - ptr prim_216; - ptr prim_217; - ptr prim_218; - ptr prim_219; - ptr prim_220; - ptr prim_221; - ptr prim_222; - ptr prim_223; - ptr prim_224; - ptr prim_225; - ptr prim_226; - ptr prim_227; - ptr prim_228; - ptr prim_229; - ptr prim_230; - ptr prim_231; - ptr prim_232; - ptr prim_233; - ptr prim_234; - ptr prim_235; - ptr prim_236; - ptr prim_237; - ptr prim_238; - ptr prim_239; - ptr prim_240; - ptr prim_241; - ptr scheme_objects_end; -} pcb_t; -ptr scheme_entry(pcb_t* pcb); -extern ptr scheme_main(pcb_t* pcb); -#endif /* SCHEME_H */ diff --git a/src/stst b/src/stst deleted file mode 100755 index dc8ae39..0000000 Binary files a/src/stst and /dev/null differ diff --git a/src/stst.fasl b/src/stst.fasl deleted file mode 100644 index 89a8d3e..0000000 Binary files a/src/stst.fasl and /dev/null differ diff --git a/src/test.ss b/src/test.ss new file mode 100644 index 0000000..a23fc8c --- /dev/null +++ b/src/test.ss @@ -0,0 +1,2 @@ +(define (asm-helpers) + )