€h’’’’ž’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’ž’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’A@y¢ #ķAŠ— # ¤¬ז # ¤ĖŪ– #¤/Ż– #¤Fą– # ¤į– #!¤"5ä– #"#$%&'(*¤Ńč– #12345¤$ė– #6789:;<>¤X ļ– #ABC¤$š– #DE¤ ņ– #F¤!ó– #G¤(õ– #HIJKLMNP¤® ų– #QRS¤Łś– #TUķĶ0ž– #VWXYZ[\^¤}— #de¤„— #f¤Ļ— #gh¤ø— #i¤¹4 — #jklmnopr¤%— #yz{|}~¤® — #€¤„— #‚ƒ¤ī— #„¤V— #…†‡ˆ‰¤y— #Š‹’A€Ź¢ #ŒķŲŗ¦¢ #Ž‘’“•ķVŖ¢ #½ķg¬¢ #¾ķß®¢ #椁čĘ¢ #ĄĮĀĆÄÅĘČķŲdÓ¢ #üżž’...mmlib...alloc.calloc.sbreak.cbreak.sconst.hexec.c exec.s forkexit.c forkexit.s getset.c getset.sglo.hmain.cmain.smakefilemmmproc.hparam.hputc.cputc.ssignal.csignal.stable.ctable.stype.hutility.cutility.s/* This file is concerned with allocating and freeing arbitrary-size blocks of * physical memory on behalf of the FORK and EXEC system calls. The key data * structure used is the hole table, which maintains a list of holes in memory. * It is kept sorted in order of increasing memory address. The addresses * it contains refer to physical memory, starting at absolute address 0 * (i.e., they are not relative to the start of MM). During system * initialization, that part of memory containing the interrupt vectors, * kernel, and MM are "allocated" to mark them as not available and to * remove them from the hole list. * * The entry points into this file are: * alloc_mem: allocate a given sized chunk of memory * free_mem: release a previously allocated chunk of memory * mem_init: initialize the tables when MM start up * max_hole: returns the largest hole currently available */ #include "../h/const.h" #include "../h/type.h" #include "const.h" #define NR_HOLES 128 /* max # entries in hole table */ #define NIL_HOLE (struct hole *) 0 PRIVATE struct hole { phys_clicks h_base; /* where does the hole begin? */ phys_clicks h_len; /* how big is the hole? */ struct hole *h_next; /* pointer to next entry on the list */ } hole[NR_HOLES]; PRIVATE struct hole *hole_head; /* pointer to first hole */ PRIVATE struct hole *free_slots; /* ptr to list of unused table slots */ /*===========================================================================* * alloc_mem * *===========================================================================*/ PUBLIC phys_clicks alloc_mem(clicks) phys_clicks clicks; /* amount of memory requested */ { /* Allocate a block of memory from the free list using first fit. The block * consists of a sequence of contiguous bytes, whose length in clicks is * given by 'clicks'. A pointer to the block is returned. The block is * always on a click boundary. This procedure is called when memory is * needed for FORK or EXEC. */ register struct hole *hp, *prev_ptr; phys_clicks old_base; hp = hole_head; while (hp != NIL_HOLE) { if (hp->h_len >= clicks) { /* We found a hole that is big enough. Use it. */ old_base = hp->h_base; /* remember where it started */ hp->h_base += clicks; /* bite a piece off */ hp->h_len -= clicks; /* ditto */ /* If hole is only partly used, reduce size and return. */ if (hp->h_len != 0) return(old_base); /* The entire hole has been used up. Manipulate free list. */ del_slot(prev_ptr, hp); return(old_base); } prev_ptr = hp; hp = hp->h_next; } return(NO_MEM); } /*===========================================================================* * free_mem * *===========================================================================*/ PUBLIC free_mem(base, clicks) phys_clicks base; /* base address of block to free */ phys_clicks clicks; /* number of clicks to free */ { /* Return a block of free memory to the hole list. The parameters tell where * the block starts in physical memory and how big it is. The block is added * to the hole list. If it is contiguous with an existing hole on either end, * it is merged with the hole or holes. */ register struct hole *hp, *new_ptr, *prev_ptr; if ( (new_ptr = free_slots) == NIL_HOLE) panic("Hole table full", NO_NUM); new_ptr->h_base = base; new_ptr->h_len = clicks; free_slots = new_ptr->h_next; hp = hole_head; /* If this block's address is numerically less than the lowest hole currently * available, or if no holes are currently available, put this hole on the * front of the hole list. */ if (hp == NIL_HOLE || base <= hp->h_base) { /* Block to be freed goes on front of hole list. */ new_ptr->h_next = hp; hole_head = new_ptr; merge(new_ptr); return; } /* Block to be returned does not go on front of hole list. */ while (hp != NIL_HOLE && base > hp->h_base) { prev_ptr = hp; hp = hp->h_next; } /* We found where it goes. Insert block after 'prev_ptr'. */ new_ptr->h_next = prev_ptr->h_next; prev_ptr->h_next = new_ptr; merge(prev_ptr); /* sequence is 'prev_ptr', 'new_ptr', 'hp' */ } /*===========================================================================* * del_slot * *===========================================================================*/ PRIVATE del_slot(prev_ptr, hp) register struct hole *prev_ptr; /* pointer to hole entry just ahead of 'hp' */ register struct hole *hp; /* pointer to hole entry to be removed */ { /* Remove an entry from the hole list. This procedure is called when a * request to allocate memory removes a hole in its entirety, thus reducing * the numbers of holes in memory, and requiring the elimination of one * entry in the hole list. */ if (hp == hole_head) hole_head = hp->h_next; else prev_ptr->h_next = hp->h_next; hp->h_next = free_slots; free_slots = hp; } /*===========================================================================* * merge * *===========================================================================*/ PRIVATE merge(hp) register struct hole *hp; /* ptr to hole to merge with its successors */ { /* Check for contiguous holes and merge any found. Contiguous holes can occur * when a block of memory is freed, and it happens to abut another hole on * either or both ends. The pointer 'hp' points to the first of a series of * three holes that can potentially all be merged together. */ register struct hole *next_ptr; /* If 'hp' points to the last hole, no merging is possible. If it does not, * try to absorb its successor into it and free the successor's table entry. */ if ( (next_ptr = hp->h_next) == NIL_HOLE) return; if (hp->h_base + hp->h_len == next_ptr->h_base) { hp->h_len += next_ptr->h_len; /* first one gets second one's mem */ del_slot(hp, next_ptr); } else { hp = next_ptr; } /* If 'hp' now points to the last hole, return; otherwise, try to absorb its * succesor into it. */ if ( (next_ptr = hp->h_next) == NIL_HOLE) return; if (hp->h_base + hp->h_len == next_ptr->h_base) { hp->h_len += next_ptr->h_len; del_slot(hp, next_ptr); } } /*===========================================================================* * max_hole * *===========================================================================*/ PUBLIC phys_clicks max_hole() { /* Scan the hole list and return the largest hole. */ register struct hole *hp; register phys_clicks max; hp = hole_head; max = 0; while (hp != NIL_HOLE) { if (hp->h_len > max) max = hp->h_len; hp = hp->h_next; } return(max); } /*===========================================================================* * mem_init * *===========================================================================*/ PUBLIC mem_init(clicks) phys_clicks clicks; /* amount of memory available */ { /* Initialize hole lists. There are two lists: 'hole_head' points to a linked * list of all the holes (unused memory) in the system; 'free_slots' points to * a linked list of table entries that are not in use. Initially, the former * list has one entry, a single hole encompassing all of memory, and the second * list links together all the remaining table slots. As memory becomes more * fragmented in the course of time (i.e., the initial big hole breaks up into * many small holes), new table slots are needed to represent them. These * slots are taken from the list headed by 'free_slots'. */ register struct hole *hp; for (hp = &hole[0]; hp < &hole[NR_HOLES]; hp++) hp->h_next = hp + 1; hole[0].h_next = NIL_HOLE; /* only 1 big hole initially */ hole[NR_HOLES-1].h_next = NIL_HOLE; hole_head = &hole[0]; free_slots = &hole[1]; hole[0].h_base = 0; hole[0].h_len = clicks; } É_alloc_mem † _alloc_mem: ƒ ‚ ×ņ,#8 Ąå_hole_head ĄĘ,ģ • ĶĘö ± § ¢ Ķ2Ē,ė jb I0016 § « ĄŠ,ė — ĄŲ,ė ĄåŲ « ÄäÅ ° § Äā2 ĄŲ,ģ « ×äÅ ° § Ķ2Ēö je I0019 ĮŠ š I0019: ” ¹ Ó_del_slot Š Š ĮŠ š ½ — ¬ § Ąä4Ē ” ­   ‡ € Ÿ  … „  É_free_mem _free_mem: ƒ ‚ ×ņ,#6 Ąå_free_slots ĄĻ,ģ Ķ_free_slotsö ŁI0023 Ąį32768 € Ąį_1 € Ó_panic Š Š I0023: ¢ ĄåĻ ° ĄåĻ ĄäĪ Ą2Ē,ė ĄåĻ Ąå4Ē Ą_free_slots,ģ Ąå_hole_head ĄĘ,ģ ĶĘö je I0025 § « ĶÅ,ė ja I002A I0025: ĄåĻ — Ą4Ē,ė ĄåĻ Ą_hole_head,ģ ¹ Ó_merge Š … „  I002A: ĶĘö je I0029 § « ĶÅ,ė jbe I0029 — ĄŠ,ė § Ąä4Ē ” ĢI002A I0029: ĄåŠ ĄčĻ Ąä4Ē Ą4(ļ),ė ĄåŠ £ Ą4Ē,ė ĮŠ Ó_merge Š … „  _del_slot: ƒ ‚ Ąå_hole_head ĶĪ,ģ ŁI0033 Æ Ąå4Ē Ą_hole_head,ģ ĢI0034 I0033: Æ ĄčÅ Ąä4Ē Ą4(ļ),ė I0034: Æ Ąę_free_slots Ą4Ē,ķ Æ Ą_free_slots,ģ … „  _merge: ƒ ‚ € € ’ Ąä4Ē ” ĶĘö ŁI0043 … „  I0043: ’ ĄčÅ Ąä2Ē Ää(ļ) § ĶĒ,ė ŁI0046 Ąå4(ń) Äā2 ĄĻ,ģ ĄčĘ « Ää2(ļ) ° ” ˆ Ó_del_slot Š Š ĢI0047 I0046: — ĄÅ,ė I0047: ’ Ąä4Ē ” ĶĘö ŁI0049 … „  I0049: ’ ĄčÅ Ąä2Ē Ää(ļ) § ĶĒ,ė ŁI004C ’ Äā2 ĄĻ,ģ ĄčĘ « Ää2(ļ) ° ” ˆ Ó_del_slot Š Š I004C: … „  É_mė_hole _mė_hole: ƒ ‚ € € Ąå_hole_head ĄĘ,ģ ĄĻö I0053: ĶĘö je I0052 § £ Ķ2Ē,ė jbe I0056 § Ąä2Ē ¬ I0056: § Ąä4Ē ” ĢI0053 I0052: £ … „  É_mem_init _mem_init: ƒ ‚ € ĄĘ,#_hole I0065: ĶĘ,#_hole+768 jae I0062 § Äā6 ĄčĘ Ą4(ļ),ģ ÄĘ,#6 ĢI0065 I0062: Ą_hole+4ö Ą_hole+766ö Ą_hole_head,#_hole Ą_free_slots,#_hole+6 Ą_holeö ’ Ą_hole+2,ģ … „  ³ _free_slots: .zerow 2/2 _hole_head: .zerow 2/2 _hole: .zerow 768/2 ® _1: Ā28488 Ā25964 Ā29728 Ā25185 Ā25964 Ā26144 Ā27765 Ā108 † /* The MINIX model of memory allocation reserves a fixed amount of memory for * the combined text, data, and stack segements. The amount used for a child * process created by FORK is the same as the parent had. If the child does * an EXEC later, the new size is taken from the header of the file EXEC'ed. * * The layout in memory consists of the text segment, followed by the data * segment, followed by a gap (unused memory), followed by the stack segment. * The data segment grows upward and the stack grows downward, so each can * take memory from the gap. If they meet, the process must be killed. The * procedures in this file deal with the growth of the data and stack segments. * * The entry points into this file are: * do_brk: BRK/SBRK system calls to grow or shrink the data segment * adjust: see if a proposed segment adjustment is allowed * size_ok: see if the segment sizes are feasible * stack_fault: grow the stack segment */ #include "../h/const.h" #include "../h/type.h" #include "../h/error.h" #include "../h/signal.h" #include "const.h" #include "glo.h" #include "mproc.h" #include "param.h" #define DATA_CHANGED 1 /* flag value when data segment size changed */ #define STACK_CHANGED 2 /* flag value when stack size changed */ /*===========================================================================* * do_brk * *===========================================================================*/ PUBLIC int do_brk() { /* Perform the brk(addr) system call. * * The call is complicated by the fact that on some machines (e.g., 8088), * the stack pointer can grow beyond the base of the stack segment without * anybody noticing it. For a file not using separate I & D space, * the parameter, 'addr' is to the total size, text + data. For a file using * separate text and data spaces, it is just the data size. Files using * separate I & D space have the SEPARATE bit in mp_flags set. */ register struct mproc *rmp; int r; vir_bytes v, new_sp; vir_clicks new_clicks; rmp = mp; v = (vir_bytes) addr; /* 'addr' is the new data segment size */ new_clicks = (vir_clicks) ( ((long) v + CLICK_SIZE - 1) >> CLICK_SHIFT); sys_getsp(who, &new_sp); /* ask kernel for current sp value */ r = adjust(rmp, new_clicks, new_sp); res_ptr = (r == OK ? addr : (char *) -1); return(r); /* return new size or -1 */ } /*===========================================================================* * adjust * *===========================================================================*/ PUBLIC int adjust(rmp, data_clicks, sp) register struct mproc *rmp; /* whose memory is being adjusted? */ vir_clicks data_clicks; /* how big is data segment to become? */ vir_bytes sp; /* new value of sp */ { /* See if data and stack segments can coexist, adjusting them if need be. * Memory is never allocated or freed. Instead it is added or removed from the * gap between data segment and stack segment. If the gap size becomes * negative, the adjustment of data or stack fails and ENOMEM is returned. */ register struct mem_map *mem_sp, *mem_dp; vir_clicks sp_click, gap_base, lower, old_clicks; int changed, r, ft; long base_of_stack, delta; /* longs avoid certain problems */ mem_dp = &rmp->mp_seg[D]; /* pointer to data segment map */ mem_sp = &rmp->mp_seg[S]; /* pointer to stack segment map */ changed = 0; /* set when either segment changed */ /* See if stack size has gone negative (i.e., sp too close to 0xFFFF...) */ base_of_stack = (long) mem_sp->mem_vir + (long) mem_sp->mem_len; sp_click = sp >> CLICK_SHIFT; /* click containing sp */ if (sp_click >= base_of_stack) return(ENOMEM); /* sp too high */ /* Compute size of gap between stack and data segments. */ delta = (long) mem_sp->mem_vir - (long) sp_click; lower = (delta > 0 ? sp_click : mem_sp->mem_vir); gap_base = mem_dp->mem_vir + data_clicks; if (lower < gap_base) return(ENOMEM); /* data and stack collided */ /* Update data length (but not data orgin) on behalf of brk() system call. */ old_clicks = mem_dp->mem_len; if (data_clicks != mem_dp->mem_len) { mem_dp->mem_len = data_clicks; changed |= DATA_CHANGED; } /* Update stack length and origin due to change in stack pointer. */ if (delta > 0) { mem_sp->mem_vir -= delta; mem_sp->mem_phys -= delta; mem_sp->mem_len += delta; changed |= STACK_CHANGED; } /* Do the new data and stack segment sizes fit in the address space? */ ft = (rmp->mp_flags & SEPARATE); r = size_ok(ft, rmp->mp_seg[T].mem_len, rmp->mp_seg[D].mem_len, rmp->mp_seg[S].mem_len, rmp->mp_seg[D].mem_vir, rmp->mp_seg[S].mem_vir); if (r == OK) { if (changed) sys_newmap(rmp - mproc, rmp->mp_seg); return(OK); } /* New sizes don't fit or require too many page/segment registers. Restore.*/ if (changed & DATA_CHANGED) mem_dp->mem_len = old_clicks; if (changed & STACK_CHANGED) { mem_sp->mem_vir += delta; mem_sp->mem_phys += delta; mem_sp->mem_len -= delta; } return(ENOMEM); } /*===========================================================================* * size_ok * *===========================================================================*/ PUBLIC int size_ok(file_type, tc, dc, sc, dvir, s_vir) int file_type; /* SEPARATE or 0 */ vir_clicks tc; /* text size in clicks */ vir_clicks dc; /* data size in clicks */ vir_clicks sc; /* stack size in clicks */ vir_clicks dvir; /* virtual address for start of data seg */ vir_clicks s_vir; /* virtual address for start of stack seg */ { /* Check to see if the sizes are feasible and enough segmentation registers * exist. On a machine with eight 8K pages, text, data, stack sizes of * (32K, 16K, 16K) will fit, but (33K, 17K, 13K) will not, even though the * former is bigger (64K) than the latter (63K). Even on the 8088 this test * is needed, since the data and stack may not exceed 4096 clicks. */ int pt, pd, ps; /* segment sizes in pages */ pt = ( (tc << CLICK_SHIFT) + PAGE_SIZE - 1)/PAGE_SIZE; pd = ( (dc << CLICK_SHIFT) + PAGE_SIZE - 1)/PAGE_SIZE; ps = ( (sc << CLICK_SHIFT) + PAGE_SIZE - 1)/PAGE_SIZE; if (file_type == SEPARATE) { if (pt > MAX_PAGES || pd + ps > MAX_PAGES) return(ENOMEM); } else { if (pt + pd + ps > MAX_PAGES) return(ENOMEM); } if (dvir + dc > s_vir) return(ENOMEM); return(OK); } /*===========================================================================* * stack_fault * *===========================================================================*/ PUBLIC stack_fault(proc_nr) int proc_nr; /* tells who got the stack fault */ { /* Handle a stack fault by growing the stack segment until sp is inside of it. * If this is impossible because data segment is in the way, kill the process. */ register struct mproc *rmp; int r; vir_bytes new_sp; rmp = &mproc[proc_nr]; sys_getsp(rmp - mproc, &new_sp); r = adjust(rmp, rmp->mp_seg[D].mem_len, new_sp); if (r == OK) return; /* Stack has bumped into data segment. Kill the process. */ rmp->mp_catch = 0; /* don't catch this signal */ sig_proc(rmp, SIGSEGV); /* terminate process */ } É_do_brk † _do_brk: ƒ ‚ ×ņ,#10 Ąå_mp ĄĘ,ģ Ąå_mm_in+10 ĄŠ,ģ ‡ € Ąć4 Ąā4 ĄäŠ – ‰ Äį16 adc ā0 ×į1 sbb ā0 Ąć4 © 2: shr ā1 rcr į1 Ø 1: Ą-10(ń),ė ŪäŲ € Į_who Ó_sys_getņ Š Š ĮŲ Į-10(ń) ” Ó_adjust ¤ ¬ ĶĻö ŁI0013 Į_mm_in+10 ĢI0014 • Ąį-1 € I0014: Ć_res_ptr £ … „  É_adjust _adjust: ƒ ‚ ×ņ,#28 ’ Äā6 ĄĻ,ģ ’ Äā12 ĄĘ,ģ Ą-1Åö § ‡ ĄčĘ Ėęķ Ąå4Ē Äå(ļ) adc äķ Ą-22(ń),ģ Ą-20(ń),ė Ąć4 ĄäŌ shr äcl ĄŠ,ė ‡ € Ąā4 Ąä-22(ń) ĮŠ Į-20(ń) – € Ó.cmu4 ™ jl I0023 Ąį-12 € ĢI0021 I0023: Ąbx,Ę ‡ Ėęķ ĄåĒ ×åŠ sbb äķ Ą-2Ī,ģ Ą-2Å,ė Ąä-2Ī Ąå-2Å ×į0 sbb ā0 Ł1f Öäė je 1f Üģ 1: or åģ jle I0026 ĮŠ ĢI0027 I0026: § ĮĒ I0027: Ć-10(ń) ĄåĻ « ÄäĪ ĄŲ,ė ĄäŲ Ķ-10(ń),ė jae I0029 Ąį-12 € ĢI0021 I0029: ĄåĻ Ąä4Ē Ą-12(ń),ė Ąä4Ē ĶĪ,ė je I002C ĄåĻ ĄäĪ Ą4Ē,ė or -1Å,#1 I002C: Ąä-2Ī Ąå-2Å ×į0 sbb ā0 Ł1f Öäė je 1f Üģ 1: or åģ jle I002F — Ą-2Ō,ė Ąå-2Ō ‡ € ĮĒ Ąć4 Ąā4 Ąä-2Ī Į-2Å – ‰ Ćķ Ćī ×ęė sbb ēģ Ąå-2Ō ĄĒ,ķ § Äā2 Ą-2Ō,ģ ‡ € ĮĒ Ąć4 Ąā4 Ąä-2Ī Į-2Å – ‰ Ćķ Ćī ×ęė sbb ēģ Ąå-2Ō Ą(ģ),ķ § Äā4 Ą-2Ō,ģ ‡ € ĮĒ Ąć4 Ąā4 Ąä-2Ī Į-2Å – ‰ Ćķ Ćī Äęė adc ēģ Ąå-2Ō ĄĒ,ķ or -1Å,#2 I002F: ’ Ąä38Ē Öį32  ž – Ą-1Ō,ė ’ ĄčÅ ĄéÅ Į12Ē Į6(ļ) Į16(š) Į10Ē Į4(ļ) Į-1Ō Ó_ļze_ok Äņ,#12 Ą-1Ī,ė Ķ-1Īö ŁI00212 Ķ-1Åö je I00215 ¢ ×į_mproc Ąā40 cwd išv ģ ˆ € Ó_sys_newmap Š Š I00215: ‡ € ĢI0021 I00212: test -1Å,#1 je I00218 ĄåĻ Ąä-12(ń) Ą4Ē,ė I00218: test -1Å,#2 je I0021B — Ą-2Ō,ė Ąå-2Ō ‡ € ĮĒ Ąć4 Ąā4 Ąä-2Ī Į-2Å – ‰ Ćķ Ćī Äęė adc ēģ Ąå-2Ō ĄĒ,ķ § Äā2 Ą-2Ō,ģ ‡ € ĮĒ Ąę#4 Ąā4 Ąä-2Ī Į-2Å – ‰ Ćķ Ćī Äęė adc ēģ Ąå-2Ō ĄĒ,ķ § Äā4 Ą-2Ō,ģ ‡ € ĮĒ Ąć4 Ąā4 Ąä-2Ī Į-2Å – ‰ Ćķ Ćī ×ęė sbb ēģ Ąå-2Ō ĄĒ,ķ I0021B: Ąį-12 € I0021:  … „  É_ļze_ok _ļze_ok: ƒ ‚ ×ņ,#6 Ąć4 ĄäĪ sal äcl Äį16 ×į1 Ąā16 Ėēī šv ģ  ž – ” Ąć4 ĄäŌ sal äcl Äį16 ×į1 Ąā16 Ėēī šv ģ  ž – ¬ Ąć4 Ąä10(ń) sal äcl Äį16 ×į1 Ąā16 Ėēī šv ģ  ž – ĄŠ,ė  ž ¢ – Ķį32 ŁI0033 ĶĘ,#4096 jg I0035 ĄäŠ ÄäĻ Ķį4096 jle I0034 I0035: Ąį-12 € ĢI0031 I0033: £ ÄäĘ ÄäŠ Ķį4096 jle I0034 Ąį-12 € ĢI0031 I0034: ĄäŌ Ää12(ń) Ķ1Å,ė jae I003D Ąį-12 € ĢI0031 I003D: ‡ € I0031:  … „  É_stack_fault _stack_fault: ƒ ‚ ×ņ,#6 Ąį40 mul Å » Äā_mproc ĄĘ,ģ — ×į_mproc Ąā40 cwd išv ģ ŪåŠ ¦ € Ó_sys_getņ Š Š § ĮŠ Į10Ē ” Ó_adjust ¤ ¬ ĶĻö ŁI0043 … „  I0043: § Ą34Ēö 1 € ” Ó_ļg_proc Š Š … „  /* Constants used by the Memory Manager. */ #define ZEROBUF_SIZE 1024 /* buffer size for erasing memory */ /* Size of MM's stack depends mostly on do_exec(). */ #if ZEROBUF_SIZE > MAX_PATH #define MM_STACK_BYTES MAX_ISTACK_BYTES + ZEROBUF_SIZE + 384 #else #define MM_STACK_BYTES MAX_ISTACK_BYTES + MAX_PATH + 384 #endif #define NO_MEM (phys_clicks)0 /* returned by alloc_mem() with mem is up */ #ifdef i8088 #define PAGE_SIZE 16 /* how many bytes in a page */ #define MAX_PAGES 4096 /* how many pages in the virtual addr space */ #define HDR_SIZE 32 /* # bytes in the exec file header */ #endif #define printf printk /* This file handles the EXEC system call. It performs the work as follows: * - see if the permissions allow the file to be executed * - read the header and extract the sizes * - fetch the initial args and environment from the user space * - allocate the memory for the new process * - copy the initial stack from MM to the process * - read in the text and data segments and copy to the process * - take care of setuid and setgid bits * - fix up 'mproc' table * - tell kernel about EXEC * * The only entry point is do_exec. */ #include "../h/const.h" #include "../h/type.h" #include "../h/callnr.h" #include "../h/error.h" #include "../h/stat.h" #include "const.h" #include "glo.h" #include "mproc.h" #include "param.h" #define MAGIC 0x04000301L /* magic number with 2 bits masked off */ #define SEP 0x00200000L /* value for separate I & D */ #define TEXTB 2 /* location of text size in header */ #define DATAB 3 /* location of data size in header */ #define BSSB 4 /* location of bss size in header */ #define TOTB 6 /* location of total size in header */ /*===========================================================================* * do_exec * *===========================================================================*/ PUBLIC int do_exec() { /* Perform the exece(name, argv, envp) call. The user library builds a * complete stack image, including pointers, args, environ, etc. The stack * is copied to a buffer inside MM, and then to the new core image. */ register struct mproc *rmp; int m, r, fd, ft; char mbuf[MAX_ISTACK_BYTES]; /* buffer for stack and zeroes */ union u { char name_buf[MAX_PATH]; /* the name of the file to exec */ char zb[ZEROBUF_SIZE]; /* used to zero bss */ } u; char *new_sp; vir_bytes src, dst, text_bytes, data_bytes, bss_bytes, stk_bytes, vsp; phys_bytes tot_bytes; /* total space for program, including gap */ vir_clicks sc; struct stat s_buf; /* Do some validity checks. */ rmp = mp; stk_bytes = (vir_bytes) stack_bytes; if (stk_bytes > MAX_ISTACK_BYTES) return(ENOMEM); /* stack too big */ if (exec_len <= 0 || exec_len > MAX_PATH) return(EINVAL); /* Get the exec file name and see if the file is executable. */ src = (vir_bytes) exec_name; dst = (vir_bytes) u.name_buf; r = mem_copy(who, D, (long) src, MM_PROC_NR, D, (long) dst, (long) exec_len); if (r != OK) return(r); /* file name not in user data segment */ tell_fs(CHDIR, who, 0, 0); /* temporarily switch to user's directory */ fd = allowed(u.name_buf, &s_buf, X_BIT); /* is file executable? */ tell_fs(CHDIR, 0, 1, 0); /* switch back to MM's own directory */ if (fd < 0) return(fd); /* file was not executable */ /* Read the file header and extract the segment sizes. */ sc = (stk_bytes + CLICK_SIZE - 1) >> CLICK_SHIFT; m = read_header(fd, &ft, &text_bytes, &data_bytes, &bss_bytes, &tot_bytes,sc); if (m < 0) { close(fd); /* something wrong with header */ return(ENOEXEC); } /* Fetch the stack from the user before destroying the old core image. */ src = (vir_bytes) stack_ptr; dst = (vir_bytes) mbuf; r = mem_copy(who, D, (long) src, MM_PROC_NR, D, (long) dst, (long) stk_bytes); if (r != OK) { close(fd); /* can't fetch stack (e.g. bad virtual addr) */ return(EACCES); } /* Allocate new memory and release old memory. Fix map and tell kernel. */ r = new_mem(text_bytes, data_bytes, bss_bytes, stk_bytes, tot_bytes, u.zb, ZEROBUF_SIZE); if (r != OK) { close(fd); /* insufficient core or program too big */ return(r); } /* Patch up stack and copy it from MM to new core image. */ vsp = (vir_bytes) rmp->mp_seg[S].mem_vir << CLICK_SHIFT; patch_ptr(mbuf, vsp); src = (vir_bytes) mbuf; r = mem_copy(MM_PROC_NR, D, (long) src, who, D, (long) vsp, (long) stk_bytes); if (r != OK) panic("do_exec stack copy err", NO_NUM); /* Read in text and data segments. */ load_seg(fd, T, text_bytes); load_seg(fd, D, data_bytes); close(fd); /* don't need exec file any more */ /* Take care of setuid/setgid bits. */ if (s_buf.st_mode & I_SET_UID_BIT) { rmp->mp_effuid = s_buf.st_uid; tell_fs(SETUID, who, (int) rmp->mp_realuid, (int) rmp->mp_effuid); } if (s_buf.st_mode & I_SET_GID_BIT) { rmp->mp_effgid = s_buf.st_gid; tell_fs(SETGID, who, (int) rmp->mp_realgid, (int) rmp->mp_effgid); } /* Fix up some 'mproc' fields and tell kernel that exec is done. */ rmp->mp_catch = 0; /* reset all caught signals */ rmp->mp_flags &= ~SEPARATE; /* turn off SEPARATE bit */ rmp->mp_flags |= ft; /* turn it on for separate I & D files */ new_sp = (char *) vsp; sys_exec(who, new_sp); return(OK); } /*===========================================================================* * read_header * *===========================================================================*/ PRIVATE int read_header(fd, ft, text_bytes, data_bytes, bss_bytes, tot_bytes,sc) int fd; /* file descriptor for reading exec file */ int *ft; /* place to return ft number */ vir_bytes *text_bytes; /* place to return text size */ vir_bytes *data_bytes; /* place to return initialized data size */ vir_bytes *bss_bytes; /* place to return bss size */ phys_bytes *tot_bytes; /* place to return total size */ vir_clicks sc; /* stack size in clicks */ { /* Read the header and extract the text, data, bss and total sizes from it. */ int m, ct; vir_clicks tc, dc, s_vir, dvir; phys_clicks totc; long buf[HDR_SIZE/sizeof(long)]; /* Read the header and check the magic number. The standard MINIX header * consists of 8 longs, as follows: * 0: 0x04100301L (combined I & D space) or 0x04200301L (separate I & D) * 1: 0x00000020L * 2: size of text segments in bytes * 3: size of initialized data segment in bytes * 4: size of bss in bytes * 5: 0x00000000L * 6: total memory allocated to program (text, data and stack, combined) * 7: 0x00000000L * The longs are represented low-order byte first and high-order byte last. * The first byte of the header is always 0x01, followed by 0x03. * The header is followed directly by the text and data segments, whose sizes * are given in the header. */ if (read(fd, buf, HDR_SIZE) != HDR_SIZE) return(ENOEXEC); if ( (buf[0] & 0xFF0FFFFFL) != MAGIC) return(ENOEXEC); *ft = (buf[0] & SEP ? SEPARATE : 0); /* separate I & D or not */ /* Get text and data sizes. */ *text_bytes = (vir_bytes) buf[TEXTB]; /* text size in bytes */ *data_bytes = (vir_bytes) buf[DATAB]; /* data size in bytes */ if (*ft != SEPARATE) { /* If I & D space is not separated, it is all considered data. Text=0 */ *data_bytes += *text_bytes; *text_bytes = 0; } /* Get bss and total sizes. */ *bss_bytes = (vir_bytes) buf[BSSB]; /* bss size in bytes */ *tot_bytes = buf[TOTB]; /* total bytes to allocate for program */ if (*tot_bytes == 0) return(ENOEXEC); /* Check to see if segment sizes are feasible. */ tc = (*text_bytes + CLICK_SHIFT - 1) >> CLICK_SHIFT; dc = (*data_bytes + *bss_bytes + CLICK_SHIFT - 1) >> CLICK_SHIFT; totc = (*tot_bytes + CLICK_SIZE - 1) >> CLICK_SHIFT; if (dc >= totc) return(ENOEXEC); /* stack must be at least 1 click */ dvir = (*ft == SEPARATE ? 0 : tc); s_vir = dvir + (totc - sc); m = size_ok(*ft, tc, dc, sc, dvir, s_vir); ct = buf[1] & BYTE; /* header length */ if (ct > HDR_SIZE) read(fd, buf, ct - HDR_SIZE); /* skip unused hdr */ return(m); } /*===========================================================================* * new_mem * *===========================================================================*/ PRIVATE int new_mem(text_bytes, data_bytes, bss_bytes,stk_bytes,tot_bytes,bf,zs) vir_bytes text_bytes; /* text segment size in bytes */ vir_bytes data_bytes; /* size of initialized data in bytes */ vir_bytes bss_bytes; /* size of bss in bytes */ vir_bytes stk_bytes; /* size of initial stack segment in bytes */ phys_bytes tot_bytes; /* total memory to allocate, including gap */ char bf[ZEROBUF_SIZE]; /* buffer to use for zeroing data segment */ int zs; )+,-./0 /* true size of 'bf' */ { /* Allocate new memory and release the old memory. Change the map and report * the new map to the kernel. Zero the new core image's bss, gap and stack. */ register struct mproc *rmp; char *rzp; vir_bytes vzb; vir_clicks text_clicks, data_clicks, gap_clicks, stack_clicks, tot_clicks; phys_clicks new_base, old_clicks; phys_bytes bytes, base, count, bss_offset; extern phys_clicks alloc_mem(); extern phys_clicks max_hole(); /* Acquire the new memory. Each of the 4 parts: text, (data+bss), gap, * and stack occupies an integral number of clicks, starting at click * boundary. The data and bss parts are run together with no space. */ text_clicks = (text_bytes + CLICK_SIZE - 1) >> CLICK_SHIFT; data_clicks = (data_bytes + bss_bytes + CLICK_SIZE - 1) >> CLICK_SHIFT; stack_clicks = (stk_bytes + CLICK_SIZE - 1) >> CLICK_SHIFT; tot_clicks = (tot_bytes + CLICK_SIZE - 1) >> CLICK_SHIFT; gap_clicks = tot_clicks - data_clicks - stack_clicks; if ( (int) gap_clicks < 0) return(ENOMEM); /* Check to see if there is a hole big enough. If so, we can risk first * releasing the old core image before allocating the new one, since we * know it will succeed. If there is not enough, return failure. */ if (text_clicks + tot_clicks > max_hole()) return(EAGAIN); /* There is enough memory for the new core image. Release the old one. */ rmp = mp; old_clicks = (phys_clicks) rmp->mp_seg[S].mem_vir + rmp->mp_seg[S].mem_len; if (rmp->mp_flags & SEPARATE) old_clicks += rmp->mp_seg[T].mem_len; free_mem(rmp->mp_seg[T].mem_phys, old_clicks); /* free the memory */ /* We have now passed the point of no return. The old core image has been * forever lost. The call must go through now. Set up and report new map. */ new_base = alloc_mem(text_clicks + tot_clicks); /* new core image */ if (new_base == NO_MEM) panic("MM hole list is inconsistent", NO_NUM); rmp->mp_seg[T].mem_vir = 0; rmp->mp_seg[T].mem_len = text_clicks; rmp->mp_seg[T].mem_phys = new_base; rmp->mp_seg[D].mem_vir = 0; rmp->mp_seg[D].mem_len = data_clicks; rmp->mp_seg[D].mem_phys = new_base + text_clicks; rmp->mp_seg[S].mem_vir = rmp->mp_seg[D].mem_vir + data_clicks + gap_clicks; rmp->mp_seg[S].mem_len = stack_clicks; rmp->mp_seg[S].mem_phys = rmp->mp_seg[D].mem_phys + data_clicks + gap_clicks; sys_newmap(who, rmp->mp_seg); /* report new map to the kernel */ /* Zero the bss, gap, and stack segment. Start just above text. */ for (rzp = &bf[0]; rzp < &bf[zs]; rzp++) *rzp = 0; /* clear buffer */ bytes = (phys_bytes) (data_clicks + gap_clicks + stack_clicks) << CLICK_SHIFT; vzb = (vir_bytes) bf; base = (long) rmp->mp_seg[T].mem_phys + rmp->mp_seg[T].mem_len; base = base << CLICK_SHIFT; bss_offset = (data_bytes >> CLICK_SHIFT) << CLICK_SHIFT; base += bss_offset; bytes -= bss_offset; while (bytes > 0) { count = (long) MIN(bytes, (phys_bytes) zs); if (mem_copy(MM_PROC_NR, D, (long) vzb, ABS, 0, base, count) != OK) panic("new_mem can't zero", NO_NUM); base += count; bytes -= count; } return(OK); } /*===========================================================================* * patch_ptr * *===========================================================================*/ PRIVATE patch_ptr(stack, base) char stack[MAX_ISTACK_BYTES]; /* pointer to stack image within MM */ vir_bytes base; /* virtual address of stack base inside user */ { /* When doing an exec(name, argv, envp) call, the user builds up a stack * image with arg and env pointers relative to the start of the stack. Now * these pointers must be relocated, since the stack is not positioned at * address 0 in the user's address space. */ char **ap, flag; vir_bytes v; flag = 0; /* counts number of 0-pointers seen */ ap = (char **) stack; /* points initially to 'nargs' */ ap++; /* now points to argv[0] */ while (flag < 2) { if (ap >= (char **) &stack[MAX_ISTACK_BYTES]) return; /* too bad */ if (*ap != NIL_PTR) { v = (vir_bytes) *ap; /* v is relative pointer */ v += base; /* relocate it */ *ap = (char *) v; /* put it back */ } else { flag++; } ap++; } } /*===========================================================================* * load_seg * *===========================================================================*/ PRIVATE load_seg(fd, seg, seg_bytes) int fd; /* file descriptor to read from */ int seg; /* T or D */ vir_bytes seg_bytes; /* how big is the segment */ { /* Read in text or data from the exec file and copy to the new core image. * This procedure is a little bit tricky. The logical way to load a segment * would be to read it block by block and copy each block to the user space * one at a time. This is too slow, so we do something dirty here, namely * send the user space and virtual address to the file system in the upper * 10 bits of the file descriptor, and pass it the user virtual address * instead of a MM address. The file system copies the whole segment * directly to user space, bypassing MM completely. */ int new_fd, bytes; char *ubuf_ptr; if (seg_bytes == 0) return; /* text size for combined I & D is 0 */ new_fd = (who << 8) | (seg << 6) | fd; ubuf_ptr = (char *) (mp->mp_seg[seg].mem_vir << CLICK_SHIFT); bytes = (int) seg_bytes; read(new_fd, ubuf_ptr, bytes); } É_do_exec † _do_exec: ƒ ‚ ×ņ,#2112 Ąå_mp ĄĘ,ģ  ž Ąä_mm_in+6 – Ą-2072(ń),ė Ķ-2072(ń),#1024 jbe I0013 Ąį-12 € š • Ķ_mm_in+4ö jle I0015 Ķ_mm_in+4,#128 jle I0016 I0015: Ąį-22 € š ½ Ąå_mm_in+10 Ą-2062(ń),ģ Ūå-205Ō Ą-206Å,ģ Ąä_mm_in+4 cwd Ėåģ Ėęķ œ € ¦ Į-206Å  € ‡ € Įķ Į-2062(ń)  € Į_who Ó_mem_copy Äņ,#20 ĄŠ,ė ĶŠö je I001A ĮŠ š I001A: ‡ € € Į_who 2 € Ó_tell_fs Äņ,#8  € Ūä-2110(ń) € Ūä-205Ō € Ó_allowed ¤ ĄŲ,ė ‡ €  € ‡ € 2 € Ó_tell_fs Äņ,#8 ĶŲö jge I001D ĮŲ š I001D: Ąä-2072(ń) Äį16 ×į1 Ąķ,#4 shr äcl Ą-2080(ń),ė Į-2080(ń) Ūä-207Ō € Ūä-2070(ń) € Ūä-206Ō € Ūä-206Ī € Ūä-10(ń) € ĮŲ Ó_read_header Äņ,#14 ¬ ĶĻö jge I00110 ĮŲ Ó_close Š Ąį-8 € š I00110: Ąå_mm_in+12 Ą-2062(ń),ģ Ūå-103Å Ą-206Å,ģ ‡ Ėåģ Ėęķ € Į-2072(ń) ¦ Į-206Å  € ‡ € Įķ Į-2062(ń)  € Į_who Ó_mem_copy Äņ,#20 ĄŠ,ė ĶŠö je I00113 ĮŲ Ó_close Š Ąį-13 € š I00113: 024 € Ūä-205Ō € Į-207Ī Į-207Ō Į-2072(ń) Į-2070(ń) Į-206Ō Į-206Ī Ó_new_mem ‘ ĄŠ,ė ĶŠö je I00116 ĮŲ Ó_close Š ĮŠ š I00116: § Ąć4 Ąä12Ē sal äcl Ą-207Å,ė Į-207Å lea ä-103Å € Ó_patch_ptr Š Š Ūå-103Å Ą-2062(ń),ģ ‡ Ėåģ Ėęķ € Į-2072(ń) ¦ Į-207Å  € Į_who Įķ Į-2062(ń) € ‡ € Ó_mem_copy Äņ,#20 ĄŠ,ė ĶŠö je I00119 Ąį32768 € Ąį_1 € Ó_panic Š Š I00119: Į-206Ī ‡ € ĮŲ Ó_load_seg ¤ Į-206Ō  € ĮŲ Ó_load_seg ¤ ĮŲ Ó_close Š test -210Ī,#2048 je I0011C § Ąä-2102(ń) Ą28Ē,ė § ĄčĘ Į28Ē Į26(ļ) Į_who “3 € Ó_tell_fs Äņ,#8 I0011C: test -210Ī,#1024 je I0011F § Ąä-2100(ń) Ź31Ē,al § Źal,31Ē Ž ‹ € Źal,30Ē Ž ‹ € Į_who Ąį46 € Ó_tell_fs Äņ,#8 I0011F: § Ą34Ēö § Äā38 Ą-2112(ń),ģ « Öį65503 ° § Äā38 Ą-2112(ń),ģ ĮĒ  ž Ąä-10(ń) – ‰ or äģ Ąå-2112(ń) ° Ąä-207Å Ą-2060(ń),ė Į-2060(ń) Į_who Ó_sys_exec Š Š ‡ € Ÿ  … „  _read_header: ƒ ‚ ×ņ,#48 Ąį32 € Ūä-4Ī € ˆ Ó_read ¤ Ķį32 je I0023 Ąį-8 € ĢI0021 I0023: Ąį65535 Ąā-241 Öä-4Ī Öå-4Å ×į769 sbb ā1024 Ł1f or åė 1: or åģ je I0026 Ąį-8 € ĢI0021 I0026: ‡ Ąā32 Öä-4Ī Öå-4Å ×į0 sbb ā0 Ł1f or åė 1: or åģ je I0029 Ąį32 € ĢI002A I0029: ‡ € I002A:  ž  – Æ ° Ąä-3Ō › ° Ąä-3Å Ąå10(ń) ° Æ ĮĒ  ž pop ė – Ķį32 je I002C Ąä10(ń) Ą-4Ō,ė Ąå-4Ō ĄčŌ « Ää(ļ) ° › ĄĒö I002C: Ąä-30(ń) Ąå12(ń) ° Ąå1Å Ąä-22(ń) Ąę-20(ń) ° Ą2Ē,ķ Ąå1Å « Ąę2Ē ×į0 sbb ć0 Ł1f or ęė 1: or ęķ ŁI002F Ąį-8 € ĢI0021 I002F: › « Äį4 ×į1 Ąć4 shr äcl ĄŠ,ė Ąå12(ń) Ąč10(ń) « Ää(ļ) Äį4 ×į1 shr äcl ĄŲ,ė Ąå1Å Į2Ē ĮĒ Ąā4  – ‰ Äį16 adc ā0 ×į1 sbb ā0 Ąć4 © 2: shr ā1 rcr į1 Ø 1: Ą-1Å,ė Ąä-1Å ĶŲ,ė jb I00212 Ąį-8 € ĢI0021 I00212: Æ ĮĒ  ž  – Ķį32 ŁI00215 ‡ € ĢI00216 I00215: ĮŠ I00216: Ć-12(ń) Ąä-1Å ×ä1Ī Ää-12(ń) Ą-10(ń),ė Æ Į-10(ń) Į-12(ń) Į1Ī ĮŲ ĮŠ ĮĒ Ó_ļze_ok Äņ,#12 ” Ąć4 Ąā4 Ąä-42(ń) Į-40(ń) – ‰ „ Öā0 ¬ ĶĻ,#32 jle I00218 £ ×į32 € Ūä-4Ī € ˆ Ó_read ¤ I00218: ” I0021:  … „  _new_mem: ƒ ‚ ×ņ,#46 ¢ Äį16 ×į1 Ąć4 shr äcl ĄŲ,ė ĄäŌ ÄäĪ Äį16 ×į1 shr äcl Ą-10(ń),ė Ąä10(ń) Äį16 ×į1 shr äcl Ą-1Å,ė Ąā4 Ąä12(ń) Į1Å – ‰ Äį16 adc ā0 ×į1 sbb ā0 Ąć4 © 2: shr ā1 rcr į1 Ø 1: Ą-1Ī,ė Ąä-1Ī ×ä-10(ń) ×ä-1Å Ą-12(ń),ė  ž Ąä-12(ń) – ™ jge I0033 Ąį-12 € ĢI0031 I0033: Ąä-1Ī ÄäŲ € Ó_mė_hole ‰ Ķåė jbe I0036 Ąį-11 € ĢI0031 I0036: Ąå_mp ĄĘ,ģ § ĄčĘ Ąä16Ē Ää12(ļ) Ą-20(ń),ė testb 38Ē,#32 je I0039 § Ąä-20(ń) Ää4Ē Ą-20(ń),ė I0039: § Į-20(ń) Į2Ē Ó_free_mem Š Š Ąä-1Ī ÄäŲ € Ó_alloc_mem Š Ą-1Ō,ė Ķ-1Ōö ŁI003C Ąį32768 € Ąį_2 € Ó_panic Š Š I003C: § ĄĒö § ĄäŲ Ą4Ē,ė § Ąä-1Ō Ą2Ē,ė § Ą6Ēö § Ąä-10(ń) Ą10Ē,ė ĄäŲ Ää-1Ō § Ą8Ē,ė § Ąä6Ē Ää-10(ń) Ää-12(ń) Ą12Ē,ė § Ąä-1Å Ą16Ē,ė § Ąä8Ē Ää-10(ń) Ää-12(ń) Ą14Ē,ė ” Į_who Ó_sys_newmap Š Š Ąä1Ī ¬ I00311: Ąå1Ō Äå1Ī ĶĻ,ģ jae I003E ĄåĻ ŹĒö ÄĻ,#1 ĢI00311 I003E: Ąä-12(ń) Ää-10(ń) Ää-1Å Ėåģ Ąć4 © 2: sal į1 rcl ā1 Ø 1: Ą-2Å,ė Ą-22(ń),ģ Ąä1Ī ĄŠ,ė § ‡ € Į2Ē Ąć4 Ąā4  – § Ėęķ Ćī Ää4Ē adc ēķ Ąć4 Ąā4 œ – Ą-2Ō,ė Ć-2Ī Ąć4 Ąä-2Ō Ąå-2Ī © 2: sal į1 rcl ā1 Ø 1: Ą-2Ō,ė Ą-2Ī,ģ Ąć4 ĄäĪ shr äcl sal äcl Ėåģ Ą-3Ī,ė Ą-3Å,ģ Ąä-2Ō Ąå-2Ī Ää-3Ī adc å-3Å Ą-2Ō,ė Ą-2Ī,ģ Ąä-2Å Ąå-22(ń) ×ä-3Ī sbb å-3Å Ą-2Å,ė Ą-22(ń),ģ I00313: Ąä-2Å Ąå-22(ń) ×į0 sbb ā0 Ł1f Öäė je 1f Üģ 1: or åģ jle I00312 Ąä1Ō cwd Ąå-2Å Ąę-22(ń) ×åė sbb ęī Ł1f Öåbx je 1f Üķ 1: or ęķ jge I00316 Į-22(ń) Į-2Å ĢI00317 I00316: Ąä1Ō cwd œ € I00317: Ć-32(ń) Ć-30(ń) ‡ Į-30(ń) Į-32(ń) Į-2Ī Į-2Ō Ėåģ ¦ Ąā-999 ¦ € ĮŠ  € ‡ € Ó_mem_copy Äņ,#20 ™ je I00319 Ąį32768 € Ąį_3 € Ó_panic Š Š I00319: Ąä-2Ō Ąå-2Ī Ää-32(ń) adc å-30(ń) Ą-2Ō,ė Ą-2Ī,ģ Ąä-2Å Ąå-22(ń) ×ä-32(ń) sbb å-30(ń) Ą-2Å,ė Ą-22(ń),ģ ĢI00313 I00312: ‡ € I0031:  … „  _patch_ptr: ƒ ‚ ×ņ,#8 Ź-3(ń)ö ¢ ” ÄĘ,#2 I0043: Źal,-3(ń) Ž ‹ Ķį2 jge I0042 ’ Äā1024 ĶĘ,ģ jb I0046 … „  I0046: § ĶĒö je I0049 § « ĄŠ,ė ĄäŠ ÄäĪ ĄŠ,ė ĄäŠ § ° ĢI004A I0049: Źal,-3(ń) Ž ‹ Üė Ź-3(ń),al I004A: ÄĘ,#2 ĢI0043 I0042: … „  _load_seg: ƒ ‚ ×ņ,#6 ĶŌö ŁI0053 … „  I0053: Ąć6 ĄäĪ sal äcl Ąć8 Ąå_who sal åcl or äģ or äÅ ” Ąį6 mul Ī » Äå_mp Ąć4 « sal äcl ĄŠ,ė  ž ĄäŌ – ¬ ¹ ĮŠ ” Ó_read ¤ … „  ® _1: Ā28516 Ā25951 Ā25976 Ā8291 Ā29811 Ā25441 Ā8299 Ā28515 Ā31088 Ā25888 Ā29298 ø _2: Ā19789 Ā26656 Ā27759 Ā8293 Ā26988 Ā29811 Ā26912 Ā8307 Ā28265 Ā28515 Ā29550 Ā29545 Ā25972 Ā29806 ø _3: Ā25966 Ā24439 Ā25965 Ā8301 Ā24931 Ā10094 Ā8308 Ā25978 Ā28530 .word 0 .text /* This file deals with creating processes (via FORK) and deleting them (via * EXIT/WAIT). When a process forks, a new slot in the 'mproc' table is * allocated for it, and a copy of the parent's core image is made for the * child. Then the kernel and file system are informed. A process is removed * from the 'mproc' table when two events have occurred: (1) it has exited or * been killed by a signal, and (2) the parent has done a WAIT. If the process * exits first, it continues to occupy a slot until the parent does a WAIT. * * The entry points into this file are: * do_fork: perform the FORK system call * do_mm_exit: perform the EXIT system call (by calling mm_exit()) * mm_exit: actually do the exiting * do_wait: perform the WAIT system call */ #include "../h/const.h" #include "../h/type.h" #include "../h/callnr.h" #include "../h/error.h" #include "const.h" #include "glo.h" #include "mproc.h" #include "param.h" #define LAST_FEW 2 /* last few slots reserved for superuser */ PRIVATE next_pid = INIT_PROC_NR+1; /* next pid to be assigned */ PRIVATE process_group = 1; /* next process grp to be assigned */ /* Some C compilers require static declarations to precede their first use. */ /*===========================================================================* * do_fork * *===========================================================================*/ PUBLIC int do_fork() { /* The process pointed to by 'mp' has forked. Create a child process. */ register struct mproc *rmp; /* pointer to parent */ register struct mproc *rmc; /* pointer to child */ int i, child_nr, t; char *sptr, *dptr; long prog_bytes; phys_clicks prog_clicks, child_base; long parent_abs, child_abs; extern phys_clicks alloc_mem(); /* If tables might fill up during FORK, don't even start since recovery half * way through is such a nuisance. */ rmp = mp; if (procs_in_use == NR_PROCS) return(EAGAIN); if (procs_in_use >= NR_PROCS - LAST_FEW && rmp->mp_effuid != 0)return(EAGAIN); /* Determine how much memory to allocate. */ prog_clicks = (phys_clicks) rmp->mp_seg[T].mem_len + rmp->mp_seg[D].mem_len + rmp->mp_seg[S].mem_len; #ifdef i8088 prog_clicks += rmp->mp_seg[S].mem_vir - rmp->mp_seg[D].mem_len; /* gap too */ #endif prog_bytes = (long) prog_clicks << CLICK_SHIFT; if ( (child_base = alloc_mem(prog_clicks)) == NO_MEM) return(EAGAIN); /* Create a copy of the parent's core image for the child. */ child_abs = (long) child_base << CLICK_SHIFT; parent_abs = (long) rmp->mp_seg[T].mem_phys << CLICK_SHIFT; i = mem_copy(ABS, 0, parent_abs, ABS, 0, child_abs, prog_bytes); if ( i < 0) panic("do_fork can't copy", i); /* Find a slot in 'mproc' for the child process. A slot must exist. */ for (rmc = &mproc[0]; rmc < &mproc[NR_PROCS]; rmc++) if ( (rmc->mp_flags & IN_USE) == 0) break; /* Set up the child and its memory map; copy its 'mproc' slot from parent. */ child_nr = rmc - mproc; /* slot number of the child */ procs_in_use++; sptr = (char *) rmp; /* pointer to parent's 'mproc' slot */ dptr = (char *) rmc; /* pointer to child's 'mproc' slot */ i = sizeof(struct mproc); /* number of bytes in a proc slot. */ while (i--) *dptr++ = *sptr++;/* copy from parent slot to child's */ /* Set process group. */ if (who == INIT_PROC_NR) rmc->mp_procgrp = process_group++; rmc->mp_parent = who; /* record child's parent */ rmc->mp_seg[T].mem_phys = child_base; rmc->mp_seg[D].mem_phys = child_base + rmc->mp_seg[T].mem_len; rmc->mp_seg[S].mem_phys = rmc->mp_seg[D].mem_phys + (rmp->mp_seg[S].mem_phys - rmp->mp_seg[D].mem_phys); rmc->mp_exitstatus = 0; rmc->mp_sigstatus = 0; /* Find a free pid for the child and put it in the table. */ do { t = 0; /* 't' = 0 means pid still free */ next_pid = (next_pid < 30000 ? next_pid + 1 : INIT_PROC_NR + 1); for (rmp = &mproc[0]; rmp < &mproc[NR_PROCS]; rmp++) if (rmp->mp_pid == next_pid) { t = 1; break; } rmc->mp_pid = next_pid; /* assign pid to child */ } while (t); /* Tell kernel and file system about the (now successful) FORK. */ sys_fork(who, child_nr, rmc->mp_pid); tell_fs(FORK, who, child_nr, 0); /* Report child's memory map to kernel. */ sys_newmap(child_nr, rmc->mp_seg); /* Reply to child to wake it up. */ reply(child_nr, 0, 0, NIL_PTR); return(next_pid); /* child's pid */ } /*===========================================================================* * do_mm_exit * *===========================================================================*/ PUBLIC int do_mm_exit() { /* Perform the exit(status) system call. The real work is done by mm_exit(), * which is also called when a process is killed by a signal. */ mm_exit(mp, status); dont_reply = TRUE; /* don't reply to newly terminated process */ return(OK); /* pro forma return code */ } /*===========================================================================* * mm_exit * *===========================================================================*/ PUBLIC mm_exit(rmp, exit_status) register struct mproc *rmp; /* pointer to the process to be terminated */ int exit_status; /* the process' exit status (for parent) */ { /* A process is done. If parent is waiting for it, clean it up, else hang. */ /* How to terminate a process is determined by whether or not the * parent process has already done a WAIT. Test to see if it has. */ rmp->mp_exitstatus = (char) exit_status; /* store status in 'mproc' */ if (mproc[rmp->mp_parent].mp_flags & WAITING) cleanup(rmp); /* release parent and tell everybody */ else rmp->mp_flags |= HANGING; /* Parent not waiting. Suspend proc */ /* If the exited process has a timer pending, kill it. */ if (rmp->mp_flags & ALARM_ON) set_alarm(rmp - mproc, (unsigned) 0); /* Tell the kernel and FS that the process is no longer runnable. */ sys_xit(rmp->mp_parent, rmp - mproc); tell_fs(EXIT, rmp - mproc, 0, 0); /* file system can free the proc slot */ } /*===========================================================================* * do_wait * *===========================================================================*/ PUBLIC int do_wait() { /* A process wants to wait for a child to terminate. If one is already waiting, * go clean it up and let this WAIT call terminate. Otherwise, really wait. */ register struct mproc *rp; register int children; /* A process calling WAIT never gets a reply in the usual way via the * reply() in the main loop. If a child has already exited, the routine * cleanup() sends the reply to awaken the caller. */ /* Is there a child waiting to be collected? */ children = 0; for (rp = &mproc[0]; rp < &mproc[NR_PROCS]; rp++) { if ( (rp->mp_flags & IN_USE) && rp->mp_parent == who) { children++; if (rp->mp_flags & HANGING) { cleanup(rp); /* a child has already exited */ dont_reply = TRUE; return(OK); } } } /* No child has exited. Wait for one, unless none exists. */ if (children > 0) { /* does this process have any children? */ mp->mp_flags |= WAITING; dont_reply = TRUE; return(OK); /* yes - wait for one to exit */ } else return(ECHILD); /* no - parent has no children */ } /*===========================================================================* * cleanup * *===========================================================================*/ PRIVATE cleanup(child) register struct mproc *child; /* tells which process is exiting */ { /* Clean up the remains of a process. This routine is only called if two * conditions are satisfied: * 1. The process has done an EXIT or has been killed by a signal. * 2. The process' parent has done a WAIT. * * It releases the memory, if that has not been done yet. Whether it has or * has not been done depends on the order of the EXIT and WAIT calls. */ register struct mproc *parent, *rp; int init_waiting, child_nr; unsigned int r; phys_clicks s; child_nr = child - mproc; parent = &mproc[child->mp_parent]; /* Wakeup the parent. */ r = child->mp_sig=?@status & 0377; r = r | (child->mp_exitstatus << 8); reply(child->mp_parent, child->mp_pid, r, NIL_PTR); /* Release the memory occupied by the child. */ s = (phys_clicks) child->mp_seg[S].mem_vir + child->mp_seg[S].mem_len; if (child->mp_flags & SEPARATE) s += child->mp_seg[T].mem_len; free_mem(child->mp_seg[T].mem_phys, s); /* free the memory */ /* Update flags. */ child->mp_flags &= ~HANGING; /* turn off HANGING bit */ child->mp_flags &= ~PAUSED; /* turn off PAUSED bit */ parent->mp_flags &= ~WAITING; /* parent is no longer waiting */ child->mp_flags &= ~IN_USE; /* release the table slot */ procs_in_use--; /* If exiting process has children, disinherit them. INIT is new parent. */ init_waiting = (mproc[INIT_PROC_NR].mp_flags & WAITING ? 1 : 0); for (rp = &mproc[0]; rp < &mproc[NR_PROCS]; rp++) { if (rp->mp_parent == child_nr) { /* 'rp' points to a child to be disinherited. */ rp->mp_parent = INIT_PROC_NR; /* init takes over */ if (init_waiting && (rp->mp_flags & HANGING) ) { /* Init was waiting. */ cleanup(rp); /* recursive call */ init_waiting = 0; } } } } ® _next_pid: Ā3 _process_group: É_do_fork Ā1 † _do_fork: ƒ ‚ ×ņ,#32 Ąå_mp ĄĘ,ģ Ķ_procs_in_use,Ń ŁI0013 Ąį-11 € š • Ķ_procs_in_use,#14 jl I0016 § Ķ28Ēö je I0016 Ąį-11 € š ½ § ĄčĘ Ąä10Ē Ää4(ļ) Ää16Ē Ą-20(ń),ė Ąä12Ē ×ä10(ļ) Ää-20(ń) Ą-20(ń),ė ‡ Ąć4 Ąå-20(ń) © 2: sal ā1 rcl į1 Ø 1: Ą-1Ō,ģ Ą-1Ī,ė Į-20(ń) Ó_alloc_mem Š Ą-22(ń),ė Ķ-22(ń)ö ŁI001A Ąį-11 € š I001A: ‡ Ąć4 Ąå-22(ń) © 2: sal ā1 rcl į1 Ø 1: Ą-30(ń),ģ Ą-2Ō,ė § ‡ Ąć4 Ąå2Ē © 2: sal ā1 rcl į1 Ø 1: Ą-2Ī,ģ Ą-2Å,ė Į-1Ī Į-1Ō Į-2Ō Į-30(ń) ‡ € Ąį-999 € Į-2Å Į-2Ī Ėäė € Ąį-999 € Ó_mem_copy Äņ,#20 ĄŠ,ė ĶŠö jge I001D ĮŠ Ąį_1 € Ó_panic Š Š I001D: ĄĻ,#_mproc I00112: ĶĻ,#_mproc+640 jae I001F ĄåĻ testb 38Ē,#1 ŁI00110 ĢI001F I00110: ÄĻ,#40 š2 I001F: £ ×į_mproc Ąā40 cwd išv ģ ĄŲ,ė Ü_procs_in_use — Ą-12(ń),ė £ Ą-1Å,ė ĄŠ,#40 I00117: ĮŠ óŠ  ™ je I00116 Į-12(ń) Ä-12(ń),#1 ‰ Ąč-1Å Œ Ź(ļ),al Ä-1Å,#1 š7 I00116: Ķ_who,#2 ŁI0011A Į_process_group Ü_process_group ĄåĻ  Ą24Ē,ė I0011A: ĄåĻ Ąę_who Ą22Ē,ķ ĄåĻ Ąä-22(ń) Ą2Ē,ė ĄåĻ Ąä4Ē Ää-22(ń) Ą8Ē,ė § ĄčĘ Ąä14Ē ×ä8(ļ) ĄåĻ Ää8Ē Ą14Ē,ė ĄåĻ Ź18Ēö ĄåĻ Ź19Ēö I0011E: Ą-10(ń)ö Ķ_next_pid,#30000 jge I00120 Ąå_next_pid Üģ ¦ ĢI00121 I00120: Ąį3 € I00121: Ć_next_pid ĄĘ,#_mproc I00125: ĶĘ,#_mproc+640 jae I00122 § Ąę_next_pid Ķ20Ē,ķ ŁI00123 Ą-10(ń),#1 ĢI00122 I00123: ÄĘ,#40 ĢI00125 I00122: ĄåĻ Ąę_next_pid Ą20Ē,ķ Ķ-10(ń)ö ŁI0011E ĄåĻ Į20Ē ĮŲ Į_who Ó_sys_fork ¤ ‡ € ĮŲ Į_who “ € Ó_tell_fs Äņ,#8 ¹ ĮŲ Ó_sys_newmap Š Š ‡ € € € ĮŲ Ó_reply Äņ,#8 Į_next_pid Ÿ  … „  É_do_mm_exit _do_mm_exit: ƒ ‚ Į_mm_in+4 Į_mp Ó_mm_exit Š Š Ą_dont_reply,#1 ‡ … „  É_mm_exit _mm_exit: ƒ ‚ € ’ ĄäĪ Ź18Ē,al ’ Ąį40 mul 22Ē mov åė testb _mproc+38Ē,#2 je I0033 ˆ Ó_cleanup Š ĢI0034 I0033: ’ Äā38 ĄĘ,ģ « or į4 ° I0034: ’ testb 38Ē,Ń je I0036 ¢ ×į_mproc Ąā40 cwd išv ģ Ėåģ ¦ € Ó_set_alarm Š Š I0036: ¢ ×į_mproc Ąā40 cwd išv ģ ’ € Į22Ē Ó_sys_xit Š Š ¢ ×į_mproc Ąā40 cwd išv ģ Ėåģ ¦ ¦ €  € Ó_tell_fs Äņ,#8 … „  É_do_wait _do_wait: ƒ ‚ ×ņ,#6 ĄĻö ĄĘ,#_mproc I0045: ĶĘ,#_mproc+640 jae I0042 § testb 38Ē,#1 je I0043 § Ąę_who Ķ22Ē,ķ ŁI0043 ÜĻ § testb 38Ē,#4 je I0043 ” Ó_cleanup Š Ą_dont_reply,#1 ‡ € ĢI0041 I0043: ÄĘ,#40 ĢI0045 I0042: ĶĻö jle I004E Ąå_mp Äā38 ĄŠ,ģ « or į2 ° Ą_dont_reply,#1 ‡ € ĢI0041 I004E: Ąį-10 € I0041:  … „  _cleanup: ƒ ‚ ×ņ,Ń ¢ ×į_mproc Ąā40 cwd išv ģ ĄŲ,ė ’ Ąį40 mul 22Ē » Äā_mproc ĄĘ,ģ ’ Źal,19Ē Ž Ą-10(ń),ė Źal,18Ē Ž ‹ Ąć8 sal äcl  ž – or -10(ń),ė ’ ĄčÅ ‡ € Į-10(ń) Į20Ē Į22(ļ) Ó_reply Äņ,#8 ’ ĄčÅ Ąä16Ē Ää12(ļ) Ą-12(ń),ė testb 38Ē,#32 je I0053 ’ Ąä-12(ń) Ää4Ē Ą-12(ń),ė I0053: ’ Į-12(ń) Į2Ē Ó_free_mem Š Š ’ Äā38 Ą-1Ī,ģ « Öį65531 ° ’ Äā38 Ą-1Ī,ģ « Öį65527 ° § Äā38 Ą-1Ī,ģ « Öį65533 mov Ē,ė ’ Äā38 Ą-1Ī,ģ « Öį65534 ° ó_procs_in_use test _mproc+118,#2 je I0056  € ĢI0057 I0056: ‡ € I0057: ĆŠ ĄĻ,#_mproc I005B: ĶĻ,#_mproc+640 jae I0058 ĄåĻ ĄäŲ Ķ22Ē,ė ŁI0059 ĄåĻ Ą22Ē,#2 ĶŠö je I0059 ĄåĻ testb 38Ē,#4 je I0059 ¹ Ó_cleanup Š ĄŠö I0059: ÄĻ,#40 ĢI005B I0058: … „  ® _1: Ā28516 Ā26207 Ā29295 Ā8299 Ā24931 Ā10094 Ā8308 Ā28515 Ā31088 ø † /* This file handles the 4 system calls that get and set uids and gids. * It also handles getpid(). The code for each one is so tiny that it hardly * seemed worthwhile to make each a separate function. */ #include "../h/const.h" #include "../h/type.h" #include "../h/callnr.h" #include "../h/error.h" #include "const.h" #include "glo.h" #include "mproc.h" #include "param.h" /*===========================================================================* * do_getset * *===========================================================================*/ PUBLIC int do_getset() { /* Handle GETUID, GETGID, GETPID, SETUID, SETGID. The three GETs return * their primary results in 'r'. GETUID and GETGID also return secondary * results (the effective IDs) in 'result2', which is returned to the user. */ register struct mproc *rmp = mp; register int r; switch(mm_call) { case GETUID: r = rmp->mp_realuid; result2 = rmp->mp_effuid; break; case GETGID: r = rmp->mp_realgid; result2 = rmp->mp_effgid; break; case GETPID: r = mproc[who].mp_pid; result2 = mproc[rmp->mp_parent].mp_pid; break; case SETUID: if (rmp->mp_realuid != usr_id && rmp->mp_effuid != SUPER_USER) return(EPERM); rmp->mp_realuid = usr_id; rmp->mp_effuid = usr_id; tell_fs(SETUID, who, usr_id, usr_id); r = OK; break; case SETGID: if (rmp->mp_realgid != grpid && rmp->mp_effuid != SUPER_USER) return(EPERM); rmp->mp_realgid = grpid; rmp->mp_effgid = grpid; tell_fs(SETGID, who, grpid, grpid); r = OK; break; } return(r); } É_do_getset † _do_getset: ƒ ‚ € € ® _1: ĀI0013 Ā5 Ā20 ĀI0016 Ā23 ĀI0017 Ā24 ĀI0014 Ā46 ĀI001C Ā47 ĀI0015 † Ąå_mp ĄĘ,ģ Į_mm_call ĢI0012 I0014: § Ąä26Ē ¬ Ąå28Ē Ą_result2,ģ ­ I0015: § Źal,30Ē Ž ‹ ¬ Źal,31Ē Ž ‹ Ą_result2,ė ­ ½ Ąį40 mul _who » Ąä_mproc+20Ē ¬ § Ąį40 mul 22Ē » Ąå_mproc+20Ē Ą_result2,ģ ­ I0017: § Ąę_mm_in+4 Ķ26Ē,ķ je I0019 § Ķ28Ēö je I0019 Ąį-1 € š I0019: § Ąę_mm_in+4 Ą26Ē,ķ § Ąę_mm_in+4 Ą28Ē,ķ Į_mm_in+4 Į_mm_in+4 Į_who “3 € Ó_tell_fs Äņ,#8 ĄĻö ­ I001C: § Źal,30Ē Ž ‹ € Ąä_mm_in+4 ‹ ‰ Ķåė je I001E § Ķ28Ēö je I001E Ąį-1 € š I001E: § Ąę_mm_in+4 Ź30Ē,cl § Ąę_mm_in+4 Ź31Ē,cl Ąä_mm_in+4 ‹ € ‹ € Į_who Ąį46 € Ó_tell_fs Äņ,#8 ĄĻö ­   Ąč#_1 Ćī Ģ.csb2 • ¹ Ÿ  … „  /* Global variables. */ EXTERN struct mproc *mp; /* ptr to 'mproc' slot of current process */ EXTERN int dont_reply; /* normally 0; set to 1 to inhibit reply */ EXTERN int procs_in_use; /* how many processes are marked as IN_USE */ /* The parameters of the call are kept here. */ EXTERN message mm_in; /* the incoming message itself is kept here. */ EXTERN message mm_out; /* the reply message is built up here. */ EXTERN int who; /* caller's proc number */ EXTERN int mm_call; /* caller's proc number */ /* The following variables are used for returning results to the caller. */ EXTERN int err_code; /* temporary storage for error number */ EXTERN int result2; /* secondary result */ EXTERN char *res_ptr; /* result, if pointer */ EXTERN char mm_stack[MM_STACK_BYTES]; /* MM's stack */ /* This file contains the main program of the memory manager and some related * procedures. When MINIX starts up, the kernel runs for a little while, * initializing itself and its tasks, and then it runs MM. MM at this point * does not know where FS is in memory and how big it is. By convention, FS * must start at the click following MM, so MM can deduce where it starts at * least. Later, when FS runs for the first time, FS makes a pseudo-call, * BRK2, to tell MM how big it is. This allows MM to figure out where INIT * is. * * The entry points into this file are: * main: starts MM running * reply: reply to a process making an MM system call * do_brk2: pseudo-call for FS to report its size */ #include "../h/const.h" #include "../h/type.h" #include "../h/callnr.h" #include "../h/com.h" #include "../h/error.h" #include "const.h" #include "glo.h" #include "mproc.h" #include "param.h" #define ENOUGH (phys_clicks) 4096 /* any # > max(FS size, INIT size) */ #define CLICK_TO_K (1024L/CLICK_SIZE) /* convert clicks to K */ PRIVATE phys_clicks tot_mem; extern (*call_vec[])(); /*===========================================================================* * main * *===========================================================================*/ PUBLIC main() { /* Main routine of the memory manager. */ int error; mm_init(); /* initialize memory manager tables */ /* This is MM's main loop- get work and do it, forever and forever. */ while (TRUE) { /* Wait for message. */ get_work(); /* wait for an MM system call */ mp = &mproc[who]; /* Set some flags. */ error = OK; dont_reply = FALSE; err_code = -999; /* If the call number is valid, perform the call. */ if (mm_call < 0 || mm_call >= NCALLS) error = E_BAD_CALL; else error = (*call_vec[mm_call])(); /* Send the results back to the user to indicate completion. */ if (dont_reply) continue; /* no reply for EXIT and WAIT */ if (mm_call == EXEC && error == OK) continue; reply(who, error, result2, res_ptr); } } /*===========================================================================* * get_work * *===========================================================================*/ PRIVATE get_work() { /* Wait for the next message and extract useful information from it. */ if (receive(ANY, &mm_in) != OK) panic("MM receive error", NO_NUM); who = mm_in.m_source; /* who sent the message */ if (who < HARDWARE || who >= NR_PROCS) panic("MM called by", who); mm_call = mm_in.m_type; /* system call number */ } /*===========================================================================* * reply * *===========================================================================*/ PUBLIC reply(proc_nr, result, res2, respt) int proc_nr; /* process to reply to */ int result; /* result of the call (usually OK or error #)*/ int res2; /* secondary result */ char *respt; /* result if pointer */ { /* Send a reply to a user process. */ register struct mproc *proc_ptr; /* To make MM robust, check to see if destination is still alive. */ proc_ptr = &mproc[proc_nr]; if ( (proc_ptr->mp_flags&IN_USE) == 0 || (proc_ptr->mp_flags&HANGING)) return; reply_type = result; reply_i1 = res2; reply_p1 = respt; if (send(proc_nr, &mm_out) != OK) panic("MM can't reply", NO_NUM); } /*===========================================================================* * mm_init * *===========================================================================*/ PRIVATE mm_init() { /* Initialize the memory manager. */ extern phys_clicks get_tot_mem(), alloc_mem(); /* Find out how much memory the machine has and set up core map. MM and FS * are part of the map. Tell the kernel. */ tot_mem = get_tot_mem(); /* # clicks in mem starting at absolute 0 */ mem_init(tot_mem); /* initialize tables to all physical mem */ /* Initialize MM's tables. */ mproc[MM_PROC_NR].mp_flags |= IN_USE; mproc[FS_PROC_NR].mp_flags |= IN_USE; mproc[INIT_PROC_NR].mp_flags |= IN_USE; procs_in_use = 3; /* Set stack limit, which is checked on every procedure call. */ } /*===========================================================================* * do_brk2 * *===========================================================================*/ PUBLIC do_brk2() { /* This "call" is made once by FS during system initialization and then never * again by anyone. It contains the origin and size of INIT, and the combined * size of the 1536 bytes of unused mem, MINIX and RAM disk. * m1_i1 = size of INIT text in clicks * m1_i2 = size of INIT data in clicks * m1_i3 = number of bytes for MINIX + RAM DISK * m1_p1 = origin of INIT in clicks */ int mem1, mem2, mem3; register struct mproc *rmp; phys_clicks init_org, init_clicks, ram_base, ram_clicks, tot_clicks; phys_clicks init_text_clicks, init_data_clicks; if (who != FS_PROC_NR) return(EPERM); /* only FS make do BRK2 */ /* Remove the memory used by MINIX and RAM disk from the memory map. */ init_text_clicks = mm_in.m1_i1; /* size of INIT in clicks */ init_data_clicks = mm_in.m1_i2; /* size of INIT in clicks */ tot_clicks = mm_in.m1_i3; /* total size of MINIX + RAM disk */ init_org = (phys_clicks) mm_in.m1_p1; /* addr where INIT begins in memory */ init_clicks = init_text_clicks + init_data_clicks; ram_base = init_org + init_clicks; /* start of RAM disk */ ram_clicks = tot_clicks - ram_base; /* size of RAM disk */ alloc_mem(tot_clicks); /* remove RAM disk from map */ /* Print memory information. */ mem1 = tot_mem/CLICK_TO_K; mem2 = (ram_base + 512/CLICK_SIZE)/CLICK_TO_K; /* MINIX, rounded */ mem3 = ram_clicks/CLICK_TO_K; printf("%c 8%c~0",033, 033); /* go to top of screen and clear screen */ printf("Memory size = %dK ", mem1); printf("MINIX = %dK ", mem2); printf("RAM disk = %dK ", mem3); printf("Available = %dK\n\n", mem1 - mem2 - mem3); if (mem1 - mem2 - mem3 < 32) { printf("\nNot enough memory to run MINIX\n\n", NO_NUM); sys_abort(); } /* Initialize INIT's table entry. */ rmp = &mproc[INIT_PROC_NR]; rmp->mp_seg[T].mem_phys = init_org; rmp->mp_seg[T].mem_len = init_text_clicks; rmp->mp_seg[D].mem_phys = init_org + init_text_clicks; rmp->mp_seg[D].mem_len = init_data_clicks; rmp->mp_seg[S].mem_vir = init_clicks; rmp->mp_seg[S].mem_phys = init_org + init_clicks; if (init_text_clicks != 0) rmp->mp_flags |= SEPARATE; return(OK); } /*===========================================================================* * set_map * *===========================================================================*/ PRIVATE set_map(proc_nr, base, clicks) int proc_nr; /* whose map to set? */ phys_clicks base; /* where in memory does the process start? */ phys_clicks clicks; /* total size in clicks (sep I & D not used) */ { /* Set up the memory map as part of the system initialization. */ register struct mproc *rmp; vir_clicks vclicks; rmp = &mproc[proc_nr]; vclicks = (vir_clicks) clicks; rmp->mp_seg[T].mem_vir = 0; rmp->mp_seg[T].mem_len = 0; rmp->mp_seg[T].mem_phys = base; rmp->mp_seg[D].mem_vir = 0; rmp->mp_seg[D].mem_len = vclicks; rmp->mp_seg[D].mem_phys = base; rmp->mp_seg[S].mem_vir = vclicks; rmp->mp_seg[S].mem_len = 0; rmp->mp_seg[S].mem_phys = base + vclicks; sys_newmap(proc_nr, rmp->mp_seg); } OÉ_main † _main: ƒ ‚ € Ó_mm_init • Ó_get_work Ąį40 mul _who » Äā_mproc Ą_mp,ģ ¼ Ą_dont_replyö Ą_err_code,#-999 Ķ_mm_callö jl I0015 Ķ_mm_call,#69 jl I0016 I0015: ĄĘ,#-102 ĢI0017 ½ Ąå_mm_call sal ā1 Ąä_call_vecĒ Ó(ė) ” I0017: Ķ_dont_replyö je I001A ­ I001A: Ķ_mm_call,#59 ŁI001D ĶĘö ŁI001D ­ I001D: Į_res_ptr Į_result2 ” Į_who Ó_reply Äņ,#8 ­ _get_work: ƒ ‚ Ąį_mm_in € 16 € Ó_receive Š Š ™ je I0023 Ąį32768 € Ąį_1 € Ó_panic Š Š I0023: Ąå_mm_in Ą_who,ģ Ķ_who,#-1 jl I0025 Ķ_who,Ń jl I0026 I0025: Į_who Ąį_2 € Ó_panic Š Š I0026: Ąå_mm_in+2 Ą_mm_call,ģ … „  É_reply _reply: ƒ ‚ € Ąį40 mul Å mov åė Äā_mproc ĄĘ,ģ § testb 38Ē,#1 je I0032 § testb 38Ē,#4 je I0033 I0032: … „  I0033: Æ Ą_mm_out+2,ģ › Ą_mm_out+4,ģ Ąå10(ń) Ą_mm_out+18,ģ Ąį_mm_out € ˆ Ó_send Š Š ™ je I0037 Ąį32768 € Ąį_3 € Ó_panic Š Š I0037: … „  _mm_init: ƒ ‚ ×ņ,#6 Ó_get_tot_mem Ą_tot_mem,ė Į_tot_mem Ó_mem_init Š or _mproc+38,#1 or _mproc+78,#1 or _mproc+118,#1 Ą_procs_in_use,#3 … „  É_do_brk2 _do_brk2: ƒ ‚ ×ņ,#24 Ķ_who,#1 je I0053 Ąį-1 € ĢI0051 I0053:  ž Ąä_mm_in+4 – Ą-20(ń),ė  ž Ąä_mm_in+6 – Ą-22(ń),ė  ž Ąä_mm_in+8 – Ą-1Ō,ė Ąå_mm_in+10 Ą-10(ń),ģ Ąä-22(ń) Ää-20(ń) Ą-12(ń),ė Ąä-12(ń) Ää-10(ń) mov -1Å,ė Ąä-1Ō ×ä-1Å Ą-1Ī,ė Į-1Ō Ó_alloc_mem Š ‡ € Į_tot_mem € Ąį64 € Ó.dvu4 ” Ąä-1Å Äį32 Ėåģ ¦ € ‡ € Ąį64 € Ó.dvu4 ¬ ‡ € Į-1Ī € Ąį64 € Ó.dvu4 ĄŠ,ė “7 € € Ąį_4 € Ó_printk ¤ ” Ąį_5 € Ó_printk Š Š ¹ Ąį_6 € Ó_printk Š Š ĮŠ Ąį_7 € Ó_printk Š Š — ×äĻ ×äŠ € Ąį_8 € Ó_printk Š Š — ×äĻ ×äŠ Ķį32 jge I0056 Ąį32768 € Ąį_9 € Ó_printk Š Š Ó_sys_abort I0056: ĄŲ,#_mproc+80 ĄåŲ Ąä-10(ń) Ą2Ē,ė ĄåŲ Ąä-20(ń) Ą4Ē,ė Ąä-20(ń) Ää-10(ń) ĄåŲ Ą8Ē,ė ĄåŲ Ąä-22(ń) Ą10Ē,ė ĄåŲ Ąä-12(ń) Ą12Ē,ė Ąä-12(ń) Ää-10(ń) ĄåŲ Ą14Ē,ė Ķ-20(ń)ö je I0059 ĄåŲ Äā38 Ą-2Å,ģ « or į32 ° I0059: ‡ € I0051:  … „  _set_map: ƒ ‚ € € Ąį40 mul Å » Äā_mproc ĄĘ,ģ ĄäŌ ¬ § ĄĒö § Ą4Ēö § ĄäĪ Ą2Ē,ė § Ą6Ēö § £ Ą10Ē,ė § ĄäĪ Ą8Ē,ė § £ Ą12Ē,ė § Ą16Ēö £ ÄäĪ § Ą14Ē,ė ” ˆ Ó_sys_newmap Š Š … „  ³ _tot_mem: .zerow 2/2 ® _1: Ā19789 Ā29216 Ā25445 Ā26981 Ā25974 Ā25888 Ā29298 Ā29295 ø _2: Ā19789 Ā25376 Ā27745 Ā25964 Ā8292 Ā31074 ø _3: Ā19789 Ā25376 Ā28257 Ā29735 Ā29216 Ā28773 Ā31084 ø _4: Ā25381 Ā14368 Ā25381 Ā12414 ø _5: Ā25933 Ā28525 Ā31090 Ā29472 Ā31337 Ā8293 Ā8253 Ā25637 Ā8267 ² ² ø _6: Ā18765 Ā18766 Ā8280 Ā8253 Ā25637 Ā8267 ² ² ø _7: Ā16722 Ā8269 Ā26980 Ā27507 Ā15648 Ā9504 Ā19300 ² ² Ā32 _8: Ā30273 Ā26977 Ā24940 Ā27746 Ā8293 Ā8253 Ā25637 Ā2635 Ā10 _9: Ā19978 Ā29807 Ā25888 Ā28526 Ā26485 Ā8296 Ā25965 Ā28525 Ā31090 Ā29728 Ā8303 Ā30066 Ā8302 Ā18765 Ā18766 Ā2648 Ā10 † CFLAGS = -Di8088 -w -F -T. h=../h l=/usr/lib obj = main.s forkexit.s break.s exec.s signal.s getset.s \ alloc.s utility.s table.s putc.s mm: makefile $l/head.s $(obj) $l/libc.a $l/end.s @echo "Start linking MM." @echo "If RAM disk fills up, edit makefile to use asld -T. " @echo "On a PC, /lib/* will be removed to make space on RAM disk" @rm -f /lib/cem /tmp/* @asld -o mm $l/head.s $(obj) $l/libc.a $l/end.s @echo "MM done. On a PC, please restore /lib/cem manually" alloc.s: const.h $h/const.h $h/type.h break.s: const.h $h/const.h $h/type.h break.s: $h/error.h break.s: $h/signal.h break.s: glo.h break.s: mproc.h break.s: param.h exec.s: const.h $h/const.h $h/type.h exec.s: $h/callnr.h exec.s: $h/error.h exec.s: $h/stat.h exec.s: glo.h exec.s: mproc.h exec.s: param.h forkexit.s: const.h $h/const.h $h/type.h forkexit.s: $h/callnr.h forkexit.s: $h/error.h forkexit.s: glo.h forkexit.s: mproc.h forkexit.s: param.h getset.s: const.h $h/const.h $h/type.h getset.s: $h/callnr.h getset.s: $h/error.h getset.s: glo.h getset.s: mproc.h getset.s: param.h main.s: const.h $h/const.h $h/type.h main.s: $h/callnr.h main.s: $h/com.h main.s: $h/error.h main.s: glo.h main.s: mproc.h main.s: param.h putc.s: $h/const.h $h/type.h putc.s: $h/com.h signal.s: const.h $h/const.h $h/type.h signal.s: $h/callnr.h signal.s: $h/com.h signal.s: $h/error.h signal.s: $h/signal.h signal.s: $h/stat.h signal.s: glo.h signal.s: mproc.h signal.s: param.h table.s: const.h $h/const.h $h/type.h table.s: $h/callnr.h table.s: glo.h table.s: mproc.h table.s: param.h utility.s: const.h $h/const.h $h/type.h utility.s: $h/callnr.h utility.s: $h/com.h utility.s: $h/error.h utility.s: $h/stat.h utility.s: glo.h utility.s: mproc.h  Ą-ķ)ė‹&P/čėžėžU‰åPč'čuø(÷&ī?‰ĆĆę3‰$@ĒFžĒ"@Ēź?üƒ>ģ?|ƒ>ģ?E|ĒFžš’ė‹ģ?Ń拇R/’ЉFžƒ>"@t뮃>ģ?;uƒ~žu럒6ę?’6č?’vž’6ī?čUƒÄėˆU‰åø@PøtPč&^^ Ąt ø€PøŠ-Pč³!^^‹@‰ī?ƒ>ī?’|ƒ>ī?| ’6ī?øā-Pč!^^‹ @‰ģ?‰ģ]ĆU‰åPø(÷f‰ĆĆę3‰^ž‹^žöG&t ‹^žöG&t‰ģ]Ƌ^‰ņ?‹^‰ō?‹^ ‰@øš?P’včr%^^ Ąt ø€Pøš-Pč)!^^‰ģ]ĆU‰åƒģčģ)£°0’6°0čž^ 444\4Ē @‰ģ]ĆU‰åƒģƒ>ī?tø’’PéN¹»” @čü)‰Fģ¹»”@čķ)‰Fź¹»”@čŽ)‰Fī‹@‰^ö‹FźFģ‰Fō‹FōFö‰Fņ‹Fī+Fņ‰Fš’vīč?^1ĄP’6°0Pø@Pč›*‰Fž‹Fņ 1ŪSP1ĄPø@Pč„*‰Fü1ĄP’všPø@Pčs*‰FśøPPø.Pč—$ƒÄ’vžø .PčŠ$^^’vüø".Pč~$^^’vśø4.Pčr$^^‹Fž+Fü+FśPøH.Pč_$^^‹Fž+Fü+Fś= }ø€PøZ.PčD$^^čŽ"ĒFų64‹^ų‹Fö‰G‹^ų‹Fģ‰G‹FģFö‹^ų‰G‹^ų‹Fź‰G ‹^ų‹Fō‰G ‹FōFö‹^ų‰Gƒ~ģt‹^ųƒĆ&‰^č‹ ‰1ĄPX‰ģ]ĆU‰åPPø(÷f‰ĆĆę3‰^ž‹F‰Fü‹^žĒ‹^žĒG‹^ž‹F‰G‹^žĒG‹^ž‹Fü‰G ‹^ž‹F‰G‹^ž‹Fü‰G ‹^žĒG‹FüF‹^ž‰G’vž’vč\!^^‰ģ]ĆU‰åƒģ ‹$@‰^žƒ> @uøõ’Péƒ> @|‹^žƒtøõ’Pé‹^ž‹vž‹G DG‰Fģ‹G +D Fģ‰Fģ1Ą¹‹^ģćŃćŃŠāś‰^ī‰Fš’vģč]^‰Fźƒ~źuøõ’Pé¹1Ą¹‹^źćŃćŃŠāś‰^ā‰Fä‹^ž1Ą¹‹_ćŃćŃŠāś‰^ę‰Fč’vš’vī’vä’vā1ĄPøüP’vč’vę1ĄPøüPčČƒÄ‰Fśƒ~ś} ’vśø€.Pč/^^ĒFüę3~üf6s‹^üöG&uėƒFü(ėč‹Fü-ę3»(™÷ū‰Fų’ @‹Fž‰Fō‹Fü‰FņĒFś(’vś’NśX Ąt’vōƒFō[‹vņŠˆƒFņėąƒ>ī?u’6~.’~.‹^üX‰G‹^ü‹ī?‰O‹^ü‹Fź‰G‹^ü‹GFź‰G‹^ž‹vž‹G+D‹^üG‰G‹^üĘG‹^üĘGĒFö>|.0u}‹|.CSėøP|.ĒFžę3~žf6s‹^ž‹|.9OuĒFöėƒFž(ėą‹^ü‹|.‰Oƒ~öu®‹^ü’w’vų’6ī?čƒÄ1ĄP’vų’6ī?øPč ƒÄ’vü’vųč4^^1ĄPPP’vųčcūƒÄ’6|.X‰ģ]ĆU‰å’6 @’6$@č^^Ē"@1Ą‰ģ]ĆU‰åP‹^‹FˆG‹^ø(÷g‰Ćö‡ 4t ’včć^ė‹^ƒĆ&‰^ž‹ ‰‹^öG&t‹F-ę3»(™÷ū1ŪSPčĆ^^‹F-ę3»(™÷ū‹^P’wčŻ^^‹F-ę3»(™÷ū1ŪSSPøPčGƒÄ‰ģ]ĆU‰åƒģĒFüĒFžę3~žf6s9‹^žöG&t*‹^ž‹ī?9Ou’Fü‹^žöG&t’vžč=^Ē"@1ĄPė,ƒFž(ėĄƒ~ü~‹$@ƒĆ&‰^ś‹ ‰Ē"@1ĄPėøö’PX‰ģ]ĆU‰åƒģ‹F-ę3»(™÷ū‰Fų‹^ø(÷g‰ĆĆę3‰^ž‹^ŠG0ä‰FöŠG0䘹Óą¹»č˜$ Fö‹^‹v1ĄP’vö’w’tčÕłƒÄ‹^‹v‹GD ‰FōöG& t ‹^‹FōG‰Fō‹^’vō’wčY^^‹^ƒĆ&‰^š‹%ū’‰‹^ƒĆ&‰^š‹%÷’‰‹^žƒĆ&‰^š‹%ż’‰‹^ƒĆ&‰^š‹%ž’‰’ @÷\4tøPė1ĄPFśĒFüę3~üf6s4‹^ü‹Fų9Gu#‹^üĒGƒ~śt‹^üöG&t ’vüčäž^ĒFśƒFü(ėʼnģ]ĆU‰åƒģ ‹$@‰^ž‹@‰^ś1ĄP¹»‹Fśč#[ƒÓ-ƒŪ¹ćŃėŃŲāś‰FöFųP’6ī?čķ^^’vų’vö’vžč!ƒÄ‰Füƒ~üu’6@ėø’’Pę?‹Fü‰ģ]ĆU‰åƒģ‹^ƒĆ‰^ü‹^ƒĆ ‰^žĒFņ‹^ž1Ą‹vž1ɋ_ȉ^ź‰F칋FÓč‰Fś1ĄP»‹Fź’vś’vģčé"Pč“" Ą|øō’Pé‹^ž1Ą1ɋ+^śȉ^ę‰Fč‹Fę‹^č-ƒŪu!ĄtC Ū~’vśė‹^ž’7Fö‹^ü‹F‰Fų‹Fų9Fösøō’P鯋^ü‹G‰Fō‹G9Ft‹^ü‹F‰GNņ‹Fę‹^č-ƒŪu!ĄtC Ū逋Fž‰Fä‹^ä1ĄP’7¹»‹Fę’včč2"[YZ)ĮŚ‹^䉋^žƒĆ‰^ä1ĄP’7¹»‹Fę’včč "[YZ)ĮŚ‹^䉋^žƒĆ‰^ä1ĄP’7¹»‹Fę’vččą![YZĮŚ‹^䉁Nņ‹^‹G&% ¹»č½!‰Fī‹^‹v‹~’w ’t’u’w ’t’vīčČƒÄ ‰Fšƒ~šu!ƒ~ņt‹F-ę3»(™÷ū’vPč^^1ĄPé–÷Fņt ‹^ü‹Fō‰G÷Fņt{‹Fž‰Fä‹^ä1ĄP’7¹»‹Fę’včč;![YZĮŚ‹^䉋^žƒĆ‰^ä1ĄP’7¹»‹Fę’včč![YZĮŚ‹^䉋^žƒĆ‰^ä1ĄP’7¹»‹Fę’vččé [YZ)ĮŚ‹^䉸ō’PX‰ģ]ĆU‰åƒģ¹‹FÓą-»1Ņ÷ó¹»č° ‰Fž¹‹FÓą-»1Ņ÷ó¹»č ‰Fü¹‹F Óą-»1Ņ÷ó¹»čn ‰Fś¹»‹Fč_ = u~ž ‹FśFü=~øō’Pė(‹FüFžFś=~øō’Pė‹FF 9Fsøō’Pė1ĄPX‰ģ]ĆU‰åƒģø(÷f‰ĆĆę3‰^ž‹Fž-ę3»(™÷ū^śSPčp^^‹^ž’vś’w ’vžč”üƒÄ‰Füƒ~üu‰ģ]Ƌ^žĒG"ø P’vžčŃ ^^‰ģ]ĆU‰åģ@‹$@‰^ž¹»”@虉†č÷¾č÷vøō’P齃> @~> @€~øź’Pé§‹@‰žņ÷žö÷‰žš÷” @™1Ū1ÉRPS’¶š÷øP1ĄPQ’¶ņ÷øP’6ī?č”ƒÄ‰Fśƒ~śt’vśé_1ĄPP’6ī?ø PčƒÄøP†Ā÷P†ö÷PčƒÄ‰Fų1ĄPøP1ĄPø PčՃă~ų}’vų鋆č÷-¹Ó艆ą÷’¶ą÷†ā÷P†ź÷P†ģ÷P†ī÷PFöP’vųčęƒÄ‰Füƒ~ü}’vųčt^øų’PéĒ‹@‰žņ÷žöū‰žš÷1Ą1Ū1ÉP’¶č÷S’¶š÷øP1ĄPQ’¶ņ÷øP’6ī?č³ƒÄ‰Fśƒ~śt’vųč#^øó’PévøP†ö÷P’¶ä÷’¶ā÷’¶č÷’¶ź÷’¶ģ÷’¶ī÷č"ƒÄ‰Fśƒ~śt ’vųčå^’vśé9‹^ž¹‹G Óą‰†ę÷’¶ę÷†öūPč«^^žöū‰žņ÷1Ą1Ū1ÉP’¶č÷S’¶ę÷øP’6ī?Q’¶ņ÷P1ĄPčƒÄ‰Fśƒ~śt ø€Pø”.Pčy^^’¶ī÷1ĄP’vųč½ƒÄ’¶ģ÷øP’vųč¬ƒÄ’vųčU^÷†Ę÷t$‹^ž‹†Ź÷‰G‹^ž‹vž’w’t’6ī?øPč6ƒÄ÷†Ę÷t)‹^ž‹†Ģ÷ˆG‹^žŠG0ä˜PŠG0ä˜P’6ī?ø.PčƒÄ‹^žĒG"‹^žƒĆ&‰žĄ÷‹%ß’‰‹^žƒĆ&‰žĄ÷’7¹»‹Föčź[ Ų‹žĄ÷‰‹†ę÷‰†ō÷’¶ō÷’6ī?čĘ^^1ĄPX‰ģ]ĆU‰åƒģ0ø PFŅP’včĘƒÄ= tøų’P飸’’»’#FŅ#^Ō-Ūu Ć Ūtøų’Pé1Ą» #FŅ#^Ō-ƒŪu Ć Ūtø Pė1ĄP¹»XčS‹^‰‹FŚ‹^‰‹FŽ‹^ ‰‹^’7¹»Xč/= t‹F ‰FŠ‹^Š‹v‹‰‹^Ē‹Fā‹^ ‰‹^‹Fź‹N쉉O‹^‹‹O-ƒŁu Į Éuøų’P鱋^‹-¹Óč‰Fś‹^ ‹v ‹-Óč‰Fų‹^’w’7»Xč§[ƒÓ-ƒŪ¹ćŃėŃŲāś‰Fņ‹Fņ9Fųrøų’Pé‹^’7¹»Xčn= u1ĄPė’vśFō‹Fņ+FFō‰Fö‹^’vö’vō’v’vų’vś’7čgśƒÄ ‰Fž¹»‹FÖ’vŲč&[%’ć‰Füƒ~ü ~‹Fü- PFŅP’včƒÄ’vžX‰ģ]ĆU‰åƒģ.‹F-¹Óč‰Fų‹FF-Óč‰Fö‹F -Óč‰Fņ»‹F ’vč·[ƒÓ-ƒŪ¹ćŃėŃŲāś‰Fš‹Fš+Fö+Fņ‰Fō¹»‹Fōč„ Ą}øō’Pé8‹FšFųPč÷[9Ćvøõ’Pé"‹$@‰^ž‹^ž‹vž‹GD ‰FģöG& t ‹^ž‹FģG‰Fģ‹^ž’vģ’wč8 ^^‹FšFųPčÆ ^‰Fīƒ~īu ø€Pø¬.Pčå^^‹^žĒ‹^ž‹Fų‰G‹^ž‹Fī‰G‹^žĒG‹^ž‹Fö‰G ‹FųFī‹^ž‰G‹^ž‹GFöFō‰G ‹^ž‹Fņ‰G‹^ž‹GFöFō‰G’vž’6ī?č¾^^‹F‰Fü‹^^9^üs ‹^üĘƒFüėé‹FōFöFņ1Ū¹ćŃąŃÓāś‰Fč‰^ź‹F‰Fś‹^ž1ĄP’w¹»XčQ‹^ž1ÉZGʹ»Rč<‰FäF湋Fä‹^ęćŃąŃÓāś‰Fä‰^湋FÓčÓą1Ū‰F܉^Ž‹Fä‹^ęFÜ^މFä‰^ę‹Fč‹^ź+FÜ^މFč‰^ź‹Fč‹^ź-ƒŪu!ĄtC Ū鋋F™‹^č‹Nź)ĆŃu!ŪtA É}’vź’včė‹F™RPFąFā1Ą’vā’vą’vę’vä1ŪS»üSP’vśøP1ĄPčŁƒÄ Ąt ø€PøŹ.PčD^^‹Fä‹^ęFą^ā‰Fä‰^ę‹Fč‹^ź+Fą^ā‰Fč‰^źé[’1ĄPX‰ģ]ĆU‰åƒģĘFż‹F‰FžƒFžŠFż0ä˜=}C‹^Ć9^žr‰ģ]Ƌ^žƒ?t‹^ž‹‰Fś‹FśF‰Fś‹Fś‹^ž‰ė ŠFż0ä˜@ˆFżƒFž벉ģ]ĆU‰åƒģƒ~u‰ģ]ù‹FÓą¹‹ī?Óć Ų F‰Fžø÷f‰Ć$@¹‹Óą‰Fś¹»‹F苉Fü’vü’vś’vžč’ƒÄ‰ģ]ĆU‰åPPƒ> @~ƒ> @~øź’Péƒ> @ u1ĄPéų‹ @K‰ŁøÓą‰Fžƒ>@uE‹$@ƒĆ ‰^ü’7¹»‹Fžč [ Ų‹^ü‰‹$@ƒĆ"‰^ü‹Fž÷Š’7¹»čž[!Ƌvü‰隃>@uF‹$@ƒĆ ‰^ü‹Fž÷Š’7¹»čŅ[!Ƌvü‰‹$@ƒĆ"‰^ü‹Fž÷Š’7¹»č°[!Ƌvü‰ėM‹$@ƒĆ ‰^ü‹Fž÷Š’7¹»čŒ[!Ƌvü‰‹$@ƒĆ"‰^ü’7¹»‹Fžčl[ Ų‹^ü‰‹$@‹@‰O$1ĄPX‰ģ]ĆU‰å‹$@’w’6@’6 @č ƒÄ‰ģ]ĆU‰åƒģ ƒ>ī?’tƒ>ī?tø’’Péć‹ @‰^ųø(÷fų‰ĆĆę3‰^ž‹^žöG&t ‹^žöG&t1ĄP鵋^ž‹G‰Fś¹»”@č׉FōĒ$@ę3‹^ž‹6$@‹G‰D~ō€u ’vųčŸõ^1ĄPévĒFüƒ~ü}b‹Fü@=t ‹Fü@=u1ĄPė’vśFö‹Fü@= uĒFö’’¹»‹Fü’vōčh¹»č_‰ĮXÓčØt‹Fü@1ŪSP’vöčƒÄ’Füė˜Ē"@1ĄPX‰ģ]ĆU‰åƒģ ƒ~~ƒ~~øź’Pé,ĒFü‹FH‰ĮøÓą¹»č‰FųĒFž^4~žf6réŲ‹^žöG&uéÅĒFś‹^ž‹G9Ft ƒ~tĒFśƒ~~‹^ž‹G9FtĒFś‹^žöG&tĒFśƒ~u‹$@‹vž‹D9GtĒFśƒ~u ƒ~’uĒFśƒ~u‹^žöG&uėJ‹^žƒĆ&‰^ö‹%ļ’‰ƒ~śt4‹^ž‹Fų…G tė'’Fü’v’vžčP^^‹Fž-ę3»(™÷ūPčł^ƒ~~ėƒFž(é’‹$@öG&t ‹$@öG&tĒ"@ƒ~ü~1ĄPėøż’PX‰ģ]ĆU‰åƒģ‹^öG&u‰ģ]ƋFH‰ĮøÓą¹»čĮ‰Fž‹^‹Fž…G"tg‹^ƒĆ"‰^ų‹Fž÷Š#‰‹F-ę3»(™÷ū^śSPč ^^‹Fś-‰Fś‹^’vś’w ’vč9šƒÄ Ąu ‹^‹F-ę3¹(™÷ł’w$’vPč’ ƒÄ‰ģ]ƋFH¹»’6N/č;¹»č2‰ĮXÓč%¹»č!‰Fü‹^‹FˆGƒ~üt’včs^1ĄP’včķ^^‰ģ]ĆU‰åPP¹»” @čč‰Fü’vü’6ī?č ^^‰Fž‹Fž‰ģ]ĆU‰åPPĒ“0‹^‰¶0ø<÷f1Ū£¼0‰¾0ƒ~tø(÷f‰ĆĆ 4‰^ü‹ ‰ėø(÷f‰ĆĆ 4‰^ü‹%ļ’‰ø²0Pøż’Pčˆ ^^ Ąt ø€PøŽ.Pč5 ^^‹¼0‰^ž‹Fž‰ģ]ĆU‰åP‹$@ƒĆ&‰^ž‹ ‰Ē"@1Ą‰ģ]ĆU‰åPPø(÷f‰ĆĆę3‰^ž‹^žöG&t.‹^žöG&u%‹^žƒĆ&‰^ü‹%÷’‰1ĄPPøü’P’vč>ēƒÄ‰ģ]Ƌ^žöG&t.‹^žöG&u%‹^žƒĆ&‰^ü‹%ż’‰1ĄPPøü’P’včēƒÄ‰ģ]Ć1ĄPP’vøAPč„ ƒÄ‰ģ]ĆU‰åģd‹F-ę3»(™÷ū‰†øž1ĄPP’¶øžø PčW ƒÄ‹^‹v‹D9Gt1ĄPøP1ĄPø Pč5 ƒÄ‰ģ]Ƌ$@‰ž ž‹^‰$@øPFāPøH/Pč9ƒÄ‰†ĄžøPFÄPøč.Pč#ƒÄ‰†¾ž‹ž ž‰$@ƒ¾Ąž|’¶ĄžčŅ^ƒ¾¾ž|’¶¾žčĆ^‹^ƒudžĄžƒ¾¾ž}郾Ąž} ƒ¾Ąžžté ø’PøH/PčJ^^‰†Ąž1ĄPøP1ĄPø Pč ƒÄƒ¾Ąž}‰ģ]Ƌ^ƒĆ‰žžž‹žžž1ĄŠP¹»Xčo €¹»čc‹žžžˆĒ†Āžƒ¾Āž}Gø÷¦Āž‰Ć^¹‹GÓą1Ū‰†²ž‰ž“žøP†²žP’¶ĄžčbƒÄ Ą} ’¶Ąžčš^‰ģ]Ć’†Āžė²žÄž‰ž¶ž1Ą‹ž¶ž‰ž¢ž‰†¤žĒ†Āžƒ¾Āž|éQø÷¦Āž‰Ć^1Ą¹‹ćŃćŃŠāś‰ž®ž‰†°žø÷¦Āž‰Ć^1Ą¹‹_ćŃćŃŠāś‰žŖž‰†¬ž‹†Ŗž‹ž¬ž-ƒŪu!ĄtC ŪéĒ‹†Ŗž‹ž¬ž-ƒŪu!ĄtC Ū} ’¶¬ž’¶Ŗžė1ĄPøP†¦ž†Øž’¶Øž’¶¦ž’¶¤ž’¶¢žøP1ĄP’¶°ž’¶®ž’¶Āž’¶øžč~ƒÄ‰†¼ž’¶¦ž†ÄžP’¶ĄžčMƒÄ‰†ŗžƒ¾¼ž|ƒ¾ŗž} ’¶ĄžčĶ^‰ģ]Ƌ†®ž‹ž°ž†¦žžØž‰†®ž‰ž°ž‹†Ŗž‹ž¬ž+†¦žžØž‰†Ŗž‰ž¬žé’’†ĀžéÅž1ĄPøP1ĄPø PčˆƒÄ’¶Ąžčs^‰ģ]Ć’¶Ąžčg^‰ģ]ĆU‰åPP‹$@‰^ž’6ģ?鹋^ž‹G‰Fü‹_‰č?éä‹^žŠG0䘉FüŠG0䘣č?éĢø(÷&ī?‰Ć‹‡ś3‰Fü‹^žø(÷g‰Ć‹Ÿś3‰č?馋^ž‹ @9Ot‹^žƒtø’’P鍋^ž‹ @‰O‹^ž‹ @‰O’6 @’6 @’6ī?øPčĘƒÄĒFüėY‹^žŠG0ä˜P” @˜[9Ćt‹^žƒtø’’Pė:‹^ž‹ @ˆO‹^ž‹ @ˆO” @˜P˜P’6ī?ø.PčtƒÄĒFüė¾ź.Zée ’vüX‰ģ]ĆU‰åƒģ‹Ģ0‰^žƒ~žtb‹^ž‹F9GrF‹^ž‹‰Fś‹Fž‰Fų‹^ų‹F‰‹^žƒĆ‰^ų‹+F‰‹^žƒt’vśė$’vž’vüčĻ^^’vśė‹Fž‰Fü‹^ž‹G‰Fžė˜1ĄPX‰ģ]ĆU‰åƒģ‹Ź0‰^üƒ>Ź0u ø€Pø/PčÆ^^‹F‹^ü‰‹^ü‹F‰G‹^ü‹_‰Ź0‹Ģ0‰^žƒ~žt ‹^ž‹9Fw‹^ü‹Fž‰G‹^ü‰Ģ0’vüč^‰ģ]ƃ~žt‹^ž‹9Fv‹Fž‰Fś‹^ž‹G‰Fžėߋ^ś‹vü‹G‰D‹^ś‹Fü‰G’vśč>^‰ģ]ĆU‰å‹Ģ09^u ‹^‹_‰Ģ0ė ‹^‹v‹G‰D‹^‹Ź0‰O‹^‰Ź0‰ģ]ĆU‰åPP‹^‹G‰Fžƒ~žu‰ģ]Ƌ^‹v‹G‹^ž9u ‹^ƒĆ‰^ü‹vž‹D‰’vž’v聒^^ė‹Fž‰F‹^‹G‰Fžƒ]_`abc~žu‰ģ]Ƌ^‹v‹G‹^ž9u‹^ƒĆ‰^ü‹vž‹D‰’vž’vč6’^^‰ģ]ĆU‰åPP‹Ģ0‰^žĒFüƒ~žt‹^ž‹Fü9Gv ‹^ž‹G‰Fü‹^ž‹G‰FžėŪ‹Fü‰ģ]ĆU‰åPĒFžĪ0~žĪ3s‹^žƒĆ‹vž‰\ƒFžėēĒŅ0ĒĢ3ĒĢ0Ī0ĒŹ0Ō0ĒĪ0‹^‰Š0‰ģ]ĆU‰åƒģ1ĄP’včÜ^^‰Fžƒ~ž} ‹¤@÷ŪSé!’v’vžčw^^ Ą} ø€Pø/Pč‰^^‹^‹G%š¹»čž ‰Fś¹»‹Fč =u¹»‹Fśč~ =€t’vžčO^øó’P顋$@ƒu ¹»‹FčU =u‹^öGIt’vžé–‹$@‹v‹D9GuĒFüė‹$@ŠG0䘋^9G uĒFüėĒFü‹$@ƒu¹»‹Fč÷ =t’vžėB‹^’w¹»‹FüčŪ ¹»čŅ ‰ĮXÓčP¹»‹FčĄ […Ćt’vžė ’vžčŒ^øó’PX‰ģ]ĆU‰å‹F‹^-ƒŪu Ć Ūu1ĄPėR‹^ˆŅ3‹^‰Ō3‹^‰Ų3‹^ ‰Ś3‹^ˆÓ3‹^ ‰Ö3‹^‰Ü3‹^‰Ž3‹^‰ą3‹^‰ā3øĪ3Pčw^’6Š3X‰ģ]ĆU‰åøź’‰ģ]ĆU‰å’vø(/PčG^^¹»‹Fč =€t ’vøB/Pč*^^øF/Pč!^1ĄPPPø$PčŠƒÄč­‰ģ]ĆU‰å1ĄŠFPø>@P’6¢@’¢@[XĆXˆƒ>¢@duč €~ uč‰ģ]ĆU‰åƒ>¢@u‰ģ]ĆĒ(@Ē,@Ē*@Ē8@>@‹¢@‰.@ø&@Pøł’PčŒ^^Ē¢@‰ģ]ĆU‰å’v’vøPøPč˜ƒÄ‰ģ]ĆU‰åP1ĄPP’vPP’vøPøPč:ƒÄ‰Fž‹Fž‰ģ]ĆU‰å1ĄPPPPP’vøPøPčƒÄ‰ģ]ĆU‰å’v’vøPøPč6ƒÄ‰ģ]ĆU‰åP1ĄPP’vP’v’vøPøPčփĉFž‹Fž‰ģ]ĆU‰å1ĄPP’vP’v’vøPøPč­ƒÄ‰ģ]ĆU‰å1ĄPPPP’v’vøPøž’PčŒƒÄ‰ģ]ĆU‰å1ĄPPPPP’vøPøž’PčmƒÄ‹°@‹v‰‰ģ]ĆU‰å‹^‰Ŗ@‹^‰¬@‹^‰“@øPøž’PčŌ^^‰ģ]ĆU‰å1ĄPPP’v’v’vøPøž’PčƒÄ‰ģ]ĆU‰å1ĄPP’vPP’vøPøž’Pč÷ƒÄ‰ģ]ĆU‰å1ĄPP’vPP’vøPøž’Pčփĉģ]ĆU‰å‹^ĒG’vøž’PčŹ^^ Ąt ø€PøÜ/Pčwż^^‰ģ]ĆU‰å1ĄPP’vPP’vøPøž’P艃Ä‹^‹Ŗ@‹¬@‰‰W‹^‹®@‹°@‰O‰W‹^‹²@‹“@‰O‰W ‹^‹¶@‹ø@‰O ‰W‰ģ]ĆU‰å1ĄPPPPPPø Pøž’Pč)ƒÄ‰ģ]ĆU‰å1ĄPPP’v ’v’v’vøPčƒÄ‰ģ]ĆU‰å‹^‰Ŗ@‹^ ‰¬@‹^ ‰®@‹^‰°@‹^‰²@‹^‰“@’v’včd^^‰ģ]ĆU‰åPP’v č˜^‰Fž‹^ž‰Ŗ@‹^‰¬@‹^ ‰®@ĒFü°@ƒ~ž ’vž’NžX Ąt’v ƒF [‹vüŠˆƒFüėą’v’vč^^‰ģ]ĆU‰åP‹^‰Ø@ø¦@P’vča^^‰Fžƒ~žt’vžėƒ>Ø@}‹Ø@÷Ū‰¤@ø’’Pė’6Ø@X‰ģ]ĆU‰åPĒFž’vƒF[Š0ä˜ Ąt’Fžėź‹Fž@‰ģ]ùė ¹ė¹ėU‰å‹F‹^Ķ ]ĆU‰åƒģ$^‰^ų‹^€?uéc‹^€?%t’vƒF[Š0ä˜PčĘū^ėŁĒFžƒF‹^Š0ä˜=0|+‹^Š0ä˜=9‹^Š0ä˜-0Pø ÷fž[Ɖ^žƒFėȋFų‰Fī‹Fų‰Fō‹^Š0ä˜P醒vųƒFų[‹‰Fü‹Fü™‰Fš‰VņĒFś én’vųƒFų[‹‰Fü¹»‹Füč‰Fö1Ą‹^ö‰^š‰FņĒFśé?’vųƒFų[‹‰Fü¹»‹Füčā‰Fö1Ą‹^ö‰^š‰FņĒFśé’vīƒFī[‹’w‰FšFņĒFś ‹Fī‰Fųéļ’vīƒFī[‹’w‰FšFņĒFś‹Fī‰FųéĪ’vīƒFī[‹’w‰FšFņĒFś‹Fī‰Fųé­’vųƒFų[‹‰Fü’vüčwś^ƒF酾’vōƒFō[‹‰Fą‹Fō‰Fų‹Fą‰FŽ’vąƒFą[Š0äˆFݘ Ąt ŠFŻ0ä˜Pč8ś^ė߃F‹Fą+FŽH+Fž÷Ų‰Füƒ~üé/ž’vü’NüX Ąué!žø Pčś^ėčø%Pčśł^’vƒF[Š0ä˜Pččł^éśż¾š/Z鄍FāP’vś’vņ’vščUƒÄ‰Fü‹Fž+Fü‰Fśƒ~ś~’vś’NśX Ąt ø P観^ėė‹FüH‰Fśƒ~ś|‹vśŠBā0ä˜P艳^’NśėēƒF钿‰ģ]ĆU‰åƒģ ĒFų‹F‹^-ƒŪu Ć Ūu ‹^ Ę0øPéČ‹F‹^-ƒŪu!ĄtC Ū}ƒ~ u‹^‹F÷Ų÷Ū‰^‰F’FųĒFüƒ~ü }‹^ü^ Ę’FüėģĒFüƒ~ u@’v’v1ĄPø Pč‹^ü^ ˆ‹^ü^ Š0䘙‹^‹N)ĆŃQS1ĄPø P迉F‰Nƒ~u=¹»‹F’vč[%ć‹^ü^ ˆ¹‹F‹^ćŃūŃŲāś%’’ć’‰F‰^ƒ~u=¹»‹F’vč<[%ć‹^ü^ ˆ¹‹F‹^ćŃūŃŲāś%’’ć’‰F‰^’Fü‹F‹^-ƒŪu Ć Ūté’ĒFś‹FüH‰Fžƒ~ž|b‹^ž^ €?uƒ~śu ‹^ž^ Ę ėA‹^ž^ Š0ä˜= }‹^ž^ ‰^ö‹^öŠ0ä˜0ˆė‹^ž^ ‰^ö‹^öŠ0ä˜7ˆ’Fś’Nžė˜ƒ~ųtø-P’v ’vü’Fü[XĆXˆ’vüX‰ģ]ÌŲĆøÖ@ĆśWø )’ŽĄ&Ǥ„1Ū&‹ū¤„u= uę_ūĆ[1ĄYZ^_9×w r9ĪwtH’ć@’ćĆ­“­‘I|­9Š­u÷“…ŪučĖ’ć_9Ėtƒūt ƒūuƒłu Z’ēƒłu1ŅR’ēPčŸU‰åW)’‹V ‹F‹^‹N…Ņy ÷Ś÷؃Ś÷ׅŪy ÷Ū÷كŪ÷×č…’t÷Ś÷؃Ś_]‰ŃĀ…Ūu‰Ć‰Š)Ņ÷ń“÷ń‰Ń‰Ś)ŪĆUWV)’„’u&GWˆßˆėˆĶ(É‰ĶˆÅ(ɈąˆŌˆņ(öRPQ‰é9Śr ø’’ė WWRP‰Š)Ņ÷ó‰Å÷į_)ĒƒŅ‰Ö‰Ų÷嚃Ņ^)ʃŅX)Šy MĻŽėō‰ł‰ó_…’tˆéˆŻˆūˆĒ‰č)Ņ^_]Ɖę‹\‹D Ąu1Ņ‹L‹D÷ó‘÷ó‰Ē1Ū‹D‹T¹ŃąŃŅŃÓ9ßwr 9TvāķėŪ+Tū@āćėщę‹\‹D™9Āu1!Ņ}÷Ūt)1Ņ‹L‹D!Ą}÷Ų÷ŁŠ÷ó‘÷ó1ۃ|}÷Ū÷ڃŪ‰Ē1Ū!’}÷ß÷\ߋD‹T!Ņ}÷Ś÷ŲڹŃąŃŅŃÓ9ßwr»9Tvāķė¹+Tū@āć미0ėø+0ėøB0ėøY0ėøp0ė ø†0ėø0ė»SPøPčč“ŅU‰åĒĄ@‹^‰Ā@‹^‰Ä@‹^‰Č@ø¾@PøPø»¾@¹Ķ ‰ģ]ĆŚŚMM receive errorMM called byMM can't reply%c 8%c~0Memory size = %dK MINIX = %dK RAM disk = %dK Available = %dK Not enough memory to run MINIX do_fork can't copydo_exec stack copy errMM hole list is inconsistentnew_mem can't zeroalarm er.Ms".Ą/5Hole table fullallowed: fstat failedMemory manager panic: %s %d coreüę?b"“Xb"b"b"b"<b"b"b"b"b"b"b"b"b"ćb"b"b"b"b"b"œb"Gb"b"b"b"b"b"b"Db"b"b"b"b"b"b"b" b"b"b"b"b"b"b"b"b"b"ā b"b"b"b"`b"yb"b"sys_copy can't sendµ(DÉ'Oź'X (c,(dL'ok'sG(xš'Error: Division by 0 Illegal EM instruct'n Err in EM case instr Variable out of range Err in EM set instr Floating pt not impl. Heap overflow /* This table has one slot per process. It contains all the memory management * information for each process. Among other things, it defines the text, data * and stack segments, uids and gids, and various flags. The kernel and file * systems have tables that are also indexed by process, with the contents * of corresponding slots referring to the same process in all three. */ EXTERN struct mproc { struct mem_map mp_seg[NR_SEGS]; /* points to text, data, stack */ char mp_exitstatus; /* storage for status when process exits */ char mp_sigstatus; /* storage for signal # for killed processes */ int mp_pid; /* process id */ int mp_parent; /* index of parent process */ int mp_procgrp; /* process group (used for signals) */ /* Real and effective uids and gids. */ uid mp_realuid; /* process' real uid */ uid mp_effuid; /* process' effective uid */ gid mp_realgid; /* process' real gid */ gid mp_effgid; /* process' effective gid */ /* Bit maps for signals. */ unshort mp_ignore; /* 1 means ignore the signal, 0 means don't */ unshort mp_catch; /* 1 means catch the signal, 0 means don't */ int (*mp_func)(); /* all signals vectored to a single user fcn */ unsigned mp_flags; /* flag bits */ } mproc[NR_PROCS]; /* Flag values */ #define IN_USE 001 /* set when 'mproc' slot in use */ #define WAITING 002 /* set by WAIT system call */ #define HANGING 004 /* set by EXIT system call */ #define PAUSED 010 /* set by PAUSE system call */ #define ALARM_ON 020 /* set when SIGALRM timer started */ #define SEPARATE 040 /* set if file is separate I & D space */ /* The following names are synonyms for the variables in the input message. */ #define addr mm_in.m1_p1 #define exec_name mm_in.m1_p1 #define exec_len mm_in.m1_i1 #define func mm_in.m6_f1 #define grpid (gid) mm_in.m1_i1 #define kill_sig mm_in.m1_i2 #define namelen mm_in.m1_i1 #define pid mm_in.m1_i1 #define seconds mm_in.m1_i1 #define sig mm_in.m6_i1 #define stack_bytes mm_in.m1_i2 #define stack_ptr mm_in.m1_p2 #define status mm_in.m1_i1 #define usr_id (uid) mm_in.m1_i1 /* The following names are synonyms for the variables in the output message. */ #define reply_type mm_out.m_type #define reply_i1 mm_out.m2_i1 #define reply_p1 mm_out.m2_p1 /* MM must occasionally print some message. It uses the standard library * routine prink(). (The name "printf" is really a macro defined as "printk"). * Printing is done by calling the TTY task directly, not going through FS. */ #include "../h/const.h" #include "../h/type.h" #include "../h/com.h" #define STD_OUTPUT 1 /* file descriptor for standard output */ #define BUF_SIZE 100 /* print buffer size */ PRIVATE int buf_count; /* # characters in the buffer */ PRIVATE char print_buf[BUF_SIZE]; /* output is buffered here */ PRIVATE message putch_msg; /* used for message to TTY task */ /*===========================================================================* * putc * *===========================================================================*/ PUBLIC putc(c) char c; { /* Accumulate another character. If '\n' or buffer full, print it. */ print_buf[buf_count++] = c; if (buf_count == BUF_SIZE) F_l_u_s_h(); if (c == '\n') F_l_u_s_h(); } /*===========================================================================* * F_l_u_s_h * *===========================================================================*/ PRIVATE F_l_u_s_h() { /* Flush the print buffer by calling TTY task. */ if (buf_count == 0) return; putch_msg.m_type = TTY_WRITE; putch_msg.PROC_NR = 0; putch_msg.TTY_LINE = 0; putch_msg.ADDRESS = print_buf; putch_msg.COUNT = buf_count; sendrec(TTY, &putch_msg); buf_count = 0; } É_putc † _putc: ƒ ‚ ‡ Źal,Å € Ąį_print_buf € Į_buf_count Ü_buf_count ‰  Äåė  ŗ Ķ_buf_count,#100 ŁI0013 Ó_F_l_u_s_h • cmpb Å,#10 ŁI0016 Ó_F_l_u_s_h ½ … „  _F_l_u_s_h: ƒ ‚ Ķ_buf_countö ŁI0023 … „  I0023: Ą_putch_msg+2,#4 Ą_putch_msg+6ö Ą_putch_msg+4ö Ą_putch_msg+18,#_print_buf Ąå_buf_count Ą_putch_msg+8,ģ Ąį_putch_msg € Ąį-7 € Ó_sendrec Š Š Ą_buf_countö … „  ³ _putch_msg: .zerow 24/2 _print_buf: .zerow 100/2 _buf_count: .zerow 2/2 † /* This file handles signals, which are asynchronous events and are generally * a messy and unpleasant business. Signals can be generated by the KILL * system call, or from the keyboard (SIGINT) or from the clock (SIGALRM). * In all cases control eventually passes to check_sig() to see which processes * can be signalled. The actual signalling is done by sig_proc(). * * The entry points into this file are: * do_signal: perform the SIGNAL system call * do_kill: perform the KILL system call * do_ksig: accept a signal originating in the kernel (e.g., SIGINT) * sig_proc: interrupt or terminate a signalled process * do_alarm: perform the ALARM system call by calling set_alarm() * set_alarm: tell the clock task to start or stop a timer * do_pause: perform the PAUSE system call * unpause: check to see if process is suspended on anything */ #include "../h/const.h" #include "../h/type.h" #include "../h/callnr.h" #include "../h/com.h" #include "../h/error.h" #include "../h/signal.h" #include "../h/stat.h" #include "const.h" #include "glo.h" #include "mproc.h" #include "param.h" #define DUMP_SIZE 256 /* buffer size for core dumps */ #define CORE_MODE 0777 /* mode to use on core image files */ #define DUMPED 0200 /* bit set in status when core dumped */ PRIVATE message m_sig; /*===========================================================================* * do_signal * *===========================================================================*/ PUBLIC int do_signal() { /* Perform the signal(sig, func) call by setting bits to indicate that a signal * is to be caught or ignored. */ int mask; if (sig < 1 || sig > NR_SIGS) return(EINVAL); if (sig == SIGKILL) return(OK); /* SIGKILL may not ignored/caught */ mask = 1 << (sig - 1); /* singleton set with 'sig' bit on */ /* All this func does is set the bit maps for subsequent sig processing. */ if (func == SIG_IGN) { mp->mp_ignore |= mask; mp->mp_catch &= ~mask; } else if (func == SIG_DFL) { mp->mp_ignore &= ~mask; mp->mp_catch &= ~mask; } else { mp->mp_ignore &= ~mask; mp->mp_catch |= mask; mp->mp_func = func; } return(OK); } /*===========================================================================* * do_kill * *===========================================================================*/ PUBLIC int do_kill() { /* Perform the kill(pid, kill_sig) system call. */ return check_sig(pid, kill_sig, mp->mp_effuid); } /*===========================================================================* * do_ksig * *===========================================================================*/ PUBLIC int do_ksig() { /* Certain signals, such as segmentation violations and DEL, originate in the * kernel. When the kernel detects such signals, it sets bits in a bit map. * As soon is MM is awaiting new work, the kernel sends MM a message containing * the process slot and bit map. That message comes here. The File System * also uses this mechanism to signal writing on broken pipes (SIGPIPE). */ register struct mproc *rmp; int i, proc_id, proc_nr, id; unshort sig_map; /* bits 0 - 15 for sigs 1 - 16 */ /* Only kernel and FS may make this call. */ if (who != HARDWARE && who != FS_PROC_NR) return(EPERM); proc_nr = mm_in.PROC1; rmp = &mproc[proc_nr]; if ( (rmp->mp_flags & IN_USE) == 0 || (rmp->mp_flags & HANGING) ) return(OK); proc_id = rmp->mp_pid; sig_map = (unshort) mm_in.SIG_MAP; mp = &mproc[0]; /* pretend kernel signals are from MM */ mp->mp_procgrp = rmp->mp_procgrp; /* get process group right */ /* Stack faults are passed from kernel to MM as pseudo-signal 16. */ if (sig_map == 1 << (STACK_FAULT - 1)) { stack_fault(proc_nr); return(OK); } /* Check each bit in turn to see if a signal is to be sent. Unlike * kill(), the kernel may collect several unrelated signals for a process * and pass them to MM in one blow. Thus loop on the bit map. For SIGINT * and SIGQUIT, use proc_id 0, since multiple processes may have to signalled. */ for (i = 0; i < NR_SIGS; i++) { id= (i+1 == SIGINT || i+1 == SIGQUIT ? 0 : proc_id); if (i + 1 == SIGKILL) id = -1; /* simulate kill -1 9 */ if ( (sig_map >> i) & 1) check_sig(id, i + 1, SUPER_USER); } dont_reply = TRUE; /* don't reply to the kernel */ return(OK); } /*===========================================================================* * check_sig * *===========================================================================*/ PRIVATE int check_sig(proc_id, sig_nr, send_uid) int proc_id; /* pid of process to signal, or 0 or -1 */ int sig_nr; /* which signal to send (1-16) */ uid send_uid; /* identity of process sending the signal */ { /* Check to see if it is possible to send a signal. The signal may have to be * sent to a group of processes. This routine is invoked by the KILL system * call, and also when the kernel catches a DEL or other signal. SIGALRM too. */ register struct mproc *rmp; int count, send_sig; unshort mask; extern unshort core_bits; if (sig_nr < 1 || sig_nr > NR_SIGS) return(EINVAL); count = 0; /* count # of signals sent */ mask = 1 << (sig_nr - 1); /* Search the proc table for processes to signal. Several tests are made: * - if proc's uid != sender's, and sender is not superuser, don't signal * - if specific process requested (i.e., 'procpid' > 0, check for match * - if a process has already exited, it can't receive signals * - if 'proc_id' is 0 signal everyone in same process group except caller */ for (rmp = &mproc[INIT_PROC_NR + 1]; rmp < &mproc[NR_PROCS]; rmp++ ) { if ( (rmp->mp_flags & IN_USE) == 0) continue; send_sig = TRUE; /* if it's FALSE at end of loop, don't signal */ if (send_uid != rmp->mp_effuid && send_uid != SUPER_USER)send_sig=FALSE; if (proc_id > 0 && proc_id != rmp->mp_pid) send_sig = FALSE; if (rmp->mp_flags & HANGING) send_sig = FALSE; /*don't wake the dead*/ if (proc_id == 0 && mp->mp_procgrp != rmp->mp_procgrp) send_sig = FALSE; if (send_uid == SUPER_USER && proc_id == -1) send_sig = TRUE; /* SIGALARM is a little special. When a process exits, a clock signal * can arrive just as the timer is being turned off. Also, turn off * ALARM_ON bit when timer goes off to keep it accurate. */ if (sig_nr == SIGALRM) { if ( (rmp->mp_flags & ALARM_ON) == 0) continue; rmp->mp_flags &= ~ALARM_ON; } if (send_sig == FALSE || rmp->mp_ignore & mask) continue; count++; /* Send the signal or kill the process, possibly with core dump. */ sig_proc(rmp, sig_nr); /* If process is hanging on PAUSE, WAIT, tty, pipe, etc. release it. */ unpause(rmp - mproc); /* check to see if process is paused */ if (proc_id > 0) break; /* only one process being signalled */ } /* If the calling process has killed itself, don't reply. */ if ((mp->mp_flags & IN_USE) == 0 || (mp->mp_flags & HANGING))dont_reply =TRUE; return(count > 0 ? OK : ESRCH); } /*===========================================================================* * sig_proc * *===========================================================================*/ PUBLIC sig_proc(rmp, sig_nr) register struct mproc *rmp; /* pointer to the process to be signalled */ int sig_nr; /* signal to send to process (1-16) */ { /* Send a signal to a process. Check to see if the signal is to be caught. * If so, the pc, psw, and signal number are to be pushed onto the process' * stack. If the stack cannot grow or the signal is not to be caught, kill * the process. */ unshort mask; int core_file; vir_bytes new_sp; extern unshort core_bits; if ( (rmp->mp_flags & IN_USE) == 0) return; /* if already dead forget it */ mask = 1 << (sig_nr - 1); if (rmp->mp_catch & mask) { /* Signal should be caught. */ rmp->mp_catch &= ~mask; /* disable further signals */ sys_getsp(rmp - mproc, &new_sp); new_sp -= SIG_PUSH_BYTES; if (adjust(rmp, rmp->mp_seg[D].mem_len, new_sp) == OK) { sys_sig(rmp - mproc, sig_nr, rmp->mp_func); return; /* successful signal */ } } /* Signal should not or cannot be caught. Take default qstuvwxaction. */ core_file = ( core_bits >> (sig_nr - 1 )) & 1; rmp->mp_sigstatus = (char) sig_nr; if (core_file) dump_core(rmp); /* dump core */ mm_exit(rmp, 0); /* terminate process */ } /*===========================================================================* * do_alarm * *===========================================================================*/ PUBLIC int do_alarm() { /* Perform the alarm(seconds) system call. */ register int r; unsigned sec; sec = (unsigned) seconds; r = set_alarm(who, sec); return(r); } /*===========================================================================* * set_alarm * *===========================================================================*/ PUBLIC int set_alarm(proc_nr, sec) int proc_nr; /* process that wants the alarm */ unsigned sec; /* how many seconds delay before the signal */ { /* This routine is used by do_alarm() to set the alarm timer. It is also * to turn the timer off when a process exits with the timer still on. */ int remaining; m_sig.m_type = SET_ALARM; m_sig.CLOCK_PROC_NR = proc_nr; m_sig.DELTA_TICKS = HZ * sec; if (sec != 0) mproc[proc_nr].mp_flags |= ALARM_ON; /* turn ALARM_ON bit on */ else mproc[proc_nr].mp_flags &= ~ALARM_ON; /* turn ALARM_ON bit off */ /* Tell the clock task to provide a signal message when the time comes. */ if (sendrec(CLOCK, &m_sig) != OK) panic("alarm er", NO_NUM); remaining = (int) m_sig.SECONDS_LEFT; return(remaining); } /*===========================================================================* * do_pause * *===========================================================================*/ PUBLIC int do_pause() { /* Perform the pause() system call. */ mp->mp_flags |= PAUSED; /* turn on PAUSE bit */ dont_reply = TRUE; return(OK); } /*===========================================================================* * unpause * *===========================================================================*/ PUBLIC unpause(pro) int pro; /* which process number */ { /* A signal is to be sent to a process. It that process is hanging on a * system call, the system call must be terminated with EINTR. Possible * calls are PAUSE, WAIT, READ and WRITE, the latter two for pipes and ttys. * First check if the process is hanging on PAUSE or WAIT. If not, tell FS, * so it can check for READs and WRITEs from pipes, ttys and the like. */ register struct mproc *rmp; rmp = &mproc[pro]; /* Check to see if process is hanging on PAUSE call. */ if ( (rmp->mp_flags & PAUSED) && (rmp->mp_flags & HANGING) == 0) { rmp->mp_flags &= ~PAUSED; /* turn off PAUSED bit */ reply(pro, EINTR, 0, NIL_PTR); return; } /* Check to see if process is hanging on a WAIT call. */ if ( (rmp->mp_flags & WAITING) && (rmp->mp_flags & HANGING) == 0) { rmp->mp_flags &= ~ WAITING; /* turn off WAITING bit */ reply(pro, EINTR, 0, NIL_PTR); return; } /* Process is not hanging on an MM call. Ask FS to take a look. */ tell_fs(UNPAUSE, pro, 0, 0); return; } /*===========================================================================* * dump_core * *===========================================================================*/ PRIVATE dump_core(rmp) register struct mproc *rmp; /* whose core is to be dumped */ { /* Make a core dump on the file "core", if possible. */ struct stat s_buf, d_buf; char buf[DUMP_SIZE]; int i, r, s, er1, er2, slot; vir_bytes v_buf; long len, a, c, ct, dest; struct mproc *xmp; extern char core_name[]; /* Change to working directory of dumpee. */ slot = rmp - mproc; tell_fs(CHDIR, slot, 0, 0); /* Can core file be written? */ if (rmp->mp_realuid != rmp->mp_effuid) { tell_fs(CHDIR, 0, 1, 0); /* go back to MM's directory */ return; } xmp = mp; /* allowed() looks at 'mp' */ mp = rmp; r = allowed(core_name, &s_buf, W_BIT); /* is core_file writable */ s = allowed(".", &d_buf, W_BIT); /* is directory writable? */ mp = xmp; if (r >= 0) close(r); if (s >= 0) close(s); if (rmp->mp_effuid == SUPER_USER) r = 0; /* su can always dump core */ if (s >= 0 && (r >= 0 || r == ENOENT)) { /* Either file is writable or it doesn't exist & dir is writable */ r = creat(core_name, CORE_MODE); tell_fs(CHDIR, 0, 1, 0); /* go back to MM's own dir */ if (r < 0) return; rmp->mp_sigstatus |= DUMPED; /* First loop through segments and write each length on core file. */ for (i = 0; i < NR_SEGS; i++) { len = rmp->mp_seg[i].mem_len << CLICK_SHIFT; if (write(r, (char *) &len, sizeof len) < 0) { close(r); return; } } /* Now loop through segments and write the segments themselves out. */ v_buf = (vir_bytes) buf; dest = (long) v_buf; for (i = 0; i < NR_SEGS; i++) { a = (phys_bytes) rmp->mp_seg[i].mem_vir << CLICK_SHIFT; c = (phys_bytes) rmp->mp_seg[i].mem_len << CLICK_SHIFT; /* Loop through a segment, dumping it. */ while (c > 0) { ct = MIN(c, DUMP_SIZE); er1 = mem_copy(slot, i, a, MM_PROC_NR, D, dest, ct); er2 = write(r, buf, (int) ct); if (er1 < 0 || er2 < 0) { close(r); return; } a += ct; c -= ct; } } } else { tell_fs(CHDIR, 0, 1, 0); /* go back to MM's own dir */ close(r); return; } close(r); } É_do_ļgnal † _do_ļgnal: ƒ ‚ € € Ķ_mm_in+4ö jle I0012 Ķ_mm_in+4,Ń jle I0013   Ąį-22 € š • Ķ_mm_in+4,#9 ŁI0017 ‡ € š I0017: Ąå_mm_in+4 óģ Ąęģ  sal äcl ” Ķ_mm_in+14,#1 ŁI001A Ąå_mp Äā32 ĄĻ,ģ ĮĒ  ž — – ‰ or äģ ĄåĻ ° Ąå_mp Äā34 ĄĻ,ģ — not ė ĮĒ  ž – ‰ Öåė ĄčĻ Ą(ļ),ģ ĢI001B I001A: Ķ_mm_in+14ö ŁI001D Ąå_mp Äā32 ĄĻ,ģ — not ė ĮĒ  ž – ‰ Öåė ĄčĻ Ą(ļ),ģ Ąå_mp Äā34 ĄĻ,ģ — not ė ĮĒ  ž – ‰ Öåė ĄčĻ Ą(ļ),ģ ĢI001B I001D: Ąå_mp Äā32 ĄĻ,ģ — not ė ĮĒ  Ąā2 – ‰ Öåė ĄčĻ Ą(ļ),ģ Ąå_mp Äā34 ĄĻ,ģ ĮĒ  ž — – ‰ or äģ ĄåĻ ° Ąå_mp Ąę_mm_in+14 Ą36Ē,ķ I001B: ‡ € Ÿ  … „  É_do_kill _do_kill: ƒ ‚ Ąå_mp Į28Ē Į_mm_in+6 Į_mm_in+4 Ó_check_ļg ¤ … „  É_do_kļg _do_kļg: ƒ ‚ ×ņ,#12 Ķ_who,#-1 je I0033 Ķ_who,#1 je I0033 Ąį-1 € ĢI0031 I0033: Ąå_mm_in+4 ĄŲ,ģ Ąį40 mul Ų » Äā_mproc ĄĘ,ģ § testb 38Ē,#1 je I0036 § testb 38Ē,#4 je I0037 I0036: ‡ € ĢI0031 I0037: § Ąä20Ē ĄŠ,ė  ž Ąä_mm_in+6 – Ą-12(ń),ė Ą_mp,#_mproc § Ąč_mp Ąä24Ē Ą24(ļ),ė Ķ-12(ń),#32768 ŁI003B ĮŲ Ó_stack_fault Š Ėax,ė € ĢI0031 I003B: ĄĻö I00310: ĶĻ,Ń jge I003D £ Üė Ķį2 je I00311 £ Üė Ķį3 ŁI00312 I00311: ‡ € ĢI00313 I00312: ĮŠ I00313: Ć-10(ń) £ Üė Ķį9 ŁI00316 Ą-10(ń),#-1 I00316:  ž £ Į-12(ń) –  ž – Ąęė  shr äcl testb al,#1 je I003E £ Üė Ėåģ ¦ € Į-10(ń) Ó_check_ļg ¤ I003E: ÜĻ ĢI00310 I003D: Ą_dont_reply,#1 ‡ € I0031:  … „  _check_ļg: ƒ ‚ ×ņ,#10 ĶĪö jle I0042 ĶĪ,Ń jle I0043 I0042: Ąį-22 € ĢI0041 I0043: ĄĻö ĄäĪ óė Ąęė  sal äcl  ž – ĄŲ,ė ĄĘ,#_mproc+120 I0049: ĶĘ,#_mproc+640 jae I0046 § testb 38Ē,#1 ŁI004B ĢI0047 I004B: ĄŠ,#1 § mov ä28Ē ĶŌ,ė je I004E ĶŌö je I004E ĄŠö I004E: ĶÅö jle I00412 § Ąä20Ē ĶÅ,ė je I00412 ĄŠö I00412: § testb 38Ē,#4 je I00416 ĄŠö I00416: ĶÅö ŁI00419 Ąå_mp ĄčĘ Ąä24(ļ) Ķ24Ē,ė je I00419 ĄŠö I00419: ĶŌö ŁI0041D ĶÅ,#-1 ŁI0041D ĄŠ,#1 I0041D: ĶĪ,#14 ŁI00421 § testb 38Ē,Ń ŁI00424 ĢI0047 I00424: § Äā38 Ą-10(ń),ģ « Öį65519 ° I00421: ĶŠö je I0047 § ĄäŲ test 32Ē,ė je I00427 ĢI0047 I00427: ÜĻ “ ” Ó_ļg_proc Š Š — ×į_mproc Ąā40 cwd išv ģ € Ó_unpause Š ĶÅö jle I0047 ĢI0046 I0047: ÄĘ,#40 ĢI0049 I0046: Ąå_mp testb 38Ē,#1 je I0042D Ąå_mp testb 38Ē,#4 je I0042E I0042D: Ą_dont_reply,#1 I0042E: ĶĻö jle I00432 ‡ € ĢI0041 I00432: Ąį-3 € I0041:  … „  É_ļg_proc _ļg_proc: ƒ ‚ ×ņ,#8 ’ testb 38Ē,#1 ŁI0053 … „  I0053: ĄäĪ óė Ąęė  sal äcl  ž – ” ’ — test 34Ē,ė je I0056 ’ Äā34 ĄŲ,ģ — not ė ÖäĒ ° ¢ ×į_mproc Ąā40 cwd išv ģ ŪåŠ ¦ € Ó_sys_getņ Š Š ĄäŠ ×į8 ĄŠ,ė ’ ĮŠ Į10Ē ˆ Ó_adjust ¤ ™ ŁI0056 ’ ¢ ×į_mproc Ąć40 cwd išv ķ Į36Ē “ € Ó_sys_ļg ¤ … „  I0056: ĄäĪ óė  ž Į_core_bits –  ž – Ąęė  shr äcl Öį1  ž – ¬ Ąå4(ń) ĄäĪ Ź19Ē,al ĶĻö je I005C ˆ Ó_dump_core Š I005C: ‡ € ˆ Ó_mm_exit Š Š … „  É_do_alarm _do_alarm: ƒ ‚ € €  ž Ąä_mm_in+4 – ¬ ¹ Į_who Ó_set_alarm Š Š ” — … „  É_set_alarm _set_alarm: ƒ ‚ € € Ą_m_ļg+2,#1 ’ Ą_m_ļg+4,ģ Ąį60 mul Ī Ėåģ Ą_m_ļg+10,ė Ą_m_ļg+10+2,ģ ĶĪö je I0073 Ąį40 mul Å » Äā_mproc+38 ĄĻ,ģ « or į16 ° ĢI0074 I0073: Ąį40 mul Å » Äā_mproc+38 ĄĻ,ģ « Öį65519 ° I0074: Ąį_m_ļg € Ąį-3 € Ó_sendrec Š Š ™ je I0076 Ąį32768 € Ąį_1 € Ó_panic Š Š I0076: Ąå_m_ļg+10 ĄĘ,ģ Ąė,Ę … „  É_do_pause _do_pause: ƒ ‚ € Ąå_mp Äā38 ĄĘ,ģ « or į8 ° Ą_dont_reply,#1 ‡ … „  É_unpause _unpause: ƒ ‚ € € Ąį40 mul Å » Äā_mproc ĄĘ,ģ § testb 38Ē,#8 je I0093 § testb 38Ē,#4 ŁI0093 § Äā38 ĄĻ,ģ « Öį65527 ° ‡ € € Ąį-4 € ˆ Ó_reply Äņ,#8 … „  I0093: § testb 38Ē,#2 je I0097 § testb 38Ē,#4 ŁI0097 § Äā38 ĄĻ,ģ « Öį65533 ° ‡ € € Ąį-4 € ˆ Ó_reply Äņ,#8 … „  I0097: ‡ € € ˆ Ąį65 € Ó_tell_fs Äņ,#8 … „  _dump_core: ƒ ‚ ×ņ,#356 ¢ ×į_mproc Ąā40 cwd išv ģ Ą-32Ō,ė ‡ € € Į-32Ō 2 € Ó_tell_fs Äņ,#8 ’ ĄčÅ Ąä28(ļ) Ķ26Ē,ė je I00A3 ‡ €  € ‡ € 2 € Ó_tell_fs Äņ,#8 … „  I00A3: Ąå_mp Ą-352(ń),ģ ’ Ą_mp,ģ “ € Ūä-30(ń) € Ąį_core_name € Ó_allowed ¤ Ą-320(ń),ė “ € Ūä-60(ń) € Ąį_2 € Ó_allowed ¤ Ą-322(ń),ė Ąå-352(ń) Ą_mp,ģ Ķ-320(ń)ö jl I00A6 Į-320(ń) Ó_close Š I00A6: Ķ-322(ń)ö jl I00A9 Į-322(ń) Ó_close Š I00A9: ’ Ķ28Ēö ŁI00AC Ą-320(ń)ö I00AC: Ķ-322(ń)ö jl I00AF Ķ-320(ń)ö jge I00AE Ķ-320(ń),#-2 ŁI00AF I00AE: Ąį511 € Ąį_core_name € Ó_creat Š Š Ą-320(ń),ė ‡ €  € ‡ € Ąä#12 € Ó_tell_fs Äņ,#8 Ķ-320(ń)ö jge I00A14 … „  I00A14: ’ Äā19 Ą-35Å,ģ Ąå-35Å ‡ Œ €  ž  – or į128  ž – Ąå-35Å ŗ Ą-31Ōö I00A19: Ķ-31Ō,#3 jge I00A16 Ąį6 mul -31Ō » ÄåÅ Ąć4 Ąä4Ē sal äcl Ėåģ Ą-33Å,ė Ą-332(ń),ģ Ąį4 € Ūä-33Å € Į-320(ń) Ó_write ¤ ™ jge I00A17 Į-320(ń) Ó_close Š … „  I00A17: Ü-31Ō ĢI00A19 I00A16: Ūå-31Ī Ą-330(ń),ģ ‡ Ąå-330(ń) Ą-350(ń),ģ Ą-34Ō,ė Ą-31Ōö I00A20: Ķ-31Ō,#3 jge I00A10 Ąį6 mul -31Ō » ÄåÅ ‡ Ąć4 ĄåĒ © 2: sal ā1 rcl į1 Ø 1: Ą-33Ō,ģ Ą-33Ī,ė Ąį6 mul -31Ō » ÄåÅ ‡ Ąć4 Ąå4Ē jcxz 1f 2: sal ā1 rcl į1 Ø 1: Ą-342(ń),ģ Ą-340(ń),ė I00A22: Ąä-342(ń) Ąå-340(ń) ×į0 sbb ā0 Ł1f Öäė je 1f Üģ 1: or åģ jle I00A1E Ąä-342(ń) Ąå-340(ń) ×į256 sbb ā0 Ł1f Öäė je 1f Üģ 1: or åģ jge I00A25 Į-340(ń) Į-342(ń) ĢI00A26 I00A25: ‡ € “56 € I00A26: Ć-34Ī Ć-34Å Į-34Å Į-34Ī Į-34Ō Į-350(ń)  € ‡ € Į-33Ī Į-33Ō Į-31Ō Į-32Ō Ó_mem_copy Äņ,#20 Ą-32Å,ė Į-34Ī Ūä-31Ī € Į-320(ń) Ó_write ¤ Ą-32Ī,ė Ķ-32Åö jl I00A27 Ķ-32Īö jge I00A28 I00A27: Į-320(ń) Ó_close Š … „  I00A28: Ąä-33Ō Ąå-33Ī Ää-34Ī adc å-34Å Ą-33Ō,ė Ą-33Ī,ģ Ąä-342(ń) Ąå-340(ń) ×ä-34Ī sbb å-34Å Ą-342(ń),ė Ą-340(ń),ģ ĢI00A22 I00A1E: Ü-31Ō ĢI00A20 I00AF: ‡ €  € ‡ € 2 € Ó_tell_fs Äņ,#8 Į-320(ń) Ó_close Š … „  I00A10: Į-320(ń) Ó_close Š … „  ³ _m_ļg: .zerow 24/2 ® _1: Ā27745 Ā29281 Ā8301 Ā29285 ø _2: Ā46 † /* This file contains the table used to map system call numbers onto the * routines that perform them. */ #include "../h/const.h" #include "../h/type.h" #include "const.h" #undef EXTERN #define EXTERN #include "../h/callnr.h" #include "glo.h" #include "mproc.h" #include "param.h" /* Miscellaneous */ char core_name[] = {"core"}; /* file name where core images are produced */ unshort core_bits = 0x0EFC; /* which signals cause core images */ extern char mm_stack[]; char *stackpt = &mm_stack[MM_STACK_BYTES]; /* initial stack pointer */ extern do_mm_exit(), do_fork(), do_wait(), do_brk(), do_getset(), do_exec(); extern do_signal(), do_kill(), do_pause(), do_alarm(); extern no_sys(), unpause(), do_ksig(), do_brk2(); int (*call_vec[NCALLS])() = { no_sys, /* 0 = unused */ do_mm_exit, /* 1 = exit */ do_fork, /* 2 = fork */ no_sys, /* 3 = read */ no_sys, /* 4 = write */ no_sys, /* 5 = open */ no_sys, /* 6 = close */ do_wait, /* 7 = wait */ no_sys, /* 8 = creat */ no_sys, /* 9 = link */ no_sys, /* 10 = unlink */ no_sys, /* 11 = exec */ no_sys, /* 12 = chdir */ no_sys, /* 13 = time */ no_sys, /* 14 = mknod */ no_sys, /* 15 = chmod */ no_sys, /* 16 = chown */ do_brk, /* 17 = break */ no_sys, /* 18 = stat */ no_sys, /* 19 = lseek */ do_getset, /* 20 = getpid */ no_sys, /* 21 = mount */ no_sys, /* 22 = umount */ do_getset, /* 23 = setuid */ do_getset, /* 24 = getuid */ no_sys, /* 25 = stime */ no_sys, /* 26 = (ptrace)*/ do_alarm, /* 27 = alarm */ no_sys, /* 28 = fstat */ do_pause, /* 29 = pause */ no_sys, /* 30 = utime */ no_sys, /* 31 = (stty) */ no_sys, /* 32 = (gtty) */ no_sys, /* 33 = access */ no_sys, /* 34 = (nice) */ no_sys, /* 35 = (ftime) */ no_sys, /* 36 = sync */ do_kill, /* 37 = kill */ no_sys, /* 38 = unused */ no_sys, /* 39 = unused */ no_sys, /* 40 = unused */ no_sys, /* 41 = dup */ no_sys, /* 42 = pipe */ no_sys, /* 43 = times */ no_sys, /* 44 = (prof) */ no_sys, /* 45 = unused */ do_getset, /* 46 = setgid */ do_getset, /* 47 = getgid */ do_signal, /* 48 = sig */ no_sys, /* 49 = unused */ no_sys, /* 50 = unused */ no_sys, /* 51 = (acct) */ no_sys, /* 52 = (phys) */ no_sys, /* 53 = (lock) */ no_sys, /* 54 = ioctl */ no_sys, /* 55 = unused */ no_sys, /* 56 = (mpx) */ no_sys, /* 57 = unused */ no_sys, /* 58 = unused */ do_exec, /* 59 = exece */ no_sys, /* 60 = umask */ no_sys, /* 61 = chroot */ no_sys, /* 62 = unused */ no_sys, /* 63 = unused */ do_ksig, /* 64 = KSIG: signals originating in the kernel */ no_sys, /* 65 = UNPAUSE */ do_brk2, /* 66 = BRK2 (used to tell MM size of FS,INIT) */ no_sys, /* 67 = REVIVE */ no_sys /* 68 = TASK_REPLY */ }; É_core_name ® _core_name: Ā28515 Ā25970 É_core_bits ø _core_bits: É_stackpt Ā3836 _stackpt: Ā_mm_stack+2432 É_call_vec _call_vec: Ā_no_sys Ā_do_mm_exit Ā_do_fork Ā_no_sys Ā_no_sys Ā_no_sys Ā_no_sys Ā_do_wait Ā_no_sys Ā_no_sys Ā_no_sys Ā_no_sys Ā_no_sys Ā_no_sys Ā_no_sys Ā_no_sys Ā_no_sys Ā_do_brk Ā_no_sys Ā_no_sys Ā_do_getset Ā_no_sys Ā_no_sys Ā_do_getset Ā_do_getset Ā_no_sys Ā_no_sys Ā_do_alarm Ā_no_sys Ā_do_pause Ā_no_sys Ā_no_sys Ā_no_sys Ā_no_sys Ā_no_sys Ā_no_sys Ā_no_sys Ā_do_kill Ā_no_sys Ā_no_sys Ā_no_sys Ā_no_sys Ā_no_sys Ā_no_sys Ā_no_sys Ā_no_sys Ā_do_getset Ā_do_getset Ā_do_ļgnal Ā_no_sys Ā_no_sys Ā_no_sys Ā_no_sys Ā_no_sys Ā_no_sys Ā_no_sys Ā_no_sys Ā_no_sys Ā_no_sys Ā_do_exec Ā_no_sys Ā_no_sys Ā_no_sys Ā_no_sys Ā_do_kļg Ā_no_sys Ā_do_brk2 Ā_no_sys Ā_no_sys É_mproc ³ _mproc: .zerow 640/2 É_mm_stack _mm_stack: .zerow 2432/2 É_res_ptr _res_ptr: .zerow 2/2 É_result2 _result2: .zerow 2/2 É_err_code _err_code: .zerow 2/2 É_mm_call _mm_call: .zerow 2/2 É_who _who: .zerow 2/2 É_mm_out _mm_out: .zerow 24/2 É_mm_in _mm_in: .zerow 24/2 É_procs_in_use _procs_in_use: .zerow 2/2 É_dont_reply _dont_reply: .zerow 2/2 É_mp _mp: .zerow 2/2 † /* If there were any type definitions local to the Memory Manager, they would * be here. This file is included only for symmetry with the kernel and File * System, which do have some local type definitions. */ #include "../h/type.h" /* This file contains some useful utility routines used by MM. * * The entries into the file are: * allowed: see if an access is permitted * mem_copy: copy data from somewhere in memory to somewhere else * no_sys: this routine is called for invalid system call numbers * panic: MM has run aground of a fatal error and cannot continue */ #include "../h/const.h" #include "../h/type.h" #include "../h/callnr.h" #include "../h/com.h" #include "../h/error.h" #include "../h/stat.h" #include "const.h" #include "glo.h" #include "mproc.h" PRIVATE message copy_mess; /*===========================================================================* * allowed * *===========================================================================*/ PUBLIC int allowed(name_buf, s_buf, mask) char *name_buf; /* pointer to file name to be EXECed */ struct stat *s_buf; /* buffer for doing and returning stat struct */ int mask; /* R_BIT, W_BIT, or X_BIT */ { /* Check to see if file can be accessed. Return EACCES or ENOENT if the access * is prohibited. If it is legal open the file and return a file descriptor. */ register int fd, shift; int mode; extern errno; /* Open the file and stat it. */ if ( (fd = open(name_buf, 0)) < 0) return(-errno); if (fstat(fd, s_buf) < 0) panic("allowed: fstat failed", NO_NUM); /* Only regular files can be executed. */ mode = s_buf->st_mode & I_TYPE; if (mask == X_BIT && mode != I_REGULAR) { close(fd); return(EACCES); } /* Even for superuser, at least 1 X bit must be on. */ if (mp->mp_effuid == SUPER_USER && mask == X_BIT && (s_buf->st_mode & (X_BIT << 6 | X_BIT << 3 | X_BIT))) return(fd); /* Right adjust the relevant set of permission bits. */ if (mp->mp_effuid == s_buf->st_uid) shift = 6; else if (mp->mp_effgid == s_buf->st_gid) shift = 3; else shift = 0; if (mp->mp_effuid == SUPER_USER && mask != X_BIT) return(fd); if (s_buf->st_mode >> shift & mask) /* test the relevant bits */ return(fd); /* permission granted */ else { close(fd); /* permission denied */ return(EACCES); } } /*===========================================================================* * mem_copy * *===========================================================================*/ PUBLIC int mem_copy(src_proc,src_seg, src_vir, dst_proc,dst_seg, dst_vir, bytes) int src_proc; /* source process */ int src_seg; /* source segment: T, D, or S */ long src_vir; /* source virtual address (clicks for ABS) */ int dst_proc; /* dest process */ int dst_seg; /* dest segment: T, D, or S */ long dst_vir; /* dest virtual address (clicks for ABS) */ long bytes; /* how many bytes (clicks for ABS) */ { /* Transfer a block of data. The source and destination can each either be a * process (including MM) or absolute memory, indicate by setting 'src_proc' * or 'dst_proc' to ABS. */ if (bytes == 0L) return(OK); copy_mess.SRC_SPACE = (char) src_seg; copy_mess.SRC_PROC_NR = src_proc; copy_mess.SRC_BUFFER = src_vir; copy_mess.DST_SPACE = (char) dst_seg; copy_mess.DST_PROC_NR = dst_proc; copy_mess.DST_BUFFER = dst_vir; copy_mess.COPY_BYTES = bytes; sys_copy(©_mess); return(copy_mess.m_type); } /*===========================================================================* * no_sys * *===========================================================================*/ PUBLIC int no_sys() { /* A system call number not implemented by MM has been requested. */ return(EINVAL); } /*===========================================================================* * panic * *===========================================================================*/ PUBLIC panic(format, num) char *format; /* format string */ int num; /* number to go with format string */ { /* Something awful has happened. Panics are caused when an internal * inconsistency is detected, e.g., a programm_ing error or illegal value of a * defined constant. */ printf("Memory manager panic: %s ", format); if (num != NO_NUM) printf("%d",num); printf("\n"); tell_fs(SYNC, 0, 0, 0); /* flush the cache to the disk */ sys_abort(); } É_allowed † _allowed: ƒ ‚ ×ņ,#6 ‡ € ˆ Ó_open Š Š ” ĶĘö jge I0013 Ąå_errno ōģ ¦ š • “ ” Ó_fstat Š Š ™ jge I0016 Ąį32768 € Ąį_1 € Ó_panic Š Š ½ Æ Ąä4Ē Öį61440  ž – ĄŠ,ė  ž ĄäŌ – Ķį1 ŁI0019  ž ĄäŠ – Ķį32768 je I0019 ” Ó_close Š Ąį-13 € š I0019: Ąå_mp Ķ28Ēö ŁI001D  ž ĄäŌ – Ķį1 ŁI001D Æ testb 4Ē,#73 je I001D ” š I001D: Ąå_mp ĄčĪ Ąä8(ļ) Ķ28Ē,ė ŁI00112 ĄĻ,#6 š3 I00112: Ąå_mp Źal,31Ē Ž ‹ Æ Ķ10Ē,ė ŁI00115 ĄĻ,#3 š3 I00115: ĄĻö I00113: Ąbx,_mp Ķ28Ēö ŁI00118  ž ĄäŌ – Ķį1 je I00118 ” š I00118: Æ Į4Ē  ž £ –  ž – Ąęė  shr äcl €  ž ĄäŌ – ‰ test åė je I0011C ” š I0011C: ” Ó_close Š Ąį-13 € Ÿ  … „  É_mem_copy _mem_copy: ƒ ‚ Ąä20(ń) Ąå22(ń) ×į0 sbb ā0 Ł1f or åė 1: or åģ ŁI0023 ‡ € ĢI0021 I0023: Æ Ź_copy_mess+4,bl ’ Ą_copy_mess+6,ģ › Ą_copy_mess+10,ģ Ąå10(ń) Ą_copy_mess+10+2,ģ Ąå1Å Ź_copy_mess+5,bl Ąå12(ń) Ą_copy_mess+8,ģ Ąå1Ī Ą_copy_mess+14,ģ Ąå1Ō Ą_copy_mess+14+2,ģ Ąå20(ń) Ą_copy_mess+18,ģ Ąå22(ń) Ą_copy_mess+18+2,ģ Ąį_copy_mess € Ó_sys_copy Š Į_copy_mess+2 I0021:  … „  É_no_sys _no_sys: ƒ ‚ Ąį-22 … „  É_panic _panic: ƒ ‚ ˆ Ąį_2 € Ó_printk Š Š  ž ĄäĪ – Ķį32768 je I0043 “ Ąį_3 € Ó_printk Š Š I0043: Ąį_4 € Ó_printk Š ‡ € € € Ąį36 € Ó_tell_fs Äņ,#8 Ó_sys_abort … „  ³ _copy_mess: .zerow 24/2 ® _1: Ā27745 Ā28524 Ā25975 Ā14948 Ā26144 Ā29811 Ā29793 Ā26144 Ā26977 Ā25964 Ā100 _2: Ā25933 Ā28525 Ā31090 Ā27936 Ā28257 Ā26465 Ā29285 Ā28704 Ā28257 Ā25449 Ā8250 Ā29477 Ā32 _3: Ā25637 ø _4: Ā10 † ...cg crtso.s!end.s"head.s#libc.a$optp0š`øY)ų‹Ü‹ƒĆ‹Į@ŃąĆ£PSQčĶ0ƒÄPč–Yøzčö^ĒFśĒ†Œūė>č…:ĒFśƒ> R ~’v’vøōYPč³FƒÄFś’vč·6ƒÄ‰Fų…ĄuBƒ~t6’Nč#!‹^Š˜%’F=wŃą“’§<Ē€ZĒRƒ~u˜ƒnš‹FśéÆ^‹^ųŠ˜‰Fö’Fų=éĒFō’ĒFī+’ėk‹^ų’FųŠ˜*ä‰Fš=€|-€¹Óą‹^ųйÓāÓś*ö ‰Fš’Fų’vščŖBƒÄ‰Fņ;Fōw(;Fōs…ĄuéåĒFī‰FōFŹ‹VīŃā‹؋Fš‰’FīG;~ö|ƒ~ī遍†6üPčr;ƒÄ‹F +Fś@‰†4ü+’ėL+ĄP’¶4üP’vFŹ‹×Ńā‹؋ö P脞ƒÄ ‰†2ü;†4üs‰†4üFŹ‹×Ńā‹؋‰Fš†6üPčÅ;ƒÄG;~ī|ƋFś†4ü;F vC‹†4üFśéŽž‹FʉFšė1‹^ų’FųŠ˜*ä‰Fš=€|-€¹Óą‹^ųйÓāÓś*ö ‰Fš’Fų‹Fšö ‰FéižĒ€ZdžŒūéZž‹^ŠG’˜¹Óų%£€Z+’ėV‹^’FŠ˜*䍖āū‹ßŃćӋډ=€|7†āū‹×Ńā‹؋-€¹Óą‹^йÓāÓś*ö Ā–āū‹ßŃćӋډ’FG;>€Z|¤†āū‹×ŃāĀ‹ŲĒéÕż‹^ŠG’˜¹Óų%£€Z+’ėV‹^’FŠ˜*䍖āū‹ßŃćӋډ=€|7†āū‹×Ńā‹؋-€¹Óą‹^йÓāÓś*ö Ā–āū‹ßŃćӋډ’FG;>€Z|¤†āū‹×ŃāĀ‹ŲĒ” RHŗ ÷źøY‰†,ü+’ėq¾,üøYro’¶,üčSBƒÄ‰†šūė#†āū‹×Ńā‹ؒ7č%BƒÄ‰†īū;†šū )†šūG;>€Z|×;>€Z}%ƒ¾šūt’v’v’¶,üčuCƒÄFś‹Fś;F réżƒ®,ü ;>€Z|‰” RHŗ ÷źøY‰†,ü+’ė\¾,üøYrZ’¶,üčČAƒÄ‰†šū†āū‹×Ńā‹ؒ7čœAƒÄ‰†īū‹†šū;†īūt’v’v’¶,üčCƒÄFś‹Fś;F réŽüGƒ®,ü ;>€Z|ž” RHŗ ÷źøY‰†,ü+’džąūé&¾,üøYsé$+ĄP†āū‹×Ńā‹؋¹Óą/P’¶,üčŲ9ƒÄ…Ąt鼍†āū‹×Ńā‹؋¹Óą/P’¶,üčĀDƒÄ‰†Ęū…ĄuVdžüė&‹†,ü-øY™¹ ÷ł@‹Ń÷ź–Ųū‹žüŃćӋŚ)’†ü‹†ü;†ąū|Š’v’v’¶,üč$BƒÄFś‹Fś;F r}é²ū‹žĘūƒu"+ĄP’v’vS’¶,üčAƒÄ Fś‹Fś;F rBé†ū†Ųū‹–ąūŃā‹؋†,ü‰†Šū‹–ąūŃā‹؋†Ęū‰†Čū‹–ąūŃā‹ؔ‚Z‰’†ąūGƒ®,ü ;>€Z}éŃž”€Z; RéŸ+ R‰†Šū” RH‰†üė3‹†ü†Šūŗ ÷źøY‰†‚ū‹†üŗ ÷źøYW‹š‹¾‚ū¹ėó„_’Žüƒ¾ü}Ędžü닆üŗ ÷ź‹ŲLJøY’†ü‹†ü;†Šū|዆Šū Rdžü닆Šūŗ ÷ź–Ųū‹žüŃćӋŚ’†ü‹†ü;†ąū|Ł‹†ŠūHŗ ÷źøY‰†,ü;>€Z|éၾ,üøYsé֍†āū‹×Ńā‹؋¹Óą/P+ĄPčļBƒÄ‰†Ęū…Ąu4džüė†Čū‹–üŃā‹ؒ7čØ3ƒÄ’†ü‹†ü;†ąū|ÜĒFśc€éś‹žĘūƒu"+ĄP’v’vS’¶,üčj?ƒÄ Fś‹Fś;F rBéÕł†Ųū‹–ąūŃā‹؋†,ü‰†Šū‹–ąūŃā‹؋†Ęū‰†Čū‹–ąūŃā‹ؔ‚Z‰’†ąūGƒ®,ü é’džŠūƒ¾ąūuéMł†6üPč5ƒÄ‹F +Fś@‰†4ü’¶ąū†ČūPčüƒÄ‰†ˆūdž„ū顋žˆū‹‰††ū+’dž2üėH‹†2ü;†4üsD‹†ˆū‹×Ńā‹ؒ7+ĄP’v†Šū‹×Ńā‹ؒ7†Ųū‹×Ńā‹ؒ7č{>ƒÄ †2üG;¾ąū|²‹†2ü;†4üs+ĄP‹†4ü+†2üP+ĄP’v’včFųƒÄ †2ü‹†2ü;†4üs‰†4ü‹†ˆū‰†„ūė ’¶ˆūč/2ƒÄ†6üPč^5ƒÄ‹††ū‰†ˆūƒ¾ˆūté6’+’ė†Čū‹×Ńā‹ؒ7čś1ƒÄG;¾ąū|å‹Fś†4ü;F w髃¾„ūt ’¶„ūčÓ1ƒÄ‹†Šū;€ZuéMł…Ąth~ ’s ‹F @‰Fśé ų+’ė,‹Ēŗ ÷źøY‰†‚ū‹Ē†Šūŗ ÷źøYW‹š‹¾‚ū¹ėó„_G” R+†Šū;ų|ɋ†Šū) R’v’v” RHŗ ÷źøYė ’v’vøøYPč>ƒÄFś‹Fś;F sé)ūéØ÷+’ė=‹†„ū‹×Ńā‹ؒ7’v’v†Šū‹×Ńā‹ؒ7†Ųū‹×Ńā‹ؒ7čņ<ƒÄ FśG;¾ąū|½’¶„ūčč0ƒÄé$÷‹^ŠG’˜© te’FŠ˜*䉆0ü=€|-€¹Óą‹^йÓāÓś*ö ‰†0ü’F‹^’FŠ˜*䉆.ü=€|Z-€¹Óą‹^йÓāÓś*ö ‰†.ü’Fė9‹^’FŠ˜*䉆0ü=€|-€¹Óą‹^йÓāÓś*ö ‰†0ü’Fdž.ü” R+€ZHŗ ÷źøY‰†,üėB’¶.ü‹†0ü¹Óą/P’¶,üč4ƒÄ…Ąt’v’v’¶,üčÉ<ƒÄFś‹Fś;F réWöƒ®,ü ¾,üøYs¶Ē†&ü%¾&ü†&ré ö’¶.ü‹†0ü¹Óą/P‹†&üPčŗ3ƒÄ…Ąt ‹ž&üĒGƒ†&üėĀ‹^’FŠ˜*䉆.ü=€|-€¹Óą‹^йÓāÓś*ö ‰†.ü’F‹†.üŗ÷ź&'PčŒ ƒÄ–öūW‹š‹ś¹ėó„_” R+€ZHŗ ÷źøY‰†,ü¾,üøYsé`õ‹ž,üƒ?’u*‹G;†ųūue’v’v’¶,üčŅ;ƒÄFś‹Fś;F ré`õé-õ‹ž,ü‹ŗ ÷ź†&‰†*ü+’‹†*üNj؀?u‹†,ü‹×¹Óā‹؋;†ųūt”Gƒ’|Ѓ®,ü év’‹^’FŠ˜*䉆(ü=€|-€¹Óą‹^йÓāÓś*ö ‰†(ü’F†üP’¶(üč<3ƒÄƒ¾ü’uøPø’’P’¶üč,,ƒÄéƒō‹†üŗ ÷ź†&‰†*ü+’ƒ’|éiō‹†*üNj؀?uøPø’’P†ü‹×¹Óā‹ؒ7čą+ƒÄGėĘdž&üĢ$¾&ü†&ré&ō‹ž&üƒt ‹G)G ĒGƒ†&üėŁ‹^ŠG’˜© te’FŠ˜*䉆ü=€|-€¹Óą‹^йÓāÓś*ö ‰†ü’F‹^’FŠ˜*䉆(ü=€|Z-€¹Óą‹^йÓāÓś*ö ‰†(ü’Fė9‹^’FŠ˜*䉆ü=€|-€¹Óą‹^йÓāÓś*ö ‰†ü’Fdž(ü†üP’¶(üčī1ƒÄƒ~ tédžüĒFī‹žüŃ拇FF‰†$üėV‹†&ü-Ģ$™¹÷łPč+ƒÄ…Ąu9‹†&ü-Ģ$™¹÷łVŹ‹^īŃćӋډ’Fī†üP‹†&üPč5ƒÄ…Ąt’†üƒ†$ü‹ž$ü‹‰†&ü…Ąuœƒ~īu:” R;€Zƒ~uéŲųøbPčæ<ƒÄ’v’vøøYPč+9ƒÄFś‹Fś;F ré¹ņƒ~īué8’ƒ¾üu-‹Fī‰Fģ+’;~ī|éэFŹ‹×Ńā‹؋V؋ßŃćӋډGėŪ†ü–üW‹š‹ś¹ėó„_ĒFģ+’;~ī|鐍†üPFŹ‹×Ńā‹؋ŗ÷źŚ$Pč84ƒÄ…ĄtaFŹ‹×Ńā‹؋V؋^ģŃćӋډ’Fģdžü‹FģH9†ü}3F؋–üŃā‹؋Їŗ$˜VŹ‹ßŃćӋڋЗŗ$¹ÓāÓś;Āu’NģGén’’†üė¹Ē†ü’’捆ü‹×¹ÓāĀ‹ŲĒĒGGƒ’|āƒ~ģu ‹F؉†žūé<†6üPč¤-ƒÄ‹F +Fś@‰†4üdžüéē+ĄPøPF؋–üŃā‹ؒ7čĢ(ƒÄF؋–üŃā‹؋‰†üF؋–üŃā‹؋‹RŃ扇„Z’Rƒ¾üt ’¶4ü+ĄP’v†üP†üPčÓ"ƒÄ ‰†2üėdž2üF؋–üŃā‹ؒ7č)ƒÄ‹†2ü;†4üs+ĄP‹†4ü+†2üP+ĄP’v’včAšƒÄ †2ü‹†2ü;†4üs‰†4üF؋–üŃā‹؋‰†žū†6üPčZ-ƒÄ’†ü‹†ü;Fģ}é ’‹Fś†4ü;F végö‹F ‰†žūPč5(ƒÄ…ĄtéRödžü’’+ĄPøP’¶žūčŗ'ƒÄ‹†žū‰†üƒ¾üt(ø’P’v’v†üP†üPčé!ƒÄ Fś‹Fś;F r é š’¶žūč7(ƒÄ‹RŃ拆žū‰‡„Z’Ré¾ļ‹^’FŠ˜*䉆üū=€|-€¹Óą‹^йÓāÓś*ö ‰†üū’F‹^’FŠ˜*䉆.ü=€|-€¹Óą‹^йÓāÓś*ö ‰†.ü’Fƒ~uéOļ‹žüūŃć’·–,člƒÄ’¶.üč›é ų‹^ŠG’˜¹Óų%‹ų‹^’FŠ˜*䉆üū=€|-€¹Óą‹^йÓāÓś*ö ‰†üū’Fƒ~t‹žüūŃć’·–,čƒÄčø‹ĒO…Ąu­éĪī‹^’FŠ˜*䉆(ü=€|-€¹Óą‹^йÓāÓś*ö ‰†(ü’F†üP’¶(üč)-ƒÄ‹^’FŠ˜*䉆(ü=€|-€¹Óą‹^йÓāÓś*ö ‰†(ü’F†üP’¶(üčē,ƒÄ‹F +Fś@P’v’v†üP†üPč* ƒÄ Fś‹Fś;F réNīéī‹^’FŠ˜*䉆.ü=€|-€¹Óą‹^йÓāÓś*ö ‰†.ü’F‹†.üŗ÷ź&'PčŃƒÄ–öūW‹š‹ś¹ėó„_’¶ųūč&éö‹^ŠG’˜¹Óų%‰†ģū+’ėd‹^’FŠ˜*䉆(ü=€|-€¹Óą‹^йÓāÓś*ö ‰†(ü’F‹Ēŗ ÷ź–’ūĀP’¶(üčõ+ƒÄøP‹Ēŗ ÷ź–’ūĀPč”2ƒÄG;¾ģū|–+’ė#ƒ¾Œūuø’’P” RHŗ ÷źøYPčk2ƒÄ’ RG;>€Z|×+’ė0” Rŗ ÷źøY‰†‚ū‹Ēŗ ÷ź–’ūĀW‹š‹¾‚ū¹ėó„_’ RG;¾ģū|Ź+’;>R|éĒģ+ĄPø’’P‹ßŃć’·„ZčX$ƒÄGėߋ^ŠG’˜¹Óų%‰†ū”R-ˆZ™¹ ÷ł‰†ü‹†ū;†ü~W‹>Rė0‹Ē†ū+†üŗ ÷źˆZ‰†‚ū‹Ēŗ ÷źˆZW‹š‹¾‚ū¹ėó„_O…’}Ģ‹†ū+†üR‹†ū+†üŗ ÷źR‹†ūŗ ÷ź)R+’;¾ū|éV‹^’FŠ˜*䉆Žū=€|-€¹Óą‹^йÓāÓś*ö ‰†Žū’F‹^’FŠ˜*䉆.ü=€|-€¹Óą‹^йÓāÓś*ö ‰†.ü’F‹Ēŗ ÷źR‹Ų‹†Žū‰‹†.üŗ÷ź&'PčƒƒÄ–öūW‹š‹ś¹ėó„_‹†öū=t =t-=t}‹Ēŗ ÷źR‹ŲĒG‹Ēŗ ÷źR‹ŲĒGGé’‹Ēŗ ÷źR‹ŲĒG’¶śū’¶ųūč_ƒÄ‰†‚ū‹Ēŗ ÷źR‹Ų‹†‚ū‰G‹Ēŗ ÷źR‹Ų‹–śū‹†ųū‰G‰Wė§‹Ēŗ ÷źR‹ŲĒG‹Ēŗ ÷źR‹Ų‹†ųū‰Gé~’ƒ~t铟‹†ūFéŖź‹^’FŠ˜*䉆ņū=€|-€¹Óą‹^йÓāÓś*ö ‰†ņū’F‹^’FŠ˜*䉆ōū=€|-€¹Óą‹^йÓāÓś*ö ‰†ōū’F’¶ōū’¶ņūčæ.ƒÄFś‹Fś;F réXźé%źøčŹH’včØGƒÄ‰Fś’včœGƒÄFśPčś#ƒÄ‹ų’vWč`GƒÄ’vWččFƒÄ‹ĒéŹH+Ąč‹H’včiGƒÄPčŹ#ƒÄ‹ų’vWč0GƒÄ‹Ēé¤HøčdH~’’}鈁~ģ’rƒ~y|ƒ~wq‹V‹F%+Ņ…Ąub‹V‹FŃśŃŲ ƒŅŗ÷ź‹Ų€æP[u)’v’vø*P‹V‹FŃśŃŲ ƒŅŗ÷źP[PčV<ƒÄ‹V‹FŃśŃŲ ƒŅŗ÷źP[é H’v’vø-PFćPč'<ƒÄFćPč'’ƒÄėŻø$č¬G‹^‹Ї¬˜‰Fę©th‹^‹Gŗ÷ź&'PčÖ’ƒÄVö‹š‹ś¹ėó„÷Fęt>ƒ~öu8øÖ龋^‹Gŗ÷ź&'Pč ’ƒÄVš‹š‹ś¹ėó„÷Fętƒ~šu ėČ÷FęuĒĒFź‹^‹=&wŃą“’§Ü‹^ƒt” R+Gŗ ÷źøYė”R‰Fč‹Ų‹ŗ ÷źŒ&‹^‹WJĀ‹ŲŠ˜‰Fź=t =t;=t6‹Fč‹^‹WJ¹Óā‹؋W‹‰Fģ‰VīFź‹šæŹ‚¹ėó„øŹ‚éĪF‹Fč‹^‹WJ¹Óā‹؋‰FģėĪ‹^‹GHŗ÷źŒ\ėĄĒFź‹^‹G™¹ŃąŃŅāś‹^‹_+ö…Ū}÷Ö+ö Ć ÖėŒĒFź‹^‹Gė²ĒFź‹^‹GH‹ŲŃ拇„Z‰Fģ‹^ƒuéb’ŗ÷źŠ$‹WJŃāéx’ĒFźƒ~ś| ƒ~ō| øėƒ~ō|õ+Ą™é)’ĒFā’’ĒFä’’ĒFÜė|;Ćs(ø‹NÜÓą÷Š™!Fā!Vä’F܋Fܙ‹vō‹^ņƒėƒŽ;Ö~Ņ‹Vś‹Fų#Fā#Vä‰FމVąu…Ąt˜‹Vą‹FŽ;Väu˜;Fāu“ė†ĒFā’’ĒFä’’ĒFÜė|;Fņsø‹NÜÓą÷Š™!Fā!Vä’F܋Fܙ;Vō~܋Vś‹Fų#Fā#VätéK’…ĄtéD’é6’‹^‹Gŗ÷źŒ\Vš‹š‹ś¹ėó„ƒ~št鐿’vņč”ƒÄ‰FŲ…Ąué}ż‹Ų‹W‹G‹^¾‹OÓꋮ+ö…Ū}÷Ö#Ć#Öu…ĄuéSż‹FŲ‹^‹Wéńż‹^‹Gŗ ÷źž\‹Ų‹W‹G+Ņé濋^‹Gŗ ÷źž\‹Ų‹W‹G¹ŃśŃŲāśéĄż‹Vś‹Fų;Vōt郞;Fņté{žémž’vņ’vųčĶBƒÄ…ĄtéežéWž‹Fų;FņtéWžéIž‹Vś‹Fų;Vōté;ž;Fņué>žé0ž’vņ’vųčBƒÄé.ž‹Fų;Fņué!žéž‹Vś‹Fų;Vō}éž~éž;Fņwéžéõż‹Vś‹Fų;Vō}éņż~éāż;Fņséåżé׿‹Vś‹Fų;Vō~éŌż}éÄż;FņréĒżé¹ż‹Vś‹Fų;Vō~é¶ż}馿;Fņv驿雿ƒ~śuƒ~ųu‹^‹Gŗ÷ź&'Pč“ūƒÄéŗüFöé“üƒ~śu܃~ųtīėŌ‹Vś‹FųFņVōéŽüĒFź’vņ’vųč_śƒÄé­ü‹Vś‹Fų+FņVōékü’vō’vņ’vś’vųčoCéYü’vō’vņ’vś’vųč}CéGü’vō’vņ’vś’vųč«Cé5ü‹Vś‹Fų‹Nņ…Éué%üŃąŃŅāśéü‹Vś‹Fų‹Nņ…Éué üŃśŃŲāśéüƒ~śuƒ~ųtéÅüé·ü‹Vś‹Fų÷Š÷Ņéäū‹^ƒu‹Gŗ ÷ź‹Ų‹‡ˆ&é’‹^‹Gŗ ÷ź‹Ų‹‡Š&éóžĒFź‹^‹G‹ŲŃ拇–,éÓūƒ~öuéhüéZüĒFź‹^” R+Gŗ ÷źøY‰Fč‹Ų‹G‰FŚ‹^ƒtŗ÷źŠ$‹WJŃā‹؋‰FŚ‹FŚé€ūĒFź’vś’vųč„łé¼ž‹Vś‹Fų÷Ś÷؃Śé,ūøčŌAĒFś+’ė1‹Ęŗ÷źŚ$P‹Ēŗ÷źŚ$Pč5%ƒÄ…ĄtI‹ŽŃ拇¬\‹ßŃ扇¬\Gƒ’}6‹ßŃć‹Fś‰‡¬\’FśWčŲƒÄ…Ąuį+ö;÷}ۊ…ŗ$˜Š”ŗ$¹ÓāÓś;Āt—Fėå‹F£Ŗ\‹F£Ø\ĒĪ\+ĄPč ƒÄ”Ī\éxAøč8A‹F;Ŗ\téa‹>Ī\éĒFśė/E‹VśŃā‹؋‹ŲŃ拇¬\‹^śŃ拗 \‹ŚŃć9‡¬\téÜ’Fś‹Fś;Ŗ\|ČĒFś‹Fś;Ŗ\|éĒFų馍E‹VśŃā‹؋ŗ÷źŌ$U‹^ųŃćÓ‹Ś‹¹ÓśŃā‹؋U‹^ųŃćÓ‹Ś‹ā»‹ŹÓć…Ćtøė+Ą‰Fö‹^śŃ拇 \ŗ÷źŌ$‹^ųŃ拗 \¹ÓśŃā‹؋‹^ųŃ拗 \ā»‹ŹÓć…Ćtøė+Ą;Föu’Fų‹Fų;Fś}éO’’Fśé5’‹=…’téčžø PčöƒÄ‹ų”Ī\‰ĒFśė‹^śŃ拇 \U‹^śŃćӋډ’Fś‹Fś;Ŗ\|݉>Ī\é@‹FŃąØ\‹Ų‹7‹H‰Fśƒ~ś|äD‹VśŃā‹؋‹^Ń扇 \‹F@PčUžƒÄ’NśėÓ+Ąč…?’6ōXøīP’vč1ƒÄ£Š\…Ąu ’vøšPč¤*ƒÄč˜=­t ’vøžPč*ƒÄ锖—˜™š›œžŸ ”¢£¤„¦§Ø©Ŗ«¬­®Æ°±²³“µ¶·ø¹ŗ»¼‚?+ĄčC?øPø P’6"^čl0ƒÄéh?+Ąč)?é`?øč ?”Rŗ ÷źˆZ+R™¹ ÷ł=}@ƒ>Ņ\t<”R‹Ń÷ź‹ŲLJˆZė(=tZ=–t øPč*ƒÄĒŅ\‹Fś£Ō\’RĒéż>”Rŗ ÷źˆZ‹ų’R載Fś=štĶ7=’’u²ĒŅ\£Ō\Ē^ėĮ”Ö\‰‹Ї/˜%‰Fųu$ĒEĒEéN’=ńt=ņtŠ=ót…=ōt€és’‹^ųŃ拇ʉFśPčƒÄ‰Fś‹Fų-= w\Ńą“’§`ƒ>Ü\| ƒŚ\ƒÜ\ĒE‹Ü\”Ś\‰E‰U’6Ü\’6Ś\č—õƒÄ‰EéŲž~śõuĒE’6Ü\’6Ś\č@ ėŽĒFśń’vśč+ƒÄ‰E~ś’u0ĒE韾ĒE’vśč ƒÄ‰EėĒE‹Ü\”Ś\‰E‰Uéwž~śõtäĒEéhžøč‚=ƒ>Ņ\tƒ>R~’6ˆZø)PčŖ(ƒÄĒŅ\”Ō\=ńtb=’’ué×=–uéų=štéāč—øP’6” RHŗ ÷źøYPč %ƒÄ‰FŽčŠ’6Ō\čjƒÄøą]Pø?P’6"^č9.ƒÄéŃą“’§v=ņt =ót=ōt醒6Ō\č2ƒÄčwéX’R’6RøVPø^Pč%1ƒÄø`PčƒƒÄ”Ś\‰Fśø’?PčsƒÄ‹š‹Ü\”Ś\‰Fö‰Vųø`PčZƒÄ‹>Ś\‹Vų‹Fö£Ś\‰Ü\WV’vśčZél’øPčÓƒÄčAø’?Pč'ƒÄPčęƒÄø’æPčƒÄ‹š=’uéĮVėćøPčžƒÄč2ĒFäĒFąĒFāø’?PčćƒÄ‹šž’u&ƒ~ąt‹Fą™‰Fņ‰VōFęPø^Pč ƒÄĘ^éjžõu'ƒ~ä}!Fę‹Vä¹Óā‹؋Ü\”Ś\‰‰W‹Fā Fą’FäŃfāVčAƒÄø’æėŒø PčlƒÄƒ>Ü\ujƒ>Ś\ucø PčTƒÄƒ>Ü\uƒ>Ś\t ø\PčŲ&ƒÄø Pč2ƒÄƒ>Ü\uƒ>Ś\t øjPč¶&ƒÄø’æPčƒÄ=’ué½ø{Pčš&ƒÄé°’6Ü\’6Ś\č܃Ä韸P蹃ÄPčbƒÄøą]PøéõżøPčŃÄPčGė¾øP赃ÄPč7ƒÄøą]Pøš鏿øėÓ+ĄPč5ƒÄ’TøP舃ÄPč ƒÄøą]Pø„P’6"^čŁ+ƒÄø`PčeƒÄ’6Ś\č’éZ’ø`€PčQƒÄč3čŪé±:čŠ+ĄPč’ƒÄčÉčs++ĄPčł4ƒÄ’6Ō\øDPč’%ƒÄ”Ö\-–= wéEż’6Ō\øŖPčv%é’+Ąč-:蘋ų‹šƒ’’u øĄPč„%ƒÄļšø‹ĻÓą‹ų‹F…Ēu VøĻPč<%ƒÄ‹Ęé-:+Ąčī9’6Š\čg-ƒÄ‹ų’–}5ƒ’|0‰>Ö\øė$’–|'‰>Ö\ø–끒“|…L’™£Ś\‰Ü\øńéį9’“|Ӂ’š|ÜWč:ƒÄėč+Ąč9’6Š\č-ƒÄ‹ų’š}…’|Eˆ™£Ś\‰Ü\øõé 9WčƒÄėōøčW9‹F-š= wŃą“’§Ž’6Š\č¾,ƒÄ™£Ś\‰Ü\‹Fég9’6Š\č¦,ƒÄ£Ž\ėėčVėöĒFõčLėŌĒFõčuėĖčžėĶøPčĒžƒÄ£Ų\ø`PčŗžƒÄ듸`P讞ƒÄ‹Ü\”Ś\‰Fų‰VśčɋVś‹Fųė‹+ĄčĄ8’6Š\č9,ƒÄ‹ų’6Š\č-,ƒÄ‹šž€|ī‹Ę¹Óą ĒéĢ8øčŒ8’6Š\č,ƒÄ™‰Fų‰Vś’6Š\čō+ƒÄ¹Óą+Ņ Fų Vś’6Š\čŻ+ƒÄ™¹ŃąŃŅāś¹ŃąŃŅāś Fų Vś’6Š\čŗ+ƒÄ‹ų’€|ļ‹Ē™¹ŃąŃŅāś¹ŃąŃŅāś¹ŃąŃŅāś Fų Vśé>8+Ąč’7ø`PčĘżƒÄƒ>Ü\|ƒ>Ü\|>Ś\’v øäPč@#ƒÄ‹6Ś\‰6 ^æą\ė’6Š\č?+ƒÄ‹ßGˆƒī}ģ‹ßGĘéć7øč£7‹F-š=wŃą“’§Ŗ’6Ś\’6Tø’Pøą]Pčä+ƒÄøą]PčäīƒÄéØ7’6Ž\øPøą]PčÅ+ƒÄėß’6Ś\ø ėźøą\Pøėį’6Ų\蘒ƒÄæą]ėG€=uśƒ>Ü\|‹ßGĘ+’6Ś\øPWė¹ø넸č7‹F™¹÷ł…Ņt øPčf"ƒÄƒ~t~õu4ƒ>Ü\u-ƒ>Ś\u&øPčDƒÄ’vø^Pø#P’6"^čś'ƒÄĘ^ėIøPčƒÄčŒė’vč7ƒÄ‰Fų‰Vś)Fƒ~č+ŅøRP’vś’vųčE7…Ņu…Ąt ø4PčÜ!ƒÄé¦6+Ąčg6’včøžƒÄ‹F-š= w!Ńą“’§Źčqøą]PøHP’6"^čr'ƒÄ+Ņøéi6čTøą]PøRėį’6Ü\’6Ś\øPčėŲ+’ė‹…ą\˜™RPøPčˆƒÄG;> ^|ē” ^™ė½ƒ>Ü\|ƒ>Ś\vč’6Ü\’6Ś\čĮƒÄėøą\Pč³/ƒÄRP’6Ś\čBƒÄ‹Ü\”Ś\éz’čŃčįėī+ĄčŸ5+ĄPčƒÄéĶ5+ĄčŽ5‹F;Vt$čŖ‹F£V…Ą|‹^Ńć’·ęø\P’6"^čœ&ƒÄé˜5+ĄčY5č~€>^tø^Pøą]Pø`P’6"^čt&ƒÄép5æą]¾^‹ßGŠ˜‹ŽFˆ…Ąuńėę+Ąč5€>^tø^PøiP’6"^č<&ƒÄĘ^é35+Ąčō4€>^tø^PønP’6"^č&ƒÄé5+ĄčÓ4ƒ>Xt(’6\’6ZøsP’6"^čń%ƒÄĒXĒZĒ\éŪ4+Ąčœ4’6R’v’vø}Pøą\Pčķ(ƒÄ øą\PčķėƒÄé±4+Ąčr4‹¾ė’X”X™÷’…Ņuņƒ>Xuč|’ƒ’u+f’ĒFƒ>Xt ¹ŃfŃVāų‹\”Z F Vė‹V‹F£Z‰\>XéJ4øč 4ƒ~uƒ~t ø†PčaƒÄøą\PčŪ-ƒÄ‰Fų‰Vś¹ŃśŃŲāśP‹FųPø™P’6"^č%ƒÄé’3+ĄčĄ3‹>Ś\ƒ’t"ƒ’tø§PčƒÄėøµP’6"^čÓ$ƒÄƒļ…’uėéČ3+Ąč‰3øĮP’6"^č¶$ƒÄ‹F=t=t=uøÖPčÄ$ƒÄøąPčŗ$ƒÄéŒ3’vøźPčŖ$ƒÄėīøč=3‹V‹F=u)ø‚PčłųƒÄ‰Fś=’t&PčsūƒÄøą]Pø÷Pčp$ƒÄė×ø’æPčŠųƒÄ=’uńé13+Ąčń2ƒ~u”öX£"^ė%’6öXø^P’včc$ƒÄ£"^…Ąu ’vø`PčƒÄéõ2+Ąč¶2’6"^čc$ƒÄ’6öXčĒ%ƒÄéŁ2+Ąčš2‹"^‹G©t øpPčČƒÄé»2ø č{2‹¾čŠüé‹Ę-=wŃą“’§R’6"^Včt+ƒÄéų‹ßGŠ˜‰Fś” R+Fśŗ ÷źøY‰Fš‹Ųƒ?’u‹Ų‹Gŗ÷ź‹Ų‹‡Ģ$‹ŲŃć’·–,ø†é®’vščXƒÄé­‹ßGŠ˜‰Fś‹ßGŠ˜‰Fų” R+Fśŗ ÷źøY‰Fš‹Ų‹ŗ ÷źŒ&‹VųJĀ‹ŲŠ˜=t =tI=t)‹Fš‹VųJ¹Óā‹ؒw’7ø‰P’6"^čÓ"ƒÄé;‹Fš‹VųJ¹Óā‹ؒ7øŒé‹Fš‹VųJ¹Óā‹؋ŗ÷ź‹Ų‹‡Ģ$‹ŲŃć’·–,øéē‹ßGŠ˜‰FöHŗ÷ź‹Ų’·\’·Ž\ø’ė‹‹ßGŠ˜‰FöHŗ÷ź‹Ų’·Ž\ø•鮋ßGŠ˜‰Fō‹ßGŠ˜*ä‰Fņ‹FōH‹ŲŃ拇„Z‰Fō~ņ’tŗ÷źŠ$‹VņJŃā‹؋‰Fō‹Fōŗ÷ź‹Ų‹‡Ģ$‹ŲŃć’·–,ø˜ėR‹ßGŠ˜‰Fś‹ßGŠ˜‰Fņ” R+Fśŗ ÷źøY‰Fš‹Ų‹Gŗ÷źŠ$‹VņJŃā‹؋ŗ÷ź‹Ų‹‡Ģ$‹ŲŃć’·–,ø›P’6"^č•!ƒÄ‹ßGŠ˜‹š…Ąt錿é‚0øčB0‹Fŗ÷ź&'PččƒÄVö‹š‹ś¹ėó„‹Fö=t =t=t=’vś’vųøžP’6"^č7!ƒÄé30‹Fųŗ÷ź‹Ų‹‡Ģ$‹ŲŃć’·–,ø”P’6"^č!ƒÄė×’vųø¤ėė+ĄčĘ/’6"^ø Pč×(ƒÄéļ/øčÆ/‹^‹ŗ ÷ź†&‰Fś‹Ų‹G‹ŲŃć‹·–,ėcéĒ/ƒ’~l’6"^Wčœ(ƒÄėN‹FU’¹Óā‹ؒw’7ø§P’6"^č‘ ƒÄė'=uŌ‹FU’¹Óā‹ؒ7øŖP’6"^čh ƒÄ‹ŽFŠ˜‹ų…Ąt‘ƒ’ }‹FśU’Ā‹ŲŠ˜=tŒ=u®‹FU’¹Óā‹؋ŗ÷ź‹Ų‹‡Ģ$‹ŲŃć’·–,ø­ėžøčŠ.øPč¹ ƒÄ‹ų”ꉒvč-ƒÄ@Pč” ƒÄ‰E’v’uč`-ƒÄ+ö‹Ę¹ÓąF‹Ų‹W‹‰Fų‰VśE‹Ö¹Óā‹؋Vś‹Fų‰‰WFƒž~ʉ>ęéš.+Ąč[.‹>ęė’v’učĢ,ƒÄ…Ąu‹Ēéz.‹=…’uå+Ąėó+Ąč1.ø&^P’6öXčB"ƒÄ‹^‹£$^éÓ=wtK‹^‹ŠG˜PøPčCƒÄ鷃F‹^‹€?-t鯋^‹ŠG˜=puŋ^‹Pč‹(ƒÄ£郋^‹Pčv(ƒÄ‹ų”dF÷ē£dF”fFŗ2÷ā£fFød+Ē÷&hF£hF”jFŗ2÷ā£jF’6fF’6dF譃Ä‹ų”dF+Ņ÷÷£dF”fF+Ņ÷÷£fF’6jF’6hF艃Ä‹ų”hF+Ņ÷÷£hF”jF+Ņ÷÷£jFƒnté@’ƒ~|ƒ~~’6$^ø.PčfƒÄ‹^’7čķƒÄ‹^’wčśƒÄčĄķ+ĄPø’PøP’6ø:PčöĶƒÄ č¾ķƒ>^u øJPčƒÄčśé-øčĻ,‹¾‹¶‹Ē+Ņ÷ö‰Vś‹ž‹ņ…Ņuļ‹Ēéė,øčŖ,’v’vč$ƒÄ…Ąt龋^‹Gŗ÷ź‹ŲƒæŚ$t>駋^ƒ?’tér‹^ƒ?’ux‹^‹Gŗ÷źŚ$P‹^‹Gŗ÷źŚ$PčĻƒÄ…Ąu®‹^ƒt1‹^’wčéƒÄ‹^‹Gŗ÷źŚ$‰Fō‹^‹Gŗ÷źŚ$VW‹šėY‹^‹Gŗ÷źŚ$‰Fō‹^ėŁ’v‹^‹Gŗ÷źŚ$PčcƒÄ…Ąt+Ąé,‹^’wčƒÄ‹^‹Gŗ÷źŚ$‰FōVW‹v‹~ō¹ėó„_^ĒFśĢ$ė[‹Fś‹Vö¹Óā‹؋ŗ÷źŌ$‹^‹W¹ÓśŃā‹؋‹^‹Wā»‹ŹÓć…ĆtS‹Fś-Ģ$™¹÷łPčƒÄƒFś~ś†&s‹^śƒtģ‹Gŗ ÷ź†&‰FųĒFöƒ~ö}ӋFųFö‹Ų€?uéi’’Föėā‹^ƒ?’u=‹Gŗ÷źŚ$P’včlƒÄ…Ąté’‹^‹Gŗ÷źŚ$‰FōVW‹v‹ų¹ėó„_^æö3ė:’u‹¹Óą/P’včĒ ƒÄ…Ąt’u‹E¹Óą/P’vč« ƒÄ…Ąu ƒĒ’*5rĄƒ}tw” Rŗ ÷źøY‰FōVW‹v‹ų¹ėó„_^” R@ŗ ÷źøY‰FōVW‹v‹ų¹ėó„_^ƒ R+ĄP’v ’v ’v‹Eö PčĖƒÄ ‹š;v w’u ’u čćƒÄšƒ. Rė+ö‹Ęéžø čī)‹¾‹ßGŠ˜*䋹=€|D€¹Óą‹ßGйÓāÓś*ö Ā‹šƒ~uƒž}ė.;vu)ĒFśė*‹Fśŗ ÷źR‹Ų‹‹ßGйÓāÓś*ö;Āt+Ąé»)’Fś9vś|ŃĒFśé²‹Fśŗ ÷źR‹Ųƒu‹Fśŗ÷ź‹ŲLJŒ\鈋Fśŗ ÷źR‹Ų’7čƒÄ‰Fņ‹Fśŗ÷ź‹Ų‹Fņ‰‡Œ\=u4‹Fśŗ ÷źR‹Ų‹W‹G‰Fš‰Vņ‹Fśŗ÷ź‹Ų‹Vņ‹Fš‰‡Ž\‰—\ė%‹Fśŗ ÷źR‹Ų‹G‰Fņ‹Fśŗ÷ź‹Ų‹Fņ‰‡Ž\’Fś9vś}éF’‹ßGŠ˜*ä‰Fś=€|-€¹Óą‹ßGйÓāÓś*ö ‰Fśƒ~śt<‹Fśŗ÷ź&'PčÅąƒÄVōVW‹š‹ś¹ėó„_^ƒ~ōtéÓžƒ~ųu ƒ~öuéÄž”R£ž\‹Ęŗ ÷źR‹Ēé°ž+Ąč/(‹^Ї/˜%-= w Ńą“’§ŹøéI(øėųø č(ƒ~tSƒ>RtI>RˆZvA”R-ˆZ™¹ ÷ł)R+’ĒFšˆZėVW‹6R‹~š¹ėó„_^ƒR ƒFš G;>R|ŽĒRˆZč…č‹R‹‰Fö¹Óą3G ‰Fų¹Óą3G‰FśæėFö‹×Ńā‹؋*ä‹ŲŃ拇C‰Fņ…Ąu O…’}Ż+Ąė<‹Fņ*5‹šFö‹×Ńā‹؋¹ÓųйÓāÓś;ŠuEPDPč:żƒÄ‰Fō…Ąté['ŠD˜*äŠT¹ÓāÓś¹Óā Āė˜+Ąč'‹Fŗ÷źĢ$‹ųƒ}u‹FE ƒ~tEé'+öƒž}öE‹ÖŃāĀ‹Ųƒ?t’v’vE‹ÖŃā‹ؒ7č©’ƒÄFėĻøč„&‹Fŗ÷źĢ$‹ųƒ}u‹E éĘ&ĒFś+öE‹ÖŃāĀ‹Ųƒ?t E‹ÖŃā‹ؒ7čŗ’ƒÄP’vśčƒÄ‰FśFƒž|Ź‹Fśė»+ĄčE&æĢ$ė:E‹V¹ÓśŃā‹؋‹Vā»‹ŹÓć…Ćt‹Ē-Ģ$™¹÷łPčƒÄƒĒ’†&rĄé7&øč÷%‹Fŗ÷źĢ$‹ųĒEĒFśėE‹Vś¹ÓāĀ‹ŲĒĒG’Fśƒ~ś|ßæĢ$ėe‹E;FtHėXƒ}’tš‹Eŗ ÷ź†&‹šĒFśė’Fśƒ~ś}5DFś‹Ų€?uźE‹Vś¹Óā‹؋;FuŌ‹Ē-Ģ$™¹÷łPč’ƒÄƒĒ’†&rŸé„%+ĄčE%æĢ$ė'ĒE+öE‹Ö¹ÓāĀ‹ŲĒĒGFƒž|ćƒĒ’†&rÓéJ%+Ąč %’včę ƒÄ‹ų…’u øN Pč_ƒÄ‹Ēé'%+Ąčč$’včū!ƒÄé%+Ąč×$‹~ė‹ßŃć’·&b茒ƒÄG;>L |ė‹F£L éī$+ĄčÆ$>L Ä u ø\ Pč ƒÄ‹F@Pč…’ƒÄ‹ų‹L Ń㉿&b’L ‹Ēé·$+Ąčx$‹^‹‹^;sø’’é $øėųøĪ č[$>L Č}鄸:PøP’6L ø&bPčsƒÄ+’ė †.öĒ‹ŲĘG;>L |īĒFśˆZė†.öP‹^ś’wčFƒÄƒFś ”Rŗ ÷źˆZ9FśrŪĒFųøYėN‹^ųƒ?’tB‹ŗ ÷ź†&‰Fö+’‹FöNj؀?u†.öP‹Fų‹×¹Óā‹ؒ7čēƒÄGƒ’|̓Fų ” Rŗ ÷źøY9Fųr¢ĒFōĢ$ėQ‹Fō‰Fų‹Ų‹ŗ ÷ź†&‰Fö+’‹FöNj؀?u†.öP‹Fų‹×¹Óā‹ؒ7čƒÄGƒ’|̓Fō~ō†&rØ+’ė&†.öNj؀?u‹ßŃć’·&bč+žƒÄ‹ßŃćLJ&bG;>L |Ō¾&b‰vņė‹^ņƒ?t ‹‹ŽƒĘ‰ƒFņ”L Ńą&b9FņrŽ‹Ę-&b™¹÷ł£L é#øčĆ"+’”L H‰FśėD’ėö‹ŽŃć‹F;‡&brīD‹ų9~ś~#‹ĒFśŃų‹š‹ŽŃć‹F;‡&buӋFʋŲĘé³";~śuų‹ßŃć‹F;‡&buė‹FĒėß+Ąč["‹¾” R‰E” Rŗ ÷āPEPøøYPč1ƒÄ”R‰…Ģ”RŃąP…ĪPø„ZPčƒÄ”R‰…ŅøP…ŌPøŒ\PčūƒÄøŗP…ęPøĢ$PččƒÄ”R‰… ”Rŗ ÷āP…¢PøˆZPčɃÄ”R‰…j”ž\‰…l”€Z‰…n”L ‰…péķ!+Ąč®!‹¾‹E£ Rŗ ÷āPøøYPEP臃Ä‹…Ģ£RŃąPø„ZP…ĪPčnƒÄ‹…Ņ£RøPøŒ\P…ŌPčTƒÄøŗPøĢ$P…ęPčAƒÄ‹… £Rŗ ÷āPøˆZP…¢Pč%ƒÄ‹…j£R‹…l£ž\‹…n£€Z’µpč6üƒÄéF!+Ąč!‹¾‹¶ƒ~~Ń~‹ßƒĒ‹‹ŽƒĘ‰ƒnuģé!ø čŲ ‹¾‹¶ƒ=’uE‹E@‰FśD‹Vś¹ÓśŃā‹؋‹Vśā»‹ŹÓć…Ćt÷Du?’učēłƒÄ=~1+Ąė6‹‰FśD‹Vś¹ÓśŃā‹؋‹Vśā»‹ŹÓć…Ćtσ~uøé‡ ”R‰Fų‰>R‹Fŗ÷ź&'Pč‚ŲƒÄVņVW‹š‹ś¹ėó„_^‹Fų£R‹Vö‹FōėĮøč ƒ~u5‹^ĒĒFųƒ~ų|钋F‹Vų¹ÓāĀ‹ŲĒĒG’Fųė׋F¹Óą1‰Fś‹Ų‹-=wŃą“’§Ü ‹^ś” R+Gŗ ÷źøY‰Föƒu:‹š‹~¹ėó„ė)‹^ö‹Gŗ÷źĢ$‰Fō‹^ś‹WJŃā‹؋‹^‰Gé•‹^Ē’’‹^öƒ?’tŋĆ‹^ś‹WJ¹ÓāėĻ‹^Ē’’‹^ś‹Gėʋ^Ē’’‹^ś‹G‹ŲŃ拇„Z‰Fņ‹^śƒtŗ÷źŠ$‹WJŃā‹؋‰Fņ‹^‹Fņ뉋^ś‹G‹^‰ĒFųƒ~ų|és’‹Fś‹VųBŃāĀ‹Ųƒ?u‹F‹Vų¹ÓāĀ‹ŲĒĒGėo‹Fś‹VųBŃā‹؋ŗ÷ź&'PčĻփčVģ‹š‹ś¹ėó„ƒ~ģu‹F‹Vų¹Óā‹؋Vš‹FWėƒ~ģ‹F‹Vų¹Óā‹؋FFųéP’øč$‹F¹Óą1‰Fś‹Ų‹-=wŃą“’§ä ‹^śƒu;‹v‹~¹ėó„ė)‹^‹Gŗ÷źĢ$‰Fö‹^ś‹WJŃā‹؋‹^‰Géł‹^Ē’’‹^ƒ?’tŋĆ‹^ś‹WJ¹ÓāėĻ‹^Ē’’‹^ś‹Gėʋ^Ē’’‹^śƒt‹F ŗ÷źŠ$‹WJŃā‹؋‰F ‹^‹F ė—” R‰Fī‹F-øY™¹ ÷ł@£ R‹^ś‹G‹^‰ĒFų餋Fś‹VųBŃāĀ‹Ųƒ?u‹F‹Vų¹ÓāĀ‹ŲĒĒGėo‹Fś‹VųBŃā‹؋ŗ÷ź&'Pč1ՃčVš‹š‹ś¹ėó„ƒ~šu‹F‹Vų¹Óā‹؋Vō‹Fņ‰‰Wėƒ~š‹F‹Vų¹Óā‹؋Fņ‰’Fųƒ~ų}éS’‹Fī£ R點øčw‹^‹‹^;t馋^ƒ?uéåƒ?’u闋ŗ ÷ź†&‹š+’DĒ‹ŲŠ˜=t釋F‹×¹Óā‹؋W‹‰Fų‰Vś‹F‹×¹Óā‹؋W‹;Vśu<;Fųu7ėv=uz‹F‹×¹Óā‹ؒ7‹F‹×¹Óā‹ؒ7čIƒÄ…ĄtA+ĄėI‹^‹G‹^;Guīė6=u²‹F‹×¹Óā‹؋‹VƒĀ‹ß¹ÓćӋŚ;uæGƒ’}é1’øé¬øčlĒFī‹Fö ‹ųŠ˜%=uéŸ=ué”=u鉃> Rté²+ĄéĮƒ~īuo” R‰FöĒFš” RHŗ ÷źøY‰Fś+öéӋßGŠ˜*ä‰Fų=€|-€¹Óą‹ßGйÓāÓś*ö ‰Fų+ĄP‹Fų¹Óą/P’vśčļłƒÄ…Ąt遃~ītOø’ėG’Fī’Fī‹ßGŠ˜¹Óų%‰Fö” R;Fö}éd’;Föuéh’ƒ~ītĖé_’ødėƒ~īté@’ø +FšéØ’vųč̃ĉFō’vśčԃĉFņ‹Fō;FņÉ;Fņ} øc+ĘėŃ’FšFƒnś ;vö}é%’‹Fš;FötŖøė±øč‹Fŗ÷ź&'Pč^҃čVö‹š‹ś¹ėó„‹Fŗ÷ź&'Pč>҃čVš‹š‹ś¹ėó„”jF+ŅRP”hFRP’vō’vņč.RPčI‰Fģ‰Vī”fF+ŅRP”dFRP’vś’vųčRPč)FģVīéÖ+Ąč—‹^¹Ó拇/éĀ+Ąčƒ‹¾ƒ=’u‹Eŗ÷ź‹Ų‹‡Ī$飋ŗ ÷ź‹Ų‹‡†&ėīøčT‹¾ƒ=’u+ĄP’v’uč7ņƒÄés‹ŗ ÷ź†&‰Fś+öƒž}é‹FśƋ؀?u+ĄP’vE‹Ö¹Óā‹ؒ7čõńƒÄFėĶøpčń” RHŗ ÷źøY‰F–+F™¹ ÷ł‰F’ĒF”ė+‹F”Hŗ ÷źV˜‰FŒ‹F”ŗ ÷źF‹š‹~Œ¹ėó„’F”‹F”;F’~Ķ‹F’) R”€Z‰FŽĒ€Z’v ø’P’v ’v‹^‹Gö Pčs¹ƒÄ ‰F‹FŽ£€ZĒF”ė.” Rŗ ÷źøY‰FŒ‹F”ŗ ÷źV˜Ā‹š‹~Œ¹ėó„’ R’F”‹F”;F’|ŹĒR‹FéTøąčdž"’æøYé-dž$’E鋞$’’w‹¹Óą/PWč ÷ƒÄ…Ąuéš‹ž$’ƒ|F‹G‹ŲŃ拇FF‰†’닆 ’-Ģ$™¹÷łPčńƒÄ…Ątƒ†’‹ž’‹‰† ’…ĄuՃ¾ ’ué ” RHŗ ÷źøY‰†2’+Ē™¹ ÷ł‰†.’dž0’ė2‹†0’Hŗ ÷ź–4’‰†’‹†0’ŗ ÷źĒW‹š‹¾’¹ėó„_’†0’‹†0’;†.’~ċ†.’) R”€Z‰†,’Ē€Z”R‰†*’dž0’ė‹ž0’Ń拇„Z–&’‹ž0’ŃćӋډ’†0’‹†0’;†*’|Ų‹ž$’ƒ|)ĒR‹† ’-Ģ$™¹÷ł£„Z+ĄPøP’6„Zč­ļƒÄėĒR+ĄPø’P’v’v‹ž$’‹Gö Pč“·ƒÄ †"’‹ž$’’w ’wčVüƒÄ†"’‹†,’£€Zdž0’ė5” Rŗ ÷źøY‰†’‹†0’ŗ ÷ź–4’ĀW‹š‹¾’¹ėó„_’ R’†0’‹†0’;†.’|Į‹†*’£Rdž0’‹†0’;†*’}0†&’‹–0’Ńā‹؋‹ž0’Ń扇„Z’†0’ėփ†$’ ¾$’¢Eséążƒn ;~wéĖż‹†"’éø čĘæ¢Eéóƒ~t+ĄP‹¹Óą/P’včČōƒÄ…Ąu é̃=téă}u/+ĄP’vFņP’učT÷ƒÄ+ĄP’vFņPčōƒÄ…Ąu锋Ē陸$PčHšƒÄ£‚Z‹ŲĒ‹]Ń拇FF‰FšėS‹^š‹-Ģ$™¹÷ł‹šV’vFņP’učööƒÄ+ĄP’vFņPč2ōƒÄ…Ąt”‚Z‹‚Z‹Ńā‹؉7‹‚Z’ƒFš‹^šƒ?u„‹‚Zƒ?tés’SčęļƒÄƒĒ’āEsé’+Ąé]’+Ąčŗ’v’v’v’v’v ’v ’v’v’včƒÄéŠ+Ąč‘øģ P’6ųXč¾ƒÄ’v’v’v’v’v ’v ’v’v’v’6ųXč™ƒÄøō P’6ųXč‹ƒÄč’įčxø’’PčŻƒÄéw+Ąč8‹F;F~ég‹Fėųøč"~~øPø²XPøPč£ƒÄøPčœƒÄƒ> Stč°ƒ~u+’vø®vP’vč2ƒÄ‰FśPø®vPøPčgƒÄ‰Fų‹Féž’v’v’včOƒÄ‰FųėéøčŖ‹¾‹F‰Fņ‰~š‹ĒF‰Fģ‹F‰FźĒSĒS‰~īė‹^ī€? uĘ ’Fī‹Fī+Fš;F|ēė‹F+Fņ锃>StG’Nź;~ģsēĒFų€= tęŠ˜ŠU¹ÓāÓśĀ%‰Fō‹ŲŃ拇®u‰Fčƒ~ź|€= uĒFčėĒSėQ‹^č‹G‰Fčƒ~čt7‹^č’7WčSƒÄ…Ątį‹Fč- S™¹÷ł€‹^ˆ’F‹^č’7č¬ƒÄų’Fų€= t­ĒSƒ~ųtéZ’‹ßGŠ˜‹^ˆ’FéI’+Ąč–‹¾‹¶€<t‹ßGŠ˜‹ŽFйÓāÓś;Ātå+ĄéØøėų+Ąčd+ĄPP’vP’v’vøPøPčKƒÄéø č?Ē SĒFöĒFų铋^ųŃ拇R‰Fō…ĄuéŠ‹ŲŠ˜ŠW¹ÓāÓś‰Fś%‰Fś‹ŲŃヿ®uu‹Fö¹Óą S‹^śŃ扇®uė"‹^śŃ拇®u‰Fņ‹Ųƒu>‹Fö¹Óą S‰G‹^ö¹Óć‹Fō‰‡ S‹^ö¹ÓćLJS’Fö’Fų~ų€}éc’éĘ‹^ņ‹GėÆ+Ąč’vč]ƒÄP’vøPč’ƒÄøPčū ƒÄ镸čUĒFśĒ Uƒ~}‹ UʇU-’ U‹F÷Ų‰Fƒ~u‹ UʇU0’ U‹ UʇUøUéG¾'…ö~ź‹F™‹Ī÷ł‹ųƒ~śu…’~E0‹ Uˆ‡U’ UĒFś‹Ē÷ī)F‹Ę™¹ ÷ł‹šėĮ+ĄčÅ‹F £ŅX‹F£ŌX‹F÷fFP’včƒÄéŻø č”ŌX‰Fś‹F+F‰Fņ;Fśwé‹FśŃą‰Fš‹Fņ+Ņ÷vš÷fś‰Fņ‹FFņ‰Fų‰Fö‹~‹F+Fś‹šė)‹Fś)Fų’vųWčåƒÄė’vųW’ŅXƒÄ‰Fō…ĄtÜ}a~ś;~ųräėWV‹FśFö’vö赃ÄėEV‹FśFö’vöWčуÄ‹FśFų‹~ųė)V’vö’ŅXƒÄ‰Fō…ĄtĄ~;~ųtĖVWčvƒÄ+vśė¢+vś;vöwŅ;~ųuA‹Fų+F‹V+Vö;Ā|’v‹FöFśPč’ƒÄ‹Fų‰Fé’’vų’včńžƒÄ‹FöFś‰FéīžW‹Fś)Fų’vųVčAƒÄ‹Fś)Fö‹vöé:’éŸøč_”ŌX‰Fų‹~‹vŠˆFū‹ßGŠˆ‹ŽFŠFūˆƒnųuęépøč0”ŌX‰Fö‹~‹v‹F‰FśŠ˜‰Fų‹^śŠ˜‹ßGˆ‹^śŠˆ’Fś‹ŽF‹Fųˆƒnöu×é,+Ąčķ+’‹ßŃヿōXt‹ßŃć’·ōXč÷ƒÄGƒ’|įé+ĄčƍFP’v’vč\ƒÄ‹^‹G©@tSčĘƒÄéŲ+Ąč™FP’v’6öXč1ƒÄ‹öX‹G©@tSčšƒÄé¬+Ąčm’včƒÄ…Ąt+Ąé•’v’včrƒÄėļ+ĄčG+’ėø’’éwGƒ’}‹ßŃć‹F;‡ōXuķ‹ßŃćLJōXƒ’}Ų’vč7ƒÄ‹^’7č2 ƒÄ‹^‹G© tƒt ’wč ƒÄ’vč ƒÄ+Ąė øčŚ ĒFö+’ė(ƒ’|"ėP=wuKNöø¤P’vč4ƒÄ‰Fų…Ą|2ėgG‹ßŃヿōXuĶ‹^Š˜=auNöøP’vč ƒÄ‰Fų…Ą}$+Ąé“=ru¦Nö+ĄP’včn ƒÄ‰Fų…Ą}ėÜøP+Ņ+ĄRP’vųčŽƒÄø Pč ƒÄ‰Fś…Ątø‹ŲĒG‹Ų‹Fų‰‹Fö‰GøPčųƒÄ‹^ś‰GƒuOė‹^śO ‹^ś‹G‰G‹ßŃć‹Fś‰‡ōX‹Fśé øčŲ ‹^‹G©u‹G©u+Ąė0‹^ƒ~ó’w’w’7č…ųƒÄ‰Fś‹^;GuĒG‹G‰G‹FśéČ ‹^Oø’’ėšøčz ‹^‹G©tø’’ė`‹^‹G©tšƒo[‹G©t øPFśPė øP‹^’w‹^’7č] ƒÄ‹^‰GƒƒuOėŖ‹^Oė ‹Fś*äéA ‹^‹G‰G‹^‹G©uä’G‹GH‹ŲŠ˜ėŁ+Ąčß ‹^ƒt‹G© t ’wčįƒÄ‹^g›’‹F‰GƒuO‹^‹G‰GĒGéÕ ø č” ĒFņ’’ĒFö‚‹F‰Fų‹F‰FśFP’vFņPčƒÄFņP+ĄPčƒÄ‹Fé” ø čT ‹¾‹véŒ=Dué =Oué$=Xué'=cué*’vø%Pč<ƒÄ’v‹ßGŠ˜Pč,ƒÄéL€=9~邊˜-0÷nō‰F܋Fųŗ ÷źF܉Fųé\G€=0}éd€=9~é\‹Föŗ ÷źŠ¹ÓāÓśƒź0‰FöėԃĘ‹Dž™‰Fš‰VņĒFś FßP’vś’vņ’vščUƒÄ’vFßPčn ƒÄPŠFė˜P’vö’vųFßP鯃Ę‹Dž™‰Fš‰Vņ+Ņ뱃Ę‹Dž™‰Fš‰Vņ…Ņ}+҉Fš‰VņĒFś뜃Ę‹Dž™‰Fš‰Vņ…Ņ}+҉Fš‰VņĒFśé{’ƒĘ‹Tž‹Düéd’ƒĘ‹Tž‹Dü뻃Ę‹Tž‹DüėŠƒĘ‹DžˆFļ’vŠFļ˜PčƒÄė(ƒĘ‹Dž‰Fģ’vPč»ƒÄPŠFė˜P’vö’vų’vģč3ƒÄ G€=tt€=%t锾ĒFųĒFöĒFōĘFė G€=-uĒFō’’G€=0uĘFė0G€=0|évž€=.u链Š˜=du铞éž=ouéżž=suéq’=uuéÜž=xué’éžé| øč< ĒFģƒ~uƒ~u ‹^ Ę0ĘG錃~ uƒ~}‹V‹F÷Ś÷ŲƒŚ‰F‰V’Fģ+’FšĒ‹ŲĘGƒ’ |š+’ƒ~ uN+Ņø RP’v’vč– ‰FźFšNj؋FźˆFšĒ‹ŲŠ˜™‰Fč‰Vź+Ņø RP‹V‹F+FčVźRPč ‰F‰Vƒ~u-‹V‹F%+ŅVš×‹Śˆ‹V‹F¹ŃśŃŲāśā’‰F‰Vƒ~u-‹V‹F%+ŅVš×‹Śˆ‹V‹F¹ŃśŃŲāśā’‰F‰VGƒ~té<’ƒ~té3’ĒFīE’‹šėDFšƋ؀?uƒ~īu FšʋŲĘ ė%FšƋ؀? } FšƋ؀0ė FšƋ؀7’FīN…ö}øƒ~ģt FšĒ‹ŲĘ-GE’‹šėFšĘ‹ŲŠ˜‹^ ˆ’F N…ö}é‹^ Ęéɸ艋F ‰Fśƒ~~‹F ;F~‹F‰Fś‹Fś‰Fųƒ~ė8’N’vŠF ˜PčoƒÄ‹F;Fśēė‹Fś’Nś…Ąt’v‹^’FŠ˜PčHƒÄ‹^€?uۃ~})€~ 0u#’vø.Pč'ƒÄ’Fė’F’vŠF ˜PčƒÄ‹Fų÷Ų9F|åéøčŽĒFų‹^‹G©t馋G©u雋G©t øPFP‹^’7č€ņƒÄ‰Fś‹^ĒGėA‹^’G‹GH‹ŲŠFˆ‹^’G‹G=|%‹G©€u’w’w’7č>ņƒÄ‰Fś‹^‹G‰G’Fųƒ~ųt7ƒ~ś~ ‹^‹G;Fśtƒ~ś} ‹^Oė‹^Oø’’éY‹^ĒG+Ąėńø č ‹¾ĒFųĒFśĒFöėGŠ˜‹ŲЇ7Y˜©uš€=-u2GĒFöė*+Ņø RPFųPčŅ‹Ę+҉Fņ‰Vō‹Vś‹FųFņVō‰Fų‰Vś‹ßGŠ˜-0‹š= rʃ~öt‹Vś‹Fų÷Ś÷؃ŚéÄ‹Vś‹Fųėõ+Ąč}’v’vøPøPč«ƒÄé +Ąča+ĄPPPPP’vøP+ĄPčMƒÄ選č@‹¾+öĒFųėGŠ˜£Y= tō= tļ= tź= tå= tą€=-uGĒFųė ‹Ęŗ ÷ź‹švś‹ßGŠ˜-0‰Fś= rćƒ~ųt‹Ę÷Ųé‹Ęėł+ĄčÓ+ĄPPPPP’vøPøPč¾ƒÄéņøč²‹F£“‚‹V‹F£ŗ‚‰¼‚‹F £¶‚øPøPč"ƒÄ‰Fś…Ąt™éŗ‹¼‚”ŗ‚ėō+Ąčq” YF%š’-‹ų;> Yr Wč©ƒÄ…Ą}+Ąé‰> Y‹>Yė‹%ž’‹ųƒ=uō” Y‰‹ YĒøėÕøč‹F%ž’‰Fų‹>Y…’uqøPč…ƒÄ‹ų£Y£ Y‹ŲĒėW‹Ę©t‹Ę%ž’‹ųėG‹Fś©u ‹š‹‰Fś…Ąuķ‹Ę+Ē;Fųr)‹ĒFų‰Fś;Ęs‹Ų‰7‹Fś ‰Eė ’včz’ƒÄéĶ‹ž‹5…öu£’vųč’ƒÄ…Ąuß+Ąėäøčt‹F-‹ų‹F%ž’‰Fų‹%ž’‹š‹Ę+F‰Föė ‹Fś©u ‹š‹‰Fś…Ąuķ‹Ę+Ē;Fųr#‹ĒFų‰Fś;Ęs‹Ų‰7ė‹Ę ‰‹Fė+ĄéG’vč螃ĉFś…Ątė’vöP’včƒÄ%ž’‹Fśė×+Ąčā‹^gžž’éė"‹¾‹¶‹F’N…Ąt ‹ßGŠ˜‹ŽFˆėééģøč¬ėÖøč¤+ĄPP’vPPPøP+ĄPčƒÄ‰Fś…Ąu ”Ā‚£"Y+Ąéµø’’ėųøčp”"Y‰Fų‹F"Y‰FśPč²’ƒÄ…Ąu‹Fų鉸’’ėųøčDč"‰Fś+ĄP’vų’vśPPPøBP+ĄPč(ƒÄé\ŒŲĆøŠ‚ĆśWø +’ŽĄ&Ǥ„3Ū&‹ū¤„u= uę_ūĆ+Ąčļ’v’vøPøPčƒÄéøčŅ+ĄPP’vP’v’vøPøP蹃ĉFśéźøčŖ‹¾‹¶‰~ś‹ßG€?uųO‹ŽFŠ˜‹ßGˆ…Ąuń‹Fśé»+Ąč{‹¾‹¶Š˜‹ŽFйÓāÓś;Āu ‹ßG€?uå+ĄéŠ˜NйÓāÓś+Āėģøč<‹¾‹¶‰~ś‹ŽFŠ˜‹ßGˆ…Ąuń‹FśéV+Ąč‹¾+öėF‹ßG€?u÷‹Ęé;ė5‹F£“‚‹F £¶‚‹F £ø‚‹F£ŗ‚‹F£¼‚‹F£¾‚’v’včeƒÄėéøčĆėĆėK’v 蔃Ä‹ų‰>“‚‹F£¶‚‹F £ø‚¾ŗ‚ƒ’‹ĒO…Ąt‹^ Š˜‹ŽFˆ’F ėé’v’včƒÄė鮸čnė­ė=‹F£²‚ø°‚P’v訃ĉFśƒ~śt‹Fśėƒ>²‚} ”²‚÷أȂø’’딲‚ėégøč'ė»ė‹¾¾‹ßG€?tFėõDėéCøčėŽ[U‹ģWV+ą;&$Yr’ćDz‚Ē“‚Ƕ‚Ēŗ‚&Yø°‚PøPčÄéż’fü^_]ùé ¹é¹éU‹ģ‹†‹žĶ ]ĆU‹ģ‹F÷f‹Č‹F÷f ȋF÷fŃ]ĀU‹ģW+’‹V‹F‹^ ‹N…Ņy ÷Ś÷؃Ś÷ׅŪy ÷Ū÷كŪ÷×荅’t÷Ś÷؃Ś_]ĀU‹ģW+’‹V‹F‹^ ‹N…Ņy ÷Ś÷؃Ś÷ׅŪy÷Ū÷كŪčO‹Ó‹Į…’t÷Ś÷؃Ś_]ĀU‹ģ‹^‹F÷g‹Č‹G÷fȋF÷gщG‰W]Ā+ĄčĶžøcPč`łƒÄéśž…Ūu‹Ų‹Ā+Ņ÷ń“÷ń‹Ź‹Ó+ŪĆUWV+’„’u&GWŠūŠŻŠé*ɋéŠč*ɊĊāŠÖ*öRPQ‹Ķ;Ór ø’’ė WWRP‹Ā+Ņ÷ó‹č÷į_+ųƒŅ‹ņ‹Ć÷åʃŅ^+šƒŅX+Āy Młóėō‹Ļ‹Ž_…’tŠĶŠėŠßŠų‹Å+Ņ^_]Ć$Header: codegen.c,v 2.2 84/11/20 16:56:26 sater Exp $‡šK Ž 8 e ±:”TµĄÅŸ‡™ No regs available$Header: compute.c,v 2.1 84/05/19 11:38:48 sater Exp $£“ģ B«ū«ÄŚč<Zx–ĄĪŻń$6Ohz‡µĖ×/ßlˆ%D%D < +776   90   aaradfadiadpadsaduandaspassbeqbgebgtbleblmblsbltbnebracaicalcffcficfucifciiciucmfcmicmpcmscmucomcsacsbcufcuicuudchdecdeedeldupdusdvfdvidvuexgfeffiffilgtoincineinlinniorlaelallarldcldeldfldllfrlillimlinlnilocloelofloilollorloslpblpilxalxlmlfmlimlumonngfnginoprckretrmirmurolrorrttsarsbfsbisbssbusdesdfsdlsetsigsilsimslislusrisrustestfstistlstrststeqtgetgttletlttnetrpxorzeqzerzgezgtzlezltznezrezrfzrl`````|`€``` $Header: equiv.c,v 2.1 84/05/19 11:39:29 sater Exp $$Header: fillem.c,v 2.6 85/04/16 16:14:55 keie Exp $’’[!@!@!ė "!@!@!@!@!@!;!^"­"$$Ś$,$H"$G$u#L$ā"Õ%&ķ%ü%&& &ē%&&&3&3&3&‰'‰'¬'¬'É'Ą'Ÿ'Ÿ'Ņ'É'Ÿ'Ÿ'Ÿ'Ÿ'Ÿ'’'Ī(Ī(ė(ė(ė(÷(č(č(ė(Ī()+)+)n) rCan't open %sBad format %s%sunknown instruction byteNo table entry for %d%s: Unknown opcode %dhol%dbad word sizebad pointer sizetoo many parameters.globl %s .globl %s %s: No table entry for %dunexpected EOFbad argument type %dstring/identifier too longI%03x%x_%d%d_%s%dbad BSS size%s: .zerow %d/2 bad BSS initializer.word %s .word %s %s %s = %s %s: %s: .word %d %d+hol%dbad icon/ucon size .word %d,%d bad fcon size .word 0,0 push bp mov bp,sp push ax push ax sub sp,#%d .define %s .text.data.data.bss$Header: gencode.c,v 2.2 84/11/20 10:22:12 sater Exp $Č,-Ī-ģ-.c.wCan't create %sWrite error on output%s%D%s%s%D%s%s%s%D%s%s%D%s%s$Header: glosym.c,v 2.1 84/05/19 11:40:14 sater Exp $$Header: main.c,v 2.2 85/04/16 16:13:55 keie Exp $Unknown flag %cUsage: %s EMfile [ asfile ]Bombed out of codegen$Header: move.c,v 2.2 84/08/02 16:31:25 sater Exp $$Header: nextem.c,v 2.1 84/05/19 11:40:32 sater Exp $7 7777 77777 7 77$Header: reg.c,v 2.2 84/05/19 11:49:01 sater Exp $$Header: salloc.c,v 2.2 85/09/06 11:06:32 bal Exp $Out of memoryString table overflow$Header: state.c,v 2.1 84/05/19 11:41:06 sater Exp $$Header: subr.c,v 2.3 84/10/02 10:31:06 sater Exp $k?į?š?0@A}AŒA¾AError: ,L,,' ,"$, !%, "&, "', "(, ,,- ,,' ,' ' )  !,,' ,'  ,' ' )  !,-H !%,"$,"&,"',"(,!%,"$,"&,"', "(,!!%L""$L#"&L$"(L%"'L&! ' ‰     *,! '      -/A    0  a I 0 3  L'L("$L) !%L* "&L+ "'L, "(L- , !$F .  G! .  !'  . A% / #%  A$ / #   !(-q A& / A% / #%  A$ / #$  !(-q A& / #&  A' / #'  A% / A$ / A& / A' / A($L /0 a% / 1" a$ / 1# a& / 1$ a' / 1& a($Q /2 13 ! ' 4i    TVA    0  Mq q4 Mn n5 a% / 1* #%  4 ! a$ / 15 #   4 " !(Mqq= a& / 16 A  #-o4,.abB $  .,.cdA % 0 /,/efA $  .,.-A % 0 /,/-‚)&' /  0L/.mo)&' /  0L/.qr)() 7 3 sL71vw)() 7 3 sL71xyA *  0 ,8A + 0 /,/efA + 0 /,/-B),-  .,.z{B),-  .,.Tp)./ 7 3 sL71vw))./ 7 3 sL71xyA 0  0 ,8A/  1  ,.c}A*.  2  0,/e~+,- 3  9L98A* )45 0 ,8€€‚ 6 L:8A* )45 0 ,9€€‚ 7 L;9! - . ,.-AI8-9 /  0L/.*€ƒA.I8-9 /  0L/.p€ƒ! : . ,.A/ ; / 0,/*ai<=>?  0 3 L1/! @ . ,.A/ A / 0,/*ai"(,?"&,@! _  .,."$,A"',B"(,?"&,@! `  .,."$,="',>"(,?"&,@! ,C"0 a  .,.B1$,DB'$,EA$ b € F,GefB1&,HA& b € F,IefA$ c  J,KcdA& c  J,LcdB$1,MB$',NB$$ d  J,O-A2(,PA ',QA  $  .,.cdA' ,RA % 0 /,/efB1$,SB1(,TA$ f € F,GA + 0 /,/efA + 0 /,/-! _ . ,.$F g  -€› h  €œ! ` . ,.$F i  -€› j  €œ$F <  <  k   l  ! m   ,<L<<l<<<Œ<<<< 4: <;)n €ž -€ ! <;Io  !$F p  $F q  !$F p  $F r  $F g  $F i  !$F s  !$F t  $F u !'  v  '  w  !'  v  '  x  '  y  '  z  !'  {  !'  |  '  } ! ~     ! ~   €€   h   j  ! €  ! €‚   €ƒ a34 €„ 3 ,1-% -% a3- €… 3 ,1A34 €†  A34 €‡  A34 €ˆ  A34 €‰  A34 €Š  !5 €‹,.!5 )€‹4L98p!5 4L98TA"",.!"'€§?  0 3 L1/! €Ø ,.A/ €© 0,/*aÉ<€Ŗ€«=>€§?  0 3 L1/A/)H€¬ / 0,/g€ÆA/)H€¬ / 0,/T€Æ!)G€­ . ,.gg!)G€­ . ,.Tg! €­ . ,.gg! €­ . ,.Tg! : €®  ,8A3 €® 0 ,8!€Æ€±)€°€±  !€Æ€±)€°€²  !/'U €³  ,! : €“   A3 €“ 0  - M€ŗ ! :  -,.! :  M€Ą,.! )::  -,.! )::  M€Ę,.! 'V €µ  -,.! 'V €µ  M€Ė,.a   I+€¶€· 0 3 ,1a'  I€ø€¹€· 0 3 ,1m9 >p€² m9 >H€²  €ŗ ,Wa   €»  0 3   €¼  a   €½  0 3   €¾  -` ©./€æ€Ą€Į€Ā 7 3 s,7-  €Ć ,8B ,  .,.cdA + 0 /,/efA ,  .,.-A + 0 /,/-i./€æ€Ä 7 3 s,7‚i€Å€Ę€æ€Ē /  0,/ : €Č €ž ,:! €Č €ž ,: €É   €Ź  ! €Ė   B6'<©€Ģ€Ķ€Ī€Ļ€Š€Ń  ,A6'<©€Ģ€Ķ€Ī€Ļ€Š€Ń  ,A5'<©€Ģ€Ķ€Ī€Ļ€Š€Ń  ,-A5'<©€Ģ€Ķ€Ī€Ļ€Š€Ń  ,-!'< .)€Ņ€Ó  ,!'< .)€Ō€Ó  ,!'< .)€æ€Ó  ,!'< .)€Į€Ó  ,!'< .)€Õ€Ó  ,!'< .)€Ö€Ó  ,A .)€Ņ€× 0 ,/A .)€Ō€× 0 ,/A .)€æ€× 0 ,/A .)€Į€× 0 ,/A .)€Õ€× 0 ,/A .)€Ö€× 0 ,/aI€Ų€Ņ€Ł 3 ,1aI€Ų€Ō€Ł 3 ,1aI€Ų€æ€Ł 3 ,1aI€Ų€Į€Ł 3 ,1aI€Ų€Õ€Ł 3 ,1aI€Ų€Ö€Ł 3 ,1A'+5I ,8-X !   ,.!   !   !      !   !.'.,!$   J,Jef! .  .,!1,Y!.'.,!. .Z  ,-!?.  ,- €ö,*             /  /                 .  ) )  < .Z  ‰ !" )#  J  .J #  $  .  ©% &'"  (’’)*+, -@.€/!0"1 203Ą4 #5@6€7  $   &%$" !          $$  *+ .+! 1!  $67"4& 6; >@?AC C4DECCIJHK"CCONP"'  *U9Y[Z]\_^Y`[]-_Y-[hgjilknThpj!Yg[t]u_T]p_]g_v|_|[$ °-Y€[ >„•†[ * ‰ŽMŽ"“ŽeŽ—˜M g$  ƒŸ @”„>”£>‰”„ @§„§£§„>««"„ „ ²„³µ“¶ µ“øµ²„»¼¶¼øµæ²„Į¶ĀøµÅ„¶ µ„ȵ²Ź ²@Ķ Ļ ŠŃŅ„Y Ö [C_-][ƒ[<ƒYą[gYć[;ę[lFŸF¢F¤FŖFÆF·F»F½FæFŃFŁFŪFŽFčFņFüFGGGG%G)G4G;GFGPGYG`GhGrG|G†G‹GG”GžGØG²G¼GĘGŠGŚGäGīGųG’G HHH$H+H6H:HBHMHXH_HiHsH}H…H’HœH§H±H»HČHŅHŁHäHļHłHIII&I0I;IFIPI[IfIpI{I†II›I¦I°I»IĘIŠIŪIęIšI÷IžI JJJ+J-J8JCJJJUJ\JgJrJ|J‡J’J J«JŗJČJÕJąJķJ÷JKKK&K2K%+17M=JI:pB@!qBNłnU^hbonx€Š’™ep „Æ·ĮÉŠÜęšvpų‚‚ ‚‚"‡p"‚/‚=‚K‚[‚ip)‚zs‚‘e‚ c‚§d‚®‚¼‚ɂׂä‚ķ‚żĻƒ ƒƒ-ƒ=Ž"ƒMƒcƒyƒ2ƒ„ö`ƒµƒÅƒÕƒę`"ƒ÷„ `2„#Q„3„GÆ Q"„['-„m-"„9Y„‹Y"„ŸKU„©U"„ø„ĪEj€…„äjj„ój"…El€……‡l…'l"…7…L b…QÓ R…V“.…[½."…sĘZ…}G Z"…–k… Em€……„ģm…“m"…Äž"…Ł€ˆ…į2…é_"…õ$_€ˆ…ż_2†6P"†@P€ˆ†» P2†!R,"†-\,€ˆ†5,2†=nT"†IxT€ˆ†QT2†YŠ1"†e”1€ˆ†må12†u¦0"†°0€ˆ†‰02†‘ʆ†¢†§†¬†±Ü€Š†Ą†Å†Ź†Ļ†Ō†ć†č†ķ†ņ†÷†ü‡ ‡‡‡(‡.‡?‡O‡_‡e‡k‡{‡‡‡‡—‡a‡­‡³‡¹‡Ē‡×4‡ē6‡ö5ˆ'ˆ)ˆ"Q(ˆ2…ˆ?ƒˆIv„"ˆP€„€ˆˆX„2ˆ`’}ˆl›}"ˆo„}€ˆsÆ}€ˆˆxø}1ˆ~}2ˆ’IT Iq€¢ˆ”LŁIUq€¢ˆÆIĒ Iq€¢ˆ»IńIq€”ˆÉIżIq€¤ˆÕIIq€¦ˆįI~Iq€¢ˆķJI8q€¢ˆūKI q€¢‰ A“ Ah€¢‰DEAUh€¢‰ AžAh€¢‰,A]Ah€”‰:AiAh€¤‰FAAh€¦‰RA)Ah€¢‰^BA8h€¢‰lC© A h€¢‰zFØFn€Ø‰ƒC±FUn€Ø‰ŽFFn€Ø‰—FÉFn€§‰¢FÕFn€©‰¬FFn€Ŗ‰µFšFn€Ø‰¾EF8n€Ø‰ŹDF n€Ø‰Ö‰Ż‰ķ$‰ņ%‰÷Š#ŠŠŠ+Š7AbEE€…ŠCAnEE€¬ŠNAzEE€­Š]AEE€®ŠjA’EE%€­ŠpAk EE%€®ŠyAŖEE€­ŠAi EE€®ŠˆAĀEE$€­ŠŽAY EE$€®Š—ŻŠŠ®ŠæŠŠģ"ŠįŠł‹‹)õ1‹A2‹L 8‹Y‹j‹{‹Œ8"‹‹µ‹Ķ‹å%81‹ż82Œ={ŒŒ&Œ7ŒHL{"ŒYŒqŒ‰Œ”U{1Œ¹{2ŒÄg ŒŃp "ŒŽy 1Œń 2Œü² E[€… –[["$óE\€…;³\H\"Vį7q„ŌE7€…—Ø± E7€°¹Éź71Ł72źF E7|€„łF E7‚€„Ž fŽf1Ž-f2Ž=19€·ŽK<9€¹ŽPG9€½ŽXR9€¾Žf]9€ĆŽwh9€Äކs9€ĒŽ˜9€ÉެŸŽĆŽŲ9^€ĢŽī9;€ĢŽų2±^ ^2Ć;(;2;ՏD"Iēc"h’r‚’¢ "²Č 1ą2š% "’/ €ˆ2<Zx“ x–wŖt¾yŅuęvśæ x8€„‘Ė w8€„‘ × t8€„‘2ć y8€„‘Dļ u8€„‘Vū v8€„‘h x8€Ī‘zw8€Ī‘Œt8€Ī‘žO y8€Ī‘°u8€Ī‘Ā6 v8€Ī‘Ōx‘ꑜw’’"t’6’Jy’^’ru’†’šv’®’Āx’Ö’źw’ž“t“&“:y“N“bu“v“Šv“ž“²t“Ę“Śy“””$€”2”@|”N”\‚”j”x~”†”””¢”°|”¾”Ģ‚”Ś”č' |”ö•7 ‚•• E½ E|€Ó•.•?•PEE‚€Ó•`•q•‚E €Ņ•’•£E€Ņ•³•ÄDE|€Ó•Ō•åDĆ E‚€Ó•õ––––+ –9–G –U–c–q– ––› –©–·–Å€–Ó|–į‚–ļ~–ż— ——" @—-" @"—0, @€—4@€ˆ—9? X—?H X—LQ X"—Y[ X€—gX€ˆ—vp —†—Š{ "—˜—‡ €×—®—±—¾™  —Ź 2—Õ« —ć€Ų—č¾ —ż2˜Š !˜(!2˜8ā "˜K"2˜[ō *˜nż *"˜t*˜} +˜Œ+2˜™! /˜©* /"˜°3 /1˜»/˜Ź3˜Ū2˜ęB˜ķC˜÷D˜žr J™{ J™J™S™V™)Ÿ W™2W2™=]™Kg™Pi™\Ģ r™eÕ r™nr™yz™‚ õĄ¹ļĪe  œ ‚Ÿ‘ ¢ µ † § }  ž M;Du Ģ8 įŽ^ĶŁ 2 @RIė  I« E < %7.¼9=5ŗ ģõć !N W ` )•žŃEmM- ¢„ eB – -0½ŖØ ™ē™¢«™ Ē0ŗ aĻ~ć%9Lo ¶†t P G b Ž .Ś ‰ģ õ Ń Č ć dm[a &— £ ÷ g  ‹ [ ž s ”Ē ß ė  7 C  } + ‰ķ’’’]ƒ ’’beßg1’’og›'’’vg›}eß’’ˆįā$’’”Ł&’’ äå(Ū’’؃ ­äå ’’µįē$Jš Ŗ1YŗæŹ?ßšę$%%4%N%h%‚%œ%¶%%h%&Š%ź%&&8&R&Š%ź%&&Š%ź%l&ź%ź%8&R&&&8&R&8&R&āEęEųEüEFFFF$F(F0F4F8F>FBF$Header: table,v 2.2 85/01/11 17:03:53 keie Stab $#(bp)()(bp_)()+41: mov ’,4(’)loop 1b2+2sub sp,cxsar cx,#1mov di,sprepmovcall .loicmp ,#2jne .unknown+2+pop (bp)pop pop ()pop +pop ()pop pop mov si,spmov sp,sicall .stipop ()+mov ,add ,add ,add ,adc ,add ,adc ,call .adisub ,sub ,neg sub ,sbb ,call .sbimul mul call .mli4cwdidiv call .dvi4call .rmi4neg sbb ,#0sal ,#1sal ,cljcxz 1f2: sal ,#1rcl ,#1loop 2b 1:sar ,#1sar ,cl2: sar ,#1rcr ,#1div call .dvu4call .rmu4shr ,#1shr ,cl2: shr ,#1call .adf4call .adf8call .adfcall .sbf4call .sbf8call .sbfcall .mlf4call .mlf8call .mlfcall .dvf4call .dvf8call .dvfcall .ngf4call .ngf8call .ngfcall .fif4call .fif8call .fifcall .fef4call .fef8call .fefinc dec add ,#add ,add ,add ,-sub ,inc (bp)inc dec (bp)dec call .zrf4call .zrf8call .zrf1: push bx1: push bxadd (bp),neg (bp)add (bp),#and (bp),or (bp),not (bp)add (’),neg (’)add (’),#inc (’)dec (’)and (’),or (’),not (’)add ,neg add ,#and ,or ,not call .ciicall .cuucall .cifcall .cufcall .cficall .cfucall .cffcbwand ,and ,and ,and ,and ,and ,mov cx,#call .andor ,or ,or ,or ,or ,or ,call .iorxor ,xor ,xor ,xor ,xor ,xor ,call .xornot not call .comrol ,#1rol ,cladc ,#0ror ,#1ror ,clneg cxadd cx,#32and ,#1and ,#1call .inntest ,#je jne shl ’,clcall .setmul ’mul 4+add ,sub ,mul 4+call .iaarcall .sar2call .isarcall .lar2call .ilarjne 1fand ,je 1finc  1: call .cmu4or , 1: sub ,sbb ,or , 1: call .cmscall .cmf4call .cmf8call .cmfcmp ,je 2fjb 1finc ’jmp 2f1: dec ’ 2:jge 1finc ’ 1:jg 1fjl 1fjle 1for ,#1 1:cmp ,or ,#1 1:jae 1fjbe 1fja 1fjb ja jbe jae je jne test ,test ,testb ,#testb ,#test ,#cmpb ,#cmp ,#jmp jl jg jle jge je jne call call ()mov sp,bppop bpretpop ’push lbadd sp,#add sp,add sp,jmp .csa2jmp .csb2call .dupcall .exgmov bx,#jmp .gtomov hol0+4,#mov ’,.ignmaskmov hol0,#inc hol0mov ’,spmov ’,.reghpcall .moncall .nopcall .rckxchg .trppc,mov .ignmask,mov bp,mov sp,call .strhpcall .trpadd ,#xorb ,mov ,movb ,movb ,lea ,xor ,xorb ,or ,cmp ,#0orb ,cmpb ,#0push push ’.data 1: .word  .textpush 1bpush simovb 3(si),#0pop sipush push bppush axlea ax,xchg 2(si),axCCalahblbhclchdldhaxbxcxdxsidibp$Header: var.c,v 2.1 84/05/19 11:42:19 sater Exp $ˆZUU"U,U4U;UEUKUUU`UgUnUrUU†U‘U›UØU³UĄUĖUŁUąUźUųUVVV%V-V7VAVHVOV[VhVvV€VŒV”V¢VŖV²V½VÉV×VįVēVōVW WWW#W-W9WEWMWYWfWpW~W…WW™WžW¤W«W°WµW»WĀWĒWŠWŲWŽWćWčWķWóWśWXX XXXX$X)X0X5X:X?XDXJXOXTXYX^XcXhXlXpXtXxX|X€X„X‡XŠXXX“X–X™XœX”X¦X®Xpush axretmov bp,sppush bppop bpmov sp,bp.textxor ax,axpush 4(bp)pop bxpop sicbwmovb al,(bx)pop axxorb ah,ahmov ax,#1call _callm1add sp,#16mov bx,4(bp)push 6(bp)mov -2(bp),axI0013:call .cuumov ax,-2(bp)add 4(bp),#1or ax,axjmp I0011mov bx,8(bp)push dxmov cx,#2mov bx,#2I0011:I0012:push -2(bp)mov ax,4(bp)mov ax,-4(bp)add sp,#6and ax,#255push bxmov bx,-2(bp)loop 2bjcxz 1f.word 4112mov ax,(bx)mov -4(bp),axjmp I0013.datamov bx,6(bp)mov (bx),axje I0012.word 8224.bssmov ax,#2call _lencall _callx.word 28494.word 0push -4(bp)movb (bx),almov bx,axmov -2(bp),#0I0016:.word 514.word 257mov push .word pop add 4(bp)-2(bp)(bx).define .globl movb xor jmp cmp 6(bp)-4(bp)-6(bp)#16_callm1call 8(bp)xorb and sub -8(bp)jne .cuulea inc _M+10#255loopjcxzax,#bx,#cx,#ax,bx,cx,dx,si,di,bp,axbxcxdxsidibpspdec neg _execve,#0Error in cg: buffer too small °z°zB°~°~ÖXąXźXŠ‚Stack overflow  AAAAAABBBBBB | This is the C run-time start-off routine. It's job is to take the | arguments as put on the stack by EXEC, and to parse them and set them up the | way _main expects them. .globl _main, _exit, crtso, _environ .globl begtext, begdata, begbss, endtext, enddata, endbss .text begtext: crtso: mov bx,sp mov cx,(bx) add bx,*2 mov ax,cx inc ax shl ax,#1 add ax,bx mov _environ,ax | save envp in environ push ax | push environ push bx | push argv push cx | push argc call _main add sp,*6 push ax | push exit status call _exit .data begdata: _environ: .word 0 .bss begbss: .globl endtext, enddata, endbss, _end, _edata .text endtext: .data enddata: _edata: .bss endbss: _end: .globl _main, _stackpt, begtext, begdata, begbss, _data_org, _exit .text begtext: jmp L0 .zerow 7 | kernel uses this area as stack for inital IRET L0: mov sp,_stackpt call _main L1: jmp L1 | this will never be executed _exit: jmp _exit | this will never be executed either .data begdata: _data_org: | fs needs to know where build stuffed table .word 0xDADA,0,0,0,0,0,0,0 | first 16 words of MM, FS, INIT are for stack | 0xDADA is magic number for build .bss begbss: e’getpwent.s #v¤6Č_getpwent Č_setpwent Č_getpwnam Č_getpwuid Č_endpwent ® __pw_file: Ā25903 Ā25460 Ā28719 Ā29537 Ā30579 Ā100 __pw: É_setpwent Ā-1 † _setpwent: ƒ ‚ Ķ__pwö jl I0013 ‡ € € € Į__pw Ó_lseek Äņ,#8 ĢI0014 • ‡ € Ąį__pw_file € Ó_open Š Š Ą__pw,ė I0014: Ą__bufcntö Ąä__pw … „  É_endpwent _endpwent: ƒ ‚ Ķ__pwö jl I0023 Į__pw Ó_close Š I0023: Ą__pw,#-1 Ą__bufcntö … „  _getline: ƒ ‚ Ķ__pwö jge I0033 Ó_setpwent ™ jge I0033 ‡ € ĢI0031 I0033: Ą__buf,#__pwbuf I0038: ó__bufcnt jg I003A 024 € Ąį__buffer € Į__pw Ó_read ¤ Ą__bufcnt,ė Ķ__bufcntö jg I003D ‡ € ĢI0031 I003D: Ą__pnt,#__buffer I003A: Į__pnt Ä__pnt,#1 ‰ mov č__buf Œ Ź(ļ),al Ä__buf,#1 Ąå__pnt cmpb Ē,#10 ŁI0038 Ä__pnt,#1 ó__bufcnt Ąå__buf ŹĒö Ą__buf,#__pwbuf  € I0031:  … „  _skip_period: ƒ ‚ I0043: Ąå__buf cmpb Ē,#58 je I0042 Ä__buf,#1 ĢI0043 I0042: Ąå__buf ŹĒö Ä__buf,#1 … „  É_getpwent _getpwent: ƒ ‚ Ó_getline ™ ŁI0053 ‡ € ĢI0051 I0053: Ąå__buf Ą_pwd,ģ Ó_skip_period Ąå__buf Ą_pwd+2,ģ Ó_skip_period Į__buf Ó_atoi Š Ą_pwd+4,ė Ó_skip_period Į__buf Ó_atoi Š Ą_pwd+6,ė Ó_skip_period Ąå__buf Ą_pwd+8,ģ Ó_skip_period Ąå__buf Ą_pwd+10,ģ Ó_skip_period Ąå__buf Ą_pwd+12,ģ Ąį_pwd € I0051:  … „  É_getpwnam _getpwnam: ƒ ‚ € Ó_setpwent I0063: Ó_getpwent ” ĶĘö je I0062 § ˆ ĮĒ Ó_strcmp Š Š ™ ŁI0063 I0062: Ó_endpwent ĶĘö je I0069 ” ĢI0061 I0069: ‡ € I0061:  … „  É_getpwuid _getpwuid: ƒ ‚ € Ó_setpwent I0073: Ó_getpwent ” ĶĘö je I0072 § ¢ Ķ4Ē,ė ŁI0073 I0072: Ó_endpwent ĶĘö je I0079 ” ĢI0071 I0079: ‡ € I0071:  … „  ³ _pwd: .zerow 14/2 __bufcnt: .zerow 2/2 __buf: .zerow 2/2 __pnt: .zerow 2/2 __buffer: .zerow 1024/2 __pwbuf: .zerow 256/2 † qsort.s.s #v¤}Č_qsort É_qsort † _qsort: ƒ ‚ Ąå10(ń) Ą_qcompar,ģ ĄäĪ óė mul Ō » ÄåÅ ĮŌ ¦ ˆ Ó_qsort1 ¤ … „  _qsort1: ƒ ‚ ×ņ,#14 I0025: ¢ ĶĪ,ė ja I0027 … „  I0027: ¢ ” ĄäĪ ¬ ĄäĪ ×äÅ ÄäŌ › sal ā1 cwd išv ģ mul Ō » ÄåÅ ĄŲ,ģ ĄäŲ ĄŠ,ė I002B: ĄäŠ ĶĘ,ė jae I00212 Ąå_qcompar ĮŠ ” ÓĒ Š Š Ą-10(ń),ė Ķ-10(ń)ö jg I00212 Ķ-10(ń)ö jge I002F › ÄåĘ ĄĘ,ģ ĢI002B I002F: ĄäŌ ōė » ÄåŠ ĄŠ,ģ ĮŌ ĮŠ ” Ó_qexchange ¤ ĢI002B I00212: ĄäŲ ĶĻ,ė jbe I00211 Ąå_qcompar ĮŲ ¹ ÓĒ Š Š Ą-10(ń),ė cmp -10(ń)ö jge I00215 ĄäŠ ĶĘ,ė jae I00218 ĮŌ ¹ ” Ó_qexchange ¤ › ÄåĘ ĄĘ,ģ ĄäŌ ōė » ÄåĻ ĄĻ,ģ ĢI002B I00218: › ÄåŲ ĄŲ,ģ ĮŌ ¹ ĮŲ ” Ó_q3exchange Äņ,#8 › ÄåŠ ĄŠ,ģ ĄäŠ ” ĢI00212 I00215: Ķ-10(ń)ö ŁI0021B › ÄåŲ ĄŲ,ģ ĮŌ ĮŲ ¹ Ó_qexchange ¤ ĢI00212 I0021B: ĄäŌ ōė » ÄåĻ ĄĻ,ģ ĢI00212 I00211: ĄäŠ ĶĘ,ė jae I0021E ĄäŌ ōė » ÄåŠ ĄŠ,ģ ĮŌ ” ĮŠ ¹ Ó_q3exchange Äņ,#8 ĄäŌ ōė » ÄåŲ ĄŲ,ģ ĄäŲ ¬ ĢI002B I0021E: ĄäŌ ōė » ÄåŠ ĮŌ ¦ ˆ Ó_qsort1 ¤ › ÄåŲ ĄÅ,ģ ĢI0025 _qexchange: ƒ ‚ € I0033: ĮŌ óŌ  ™ jle I0032 ’ Œ Ž ‹ ” Æ ĄčÅ Œ Ź(ļ),al ˜ Æ — ŗ ÄĪ,#1 ĢI0033 I0032: … „  _q3exchange: ƒ ‚ € I0043: Į10(ń) ó10(ń)  ™ jle I0042 ’ Œ Ž ‹ ” › ĄčÅ Œ Ź(ļ),al ˜ Æ ĄčŌ Œ Ź(ļ),al ÄŌ,#1 Æ — ŗ ÄĪ,#1 ĢI0043 I0042: … „  ³ _qcompar: .zerow 2/2 † popen.s.s #v¤ŗČ_popen Č_pclose É_popen † _popen: ƒ ‚ ×ņ,#10 Æ cmpb Ē,#114 ŁI0013 ‡ € ĢI0014 • Æ cmpb Ē,#119 ŁI0016  € ĢI0014 ½ “ € I0014: ĆŠ ĶŠ,#2 je I0018 ŪäĻ € Ó_pipe Š ™ jl I0018 Ó_fork ĄŲ,ė ĶŲö jge I0019 I0018: ‡ € š I0019: ĶŲö ŁI001E Ą-10(ń),#_pids I00113: Ķ-10(ń),#_pids+40 jae I00110 Ąå-10(ń) ĶĒö je I00111 Ąä-10(ń) ×į_pids ž cwd išv ģ € Ó_close Š I00111: Ä-10(ń),#2 š3 I00110: ĄäŠ sal į1 Ąčė Į-4(ń_ļ) Ó_close Š ĶŠö je I00117 ‡ € š9 I00117:  € I00119: ŪäĻ € ĶŠö je I0011A ‡ € šC I0011A:  € I0011C:  sal į1 ‰ Äåė ĮĒ Ó_dup2 Š Š Ūax,Ļ € ĶŠö je I0011D ‡ € šF I0011D:  € I0011F:  sal į1 ‰ Äåė ĮĒ Ó_close Š ‡ € ˆ Ąį_3 € Ąį_2 € Ąį_1 € Ó_execl Äņ,#10 27 € Ó__exit Š I001E: ĄäŠ sal į1 Ąčė Ąä-4(ń_ļ) sal į1 » ĄäŲ Ą_pidsĒ,ė ŪäĻ € ĶŠö ±0 ‡ € ĢI00122 I00120:  € I00122:  sal į1 ‰ Äåė ĮĒ Ó_close Š ĄäŠ sal į1 Ąčė “ Į-4(ń_ļ) Ó_fdopen Š Š € Ÿ  … „  É_pclose _pclose: ƒ ‚ ×ņ,#10 ’ « ”  € “ € Ó_ļgnal Š Š ĄŲ,ė  € Ąį3 € Ó_ļgnal Š Š Ą-10(ń),ė ˆ Ó_fclose Š I0023: Ūä-4(ń) € Ó_wait Š ĄŠ,ė ĶŠ,#-1 je I0022 — sal į1 » Ąä_pidsĒ ĶŠ,ė ŁI0023 I0022: ĶŠ,#-1 ŁI0029 ĄĻ,#-1 I0029: ĮŲ “ € Ó_ļgnal Š Š Į-10(ń) Ąį3 € Ó_ļgnal Š Š — sal į1 » Ą_pidsĒö £ … „  ³ _pids: .zerow 40/2 ® _1: Ā25135 Ā28265 Ā29487 Ā104 _2: Ā26739 ø _3: Ā25389 ø † scanf.s.s #v¤Č_scanf Č__doscanf Č_sscanf Č_fscanf É_scanf † _scanf: ƒ ‚ ŪäĪ € ˆ Į__io_table ‡ € Ó__doscanf Äņ,#8 … „  É_fscanf _fscanf: ƒ ‚ ŪäŌ € “ ˆ ‡ € Ó__doscanf Äņ,#8 … „  É_sscanf _sscanf: ƒ ‚ ŪäŌ € “ ˆ  € Ó__doscanf Äņ,#8 … „  _rnc: ƒ ‚ Ķ_rnc_codeö je I0043 Į_rnc_arg Ä_rnc_arg,#1 ‰ Œ Ž ‹ Ą_ic,ė Ķ_icö ŁI0044 Ą_ic,#-1 ĢI0044 I0043: Į_rnc_arg Ó_getc Š Ą_ic,ė I0044: … „  _ugc: ƒ ‚ Ķ_rnc_codeö je I0053 Ä_rnc_arg,#-1 ĢI0054 I0053: Į_rnc_arg Į_ic Ó_ungetc Š Š I0054: … „  _scnindex: ƒ ‚ I0063: “ ÄĪ,#1 ‰ Œ xorb ah,ah ‹ € Źal,Å Ž ‹ ‰ Ķåė je I0062 Æ cmpb Ēö ŁI0063 ‡ € ĢI0061 I0062:  € I0061:  … „  _iswhite: ƒ ‚ ĶÅ,#32 je I0072 ĶÅ,#9 je I0072 ĶÅ,#10 je I0072 ĶÅ,#13 je I0072 ‡ € ĢI0071 I0072:  € I0071:  … „  _isšgit: ƒ ‚ ĶÅ,#48 jl I0083 ĶÅ,#57 jg I0083  € ĢI0081 I0083: ‡ € I0081:  … „  _tolower: ƒ ‚ ĶÅ,#65 jl I0093 ĶÅ,#90 jg I0093 ÄÅ,#32 I0093: ¢ … „  É__doscanf __doscanf: ƒ ‚ ×ņ,#26 ® _1: ĀI00A32 Ā7 Ā91 ĀI00A86 Ā99 ĀI00A63 Ā100 ĀI00A36 Ā111 ĀI00A33 Ā115 ĀI00A74 Ā117 ĀI00A36 Ā120 ĀI00A37 † ¼ Æ Ą_rnc_arg,ģ ’ Ą_rnc_code,ģ Ó_rnc Ķ_ic,#-1 ŁI00AA ĄĘ,#-1 ĢI00A5 I00AA: › Œ Ž ‹ € Ó_iswhite Š ™ je I00A9 ÄŌ,#1 ĢI00AA I00A9: › cmpb Ēö ŁI00AD ĢI00AF I00AD: Ķ_icö jge I00A11 ĢI00A5 I00A11: › cmpb Ē,#37 je I00A14 I00A17: Į_ic Ó_iswhite Š ™ je I00A16 Ó_rnc ĢI00A17 I00A16: › Œ Ž ‹ Ķ_ic,ė je I00A1A ĢI00AF I00A1A: ÄŌ,#1 Ó_rnc ÜĘ ĢI00AA I00A14: ÄŌ,#1 Ą-12(ń),#1 › cmpb Ē,#42 ŁI00A1D ÄŌ,#1 Ą-12(ń)ö I00A1D: › Œ Ž ‹ € Ó_isšgit Š ™ je I00A20 Ą-1Ī,#1 Ą-1Åö I00A25: › Œ Ž ‹ € Ó_isšgit Š ™ je I00A21 ĮŌ ÄŌ,#1 ‰ Œ Ž ‹  ž – € 0 mul -1Å ‰ Äåė ×ā48 Ą-1Å,ģ ĢI00A25 I00A20: Ą-1Īö I00A21: › Œ Ž ‹ € Ó_tolower Š Ķį108 je I00A29 ‡ € ĢI00A2A I00A29:  € I00A2A: Ć-1Ō Ķ-1Ōö je I00A27 ÄŌ,#1 I00A27: › cmpb Ē,#99 je I00A2C I00A2F: Į_ic Ó_iswhite Š ™ je I00A2C Ó_rnc ĢI00A2F I00A2C: Ą-20(ń)ö › Œ Ž ‹ € ĢI00A31 I00A33: ĄĻ,#8 ĢI00A34 I00A36: ĄĻ,#10 ĢI00A34 I00A37: ĄĻ,Ń Ķ-1Īö je I00A3B Ķ-1Å,#2 jb I00A34 I00A3B: Ķ_ic,#48 ŁI00A34 Ó_rnc Į_ic Ó_tolower Š Ķį120 ŁI00A3E Ąä-1Å ×į2 Ą-1Å,ė Ą-20(ń),#1 Ó_rnc ĢI00A34 I00A3E: Ó_ugc Ą_ic,#48 I00A34: ĄŲö ĄŠö Ą-10(ń)ö Ķ-1Īö ŁI00A41 Ą-1Å,#65535 I00A41: Ķ-1Åö je I00A44 Ķ_ic,#43 ŁI00A44 Ó_rnc ĢI00A4C I00A44: Ķ-1Åö je I00A4C Ķ_ic,#45 ŁI00A4C Ą-10(ń),#1 Ó_rnc I00A4C: Ąä-1Å ×į1 Į-1Å Ą-1Å,ė  ™ je I00A4B Į_ic Ó_isšgit Š ™ je I00A4F Ąå_ic ×ā48 ĶĻ,ģ jle I00A4F Ąå_ic ×ā48 Ą_ic,ģ ĢI00A50 I00A4F: ĶĻ,Ń ŁI00A4B Į_ic Ó_tolower Š Ķį97 jl I00A4B Į_ic Ó_tolower Š Ķį102 jg I00A4B Į_ic Ó_tolower Š Äį-87 Ą_ic,ė I00A50: £ cwd ĄčŲ ĄéŠ » Ąäī Ó.mli4 œ € Ąä_ic cwd ‰ Ćķ Äåė adc ęī ĄŲ,ģ ĄŠ,ķ Ó_rnc Ą-20(ń),#1 ĢI00A4C I00A4B: Ķ-12(ń)ö je I00A58 Ķ-10(ń)ö je I00A5B ĄåŲ ĄäŠ ōė ōģ sbb į0 ĄŲ,ģ ĄŠ,ė I00A5B: Ķ-1Ōö je I00A5E Ąć4 Ąā4 ĄäŲ ĮŠ – € Į10(ń) Ä10(ń),#2 ‰ ĄåĒ  Ćķ ° Ą2Ē,ķ ĢI00A58 I00A5E: ĮŲ Į10(ń) Ä10(ń),#2 ‰ ĄåĒ  ° I00A58: Ķ-20(ń)ö je I00AF ÜĘ ĢI00A32 I00A63: Ķ-1Īö ŁI00A68 Ą-1Å,#1 I00A68: Ąä-1Å ×į1 Į-1Å Ą-1Å,ė  ™ je I00A67 Ķ_icö jl I00A67 Ķ-12(ń)ö je I00A6C Ąä10(ń) Ą-2Ī,ė Ąå10(ń) « » Üģ Ąč-2Ī Į_ic Ą(ļ),ģ »  ŗ I00A6C: Ó_rnc Ą-20(ń),#1 ĢI00A68 I00A67: Ķ-12(ń)ö je I00A6F Ä10(ń),#2 I00A6F: Ķ-20(ń)ö je I00A32 ÜĘ ĢI00A32 I00A74: Ķ-1Īö ŁI00A79 Ą-1Å,#65535 I00A79: Ąä-1Å ×į1 Į-1Å Ą-1Å,ė  ™ je I00A78 Į_ic Ó_iswhite Š ™ ŁI00A78 Ķ_icö jle I00A78 Ķ-12(ń)ö je I00A7E Ąä10(ń) Ą-2Ī,ė Ąå10(ń) « » Üģ Ąč-2Ī Į_ic Ą(ļ),ģ »  ŗ I00A7E: Ó_rnc Ą-20(ń),#1 ĢI00A79 I00A78: Ķ-12(ń)ö je I00A81 ‡ push ė Į10(ń) Ä10(ń),#2 ‰ ĄåĒ  ŗ I00A81: Ķ-20(ń)ö je I00AF ÜĘ ĢI00A32 I00A86: Ķ-1Īö ŁI00A88 Ą-1Å,#65535 I00A88: ÄŌ,#1 › cmpb Ē,#94 ŁI00A8B Ą-22(ń),#1 ÄŌ,#1 ĢI00A8C I00A8B: Ą-22(ń)ö I00A8C: ĄäŌ Ą-2Å,ė I00A8E: Ąå-2Å cmpb Ē,#93 je I00A8D Ąå-2Å cmpb Ēö je I00A8D Ä-2Å,#1 ĢI00A8E I00A8D: Ąå-2Å cmpb Ēö ŁI00A92 ĢI00A5 I00A92: Ąå-2Å ŹĒö I00A95: Ąä-1Å ×į1 Į-1Å Ą-1Å,ė  ™ je I00A94 Į_ic Ó_iswhite Š ™ ŁI00A94 Ķ_icö jle I00A94 ĮŌ Į_ic Ó_scnindex Š Š Ėä-22(ń) ™ je I00A94 Ķ-12(ń)ö je I00A9B Ąä10(ń) Ą-2Ī,ė Ąå10(ń) « » Üģ Ąč-2Ī Į_ic Ą(ļ),ģ »  ŗ I00A9B: Ó_rnc Ą-20(ń),#1 ĢI00A95 I00A94: Ąä-2Å ĄŌ,ė › ŹĒ,#93 Ķ-12(ń)ö je I00A9E ‡ € Į10(ń) Ä10(ń),#2 ‰ ĄåĒ  ŗ I00A9E: Ķ-20(ń)ö je I00AF ÜĘ ĢI00A32 I00A31: Ąč#_1 Ćī Ģ.csb2 I00A32: ÄŌ,#1 ĢI00AA I00AF: Ķ_icö jl I00A5 Ó_ugc I00A5: — … „  ³ _rnc_code: .zerow 2/2 _rnc_arg: .zerow 2/2 _ic: .zerow 2/2 † system.ss #vĒÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśū¤Č_system É_system † _system: ƒ ‚ ×ņ,#6 Ó_fork ¬ ĶĻö ŁI0016 ‡ € ˆ Ąį_3 € Ąį_2 € Ąį_1 € Ó_execl Äņ,#10 27 € Ó_exit Š ½ ŪäĘ € Ó_wait Š ĄŠ,ė £ ĶŠ,ė je I0015 ĶŠ,#-1 je I0015 ĢI0016 I0015: ĶŠ,#-1 ŁI001A ĄĘ,#-1 I001A: — … „  ® _1: Ā25135 Ā28265 Ā29487 Ā104 _2: Ā26739 ø _3: Ā25389 ø † fgets.ss #„u¤µČ_fgets É_fgets † _fgets: ƒ ‚ € € ¢ ¬ • ĄäĪ ×į1 ĄĪ,ė ĶĪö jbe I0012 ĮŌ Ó_getc Š ” ĶĘ,#-1 ± ĄåĻ — ŗ ÄĻ,#1 ĶĘ,#10 ŁI0013   ĶĘ,#-1 ŁI001a ¢ ĶĻ,ė ŁI001a ‡ € š I001a: ĄåĻ ŹĒö ˆ Ÿ  … „  fprintf.s #¦u¤÷Č_printf Č_fprintf É_fprintf † _fprintf: ƒ ‚ ŪäŌ € “ ˆ Ó__doprintf ¤ ’ testb 4Ē,#64 je I0013 ˆ Ó_fflush Š • … „  É_printf _printf: ƒ ‚ ŪäĪ € ˆ Į__io_table+2 Ó__doprintf ¤ Ąå__io_table+2 testb 4Ē,#64 je I0023 Į__io_table+2 Ó_fflush Š I0023: … „  puts.s.s #v¤uČ_puts É_puts † _puts: ƒ ‚ € Į__io_table+2 ˆ Ó_fputs Š Š Ź-1(ń),al Į__io_table+2 0 € Ó_putc Š Š Źal,-1(ń) Ž ‹ … „  fputs.s #¦u¤QČ_fputs É_fputs † _fputs: ƒ ‚ • ’ Œ Ž ‹ ™ ± “ ˆ ˜ ‰ Œ Ž ‹ € Ó_putc Š Š ­   … „  fread.s #¦u¤ęČ_fread É_fread † _fread: ƒ ‚ ×ņ,#6 ĄĻö ĄĻö ĶĪö je I0013 ½ ĄäŌ ĶĻ,ė jae I0013 ĄäĪ ĄŠ,ė I001a: Į10(ń) Ó_getc Š ” ĶĘ,#-1 je I001c ’ — ŗ ˜ ĢI0019 I001c:  ž £ – € š I0019: ĄäŠ ×į1 ĄŠ,ė ĶŠö ŁI001a £ Äį1 ¬ ĢI0016 •  ž £ – € Ÿ  … „  freopen.s #§u¤aČ_freopen É_freopen † _freopen: ƒ ‚ ĮŌ Ó_fclose Š ™ je I0013 ‡ € š • “ ˆ Ó_fopen Š Š € Ÿ  … „  fclose.s #§u¤#Č_fclose É_fclose † _fclose: ƒ ‚ € ¼ I0015: ĶĘ,#20 jge I0012 — sal į1 » Ąä__io_tableĒ ĶÅ,ė ŁI0013 — sal į1 » Ą__io_tableĒö ĢI0012 • ÜĘ ĢI0015   ĶĘ,#20 jl I001a Ąį-1 € š I001a: ˆ Ó_fflush Š ’ ĮĒ Ó_close Š ’ testb 4Ē,#32 je I001d ’ Ķ6Ēö je I001d ’ Į6Ē Ó_free Š I001d: ˆ Ó_free Š ‡ € Ÿ  … „  fopen.s #Øu¤ÄČ_fopen É_fopen † _fopen: ƒ ‚ ×ņ,#10 ® _1: ĀI00117 Ā3 Ā97 ĀI001f Ā114 ĀI00113 Ā119 ĀI001b † ĄŲö ¼ I0015: — sal į1 » Ķ__io_tableĒö ± ĶĘ,#20 jl I0013 ‡ € š • ÜĘ ĢI0015   Æ Œ Ž ‹ € ĢI0019 I001b: or Ų,#2 Ąį420 € ˆ Ó_creat Š Š ĄŠ,ė ĶŠö jge I001a ‡ € š I001f: or Ų,#2  € ˆ Ó_open Š Š ĄŠ,ė ĶŠö jge I00111 ‡ € š I00111: “ € ‡ € € ĮŠ Ó_lseek Äņ,#8 ĢI001a I00113: or Ų,#1 ‡ € ˆ Ó_open Š Š ĄŠ,ė ĶŠö jge I001a ‡ € š I00117: ‡ € š I0019: Ąč#_1 Ćī Ģ.csb2 I001a: 0 € Ó_malloc Š ¬ ĶĻö ŁI00119 ‡ € š I00119: ĄåĻ Ą2Ēö ĄäŠ ĄåĻ ° ĄåĻ ĄäŲ Ą4Ē,ė 024 € Ó_malloc Š ĄåĻ Ą6Ē,ė ĄåĻ Ķ6Ēö ŁI0011c ĄåĻ Äā4 Ą-10(ń),ģ « or į4 ° šd I0011c: ĄåĻ Äā4 Ą-10(ń),ģ « or į32 ° I0011d: ĄåĻ ĄčĻ Ąä6Ē Ą8(ļ),ė — sal į1 » £ Ą__io_tableĒ,ė ¹ Ÿ  … „  fseek.s #Øu¤ņČ_fseek É_fseek † _fseek: ƒ ‚ ×ņ,#8 ’ Äā4 ĄŲ,ģ « Öį-25 ° ’ testb 4Ē,#1 je I0013 Ķ10(ń),#2 jge I0016 ’ Ķ6Ēö je I0016 ’ testb 4Ē,#4 ŁI0016 ’ Ąä2Ē ” ĄäĪ ĄŠ,ė ĄäŌ ¬ Ķ10(ń)ö ŁI001b — cwd ’ ¹ ĮŠ œ €  € ‡ € € ĮĒ Ó_lseek Äņ,#8 ‰ Ćķ ×åė sbb ęī ×ā1 sbb ć0  Ćī Ääģ adc ēķ ĄŠ,ė ĄĻ,ī ĢI001c I001b: — cwd Æ ĄęŌ ×åė sbb ęī ĄĪ,ģ ĄŌ,ķ I001c: ĶĘö jle I0016 — cwd ĄåŠ ĄęĻ ×åė sbb ęī Ł1f Öåģ je 1f Üķ 1: or ęķ jg I0016 ’ ĄčÅ Ąä6Ē ×ä8(ļ) cwd ĄåŠ ĄęĻ ×åė sbb ęī Ł1f Öåģ je 1f Üķ 1: or ęķ jl I0016 ’ Äā8 ĄŲ,ģ ĄčŠ ÄčĒ ĄĒ,ļ ’ Äā2 ĄŲ,ģ « ×äŠ ° ‡ € š ½ ’ Į10(ń) ĮŌ “ ĮĒ Ó_lseek Äņ,#8 ĄŠ,ė ĄĻ,ī ’ Ą2Ēö ĢI0014 • ’ testb 4Ē,#2 je I0014 ˆ Ó_fflush Š ’ Į10(ń) ĮŌ “ ĮĒ Ó_lseek Äņ,#8 ĄŠ,ė ĄĻ,ī I0014: ĄäŠ ĄåĻ ×į65535 sbb ā-1 Ł1f or åė 1: or åģ ŁI00116 Ąį-1 € š I00116: ‡ € Ÿ  … „  ftell.s #©u¤^Č_ftell É_ftell † _ftell: ƒ ‚ ×ņ,#6 ĄŠö ’ testb 4Ē,#1 je I0013 ’ ĄäŠ ×ä2Ē ĄŠ,ė ĢI0014 • ’ testb 4Ē,#2 je I0016 ’ Ķ6Ēö je I0016 ’ testb 4Ē,#4 ŁI0016 ’ ĄčÅ Ąä8Ē ×ä6(ļ) ĄŠ,ė ĢI0014 ½ Ąį-1 € Ąį65535 € š I0014: ’  € ‡ € € ĮĒ Ó_lseek Äņ,#8 ¬ ĄĘ,ī £ § ×į0 sbb ā0 Ł1f Öäė je 1f Üģ 1: or åģ jge I001b ” ¹ š I001b: ĄäŠ cwd ÄäĻ adc ēĘ ¬ ĄĘ,ī ” ¹ Ÿ  Ćī … „  fwrite.s #©u¤ßČ_fwrite É_fwrite † _fwrite: ƒ ‚ € € ĄĻö ĶĪö je I0013 ½ ĄäŌ ĶĻ,ė jae I0013 ĄäĪ ” I001a: Į10(ń) ˆ ˜ ‰ Œ Ž ‹ € Ó_putc Š Š Ąå10(ń) testb 4Ē,Ń je I0019  ž £ – € š I0019: — ×į1 ” ĶĘö ŁI001a £ Äį1 ¬ ĢI0016 •  ž £ – € Ÿ  … „  gets.s #©u¤Č_gets É_gets † _gets: ƒ ‚ € € ¢ ¬ • Į__io_table Ó_getc Š ” ĶĘ,#-1 ± ĶĘ,#10 ± ĄåĻ — ŗ ÄĻ,#1 ­   ĶĘ,#-1 ŁI0017 ¢ ĶĻ,ė ŁI0017 ‡ € š I0017: ĄåĻ ŹĒö ˆ Ÿ  … „  getc.s #Ŗu¤ļČ_getc É_getc † _getc: ƒ ‚ € € ’ testb 4Ē,#24 je I0013 Ąį-1 € š • ’ testb 4Ē,#1 ŁI0016 Ąį-1 € š ½ ’ Äā2 ĄĻ,ģ « óė ° ĄåĻ ĶĒö jg I0019 ’ testb 4Ē,#4 je I001c ’  € ŪäĘ € ĮĒ Ó_read ¤ ’ Ą2Ē,ė ĢI001d I001c: ’ ĄčÅ 024 € Į6Ē Į(ļ) Ó_read ¤ ’ Ą2Ē,ė I001d: ’ Ķ2Ēö jg I001f ’ Ķ2Ēö ŁI00112 ’ Äā4 ĄĻ,ģ « or į8 ° š3 I00112: ’ Äā4 ĄĻ,ģ « or į16 ° I00113: Ąį-1 € š I001f: ’ ĄčÅ Ąä6Ē Ą8(ļ),ė I0019: ’ testb 4Ē,#4 je I00115  ž — – „  ž – € š I00115: ’ Äā8 ĄĻ,ģ ĄčĻ ĮĒ Ä(ļ),#1 ‰ Œ Ž ‹  ž – „  ž – € Ÿ  … „  printdat.s #Ŗu¤XČ___stšn Č___stdout Č__io_table Č__stderr Č__stdout Č__stšn É__stšn ® __stšn: ø ø Ā1 Ā___stšn Ā___stšn É__stdout __stdout: Ā1 ø Ā66 Ā___stdout Ā___stdout É__stderr __stderr: Ā2 ø Ā6 ø É__io_table ø __io_table: Ā__stšn Ā__stdout Ā__stderr ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø É___stdout ø ³ ___stdout: .zerow 1024/2 É___stšn ___stšn: .zerow 1024/2 † setbuf.ss #«u¤ČČ_setbuf É_setbuf † _setbuf: ƒ ‚ € ’ Ķ6Ēö je I0013 ’ testb 4Ē,#32 je I0013 ’ Į6Ē Ó_free Š • ’ Äā4 ĄĘ,ģ « Öį-101 ° ’ ĄäĪ Ą6Ē,ė ’ Ķ6Ēö ŁI0017 ’ Äā4 ĄĘ,ģ « or į4 ° I0017: ’ ĄčÅ Ąä6Ē Ą8(ļ),ė ’ Ą2Ēö … „  ctime.ss #v¤ Č_localtime Č_tzset Č___timezone Č___daylight Č_ctime Č_gmtime Č___tzname É_ctime † _ctime: ƒ ‚ ˆ Ó_localtime Š € Ó_asctime Š … „  ® _monthļze: Ā31 Ā28 Ā31 Ā30 Ā31 Ā30 Ā31 Ā31 Ā30 Ā31 Ā30 É_gmtime Ā31 † _gmtime: ƒ ‚ ×ņ,#20 ³ _1: .zerow 18/2 † ’ « Į2Ē ¬ ĆĘ Ą-1Å,#_1 Ą-1Ī,#_monthļze Ą-1Ō,#1970 ” ¹  € “0864 € Ó.rmi4 ĄŲ,ī ĄŠ,ģ ” ¹  € “0864 € Ó.dvi4 Ą-12(ń),ė Ą-10(ń),ķ ĮŠ ĮŲ ‡ € Ąį60 € Ó.rmi4 Ąå-1Å ĄĒ,ī ĮŠ ĮŲ ‡ € Ąį3600 € Ó.rmi4 ¦ œ ‡ € Ąį60 € call .dvi4 Ąå-1Å Ą2Ē,ė ĮŠ ĮŲ ‡ € Ąį3600 € Ó.dvi4 Ąå-1Å Ą4Ē,ė Ąä-12(ń) Ąå-10(ń) Äį4 adc ā0 ¦ € ‡ € Ąį7 € Ó.rmi4 Ąå-1Å Ą12Ē,ī I0023: Ąā4 Ąä-1Ō cwd išv ģ Į-10(ń) Į-12(ń) or ēī je I0026 Ąį365 € ĢI0027 I0026: Ąį366 € I0027:  cwd ‰ Ćķ ×åė sbb ęī Ł1f Öåģ je 1f Üķ 1: or ęķ jl I0022 Ąā4 Ąä-1Ō cwd išv ģ Į-10(ń) Į-12(ń) or ēī je I0029 Ąį365 € ĢI002A I0029: Ąį366 € I002A:  cwd ‰ Ćķ ×åė sbb ęī Ą-12(ń),ģ Ą-10(ń),ķ Ü-1Ō ĢI0023 I0022: Ąä-1Ō ×į1900 Ąå-1Å Ą10Ē,ė Ąå-1Å Ąä-12(ń) Ą14Ē,ė Ąå-1Å Ą16Ēö Ąā4 Ąä-1Ō cwd išv ģ or ēī je I002F Ąį365 € ĢI00210 I002F: Ąį366 € I00210:  Ķį366 ŁI00212 Ą_monthļze+2,#29 I00212: Ąå-1Ī « cwd Ąå-12(ń) Ąę-10(ń) ×åė sbb ęī ×ā0 sbb ć0 Ł1f Öåģ je 1f Üķ 1: or ęķ jl I00211 Į-10(ń) Į-12(ń) Į-1Ī Ä-1Ī,#2 ‰ « cwd ‰ Ćķ ×åė sbb ęī Ą-12(ń),ģ Ą-10(ń),ķ ĢI00212 I00211: Ąä-12(ń) Ąå-10(ń) Äį1 adc ā0 Ąå-1Å Ą6Ē,ė Ąä-1Ī ×į_monthļze ž cwd išv ģ Ąå-1Å Ą8Ē,ė Ą_monthļze+2,#28 Ąä-1Å … „  _last_sunday: ƒ ‚ € Æ ĄčĪ Ąä14Ē ×ä12(ļ) Äį420 Ąā7 cwd išv ģ ĄĘ,ī ĶÅ,#58 jl I0033 Æ Ąć4 Ąä10Ē cwd išv ķ or ēī je I0037 Ąį365 € ĢI0038 I0037: Ąį366 € I0038:  ™ je I0033 ÜÅ I0033: — ĶÅ,ė jge I003A ” ĢI0031 I003A: ¢ ×ax,Ę Ąā7 cwd išv ģ ×ēÅ ōī œ I0031:  … „  É_localtime _localtime: ƒ ‚ ×ņ,#14 Ó_tzset ’ « Ąę2Ē ×ä___timezone sbb ę___timezone+2 ĄŠ,ė ĄĻ,ķ ŪäŠ € Ó_gmtime Š ” Ķ___daylightö je I0043 ” Ąį89 € Ó_last_sunday Š Š ĄŲ,ė ” “72 € Ó_last_sunday Š Š Ą-10(ń),ė § ĄäŲ Ķ14Ē,ė jg I0048 § ĄäŲ Ķ14Ē,ė ŁI0043 § Ķ4Ē,#2 jl I0043 I0048: § Ąä-10(ń) Ķ14Ē,ė jl I0045 § Ąä-10(ń) Ķ14Ē,ė ŁI0043 § Ķ4Ē,#3 jge I0043 I0045: ĄäŠ ĄåĻ Äį3600 adc ā0 ĄŠ,ė ĄĻ,ģ ŪäŠ € Ó_gmtime Š ” § Äā16 Ą-1Å,ģ « Üė ° I0043: mov äĘ … „  É___timezone ® ___timezone: Ā-60,-1 É___daylight ___daylight: É___tzname Ā1 ___tzname: Ā_2 Ā_3 É_tzset † _tzset: ƒ ‚ ×ņ,#22 Ūä-10(ń) € Ó_ftime Š £ cwd Ąč#60 Ėéš » Ąäī Ó.mli4 Ą___timezone,ė Ą___timezone+2,ī § Ą___daylight,ģ Ąį_4 € Ó_getenv Š Ą-12(ń),ė Ķ-12(ń)ö je I0053 Ąå-12(ń) cmpb Ēö je I0053 Ą-1Åö Ą-1Ī,#1 Ąį3 € Į-12(ń) Į___tzname Ó_strncpy ¤ Ä-12(ń),#3 Ä-12(ń),#3 Ąå-12(ń) cmpb Ē,#45 ŁI005A Ą-1Ī,#-1 Ä-12(ń),#1 I005A: Ąå-12(ń) Œ Ž ‹ Ķį48 jl I0059 Ąå-12(ń) Œ Ž ‹ Ķį57 jg I0059 Į-12(ń) Ä-12(ń),#1 ‰ Œ Ž ‹ ×į48 € 0 mul -1Å ‰ Äåė Ą-1Å,ģ ĢI005A I0059: Ąė,-1Ī mul -1Å Ą-1Å,ė Ąį60 mul -1Å cwd Ąč#60 Ėéš » Ąäī Ó.mli4 Ą___timezone,ė Ą___timezone+2,ī Ąå-12(ń) cmpb Ēö ŁI005D ‡ € ĢI005E I005D:  € I005E: Ć___daylight Ąį3 € Į-12(ń) Į___tzname+2 Ó_strncpy ¤ I0053: … „  ® _2: Ā17741 Ā84 _3: Ā17485 Ā84 _4: Ā23124 ø † sprintf.s #«u¤‡Č_ņrintf É_ņrintf † _ņrintf: ƒ ‚ ×ņ,#10 Ą-10(ń),#-1 ĄŠ,#130 ¢ ¬ ¢ ” ŪäŌ € “ Ūä-10(ń) € Ó__doprintf ¤ Ūä-10(ń) € ‡ € Ó_putc Š Š ¢ … „  doprintf.s #¬u¤} Č__doprintf É__doprintf † __doprintf: ƒ ‚ ×ņ,#50 ® _1: ĀI0012A Ā9 Ā68 ĀI00125 Ā79 ĀI00126 Ā88 ĀI00127 Ā99 ĀI00128 Ā100 ĀI0011B Ā111 ĀI0011D Ā115 ĀI00129 Ā117 ĀI0011C Ā120 ĀI00121 † ĄäŌ ” • Æ Œ Ž ‹ ™ ± Æ Œ Ž ‹ Ķį37 je I0016 ˆ “ ÄĪ,#1 ‰ Œ Ž ‹ € Ó_putc Š Š ­ ½ ĄŠö ĄŲö Ą-10(ń),#1 Ź-19(ń),#32 ÄĪ,#1 Æ Œ Ž ‹ Ķį45 ŁI0019 Ą-10(ń),#-1 ÄĪ,#1 I0019: Æ Œ Ž ‹ Ķį48 ŁI001F Ź-19(ń),#48 ÄĪ,#1 I001F: Æ Œ Ž ‹ Ķį48 jl I001E Æ Œ Ž ‹ Ķį57 jg I001E Æ Œ Õah,ah ‹ ×į48 mul -10(ń) € 0 mul Š ‰ Äåė ĄŠ,ģ ÄĪ,#1 ĢI001F I001E: Æ Œ Ž ‹ Ķį46 ŁI00113 ÄĪ,#1 I00116: Æ Œ Ž ‹ Ķį48 jl I00113 Æ Œ Ž ‹ Ķį57 jg I00113 Æ Œ Ž ‹ ×į48 € 0 mul Ų ‰ Äåė ĄŲ,ģ ÄĪ,#1 š6 I00113: Æ Œ Ž ‹ € š9 I0011B: ÄĘ,#2 § Ąä-2Ē cwd Ą-1Å,ė Ą-12(ń),ī ĄĻ,#10 šA I0011C: ÄĘ,#2 § Ąä-2Ē cwd Ą-1Å,ė Ą-12(ń),ī Ąć4 Ąā4 Ąä-1Å Į-12(ń) – ‰ Öį65535 Öā0 ¦ Ąć4 Ąā4 – Ą-1Å,ė Ć-12(ń) ĄĻ,#10 šA I0011D: ÄĘ,#2 § Ąä-2Ē cwd Ą-1Å,ė Ą-12(ń),ī Ąä-1Å Ąå-12(ń) ×į0 sbb ā0 Ł1f Öäė je 1f Üģ 1: or åģ jge I0011F Ąć4 Ąā4 Ąä-1Å Į-12(ń) – ‰ Öį65535 Öā0 ¦ Ąć4 Ąā4 – Ą-1Å,ė Ć-12(ń) I0011F: ĄĻ,#8 šA I00121: ÄĘ,#2 § Ąä-2Ē cwd Ą-1Å,ė Ą-12(ń),ī Ąä-1Å Ąå-12(ń) ×į0 sbb ā0 Ł1f Öäė je 1f Üģ 1: or åģ jge I00123 Ąć4 Ąā4 Ąä-1Å Į-12(ń) – ‰ Öį65535 Öā0 ¦ Ąć4 Ąā4 – Ą-1Å,ė Ć-12(ń) I00123: ĄĻ,Ń šA I00125: ÄĘ,#4 § Ąä-4Ē Į-2Ē Ą-1Å,ė Ć-12(ń) ĄĻ,#10 šA I00126: ÄĘ,#4 § Ąä-4Ē Į-2Ē Ą-1Å,ė Ć-12(ń) ĄĻ,#8 šA I00127: ÄĘ,#4 § Ąä-4Ē Į-2Ē Ą-1Å,ė Ć-12(ń) ĄĻ,Ń šA I00128: ÄĘ,#2 § Ąė,-2Ē Ź-15(ń),al Źal,-15(ń) Ž ‹ ˆ € Ó_putc Š Š ÄĪ,#1 ­ I00129: ÄĘ,#2 § Ąä-2Ē Ą-1Ō,ė ˆ Į-1Ō Ó_strlen Š € Źal,-19(ń) Ž ‹ € ĮŲ ĮŠ Į-1Ō Ó__printit Äņ,#12 ÄĪ,#1 ­ I0012A: ˆ Ąį37 € Ó_putc Š Š ˆ “ ÄĪ,#1 ‰ Œ Ž ‹ € Ó_putc Š Š ­ I00119: Ąč#_1 Ćī Ģ.csb2 I0011A: Ūä-31(ń) € ¹ Į-12(ń) Į-1Å Ó__bintoascii Äņ,#8 ˆ Ūä-31(ń) € Ó_strlen Š € Źal,-19(ń) Ž ‹ € ĮŲ ĮŠ Ūä-31(ń) € Ó__printit Äņ,#12 ÄĪ,#1 ­   … „  __bintoascii: ƒ ‚ ×ņ,#22 Ą-1Īö ¢ Æ ×į0 sbb ā0 Ł1f or åė 1: or åģ ŁI0023 Ąå10(ń) ŹĒ,#48 Ąä10(ń) Üė » ŹĒö … „  I0023: ĶŌ,#10 ŁI0026 ¢ Æ ×į0 sbb ā0 Ł1f Öäė je 1f Üģ 1: or åģ jge I0026 ’ ĄäĪ ōė ōģ sbb į0 ĄÅ,ģ ĄĪ,ė Ü-1Ī I0026: Ą-1Ōö I002E: Ķ-1Ō,#12 jge I002B Ąč-1Ō Ź-12(ń_ļ)ö Ü-1Ō ĢI002E I002B: Ą-1Ōö I00211: ĶŌ,#10 ŁI00213 “ ˆ ‡ € 0 € Ó.rmi4 Ąč-1Ō Ź-12(ń_ļ),dl Ąč-1Ō Źal,-12(ń_ļ) Ž ‹ cwd ’ ĄęĪ ×åė sbb ęī Įķ ¦ ‡ € 0 € Ó.dvi4 ĄÅ,ė ĄĪ,ķ I00213: ĶŌ,#8 ŁI00216 Ąć4 Ąā4 ¢ “ – ‰ Öį7 Öā0 Ąč-1Ō Ź-12(ń_ļ),al Ąć3 ¢ Æ © 2: sar ā1 rcr į1 Ø 1: Öį65535 Öā8191 ĄÅ,ė ĄĪ,ģ I00216: ĶŌ,Ń ŁI00219 Ąć4 Ąā4 ¢ “ – ‰ Öį15 Öā0 Ąč-1Ō Ź-12(ń_ļ),al Ąć4 ¢ Æ © 2: sar ā1 rcr į1 Ø 1: Öį65535 Öā4095 ĄÅ,ė ĄĪ,ģ I00219: Ü-1Ō ¢ Æ ×į0 sbb ā0 Ł1f or åė 1: or åģ ŁI00211 Ą-1Åö Ąä-1Ō óė Ą-20(ń),ė I0021E: Ķ-20(ń)ö jl I0021B Ąč-20(ń) Źal,-12(ń_ļ) Ž ‹ ™ ŁI00220 Ķ-1Åö ŁI00220 Ąč-20(ń) Ź-12(ń_ļ),#32 ĢI0021C I00220: Ąč-20(ń) Źal,-12(ń_ļ) Ž ‹ Ķį10 jge I00224 Ąč-20(ń) Ūå-12(ń_ļ) Ą-22(ń),ģ Ąå-22(ń) Œ Ž ‹ Äį48 ŗ ĢI00225 I00224: Ąč-20(ń) Ūå-12(ń_ļ) Ą-22(ń),ģ Ąå-22(ń) Œ Ž ‹ Äį55 ŗ I00225: Ü-1Å I0021C: ó-20(ń) ĢI0021E I0021B: Ķ-1Īö je I00227 Ąį45 € Ūä-12(ń) € Į-1Ō Ü-1Ō ‰  Äåė  ŗ I00227: Ąä-1Ō óė Ą-20(ń),ė I0022C: Ķ-20(ń)ö jl I00229 Ąč-20(ń) Ąå10(ń) Źal,-12(ń_ļ) ŗ Ä10(ń),#1 ó-20(ń) ĢI0022C I00229: Ąå10(ń) ŹĒö … „  __printit: ƒ ‚ € € Ąä12(ń) ” ĶŌö jle I0033 ĄäŌ Ķ12(ń),ė jle I0033 ĄäŌ ” I0033: — ¬ ĶĪö jle I003D I003A: — ĶĪ,ė jle I003D óĪ Źal,10(ń) Ž ‹ Į1Å € Ó_putc Š Š ĢI003A I003D: ’ Œ Ž ‹ ™ je I003C ” óĘ  ™ je I003C Į1Å ˆ ˜ ‰ Œ Ž ‹ € Ó_putc Š Š ĢI003D I003C: ĶĪö jge I00317 Źal,10(ń) xorb ah,ah ‹ Ķį48 ŁI00317 Į1Å Ąį46 € Ó_putc Š Š ÜĪ I00317: £ ōė ĶĪ,ė jge I00316 ÜĪ Źal,10(ń) Ž ‹ Į1Å € Ó_putc Š Š ĢI00317 I00316: … „  putc.sf.s #v¤"Č_putc É_putc † _putc: ƒ ‚ ×ņ,#6 ĄĻö Æ testb 4Ē,#24 je I0013 Ąį-1 € š • Æ testb 4Ē,#2 ŁI0016 Ąį-1 € š ½ Æ testb 4Ē,#4 je I0019 Æ  € ŪäÅ € ĮĒ Ó_write ¤ ” Æ Ą2Ē,#1 ÜĻ ĢI001A I0019: Æ Äā8 ĄŠ,ģ ĄčŠ ‡ Źal,Å € ĮĒ Ä(ļ),#1 ‰  ŗ Æ Äā2 ĄŠ,ģ « Üė ° ĄåŠ ĶĒ,#1024 jl I001A Æ testb 4Ē,#128 ŁI001A Æ ĄčĪ ĄéĪ Į2Ē Į6(ļ) Į(š) Ó_write ¤ ” Æ ĄčĪ Ąä6Ē Ą8(ļ),ė ÜĻ I001A: ĶĻö je I00110 ĶĘö jle I00112 Æ — Ķ2Ē,ė je I00113 I00112: ĶĘö jge I00117 Æ add ā4 ĄŠ,ģ « or į16 ° š8 I00117: Æ Äā4 ĄŠ,ģ « or į8 ° I00118: Ąį-1 € š I00113: Æ Ą2Ēö I00110:  ž Źal,Å Ž – € Ÿ  … „  ungetc.s #­u¤ūČ_ungetc É_ungetc † _ungetc: ƒ ‚ € ĶÅö jl I0012 Æ testb 4Ē,#1 ± Æ testb 4Ē,#4 je I0013   Ąį-1 € š • Æ Ķ2Ē,#1024 jl I0018 Ąį-1 € š I0018: Æ ĄčĪ Ąä6(ļ) Ķ8Ē,ė ŁI001b Æ Äā8 ĄĘ,ģ § ÄĒ,#1 I001b: Æ Äā2 ĄĘ,ģ « Üė ° Æ Äā8 ĄĘ,ģ § ˆ ÄĒ,#-1 § ĄåĒ  ŗ ˆ Ÿ  … „  strcmp.s #­u¤’Č_strcmp É_strcmp † _strcmp: ƒ ‚ • ’ Œ Ž ‹ € “ ÄĪ,#1 ‰ Œ Ž ‹ ‰ Ķåė ŁI0012 ˆ ˜ ‰ Œ Ž ‹ ™ ŁI0013 ‡ € š   ’ Œ Ž ‹ ÄĪ,#-1 Æ € Œ Ž ‹ ‰ ×åė ¦ Ÿ  … „  access.s #®u¤EČ_access É_access † _access: ƒ ‚ ˆ “ Ąį33 €  € Ó_callm3 Äņ,#8 … „  chdir.s #®u¤?Č_chšr É_chšr † _chšr: ƒ ‚ ˆ ‡ € 2 €  € Ó_callm3 Äņ,#8 … „  chmod.s #Æu¤@Č_chmod É_chmod † _chmod: ƒ ‚ ˆ “ 5 €  € Ó_callm3 Äņ,#8 … „  chown.s #Æu¤FČ_chown É_chown † _chown: ƒ ‚ ‡ € € ˆ ĮŌ “ ˆ µ Š € 6 €  €  ‘ … „  chroot.s #Æu¤GČ_chroot É_chroot † _chroot: ƒ ‚ ˆ ‡ € Ąį61 €  € Ó_callm3 Äņ,#8 … „  creat.s #°u¤AČ_creat É_creat † _creat: ƒ ‚ ˆ “ Ąį8 €  € Ó_callm3 Äņ,#8 … „  dup.s #°u¤;Č_dup É_dup † _dup: ƒ ‚ ‡ € € € € € ˆ Ąį41 €  €  ‘ … „  dup2.s #±u¤MČ_dup2 É_dup2 † _dup2: ƒ ‚  ž ¢ Ėēī œ œ œ œ “ – Äį64 € Ąį41 €  €  ‘ … „  exec.s #±u¤/Č_execl Č_execle Č_execv Čõ Č_execn Č_nullptr É_execl † _execl: ƒ ‚ Ąį_nullptr € ŪäĪ € ˆ Óõ ¤ … „  É_execle _execle: ƒ ‚ € ŪåĪ ĄĘ,ģ I0023: ” ÄĘ,#2 ‰ ĶĒö je I0022 ĢI0023 I0022: § ĮĒ ŪäĪ € ˆ Óõ ¤ … „  É_execv _execv: ƒ ‚ Ąį_nullptr € “ ˆ Óõ ¤ … „  Éõ õ: ƒ ‚ ×ņ,#1046 Ą-103Ōö Ą-1040(ń)ö ĄäĪ Ą-102Ī,ė ĄäŌ Ą-102Ō,ė I0043: Į-102Ī Ä-102Ī,#2 ‰ ĶĒö je I0046 Ü-103Ō ĢI0043 I0046: Į-102Ō Ä-102Ō,#2 ‰ ĶĒö je I0045 Ü-1040(ń) ĢI0046 I0045: Ą-104Å,#2 Ąä-1040(ń) Ää-103Ō Äį3 mul -104Å Ąčė Ūå-1024(ń_ļ) Ą-1030(ń),ģ Ąå-103Ō Äå-1030(ń) Äå-1040(ń) Ūč0(ń) Ķåļ jb I0049 Ąį-7 € ĢI0041 I0049: Ūå-102Å Ą-1032(ń),ģ Ąä-103Ō ° Ä-1032(ń),#2 Ą-103Īö I004e: Ąä-103Ō Ķ-103Ī,ė jge I004b Ūå-102Å Ąä-1030(ń) ×äģ Ą-104Ī,ė Ąä-104Ī Ąå-1032(ń) ° Ä-1032(ń),#2 “ ÄĪ,#2 ‰ « Ą-103Å,ė I00410: Ąå-103Å Œ Ž ‹ ™ je I004f Į-103Å Ä-103Å,#1 ‰ Ąč-1030(ń) Œ Ź(ļ),al Ä-1030(ń),#1 Ūå0(ń) Ķ-1030(ń),ģ jb I00410 Ąį-7 € ĢI0041 I004f: Ąå-1030(ń) ŹĒö Ä-1030(ń),#1 Ü-103Ī ĢI004e I004b: Ąå-1032(ń) ĄĒö Ä-1032(ń),#2 Ą-103Īö I00418: Ąä-1040(ń) Ķ-103Ī,ė jge I00415 Ūå-102Å Ąä-1030(ń) ×äģ Ą-104Ī,ė Ąä-104Ī Ąå-1032(ń) ° Ä-1032(ń),#2 ĮŌ ÄŌ,#2 ‰ « Ą-103Å,ė I0041a: Ąå-103Å Œ Ž ‹ ™ je I00419 Į-103Å Ä-103Å,#1 ‰ Ąč-1030(ń) Œ Ź(ļ),al Ä-1030(ń),#1 Ūå0(ń) Ķ-1030(ń),ģ jb I0041a Ąį-7 € ĢI0041 I00419: Ąå-1030(ń) ŹĒö Ä-1030(ń),#1 Ü-103Ī ĢI00418 I00415: Ąå-1032(ń) ĄĒö Ä-1032(ń),#2 Ūå-102Å Ąä-1030(ń) ×äģ Ää-104Å óė cwd išv -104Å mul -104Å Ą-1042(ń),ė ‡ € Ūä-102Å € ˆ ‡ € Į-1042(ń) ˆ µ Š € Ąį59 € ‡ €  ‘ € I0041:  … „  É_execn _execn: ƒ ‚ € € ŹĻö Ź-3(ń)ö ŹĘö Ź-1(ń)ö ‡ € ŪäĻ € ˆ ‡ € Ąį4 € ˆ µ Š € Ąį59 € ‡ €  ‘ … „  É_nullptr ³ _nullptr: .zerow 2/2 † exit.s #²u¤;Č_exit É_exit † _exit: ƒ ‚ ‡ € € € € € ˆ  € ‡ €  ‘ … „  cleanup.s #²u¤œČ__cleanup É__cleanup † __cleanup: ƒ ‚ € ¼ I0015: ĶĘ,#20 jge I0012 — sal į1 » Ķ__io_tableĒö je I0013 — sal į1 » Į__io_tableĒ Ó_fflush Š • ÜĘ ĢI0015   … „  fflush.s #²u¤śČ_fflush É_fflush † _fflush: ƒ ‚ € € ’ testb 4Ē,#4 ŁI0012 ’ testb 4Ē,#2 ŁI0013   ‡ € š • ’ Ķ2Ēö jg I0017 ‡ € š I0017: ’ ĄčÅ ĄéÅ Į2Ē Į6(ļ) Į(š) Ó_write ¤ ” ’ Ąä2Ē ĶĘ,ė ŁI001a ’ Ą2Ēö ’ ĄčÅ Ąä6Ē Ą8(ļ),ė ” š I001a: ’ Äā4 ĄĻ,ģ « or į16 ° Ąį-1 € Ÿ  … „  fork.ss #³u¤;Č_fork É_fork † _fork: ƒ ‚ ‡ € € € € € € “ € ‡ €  ‘ … „  isatty.s #³u¤sČ_isatty É_isatty † _isatty: ƒ ‚ ×ņ,#30 Ūä-30(ń) € ˆ Ó_fstat Š Š Ąä-2Ī Öį61440 Ķį8192 ŁI0013  € š • ‡ € Ÿ  … „  fstat.s #“u¤EČ_fstat É_fstat † _fstat: ƒ ‚ € ‡ € € “ € € ˆ “8 €  €  ‘ ” — … „  getegid.s #“u¤iČ_getegid É_getegid † _getegid: ƒ ‚ € ‡ € € € € € € Ąį47 € ‡ €  ‘ ” ĶĘö jge I0013 ” š • Į_M+4 Ÿ  … „  getenv.s #v¤öČ_getenv É_getenv † _getenv: ƒ ‚ ×ņ,#6 Ąå_environ ĄĘ,ģ • ” ÄĘ,#2 ‰ « ¬ ĶĻö ± ¢ ĄŠ,ė ½ ĄåŠ cmpb Ēö je I0015 ĮŠ ÄŠ,#1 ‰ Œ Ž ‹ € ¹ ÄĻ,#1 ‰ Œ Ž ‹ ‰ Ķåė ŁI0015 ĢI0016 I0015: ĄåŠ cmpb Ēö ŁI0013 ĄåĻ cmpb Ē,#61 je I001A ­ I001A: £ Üė € š   ‡ € Ÿ  … „  geteuid.s #µu¤gČ_geteuid É_geteuid † _geteuid: ƒ ‚ € ‡ € € € € € € “4 € ‡ €  ‘ ” ĶĘö jge I0013 ” š • Į_M+4 Ÿ  … „  getgid.s #µu¤JČ_getgid É_getgid † _getgid: ƒ ‚ € ‡ € € € € € € Ąį47 € ‡ €  ‘ ” — … „  getpass.s #¶u¤bČ_getpass É_getpass † _getpass: ƒ ‚ ×ņ,#8 ® _1: Ā10 † ¼ ˆ Ó_prints Š ŪäŲ € “9704 € ‡ € Ó_ioctl ¤ ĄĻ,#3088 ŪäŲ € “9705 € ‡ € Ó_ioctl ¤ Ąį9 € Ąį_pwdbuf € ‡ € Ó_read ¤ ” • — óė » Źal,_pwdbufĒ Ž ‹ Ķį10 ± — óė »  € Äā_pwdbuf ¦ ‡ € Ó_read ¤ ­   — óė » Ź_pwdbufĒö ĄĻ,#3096 ŪäŲ € “9705 € ‡ € Ó_ioctl ¤ Ąį_1 € Ó_prints Š Ąį_pwdbuf … „  ³ _pwdbuf: .zerow 10/2 † close.ss #¶u¤@Č_close É_close † _close: ƒ ‚ ‡ € € € € € ˆ Ąį6 €  €  ‘ … „  getuid.s #·u¤HČ_getuid É_getuid † _getuid: ƒ ‚ € ‡ € € € € € € “4 € ‡ €  ‘ ” — … „  ioctl.s #·u¤ˆČ_ioctl É_ioctl † _ioctl: ƒ ‚ ×ņ,#34 ® _1: ĀI0018 Ā4 Ā29704 ĀI0016 Ā29705 ĀI0014 Ā29713 ĀI0015 Ā29714 ĀI0017 † Æ Ą_M+8,ģ ’ Ą_M+4,ģ “ ĢI0012 I0014: › Źal,2Ē Ž ‹  ž – „ Ėåģ ĄŠ,ė ĄĻ,ģ › Źal,3Ē Ž ‹  ž – „ Ėåģ Ą-10(ń),ė ĄŲ,ģ Ąć8 ĄäŠ ĄåĻ © 2: sal į1 rcl ā1 Ø 1: or ä-10(ń) or åŲ ĄŻ,ė ĄŻ+2,ģ › Ąä4Ē cwd Ą_M+14,ė Ą_M+14+2,ī Ąį54 €  € ¶ Š Š ” ” š I0015: › Œ Ž ‹  ž – „ Ėåģ Ą-1Å,ė Ą-12(ń),ģ ĄäŌ Üė » Œ Ž ‹  ž – „ Ėåģ Ą-1Ō,ė Ą-1Ī,ģ › Źal,2Ē Ž ‹  ž – „ Ėåģ Ą-22(ń),ė Ą-20(ń),ģ › Źal,3Ē Ž ‹  ž – „ Ėåģ Ą-2Ī,ė Ą-2Å,ģ › Źal,4Ē Ž ‹  ž – „ Ėåģ Ą-30(ń),ė Ą-2Ō,ģ › Źal,5Ē Ž ‹  ž – „ Ėåģ Ą-3Å,ė Ą-32(ń),ģ Ąć16 Ąä-1Ō Ąå-1Ī © 2: sal į1 rcl ā1 Ø 1: 4 Ąē-1Å Ąč-12(ń) © 2: sal ē#1 rcl č#1 Ø 1: or ēė or čģ Ąć8 Ąä-22(ń) Ąå-20(ń) © 2: sal į1 rcl ā1 Ø 1: or äī or åļ Ėęķ Ąē-2Ī Ąč-2Å © 2: sal ē#1 rcl č#1 Ø 1: or ēė or čģ ĄŻ,ī ĄŻ+2,ļ Ėęķ Ąä-3Å Ąå-32(ń) © 2: sal į1 rcl ā1 Ø 1: Ąć8 Ąē-30(ń) Ąč-2Ō © 2: sal ē#1 rcl č#1 Ø 1: or ēė or čģ Ą_M+14,ī Ą_M+14+2,ļ Ąį54 €  € ¶ Š Š ” ” š ½ Ąį54 €  € ¶ Š Š ” Ąć8 ĄåŻ ĄēŻ+2 © 2: sar ē#1 rcr ā1 Ø 1: œ ¦ Ąć4 Ąā4  – ‰ „ Öā0 › Ź2Ē,al Ėęķ ĄåŻ ĄēŻ+2 © 2: sar ē#1 rcr ā1 Ø 1: œ ¦ Ąć4 Ąā4  – ‰ „ Öā0 › Ź3Ē,al › Ąę_M+14 Ą4Ē,ķ ” š I0017: Ąį54 €  € ¶ Š Š ” 4 ĄåŻ ĄēŻ+2 © 2: sar ē#1 rcr ā1 Ø 1: œ ¦ Ąć4 Ąā4  – ‰ „ Öā0 › ŗ Ąć16 ĄåŻ ĄēŻ+2 © 2: sar ē#1 rcr ā1 Ø 1: œ ¦ Ąć4 Ąā4  – ‰ „ Öā0 › Üģ ŗ Ąć8 ĄåŻ ĄēŻ+2 © 2: sar ē#1 rcr ā1 Ø 1: œ ¦ Ąć4 Ąā4  – ‰ „ Öā0 › Ź2Ē,al Ėęķ ĄåŻ ĄēŻ+2 © 2: sar ē#1 rcr ā1 Ø 1: œ ¦ Ąć4 Ąā4  – ‰ „ Öā0 › Ź3Ē,al Ąć8 Ąå_M+14 Ąē_M+14+2 © 2: sar ē#1 rcr ā1 Ø 1: œ ¦ Ąć4 Ąā4  – ‰ „ Öā0 › Ź4Ē,al Ąć8 Ąå_M+14 Ąē_M+14+2 © 2: sar ē#1 rcr ā1 Ø 1: œ ¦ Ąć4 Ąā4  – ‰ „ Öā0 › Ź5Ē,al ” š I0018: ĄĘ,#-1 Ą_errno,#22 ” š   Ąč#_1 Ćī Ģ.csb2 Ÿ  … „  abort.s #øu¤4Č_abort É_abort † _abort: ƒ ‚ Ąį99 € Ó_exit Š … „  kill.s #øu¤>Č_kill É_kill † _kill: ƒ ‚ ‡ € € € € “ ˆ Ąį37 € ‡ €  ‘ … „  link.s #øu¤IČ_link É_link † _link: ƒ ‚ ‡ € “ ˆ € “ µ Š € ˆ µ Š € Ąį9 €  €  ‘ … „  lseek.s #¹u¤‹Č_lseek É_lseek † _lseek: ƒ ‚ € ’ Ą_M+4,ģ Æ ĄŻ,ģ › ĄŻ+2,ģ Ąå10(ń) Ą_M+6,ģ 9 €  € ¶ Š Š ” ĶĘö je I0013 — cwd œ € š • ĮŻ+2 ĮŻ Ÿ  Ćī … „  malloc.s #v¤«Č_calloc Č_malloc Č_free Č_realloc † _grow: ƒ ‚ € Ąå_top Äā2 ÄåÅ Äā15 Öā65520 Äā-2 ĄĘ,ģ Ąå_top ĶĘ,ģ jb I0012 ” Ó_brk Š ™ jge I0013   ‡ € š • § Ą_top,ģ Ąå_bottom ĄĘ,ģ I0019: § ĶĒö je I0016 § « Öį65534 ” ĢI0019 ½ Ąå_top ĄčĘ Ą(ļ),ģ Ąå_top ĄĒö  € Ÿ  … „  É_malloc _malloc: ƒ ‚ ×ņ,#8 ¢ Äį1 Öį65534 Äį2 ĄŲ,ė Ąå_bottom ĄĘ,ģ Ķ_bottomö ŁI0026 “ € Ó_sbrk Š ” § Ą_bottom,ģ § Ą_top,ģ ĄĒö I0026: § ĄčĘ Ąä(ļ) ĮĒ ¬  Ķį0 je I0025 testb Ļ,#1 je I002C £ and į65534 ” ĢI0026 I002C: ĄåĻ ĄčĻ Ąä(ļ) ĮĒ ĄŠ,ė  Ķį0 je I002B testb Š,#1 ŁI002B ĄäŠ ¬ ĢI002C I002B: £ ×äĘ  ž – ĶŲ,ė ja I00210  mul Ų » ÄåĘ ĄŠ,ģ £ ĶŠ,ė jae I00213 £ ĄåŠ ° I00213: ĄäŠ or į1 § ° § Äā2 ¦ ĢI0021 I00210: £ ” ĢI0026 I0025: ĮŲ Ó_grow Š ™ je I00216 ˆ Ó_malloc Š € ĢI0021 I00216: ‡ € I0021:  … „  É_realloc _realloc: ƒ ‚ ×ņ,#12 ’ Äā-2 ĄĘ,ģ ĄäĪ Äį1 Öį65534 Äį2 ĄŲ,ė § « Öį65534 ¬ £ ×äÅ  ž – Ą-10(ń),ė I0033: ĄåĻ ĄčĻ Ąä(ļ) ĮĒ ĄŠ,ė  Ķį0 je I0032 testb Š,#1 ŁI0032 ĄäŠ ¬ ĢI0033 I0032: £ ×äĘ  ž – ĶŲ,ė ja I0037  mul Ų » ÄåĘ ĄŠ,ģ £ ĶŠ,ė jae I003A £ ĄåŠ ° ĄäŠ or į1 § ° ĢI003B I003A: £ or į1 § ° I003B: ˆ ĢI0031 I0037: “ Ó_malloc Š ĄŠ,ė ĶŠö ŁI003D ‡ € ĢI0031 I003D: Į-10(ń) ĮŠ ˆ Ó_bcopy ¤ — Ą-12(ń),ė Ąå-12(ń) « Öį65534 ° ĮŠ I0031:  … „  É_calloc _calloc: ƒ ‚ ×ņ,#6 ¢ mul Ī  ž – ¬ ¹ Ó_malloc Š ” ĶĘö ŁI0043 ‡ push ė ĢI0041 I0043: — ĄŠ,ė I0048: ¹ óĻ  ™ je I0045 ĄåŠ ŹĒö ÄŠ,#1 ĢI0048 I0045: ” I0041:  … „  É_free _free: ƒ ‚ € ’ Äā-2 ĄĘ,ģ « Öį65534 ° … „  ³ _top: .zerow 2/2 _bottom: .zerow 2/2 † brk.s.s #ŗu¤ęČ_brk Č_sbrk É_brk † _brk: ƒ ‚ € ‡ € € ˆ € € € 7 € ‡ €  ‘ ” ĶĘö ŁI0013 Ąå_M+18 Ą_brkļze,ģ ‡ € š • Ąį-1 € Ÿ  … „  É_sbrk _sbrk: ƒ ‚ € € Ąå_brkļze ĄĻ,ģ ’ Äå_brkļze ĄĘ,ģ ” Ó_brk Š Ķį0 ŁI0023 ¹ ĢI0021 I0023: Ąį-1 € I0021:  … „  brk2.ss #ŗu¤KČ_brk2 É_brk2 _brk2: ƒ ‚ € € Óget_ļze ” ‡ € ¹ ” € € € Ąį66 € ‡ €  ‘ … „  brksize.s #»u¤-Č_brkļze ® Éendbss, _brkļze _brkļze: Āendbss mknod.ss #»u¤FČ_mknod É_mknod † _mknod: ƒ ‚ ‡ € € ˆ ĮŌ “ ˆ µ Š € 4 €  €  ‘ … „  mktemp.s #¼u¤ÄČ_mktemp É_mktemp † _mktemp: ƒ ‚ ×ņ,#6 Ó_getpid ” ¢ ĄŠ,ė • ĮŠ ÄŠ,#1 ‰ Œ Ž ‹ ™ ± ­   ÄŠ,#-1 ½ ÄŠ,#-1 ĄåŠ Œ Ž ‹ Ķį88 ŁI0015 Ąā10 — cwd išv ģ Äē#48 ĄåŠ ŹĒ,dl Ąā10 — cwd išv ģ ” ĢI0016 I0015: ¢ … „  getpid.s #¼u¤BČ_getpid É_getpid † _getpid: ƒ ‚ ‡ € € € € € € “0 € ‡ €  ‘ … „  mount.s #¼u¤LČ_mount É_mount † _mount: ƒ ‚ ‡ € “ ˆ ĮŌ “ µ Š € ˆ µ Š € “1 €  €  ‘ … „  open.s #½u¤>Č_open É_open † _open: ƒ ‚ ˆ “ Ąį5 €  € Ó_callm3 Äņ,#8 … „  perror.s #¾u¤ Č_perror Éerror_message ® error_message: Ā_1 Ā_2 Ā_3 Ā_4 Ā_5 Ā_6 Ā_7 Ā_8 Ā_9 Ā_10 Ā_11 Ā_12 Ā_13 Ā_14 Ā_15 Ā_16 Ā_17 Ā_18 Ā_19 Ā_20 Ā_21 Ā_22 Ā_23 Ā_24 Ā_25 Ā_26 Ā_27 Ā_28 Ā_29 Ā_30 Ā_31 Ā_32 Ā_33 Ā_34 Ā_35 _35: Ā25938 Ā30067 Ā29804 Ā29728 Ā28527 Ā27680 Ā29281 Ā25959 ø _34: Ā24909 Ā26740 Ā24864 Ā26482 Ā28021 Ā28261 Ā116 _33: Ā29250 Ā27503 Ā28261 Ā28704 Ā28777 Ā101 _32: Ā28500 Ā8303 Ā24941 Ā31086 Ā27680 Ā28265 Ā29547 ø _31: Ā25938 Ā25697 Ā28461 Ā27758 Ā8313 Ā26982 Ā25964 Ā29472 Ā29561 Ā25972 Ā109 _30: Ā27721 Ā25964 Ā24935 Ā8300 Ā25971 Ā27493 ø _29: · Ā29472 Ā24944 Ā25955 Ā27680 Ā26213 Ā8308 Ā28271 Ā25632 Ā30309 Ā25449 Ā101 _28: Ā26950 Ā25964 Ā29728 Ā28527 Ā27680 Ā29281 Ā25959 ø _27: Ā25940 Ā29816 Ā26144 Ā27753 Ā8293 Ā30050 Ā31091 ø _26: · Ā8308 Ā8289 Ā31092 Ā25968 Ā29303 Ā29801 Ā29285 ø _25: Ā28500 Ā8303 Ā24941 Ā31086 Ā28448 Ā25968 Ā8302 Ā26982 Ā25964 Ā115 _24: Ā26950 Ā25964 Ā29728 Ā25185 Ā25964 Ā28448 Ā25974 Ā26226 Ā28524 Ā119 _23: Ā28233 Ā24950 Ā26988 Ā8292 Ā29281 Ā30055 Ā25965 Ā29806 ø _22: Ā29513 Ā24864 Ā25632 Ā29289 Ā25445 Ā28532 Ā31090 ø _21: · Ā8308 Ā8289 Ā26980 Ā25970 Ā29795 Ā29295 Ā121 _20: · Ā29472 Ā25461 Ā8296 Ā25956 Ā26998 Ā25955 ø _19: Ā29251 Ā29551 Ā11635 Ā25956 Ā26998 Ā25955 Ā27680 Ā28265 Ā107 _18: Ā26950 Ā25964 Ā25888 Ā27000 Ā29811 Ā115 _17: Ā28493 Ā28277 Ā8308 Ā25956 Ā26998 Ā25955 Ā25120 Ā29557 Ā121 _16: Ā27714 Ā25455 Ā8299 Ā25956 Ā26998 Ā25955 Ā29216 Ā29029 Ā26997 Ā25970 Ā100 _15: Ā24898 Ā8292 Ā25697 Ā29284 Ā29541 Ā115 _14: Ā25936 Ā28018 Ā29545 Ā26995 Ā28271 Ā25632 Ā28261 Ā25961 Ā100 _13: · Ā8308 Ā28261 Ā30063 Ā26727 Ā25376 Ā29295 Ā101 _12: · Ā27936 Ā29295 Ā8293 Ā29296 Ā25455 Ā29541 Ā25971 Ā115 _11: · Ā25376 Ā26984 æ08 Ā25970 Ā110 _10: Ā24898 Ā8292 Ā26982 Ā25964 Ā28192 Ā28021 Ā25954 Ā114 _9: Ā30789 Ā25445 Ā26144 Ā29295 Ā24941 Ā8308 Ā29285 Ā28530 Ā114 _8: Ā29249 Ā8295 Ā26988 Ā29811 Ā29728 Ā28527 Ā27680 Ā28271 Ā103 _7: · Ā29472 Ā25461 Ā8296 Ā25956 Ā26998 Ā25955 Ā28448 Ā8306 Ā25697 Ā29284 Ā29541 Ā115 _6: Ā12105 Ā8271 Ā29285 Ā28530 Ā114 _5: Ā28233 Ā25972 Ā29298 Ā28789 Ā25972 Ā8292 Ā31091 Ā29811 Ā28005 Ā25376 Ā27745 Ā108 _4: · Ā29472 Ā25461 Ā8296 Ā29296 Ā25455 Ā29541 Ā115 _3: · Ā29472 Ā25461 Ā8296 Ā26982 Ā25964 Ā28448 Ā8306 Ā26980 Ā25970 Ā29795 Ā29295 Ā121 _2: · Ā8308 Ā30575 Ā25966 Ā114 _1: Ā29253 Ā28530 Ā8306 É_perror Ā48 † _perror: ƒ ‚ ® _36: Ā28233 Ā24950 Ā26988 Ā8292 Ā29285 Ā28274 Ā2671 ø _37: Ā8250 ø _38: Ā10 † Ķ_errnoö jl I0012 Ķ_errno,#34 jle I0013   4 € Ąį_36 € “ € Ó_write ¤ ĢI0014 • ˆ Ó_slen Š € ˆ “ € Ó_write ¤ “ € Ąį_37 € “ € Ó_write ¤ Ąå_errno sal ā1 Įerror_messageĒ Ó_slen Š Ąå_errno sal ā1 € Įerror_messageĒ “ € Ó_write ¤  € Ąį_38 € “ € Ó_write ¤ I0014: … „  _slen: ƒ ‚ € ¼ I0023: ˆ ˜ ‰ Œ Ž ‹ ™ je I0022 ÜĘ ĢI0023 I0022: — … „  pipe.ss #¾u¤~Č_pipe É_pipe † _pipe: ƒ ‚ € ‡ € € € € € € Ąį42 €  €  ‘ ” ĶĘö jl I0013 Ąå_M+4 ĄčÅ Ą(ļ),ģ ’ Ąę_M+6 Ą2Ē,ķ ‡ € š • ” Ÿ  … „  prints.s #æu¤3Č_prints Č_Bufp Č_Buf É_prints É_Buf É_Bufp † _prints: ƒ ‚ ×ņ,#14 ® _1: ĀI00119 Ā2 Ā99 ĀI001e Ā115 ĀI001f † Ą_Bufp,#_Buf ŪåĪ ĄŲ,ģ • ’ Œ Ž ‹ ™ ± ’ Œ Ž ‹ Ķį37 je I0016 ˆ ˜ ‰ Œ Ž ‹ € Ó_put Š ­ ½ ¼ ˜ I0019: ’ Œ Ž ‹ Ķį48 jl I0018 ’ Œ Ž ‹ Ķį57 jg I0018 ’ Œ Ž ‹ ×į48 € 0 mul Ę ‰ Äåė ĄĘ,ģ ˜ ĢI0019 I0018: ’ Œ Ž ‹ € ĢI001c I001e: ĮŲ ÄŲ,#2 ‰ « ¬ ¹ Ó_put Š ˜ ­ I001f: ĮŲ ÄŲ,#2 ‰ « Ą-10(ń),ė Ąä-10(ń) Ą-12(ń),ė I00111: Į-10(ń) Ä-10(ń),#1 ‰ Œ Ž Ź-13(ń),al ‹ ™ je I00110 Źal,-13(ń) Ž ‹ € Ó_put Š š1 I00110: ˜ Ąä-10(ń) ×ä-12(ń) óė ×äĘ ōė ¬ ĶĻö jle I0013 I00117: ¹ óĻ  ™ je I0013 Ąį32 € Ó_put Š š7 I00119: Ąį37 € Ó_put Š ˆ ˜ ‰ Œ Ž ‹ € Ó_put Š ­ I001c: Ąč#_1 Ćī Ģ.csb2   Ąä_Bufp ×į_Buf € Ąį_Buf €  € Ó_write ¤ … „  _put: ƒ ‚ Ķ_Bufp,#_Buf+128 jae I0023 Ąå_Bufp Źal,Å ŗ Ä_Bufp,#1 I0023: … „  ³ _Bufp: .zerow 2/2 _Buf: .zerow 128/2 † read.ss #æu¤DČ_read É_read † _read: ƒ ‚ € ‡ € € “ € ĮŌ ˆ Ąį3 €  €  ‘ ” — … „  setgid.s #Ąu¤DČ_setgid É_setgid † _setgid: ƒ ‚ ‡ € € € € € ˆ Ąį46 € ‡ €  ‘ … „  setuid.s #Ąu¤BČ_setuid É_setuid † _setuid: ƒ ‚ ‡ € € € € € ˆ “3 € ‡ €  ‘ … „  sleep.s #Ąu¤fČ_sleep † _alfun: ƒ ‚ … „  É_sleep _sleep: ƒ ‚ Ąį_alfun € 4 € Ó_ļgnal Š Š ˆ Ó_alarm Š Ó_pause … „  alarm.s #Įu¤IČ_alarm É_alarm † _alarm: ƒ ‚  ž ¢ Ėēī œ œ œ œ œ – € “7 € ‡ €  ‘ … „  pause.s #Įu¤?Č_pause É_pause † _pause: ƒ ‚ ‡ € € € € € € “9 € ‡ €  ‘ … „  signal.s #Āu¤Č_ļgnal Č_vectab É_ļgnal † _ļgnal: ƒ ‚ € € ¢ sal į1 ×į2 » Ąä_vectabĒ ¬ ¢ sal į1 ×į2 » ĄäĪ Ą_vectabĒ,ė ’ Ą_M+4,ģ ĶĪ,#1 ± ĶĪö ŁI0013   “ ĢI0014 • Ąį_begļg € I0014: Ć_M+14 Ąį48 € ‡ € ¶ Š Š ” ĶĘö jge I0017 ” š I0017: ¹ Ÿ  … „  É_vectab ³ _vectab: .zerow 32/2 † catchsig.s #Āu¤»Č_begļg É_begļg, _vectab, _M mtype = 2 _begļg: € ¦ Įķ œ Įļ Įš ƒ Įds Įes Ąåņ Ąå18Ē óģ Äåģ Ąå_vectabĒ Į_M+mtype ÓĒ back: Ć_M+mtype Ćes Ćds „ Ćš Š Ćī Ćķ ‰  Ćdummy i ® dummy: ø stat.sg.s #Āu¤HČ_stat É_stat † _stat: ƒ ‚ € ‡ € “ ˆ € € ˆ µ Š € 8 €  €  ‘ ” — … „  stime.s.s #Ću¤GČ_stime É_stime † _stime: ƒ ‚ ’ ĄęĒ Į2Ē ĄŻ,ķ ĆŻ+2 “5 €  € ¶ Š Š … „  strcat.ss #Ću¤}Č_strcat É_strcat † _strcat: ƒ ‚ € ¢ ” • ˆ ˜ ‰ Œ Ž ‹ ™ ± ­   ÄÅ,#-1 ½ “ ÄĪ,#1 ‰ Œ Ž ’ ŗ ˜ ‹ ™ je I0015 ĢI0016 I0015: — … „  strcpy.ss #Äu¤OČ_strcpy É_strcpy † _strcpy: ƒ ‚ € ¢ ” • “ ÄĪ,#1 ‰ Œ Ž ’ ŗ ˜ ‹ ™ ± ­   — … „  strlen.ss #Äu¤FČ_strlen É_strlen † _strlen: ƒ ‚ € ¼ • ˆ ˜ ‰ Œ Ž ‹ ™ ± ÜĘ ­   — … „  strncat.s #Åu¤ĮČ_strncat É_strncat † _strncat: ƒ ‚ € ĶŌö je I0013 ¢ ” ½ ˆ ˜ ‰ Œ Ž ‹ ™ je I0015 ĢI0016 I0015: ÄÅ,#-1 I001a: “ ÄĪ,#1 ‰ Œ Ž ’ ŗ ˜ ‹ ™ ŁI0019 ĢI0018 I0019: óŌ ŁI001a I0018: ÄÅ,#-1 ’ ŹĒö • — … „  strncmp.s #Åu¤¼Č_strncmp É_strncmp † _strncmp: ƒ ‚ • óŌ jl I0012 ’ Œ Ž ‹ € “ ÄĪ,#1 ‰ Œ Ž ‹ ‰ Ķåė ŁI0012 ˆ ˜ ‰ Œ Ž ‹ ™ ŁI0013 ‡ € š   ĶŌö jge I001a ‡ € š I001a: ’ Œ Ž ‹ ÄĪ,#-1 Æ € Œ Ž ‹ ‰ ×åė ¦ Ÿ  … „  strncpy.s #Åu¤øČ_strncpy É_strncpy † _strncpy: ƒ ‚ € € ¢ ¬ ¼ I0015: ĄäŌ ĶĘ,ė jge I0012 “ ÄĪ,#1 ‰ Œ Ž ’ ŗ ˜ ‹ ™ ŁI0013 I001a: ÜĘ ĄäŌ ĶĘ,ė jge I0019 ’ ŹĒö ˜ ĢI001a I0019: ¹ š • ÜĘ ĢI0015   ¹ Ÿ  … „  sync.s.s #Ęu¤>Č_sync É_sync † _sync: ƒ ‚ ‡ € € € € € € Ąį36 €  €  ‘ … „  time.s.s #Ęu¤ŅČ_time É_time † _time: ƒ ‚ ×ņ,#6 ‡ € € € € € € 3 €  €  ‘ ” Ķ_M+2ö jl I0012 ĶĘö je I0013   Ąå_M+2 ōģ Ą_errno,ģ Ąį-1 € Ąį65535 € š • ĄåŻ ĄŠ,ģ ĄåŻ+2 ĄĻ,ģ ĶÅö je I0017 ’ ĄäŠ ĄęĻ ° Ą2Ē,ķ I0017: ¹ ĮŠ Ÿ  Ćī … „  times.ss #Ēu¤ÅČ_times É_times † _times: ƒ ‚ € ‡ € € € € € € Ąį43 €  €  ‘ ” ’ Ąę_M+4 Ąē_M+4+2 ĄĒ,ķ Ą2Ē,ī ’ Ąę_M+8 Ąē_M+8+2 Ą4Ē,ķ Ą6Ē,ī ’ Ąę_M+12 Ąē_M+12+2 Ą8Ē,ķ Ą10Ē,ī ’ Ąę_M+16 Ąē_M+16+2 Ą12Ē,ķ Ą14Ē,ī — … „  umask.ss #Ēu¤AČ_umask É_umask † _umask: ƒ ‚ ‡ € € € € € ˆ Ąį60 €  €  ‘ … „  umount.s #Ču¤EČ_umount É_umount † _umount: ƒ ‚ ˆ ‡ € “2 €  € Ó_callm3 Äņ,#8 … „  unlink.s #Ču¤EČ_unlink É_unlink † _unlink: ƒ ‚ ˆ ‡ € 0 €  € Ó_callm3 Äņ,#8 … „  utime.s #Ču¤}Č_utime É_utime † _utime: ƒ ‚ ˆ µ Š Ą_M+4,ė Æ ĄęĒ Į2Ē ĄŻ,ķ ĆŻ+2 Ąę4Ē Į6Ē Ą_M+14,ķ Ć_M+14+2 ’ Ą_M+18,ģ Ąį30 €  € ¶ Š Š … „  wait.s #Éu¤UČ_wait É_wait † _wait: ƒ ‚ € ‡ € € € € € € Ąį7 € ‡ €  ‘ ” Ąå_M+4 ĄčÅ Ą(ļ),ģ — … „  stderr.s #Éu¤`Č_std_err É_std_err † _std_err: ƒ ‚ € ¢ ” • § Œ Ž ‹ ™ ± ÄĘ,#1 ­   — ×äÅ € ˆ “ € Ó_write ¤ … „  write.s #Źu¤AČ_write É_write † _write: ƒ ‚ ‡ € € “ € ĮŌ ˆ Ąį4 €  €  ‘ … „  syslib.s #Źu¤žČ_sys_newmap Č_tell_fs Č_sys_times Č_sys_abort Č_sys_exec Č_sys_getņ Č_sys_ļg Č_sys_fork Č_sys_copy Č_sys_xit É_sys_xit † _sys_xit: ƒ ‚ ‡ € € € € “ ˆ  € Ąį-2 €  ‘ … „  É_sys_getņ _sys_getņ: ƒ ‚ ‡ € € € € € ˆ “ € Ąį-2 €  ‘ ĄåŻ ĄčĪ Ą(ļ),ģ … „  É_sys_ļg _sys_ļg: ƒ ‚ ’ Ą_M+4,ģ Æ Ą_M+6,ģ › Ą_M+14,ģ Ąį3 € Ąį-2 € ¶ Š Š … „  É_sys_fork _sys_fork: ƒ ‚ ‡ € € € ĮŌ “ ˆ Ąį4 € Ąį-2 €  ‘ … „  É_sys_exec _sys_exec: ƒ ‚ ‡ € € “ € € ˆ Ąį7 € Ąį-2 €  ‘ … „  É_sys_newmap _sys_newmap: ƒ ‚ ‡ € € “ € € ˆ Ąį5 € Ąį-2 €  ‘ … „  É_sys_copy _sys_copy: ƒ ‚ ® _1: Ā31091 Ā24435 Ā28515 Ā31088 Ā25376 Ā28257 Ā29735 Ā29472 Ā28261 Ā100 † ’ Ą2Ē,#6 ˆ Ąį-2 € Ó_sendrec Š Š ™ je I0073 Ąį32768 € Ąį_1 € Ó_panic Š Š I0073: … „  É_sys_times _sys_times: ƒ ‚ ‡ € € “ € € ˆ Ąį8 € Ąį-2 €  ‘ Æ Ąę_M+4 Ąē_M+4+2 ĄĒ,ķ Ą2Ē,ī Æ Ąę_M+8 Ąē_M+8+2 Ą4Ē,ķ Ą6Ē,ī Æ Ąę_M+12 Ąē_M+12+2 Ą8Ē,ķ Ą10Ē,ī Æ Ąę_M+16 Ąē_M+16+2 Ą12Ē,ķ Ą14Ē,ī … „  É_sys_abort _sys_abort: ƒ ‚ ‡ € € € € € € Ąį9 € Ąį-2 €  ‘ … „  É_tell_fs _tell_fs: ƒ ‚ ‡ € € € Į10(ń) ĮŌ “ ˆ  €  ‘ … „  call.ss #Ėu¤_ČŅ Č_callm3 Č_callx Č_len Č_errno ÉŅ † Ņ: ƒ ‚ › Ą_M+4,ģ Ąå10(ń) Ą_M+6,ģ Ąå12(ń) Ą_M+8,ģ Ąå1Å ĄŻ,ģ Ąå1Ī Ą_M+12,ģ Ąå1Ō Ą_M+14,ģ “ ˆ ¶ Š Š … „  É_callm3 _callm3: ƒ ‚ € € Į10(ń) µ Š ” § Ą_M+4,ģ › Ą_M+6,ģ Ąå10(ń) Ą_M+8,ģ ĄĻ,#Ż ĶĘ,#14 jg I0023 I0026: ” óĘ  ™ je I0023 Į10(ń) Ä10(ń),#1 ‰ ĄčĻ Œ Ź(ļ),al ÄĻ,#1 ĢI0026 I0023: “ ˆ ¶ Š Š … „  É_callx _callx: ƒ ‚ € Æ Ą_M+2,ģ Ąį_M € ˆ Ó_sendrec Š Š ” ĶĘö je I0033 ” ĢI0031 I0033: Ķ_M+2ö jge I0036 Ąå_M+2 ōģ Ą_errno,ģ Ąį-1 € ĢI0031 I0036: Į_M+2 I0031:  … „  É_len _len: ƒ ‚ € ¼ I0043: ˆ ˜ ‰ Œ Ž ‹ ™ je I0042 ÜĘ ĢI0043 I0042: — Üė … „  É_errno ³ _errno: .zerow 2/2 † atoi.ss #Ėu¤]Č_atoi É_atoi † _atoi: ƒ ‚ ×ņ,#6 ¼ ĄŠö • ’ Œ Ž ‹ Ą__c_,ė Ķ__c_,#32 je I0014 Ķ__c_,#9 je I0014 Ķ__c_,#13 je I0014 Ķ__c_,#10 je I0014 Ķ__c_,#12 ŁI0012 I0014: ˜ ­   ’ Œ Ž ‹ Ķį45 ŁI001d ˜ ĄŠ,#1 I001d: ˆ ˜ ‰ Œ Ž ‹ ×į48  ž – ¬ ĶĻ,#10 jae I001c 0 mul Ę ”  ž £ ” – ‰ Äåė ĄĘ,ģ ĢI001d I001c: ĶŠö je I00110 — ōė € š I00110: ” Ÿ  … „  ³ __c_: .zerow 2/2 † message.s #Ėu¤Č_M É_M ³ _M: .zerow 24/2 † sendrec.s #Ģu¤ŃČ_send, _receive, _sendrec SEND = 1 RECEIVE = 2 BOTH = 3 SYSVEC = 32 É_send, _receive, _sendrec _send: Ąę*SEND ĢL0 _receive: Ąę*RECEIVE ĢL0 _sendrec: Ąę*BOTH ĢL0 L0: ƒ ‚ ¢ Æ int SYSVEC „  printk.s #v¤p Č_printk É_printk † _printk: ƒ ‚ ×ņ,#36 ® _1: ĀI0011F Ā8 Ā68 ĀI00111 Ā79 ĀI00112 Ā88 ĀI00113 Ā99 ĀI00114 Ā100 ĀI001E Ā111 ĀI001F Ā115 ĀI00115 Ā120 ĀI00110 † ŪåĪ ĄŲ,ģ • ’ cmpb Ēö ± ’ cmpb Ē,#37 je I0016 ˆ ˜ ‰ Œ Ž ‹ € Ó_putc Š ­ ½ ¼ ˜ I0019: ’ Œ Ž ‹ Ķį48 jl I0018 ’ Œ Ž ‹ Ķį57 jg I0018 ’ Œ Ž ‹ ×į48 € 0 mul Ę ‰ Äåė ĄĘ,ģ ˜ ĢI0019 I0018: ĄäŲ Ą-1Ō,ė ĄäŲ Ą-12(ń),ė ’ Œ Ž ‹ € ĢI001C I001E: ĮŲ ÄŲ,#2 ‰ « ¬ £ cwd Ą-1Ī,ė Ą-14(bp),ī ĄŠ,#10 ĢI001D I001F: ĮŲ ÄŲ,#2 ‰ « ¬  ž £ – Ą-10(ń),ė ‡ Ąå-10(ń) Ą-1Ī,ģ Ą-1Å,ė ĄŠ,#8 ĢI001D I00110: ĮŲ ÄŲ,#2 ‰ « ¬  ž £ – Ą-10(ń),ė ‡ Ąå-10(ń) Ą-1Ī,ģ Ą-1Å,ė ĄŠ,Ń ĢI001D I00111: Į-1Ō Ä-1Ō,#4 ‰ « Į2Ē Ą-1Ī,ė Ć-1Å ĄŠ,#10 Ąä-1Ō ĄŲ,ė ĢI001D I00112: Į-1Ō Ä-1Ō,#4 ‰ « Į2Ē Ą-1Ī,ė Ć-1Å ĄŠ,#8 Ąä-1Ō ĄŲ,ė ĢI001D I00113: Į-1Ō Ä-1Ō,#4 ‰ « Į2Ē Ą-1Ī,ė Ć-1Å ĄŠ,Ń Ąä-1Ō ĄŲ,ė ĢI001D I00114: ĮŲ ÄŲ,#2 ‰ « ¬ ¹ Ó_putc Š ˜ ­ I00115: Į-12(ń) add -12(ń),#2 ‰ « Ą-32(ń),ė Ąä-12(ń) ĄŲ,ė Ąä-32(ń) Ą-3Å,ė I00117: Į-32(ń) Ä-32(ń),#1 ‰ Œ Ž Ź-35(ń),al ‹ ™ je I00116 Źal,-35(ń) Ž ‹ € Ó_putc Š š7 I00116: ˜ Ąä-32(ń) ×ä-3Å óė ×äĘ ōė ¬ ĶĻö jle I0013 I0011D: ¹ óĻ  ™ je I0013 Ąį32 € Ó_putc Š šD I0011F: Ąį37 € Ó_putc Š ˆ ˜ ‰ Œ Ž ‹ € Ó_putc Š ­ I001C: Ąč#_1 Ćī Ģ.csb2 I001D: Ūä-30(ń) € ĮŠ Į-1Å Į-1Ī Ó_bintoascii Äņ,#8 ¬ — ×äĻ ĄŠ,ė ĶŠö jle I00121 I00124: ĮŠ óŠ  ™ ±1 Ąį32 € Ó_putc Š ĢI00124 I00121: £ óė ĄŠ,ė I00129: ĶŠö jl I00126 ĄčŠ Źal,-30(ń_ļ) Ž ‹ € Ó_putc Š óŠ ĢI00129 I00126: ˜ ­   … „  _bintoascii: ƒ ‚ ×ņ,#10 ĄŲö ¢ Æ ×į0 sbb ā0 Ł1f or åė 1: or åģ ŁI0023 Ąå10(ń) ŹĒ,#48  € ĢI0021 I0023: ¢ Æ ×į0 sbb ā0 Ł1f Öäė je 1f Üģ 1: or åģ jge I0026 ĶŌ,#10 ŁI0026 ’ ĄäĪ ōė ōģ sbb į0 ĄÅ,ģ ĄĪ,ė ÜŲ I0026: ĄĻö I002C: ĶĻ,#12 jge I0029 ĄåĻ Äå10(ń) ŹĒö ÜĻ ĢI002C I0029: ĄĻö I002F: ĶŌ,#10 ŁI00211 “ ˆ ‡ € 0 € Ó.rmi4 ĄåĻ Äå10(ń) ŹĒ,dl ĄåĻ Äå10(ń) Œ Ž ‹ cwd ’ ĄęĪ ×åė sbb ęī Įķ ¦ ‡ € 0 € Ó.dvi4 ĄÅ,ė ĄĪ,ķ I00211: ĶŌ,#8 ŁI00214 Ąć4 Ąā4 ¢ “ – ‰ Öį7 Öā0 ĄåĻ Äå10(ń) ŗ Ąć3 ¢ Æ © 2: sar ā1 rcr į1 Ø 1: Öį65535 Öā8191 ĄÅ,ė ĄĪ,ģ I00214: ĶŌ,Ń ŁI00217 Ąć4 Ąā4 ¢ “ – ‰ Öį15 Öā0 ĄåĻ Äå10(ń) ŗ Ąć4 ¢ Æ © 2: sar ā1 rcr į1 Ø 1: Öį65535 Öā4095 ĄÅ,ė ĄĪ,ģ I00217: ÜĻ ¢ Æ ×į0 sbb ā0 Ł1f or åė 1: or åģ ŁI002F ĄŠö £ óė ” I0021C: ĶĘö jl I00219 § Äå10(ń) cmpb Ēö ŁI0021E ĶŠö ŁI0021E § Äå10(ń) ŹĒ,#32 ĢI0021A I0021E: § Äå10(ń) Œ Ž ‹ Ķį10 jge I00222 § Äģ,10(ń) Ą-10(ń),ģ Ąå-10(ń) Œ Ž ‹ Äį48 ŗ ĢI00223 I00222: § Äå10(ń) Ą-10(ń),ģ Ąå-10(ń) Œ Ž ‹ Äį55 ŗ I00223: ÜŠ I0021A: óĘ ĢI0021C I00219: ĶŲö je I00225 Ąį45 € Į10(ń) ¹ ÜĻ ‰  Äåė  ŗ I00225: ¹ I0021:  … „  itoa.ss #Ķu¤­Č_itoa É_itoa † _itoa: ƒ ‚ ×ņ,#6 ĄŠö Ą_nextö ĶÅö jge I0013 Ąį45 € Ąį_qbuf € Į_next Ü_next ‰  Äåė  ŗ ōÅ • ĶÅö ŁI0016 Ąį48 € Ąį_qbuf € Į_next Ü_next ‰  Äåė  ŗ ĢI0017 ½ ĄĻ,#10000 I0019: ĶĻö jle I0017 ¢ cwd išv Ļ ” ĶŠö ŁI001b ĶĘö jle I001c I001b: — Äį48 € Ąį_qbuf € Į_next Ü_next ‰  Äåė  ŗ ĄŠ,#1 I001c: — mul Ļ ×äÅ ōė ĄÅ,ė Ąā10 £ cwd išv ģ ¬ ĢI0019 I0017: Ąå_next Ź_qbufĒö Ąį_qbuf … „  ³ _qbuf: .zerow 8/2 _next: .zerow 2/2 † abs.ss #Īu¤=Č_abs É_abs † _abs: ƒ ‚ ĶÅö jge I0013 ¢ ōė € š • ˆ Ÿ  … „  atol.ss #Īu¤>Č_atol É_atol † _atol: ƒ ‚ ×ņ,#8 ĄĻö ¼ ĄŲö • ’ Œ Ž ‹ » Źal,__ctype_+1Ē Ž ‹  ž – testb al,#8 ± ˜ ­   ’ Œ Ž ‹ Ķį45 ŁI0019 ˜ ĄŲ,#1 I0019: ˆ ˜ ‰ Œ Ž ‹ ×į48  ž – ĄŠ,ė ĶŠ,#10 jae I0018 Ąč#10 Ėéš ĄåĻ — Ó.mli4 ¬ ĄĘ,ī ‡ ĄåĻ ĄęĘ ÄåŠ adc ęė ĄĻ,ģ ĄĘ,ķ ĢI0019 I0018: ĶŲö je I001c ĄåĻ — ōė ōģ sbb į0 € ¦ š I001c: ” ¹ Ÿ  Ćī … „  ctype.s #Ļu¤šČ__ctype_ É__ctype_ ® __ctype_: Ā8192 ² ² ² ² Ā2056 Ā2056 Ā8200 ² ² ² ² ² ² ² ² Ā2080 Ŗ Ŗ Ŗ Ŗ Ŗ Ŗ Ŗ Ā1040 Ā1028 Ā1028 Ā1028 Ā1028 Ā4100 Ŗ Ŗ Ŗ Ā16705 Ā16705 Ā16705 æ æ æ æ æ æ æ æ æ æ Ŗ Ŗ Ŗ Ā16962 Ā16962 Ā16962 ¾ ¾ ¾ ¾ ¾ ¾ ¾ ¾ ¾ ¾ Ŗ Ŗ Ā32 † index.s #Ļu¤oČ_index É_index † _index: ƒ ‚ I0014: ’ Œ Ž ‹ € Źal,Ī Ž ‹ ‰ Ķåė ŁI0013 ˆ š • ˆ ˜ ‰ Œ Ž ‹ ™ ŁI0014 ‡ € Ÿ  … „  bcopy.s #Ļu¤PČ_bcopy É_bcopy † _bcopy: ƒ ‚ • ĮŌ óŌ  ™ ± ˆ ˜ ‰ ĄčĪ Œ Ź(ļ),al ÄĪ,#1 ­   … „  getutil.s #Šu¤Č_get_base, _get_ļze, _get_tot_mem É_get_base, _get_ļze, _get_tot_mem, endbss _get_base: Ąäds  _get_ļze: Ąįendbss  _get_tot_mem: cli Įes Įš Ąį8192 ×éš L1: Ąes,ė seg es Ą(š)öxA5A4 Ėåģ seg es Ąå(š) Ķā0xA5A4 ŁL2 Äį4096 Ķį0xA000 ŁL1 L2: Ćš Ćes sti  rand.s #Šu¤¶Č_rand ® _seed: Ā1,0 É_rand † _rand: ƒ ‚ Ąč#20077 ĄéŃ838 Ąå_seed Ąä_seed+2 Ó.mli4 Äį12345 adc ē#0 Öį65535 Öē#32767 Ą_seed,ė Ą_seed+2,ī Ąć4 Ąā4 Ąä_seed Į_seed+2 – ‰ Öį32767 Öā0 … „  rindex.s #Ńu¤pČ_rindex É_rindex † _rindex: ƒ ‚ € ¼ I0014: ’ Œ Ž ‹ € Źal,Ī Ž ‹ ‰ Ķåė ŁI0013 ¢ ” • ˆ ˜ ‰ Œ Ž ‹ ™ ŁI0014 — … „  setjmp.s #Ńu¤ĪČ_setjmp Č_longjmp É_setjmp, _longjmp † _setjmp: Ąåņ « Ąå*2Ē ĄĒ,ń Ą*2Ē,ņ Ą*4Ē,ė ‡  _longjmp: ‡ ƒ ‚ Ąå*Å Ąä*Ī ™ ŁL1 Üė L1: ĄęĒ L2: Ķę*0(ń) je L3 Ąź*0(ń) or źń ŁL2 hlt L3: Ąź*0(ń) Ąņ,*2Ē Ąę*4Ē Ąåņ ĄĒ,ķ  adi.s.s #Ņu¤dČ.aš .aš: Ć ģ Ķ ć2 Ł L1 Ć ķ Ä äķ Ģ Ē L1: Ķ ć4 Ł L9 Ć ī Ć ķ Ä äķ Ć ķ adc ēķ Į ī Ģ Ē L9: Ó .trpšvz and.s.s #Ņu¤9Č.and .and: ‰ Ąéņ Äéķ sar ć1 L1:  Öä(š) stow ß L1 ĢĒ cii.s.s #Óu¤›Č.cii .cii: Ć š Ķ åķ je L8 Ķ ā2 je L1 Ķ ā4 Ł L7 Ķ ć2 Ł L9 Ć ī L8: Ģ (š) L7: Ķ ā1 Ł L9 Ķ ć2 Ł L9 ‹ Ģ L8 L1: Ķ ć4 Ł L9 cwd Į ī Ģ (š) L9: Į ė Ó.trpilin cms.s.s #Óu¤VČ.cms .cms: Ć ģ Ą ēņ Ą čī Ä ēķ Ą éī Ä ēķ sar ć1 repe cmps je L1 Ü ķ L1: Ą ņ,ī Ģ Ē cmu4.ss #Ōu¤jČ.cmu4 .cmu4: Ć ģ Ė äė Ć ķ Ć ī Ć ļ Ć š Ķ éī ja L1 jb L2 Ķ čķ ja L1 je L3 L2: ó ė L3: Ģ Ē L1: Ü ė Ģ Ē  com.s #Ōu¤6Č.com .com: ‰ Ąéņ sar ć1 L1: not (š) Üš Üš ß L1 ĢĒ csa2.s #Ōu¤zČ.csa2 .csa2: Ą ē(ļ) × å2(ļ) Ķ å4(ļ) ja L1 sal ā1 Ą å6(ģ_ļ) test åģ jnz L2 L1: Ą åī test åģ jnz L2 Ó .trpcase L2: Ģ Ē csb2.s #Õu¤}Č.csb2 .csb2: lodw xchg äģ lodw xchg äķ L1: ó ķ jl L2 lodw Ķ äī lodw Ł L1 xchg äģ L2: test åģ jnz L3 Ó .trpcase L3: Ģ Ē cuu.s #Õu¤Č.ciu Č.cui ČŚ .ciu: .cui: Ś: Ć š Ķ åķ je L8 Ķ ā2 je L1 Ķ ā4 Ł L9 Ķ ć2 Ł L9 Ć ī L8: Ģ (š) L1: Ķ ć4 Ł L9 Ė ēī Į ī Ģ (š) L9: Į ė Ó.trpilin .dup.s #Öu¤€.define .dup | #bytes in cx .dup: pop bx | return address mov si,sp sub sp,cx mov di,sp sar cx,#1 rep movw jmp (bx) dvi.s #Öu¤Č.dvi .dvi: Ć ģ Ķ į2 Ł L1 Ć ė cwd Ć ķ išv ķ Į ė Ģ Ē L1: Ķ į4 Ł L9 Ć ė Ć ī Ć ļ Ć š Į ģ Į š Į ļ Į ī Į ė Ó .dvi4 Ć ģ Į ķ Į ė Ģ Ē L9: Ó .trpšvz dvi4.s #×u¤…Č.dvi4 É.dvi4 xl=6 xh=4 yl=10 yh=8 .dvi4:ƒ ‚ Įš ×éš Ąēyl(ń) Ąäyh(ń) Ąåxl(ń) Ąęxh(ń) test ēī jns L1 ōī ōė sbb ē*0 not š L1:test åģ jns L2 ōģ ōķ sbb å*0 not š L2:ÓL4 test éš je L3 ōī ōė sbb ē*0 L3:Ćš „ Ąęī  8 L4:test åģ ŁL5 » Ąäī ×ēī šv ķ xchg äģ šv ķ Ąęī Ąēģ ×åģ  L5:ƒ Įš Įļ ×éš testb bh,bh ŁL6 Üš Įš Źbh,bl Źbl,ch Źch,cl subb cl,cl Ąźķ Źch,al subb cl,cl Źal,ah Źah,dl Źdl,dh subb dh,dh œ € Įķ Ąęń Ķēģ jb L7 Ąį0xffff j L8 L6:Įš Įš œ € Ąäī ×ēī L7:šv ģ L8:Ąźė mul ķ Ćš ×éė adc ē*0 Ąčī Ąäģ mul ń Ääļ adc ē*0 Š ×čė adc ē*0  ×äī L9:jns L10 óń Äéķ adc čģ adc į0 j L9 L10:Ąęš Ąåļ Ćš test éš je L11 Źcl,ch Źch,bl Źbl,bh Źbh,al L11:Ąäń ×ēī Š Ćš „  dvu.s #×u¤Č.dvu .dvu: Ć ģ Ķ į2 Ł L1 Ć ė Ė ēī Ć ķ šv ķ Į ė Ģ Ē L1: Ķ į4 Ł L9 Ć ė Ć ī Ć ļ Ć š Į ģ Į š Į ļ Į ī Į ė Ó .dvu4 Ć ģ Į ķ Į ė Ģ Ē L9: Ó .trpšvz dvu4.s #Ųu¤ Č.dvu4 yl=2 yh=4 xl=6 xh=8 .dvu4: Ą čņ Ą åyl(ļ) Ą äyh(ļ) or äė Ł L7 Ė ēī Ą ęxl(ļ) Ą äxh(ļ) šv ģ xchg äķ šv ģ L9:  8 L7: Ą éė Ė åģ Ą äxl(ļ) Ą ēxh(ļ) Ą ć16 L1: shl į1 rcl ē#1 rcl ā1 Ķ éģ ja L3 jb L2 Ķ yl(ļ),ī jbe L2 L3: ß L1 Ģ L9 L2: × ēyl(ļ) sbb åš Ü ė ß L1 Ģ L9 exg.s #Ųu¤fČ.exg .exg: Ć ģ Ą ēķ Ą čņ × ņ,ķ Ą éņ rep movw Ą čņ Ą éņ Ä éī Ä éī Ą ęī sar ć1 rep movw Ą ņ,ļ Ģ Ē fakfp.s #Łu¤˜Č.mlf,.dvf,.ngf,.adf,.sbf,.cmf,.zrf,.fif,.fef Č.mlf8,.dvf8,.ngf8,.adf8,.sbf8,.cmf8,.zrf8,.fif8,.fef8 Č.mlf4,.dvf4,.ngf4,.adf4,.sbf4,.cmf4,.zrf4,.fif4,.fef4 Č.cif,.cfi,.cuf,.cfu,.cff .mlf: .dvf: .ngf: .adf: .sbf: .cmf: .zrf: .fif: .fef: .mlf4: .dvf4: .ngf4: .adf4: .sbf4: .cmf4: .zrf4: .fif4: .fef4: .mlf8: .dvf8: .ngf8: .adf8: .sbf8: .cmf8: .zrf8: .fif8: .fef8: .cif: .cfi: .cuf: .cfu: .cff: Ć ģ Ó.trpnofp gto.ss #Łu¤ Č.gto .gto: Ą ź#4Ē Ą ņ,#2Ē Ģ Ē iaar.s #Łu¤PČ.iaar .iaar: Ć ģ Ć ī Ķ ē#2 Ł .unknown Ć ļ Ć ė Ć š × ä(ļ) mul 4(ļ) Ä éė Ģ Ē ilar.s #Śu¤CČ.ilar .ilar: Ć ģ Ć ī Ķ ē#2 Ł .unknown Ć š Ć ė Ć ļ Į ģ Ģ .lar2 inn.s #Śu¤§Č.inn .inn: Ć ģ Ė ēī Ė čļ Ą é#8 šv š Ą éņ Ä éė Ķ äķ xchg äī xchg äļ jae L1 Ź dl,bits(ļ) testb (š),dl jz L1 Ü ė L1: Ä ņ,ķ Ģ Ē ® bits: .byte 1,2,4,8,16,32,64,128 ior.s #Ūu¤;Č.ior .ior: ‰ Ąéņ Äéķ sar ć1 L1:  or ä(š) stow ß L1 ĢĒ isar.s #Ūu¤CČ.isar .isar: Ć ģ Ć ī Ķ ē#2 Ł .unknown Ć ļ Ć ė Ć š Į ģ Ģ .sar2 lar2.s #Üu¤vČ.lar2 .larL2: Ć ģ × ä(š) Ą ć4(š) imul ķ Ä čė sar ć1 jnb L1 Õ ah,ah lodb Į ė Ģ Ē L1: × ņ,4(š) Ą éņ rep movw Ģ Ē loi.s #Üu¤XČ.loi .loi: Ć ģ Ą ēķ sar ć1 jnb L1 Õ ah,ah lodb Į ė Ģ Ē L1: × ņ,ī Ą éņ rep movw Ģ Ē mli.s #Żu¤pČ.mli .mli: Ć ģ Ķ į2 Ł L1 Ć ė Ć ķ mul ķ Į ė Ģ Ē L1: Ą ēģ Ķ į4 Ł L9 Ć ļ Ć š Ć ģ Ć ė Į ī Ģ .mli4 L9: Ó .trpšvz mli4.s #Żu¤DČ.mli4 .mli4: mul ļ Ą ęė Ą äš mul ģ Ä ęė Ą äļ mul ģ Ä ēķ  ngi.s #Žu¤lČ.ngi .ngi: Ć ģ Ķ į2 Ł L1 Ć ķ ō ķ Į ķ Ģ Ē L1: Ķ į4 Ł L9 Ć ī Ć ė ō ė ō ī sbb į0 Į ī Į ė Ģ Ē L9: Ó .trpšvz nop.s #Žu¤Č.nop  rck.s #Žu¤?Č.rck .rck: Ķ ä(ļ) jl L2 Ķ į2(ļ) jg L2  L2: Į ė Ó .trprang rmi.s #ßu¤‘Č.rmi .rmi: Ć ģ Ķ į2 Ł L1 Ć ė cwd Ć ķ išv ķ Į ī Ģ Ē L1: Ķ į4 Ł L9 Ć ė Ć ī Ć ļ Ć š Į ģ Į š Į ļ Į ī Į ė Ó .rmi4 Ć ė Į ģ Į ī Ģ (ė) L9: Ó .trpšvz rmi4.s #ßu¤ĘČ.rmi4 yl=2 yh=4 xl=6 xh=8 .rmi4: Ą čņ Ą åyl(ļ) Ą äyh(ļ) cwd Ķ ēė Ł L7 Ö ēī jge L1 ō ģ je L7 L1: Ė ēī Ą ęxl(ļ) Ą äxh(ļ) Ö äė jge L2 ō ė ō ķ sbb äī L2: šv ģ xchg äķ šv ģ Ė åģ L9: Ķ xh(ļ)ö jge L1a ō ģ ō ī sbb ā0 L1a:  8 L7: Ą éė Ė åģ Ö éš jge L1b ō š ō yl(ļ) sbb éģ L1b: Ą äxl(ļ) Ą ēxh(ļ) Ö ēī jge L1c ō ī ō ė sbb ēģ L1c: Ą ć16 L1d: shl į1 rcl ē#1 rcl ā1 Ķ éģ ja L3 jb L2 Ķ yl(ļ),ī jbe L2a L3: ß L1d Ģ L9 L2a: × ēyl(ļ) sbb åš Ü ė ß L1d L1e: Ģ L9 rmu.s #ąu¤’Č.rmu .rmu: Ć ģ Ķ į2 Ł L1 Ć ė Ė ēī Ć ķ išv ķ Į ī Ģ Ē L1: Ķ į4 Ł L9 Ć ė Ć ī Ć ļ Ć š Į ģ Į š Į ļ Į ī Į ė Ó .rmu4 Ć ė Į ģ Į ī Ģ (ė) L9: Ó .trpšvz rmu4.s #ąu¤%Č.rmu4 yl=2 yh=4 xl=6 xh=8 .rmu4: Ą čņ Ą åyl(ļ) Ą äyh(ļ) or äė Ł L7 L1: Ė ēī Ą ęxl(ļ) Ą äxh(ļ) L2: šv ģ xchg äķ šv ģ Ė åģ L9:  8 L7: Ą éė Ė åģ Ą äxl(ļ) Ą ēxh(ļ) Ą ć16 L1a: shl į1 rcl ē#1 rcl ā1 Ķ éģ ja L3 jb L2 Ķ yl(ļ),ī jbe L2 L3: ß L1a Ģ L9 L2a: × ēyl(ļ) sbb åš Ü ė ß L1a L1c: Ģ L9 rol.s #įu¤”Č.rol .rol: Ć ī Ķ į2 Ł L1 Ć ė Ć ķ rol äcl Į ė Ģ (ī) L1: Ķ į4 Ł L9 Ć ķ ą L2 Ć ė Ć ģ L3: sal į1 rcl ā1 adc į0 ß L3 Į ģ Į ė L2: Ģ (ī) L9: Ó .trpšvz ror.s #įu¤—Č.ror .ror: Ć ī Ķ į2 Ł L1 Ć ė Ć ķ ror äcl Į ė Ģ (ī) L1: Ķ į4 Ł L9 Ć ķ ą L2 ō ķ Ä ć32 Ć ė Ć ģ L3: sar ā1 rcr į1 ß L3 Į ģ Į ė L2: Ģ (ī) L9: Ó .trpšvz sar2.s #āu¤jČ.sar2 .sar2: Ć ģ × ä(ļ) Ą ę4(ļ) imul ķ Ä éė sar ć1 jnb L1 Ć ė stob Ģ Ē L1: Ą čņ rep movw Ą ņ,ļ Ģ Ē sbi.s #āu¤oČ.sbi .sbi: Ć ģ Ķ ć2 Ł L1 Ć ķ × äķ ō ė Ģ Ē L1: Ķ ć4 Ł L9 Ć ī Ć ķ × ęė Ą äķ Ć ķ sbc ęī Į ķ Ģ Ē L9: Ó .trpšvz set.s #āu¤±Č.set .set: Ć ģ Ė ēī Ą éņ × éķ L1: Į ī Ķ ņ,š ja L1 Ą é#8 šv š Ķ äķ jae L2 Ą éņ Ä éė Ą čī Ź dl,bits(ļ) orb (š),dl Ģ Ē L2: Į ģ Ó .trpset ® bits: .byte 1,2,4,8,16,32,64,128 sli.s #ću¤Č.sli .sli: Ć ī Ķ į2 Ł L1 Ć ė Ć ķ sal äcl Į ė Ģ (ī) L1: Ķ į4 Ł L9 Ć ķ ą L2 Ć ė Ć ģ L3: sal į1 rcl ā1 ß L3 Į ģ Į ė L2: Ģ (ī) L9: Ó .trpšvz sri.s #ću¤Č.sri .sri: Ć ī Ķ į2 Ł L1 Ć ė Ć ķ sar äcl Į ė Ģ (ī) L1: Ķ į4 Ł L9 Ć ķ ą L2 Ć ė Ć ģ L3: sar ā1 rcr į1 ß L3 Į ģ Į ė L2: Ģ (ī) L9: Ó .trpšvz sti.s #äu¤LČ.sti .sti: Ć ģ sar ć1 jnb L1 Ć ė stob Ģ Ē L1: Ą čņ rep movw Ą ņ,ļ Ģ Ē xor.s #äu¤9Č.xor .xor: ‰ Ąéņ Äéķ sar ć1 L1:  Ėä(š) stow ß L1 ĢĒ error.s #äu¤ęČ.error ! ė is trap number ! all registers must be saved ! because urn is posļble ! May only be called with error no's <16 .error: ƒ Įļ Įš œ Įķ ¦ € Ą ęė Ą å1 sal åcl test å(.ignmask) Ł 2f Ó .trp 2: Ć ė Ć ģ Ć ķ Ć ī Ć š Ć ļ Ć ń  unknown.s #åu¤Č.unknown .unknown: Ó.trpilin trp.sn.s #ęu¤ŻČ.trpšvz Č.trpilin Č.trpcase Č.trprang Č.trpset Č.trpnofp Č.trpheap ³ .M: .zerow 24/2 † É.trpšvz É.trpilin É.trpcase É.trprang É.trpset É.trpnofp É.trpheap .trpšvz: Ąį.Mšvz Ģ.Trp .trpilin: Ąį.Milin Ģ.Trp .trpcase: Ąį.Mcase Ģ.Trp .trprang: Ąį.Mrang Ģ.Trp .trpset: Ąį.Mset Ģ.Trp .trpnofp: Ąį.Mnofp Ģ.Trp .trpheap: Ąį.Mheap Ģ.Trp .Trp: ž2 ¦ € “ € Ó.Write Ó_exit .Write: ƒ ‚ Ą.M+2,#4 ’ Ą.M+4,ģ › Ą.M+6,ģ Æ Ą.M+10,ģ Ąį.M €  €  Ąā.M Ąć3 int 32 … „  ® .Mšvz: .asciz "Error: Diviļon by 0 \n" .Milin: .asciz "Illegal EM instruct'n\n" .Mcase: .asciz "Err in EM case instr \n" .Mrang: .asciz "Variable out of range\n" .Mset: .asciz "Err in EM set instr \n" .Mnofp: .asciz "Floating pt not impl.\n" .Mheap: .asciz "Heap overflow \n" crypt.s #v¤rČ_setkey Č_encrypt Č_crypt ® _InitialTr: Ā12858 Ā8746 Ā4634 Ā522 Ā13372 Ā9260 ¾8 Ā1036 Ā13886 Ā9774 Ā5662 Ā1550 Ā14400 Ā10288 Ā6176 Ā2064 Ā12601 Ā8489 Ā4377 Ā265 Ā13115 Ā9003 Ā4891 Ā779 Ā13629 Ā9517 Ā5405 Ā1293 Ā14143 Ā10031 Ā5919 Ā1807 _FinalTr: Ā2088 Ā4144 Ā6200 Ā8256 Ā1831 Ā3887 Ā5943 Ā7999 Ā1574 Ā3630 Ā5686 Ā7742 Ā1317 Ā3373 Ā5429 Ā7485 Ā1060 Ā3116 Ā5172 Ā7228 Ā803 Ā2859 Ā4915 Ā6971 Ā546 Ā2602 Ā4658 Ā6714 Ā289 Ā2345 Ā4401 Ā6457 _swap: Ā8737 Ā9251 Ā9765 Ā10279 Ā10793 Ā11307 Ā11821 Ā12335 Ā12849 Ā13363 Ā13877 Ā14391 Ā14905 Ā15419 Ā15933 Ā16447 Ā513 Ā1027 Ā1541 Ā2055 .word 2569 Ā3083 Ā3597 Ā4111 Ā4625 Ā5139 Ā5653 Ā6167 Ā6681 Ā7195 Ā7709 Ā8223 _KeyTr1: Ā12601 Ā8489 Ā4377 Ā265 Ā12858 Ā8746 Ā4634 Ā522 Ā13115 Ā9003 Ā4891 Ā779 Ā13372 Ā9260 Ā14143 Ā10031 Ā5919 Ā1807 Ā13886 Ā9774 Ā5662 Ā1550 Ā13629 Ā9517 Ā5405 Ā1293 ¾8 Ā1036 ø ø ø ø _KeyTr2: Ā4366 Ā6155 Ā1281 Ā7171 Ā1551 Ā2581 Ā4887 Ā1036 Ā2074 Ā1808 ¾7 Ā525 Ā13353 Ā9503 Ā14127 Ā10270 Ā11571 Ā12321 Ā12588 Ā14375 Ā13602 Ā10798 Ā9266 Ā8221 ø ø ø ø ø ø ø ø _etr: Ā288 Ā770 Ā1284 Ā1284 Ā1798 Ā2312 Ā2312 Ā2826 Ā3340 Ā3340 Ā3854 Ā4368 Ā4368 Ā4882 Ā5396 Ā5396 Ā5910 .word 6424 Ā6424 Ā6938 Ā7452 Ā7452 Ā7966 Ā288 ø ø ø ø ø ø ø ø _ptr: Ā1808 Ā5396 Ā3101 Ā4380 Ā3841 Ā6679 Ā4613 Ā2591 Ā2050 Ā3608 Ā6944 Ā2307 Ā3347 Ā1566 Ā2838 Ā6404 ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø _s_boxes: Ā1038 Ā269 Ā3842 Ā2059 Ā2563 Ā3078 Ā2309 Ā1792 Ā3840 Ā1031 Ā526 Ā269 Ā1546 Ā2828 Ā1289 Ā2051 Ā260 Ā2062 Ā1549 Ā2818 Ā3087 Ā1801 Ā2563 Ā5 Ā3087 Ā520 Ā2308 Ā1793 Ā2821 Ā3587 Ā10 Ā3334 Ā271 Ā3592 Ā2822 Ā1027 Ā1801 Ā3330 Ā12 Ā2565 Ā3331 Ā1796 Ā527 Ā3592 Ā12 Ā2561 Ā2310 Ā1291 Ā3584 Ā2823 Ā1034 Ā269 Ā2053 .word 1548 Ā777 Ā3842 Ā2061 Ā266 Ā3843 Ā516 Ā1547 Ā3079 Ā1280 Ā2318 Ā10 Ā3593 Ā774 Ā1295 Ā3329 Ā1804 Ā1035 Ā2050 Ā1805 Ā2304 Ā1027 Ā2566 Ā2050 Ā3589 Ā2828 Ā271 Ā1549 Ā2308 Ā3848 Ā3 Ā267 Ā3074 Ā2565 Ā1806 Ā2561 Ā13 Ā2310 Ā1800 Ā3844 Ā782 Ā1291 Ā3074 Ā3335 Ā782 Ā1536 Ā2569 Ā513 Ā1288 Ā3083 Ā3844 Ā2061 Ā1291 Ā3846 Ā768 Ā1796 Ā3074 Ā2561 Ā2318 Ā1546 Ā9 Ā2828 Ā3335 Ā271 Ā3587 Ā517 Ā1032 Ā3843 Ā1536 Ā266 Ā2061 Ā1033 Ā2821 Ā1804 Ā3586 Ā3074 Ā260 Ā2567 Ā1547 Ā1288 Ā3843 Ā13 Ā2318 Ā2830 Ā3074 Ā1796 Ā269 Ā5 æ5 Ā2307 Ā1544 Ā516 Ā2817 Ā3338 Ā2055 Ā2319 Ā1292 Ā774 Ā3584 Ā2059 Ā1804 Ā3585 Ā3330 Ā3846 Ā2304 Ā1034 Ā773 Ā268 Ā3850 Ā521 Ā2054 Ā3328 Ā1027 Ā1806 Ā2821 Ā3850 Ā516 Ā3079 Ā1289 Ā262 Ā3597 Ā2816 Ā2051 Ā3593 Ā1295 Ā2050 Ā780 Ā7 Ā2564 Ā3329 Ā1547 Ā772 Ā3074 Ā1289 æ5 Ā3595 Ā1793 Ā6 Ā3336 Ā2820 Ā3586 Ā15 Ā3336 Ā3075 Ā1801 Ā2565 Ā262 Ā13 Ā1803 Ā2308 Ā2561 Ā782 Ā3077 Ā3842 Ā1544 Ā1025 Ā3339 Ā780 Ā3591 Ā3850 Ā2054 Ā1280 Ā521 Ā2822 Ā2061 Ā1025 Ā1802 Ā1289 Ā3840 Ā526 Ā3075 Ā525 Ā1032 Ā3846 Ā267 Ā2314 Ā3587 Ā5 Ā1804 Ā3841 Ā2061 Ā778 Ā1031 Ā1292 Ā2822 Ā3584 Ā521 Ā2823 Ā260 Ā3081 Ā526 Ā1536 Ā3338 Ā783 Ā2053 Ā258 Ā1806 Ā2564 Ā3336 Ā3087 Ā9 Ā1283 Ā2822 _rots: Ā1 Ā1 Ā2 Ā2 Ā2 Ā2 Ā2 Ā2 Ā1 Ā2 Ā2 Ā2 Ā2 Ā2 Ā2 Ā1 † _tranņose: ƒ ‚ ×ņ,#64 ˆ Äņ,#-62 Ąäņ » € Į62Ē Ąį64 € Ó___stb ¤ Ūä-6Å € Ąäņ Äį2 € Ąį64 € Ó___stb Äņ,#70 • ĮŌ óŌ  ™ jle I0012 › ÄåĪ Œ Ž ×į1 Ąčė › ÄåÅ Źal,-64(ń_ļ) ŗ ­   … „  _rotate: ƒ ‚ ×ņ,#8 ¢ ” ’ Äā55 ĄĻ,ģ ’ ‡ Œ €  ž  – ĄŠ,ė ’ ‡ Źal,28Ē €  ž  – ĄŲ,ė I0023: push Ę ÄĘ,#1 £ ‰ Ķåė jae I0022 § — óė Ąčė Œ Ź(ļ),al ĢI0023 I0022:  ž ĄäŠ – ’ Ź27Ē,al  ž ĄäŲ – ’ Ź55Ē,al … „  ® _EP: Ā_etr † _f: ƒ ‚ ×ņ,#214 ĮŌ Äņ,#-62 Ąäņ » € Į62Ē Ąį64 € Ó___stb ¤ Ūä-6Å € Ąäņ Äį2 € Ąį64 € Ó___stb Äņ,#70 Ąį48 € Į_EP Ūä-6Å € Ó_tranņose ¤ ¢ sal į1 » Ąä_rotsĒ Ą-19Å,ė I0035: Ķ-19Åö je I0032 “ Ó_rotate Š ó-19Å ĢI0035 I0032: “ Äņ,#-62 Ąäņ » € Į62Ē Ąį64 € Ó___stb ¤ Ūä-12Ō € Ąäņ Äį2 € Ąį64 € Ó___stb Äņ,#70 Ąį48 € Ąį_KeyTr2 € Ūä-12Ō € Ó_tranņose ¤ Ūå-14Å Ą-19Ī,ģ Ūå-1Ī Ą-19Ō,ģ Ūå-80(ń) Ą-200(ń),ģ I0037: Ūå-192(ń) Ķ-19Ī,ģ jbe I0036 Ä-200(ń),#-1 Ąå-200(ń) ‡ Œ € Ä-19Ō,#-1 Ąå-19Ō Œ Ž ‰ Ėåė Ä-19Ī,#-1 Ąč-19Ī Ź(ļ),bl ĢI0037 I0036: Ąä10(ń) Ą-19Ō,ė Ą-19Åö I003C: Ķ-19Å,#8 jge I0039 Į-19Ī Ä-19Ī,#1 ‰ Ąć5 Œ Ž sal äcl  ž – Ą-20Å,ė  ž Ąä-20Å – € Į-19Ī Ä-19Ī,#1 ‰ Ąć3 Œ Ž sal äcl ‰ Äåė ¦  ž  – Ą-20Å,ė  ž Ąä-20Å – € Į-19Ī Ä-19Ī,#1 ‰  Œ Ž sal äcl ‰ Äåė ¦ ž  call Ś Ą-20Å,ė  ž Ąä-20Å – € Į-19Ī Ä-19Ī,#1 ‰ Ąć1 Œ Ž sal äcl ‰ Äåė ¦  ž  – Ą-20Å,ė  ž Ąä-20Å – € Į-19Ī Ä-19Ī,#1 ‰ Œ Ž ‰ Äåė ¦  ž  – Ą-20Å,ė  ž Ąä-20Å – € Į-19Ī Ä-19Ī,#1 ‰ Ąć4 Œ Ž sal äcl ‰ Äåė ¦  ž  – Ą-20Å,ė Ąć6 Ąä-19Å sal äcl » Äå-20Å ‡ Źal,_s_boxesĒ €  ž  – Ą-202(ń),ė Ąć3 Ąä-202(ń) sar äcl Öį1  ž – Ąå-19Ō ŗ Ä-19Ō,#1  Ąä-202(ń) sar äcl Öį1 ž – Ąå-19Ō ŗ Ä-198(bp),#1 Ąä-202(ń) sar į1 Öį1  ž – Ąå-19Ō ŗ Ä-19Ō,#1 Ąä-202(ń) Öį1  ž – Ąå-19Ō ŗ Ä-19Ō,#1 Ü-19Å ĢI003C I0039: Ąį32 € Ąį_ptr € Į10(ń) Ó_tranņose ¤ … „  É_setkey _setkey: ƒ ‚ ˆ Äņ,#-62 Ąäņ » € Į62Ē Ąį64 € Ó___stb ¤ Ąį_key € Ąäņ Äį2 € Ąį64 € Ó___stb Äņ,#70 Ąį56 € Ąį_KeyTr1 € Ąį_key € Ó_tranņose ¤ … „  É_encrypt _encrypt: ƒ ‚ ×ņ,#136 ¢ ” Ąį64 € Ąį_InitialTr € ” Ó_tranņose ¤ ĄĻ,#15 I0055: ĶĻö jl I0052 ĶĪö je I0057 ¹ ĢI0058 I0057: 5 ×äĻ € I0058: ĆŠ Į-2(ń) Äņ,#-62 Ąäņ » € Į62Ē Ąį64 € Ó___stb ¤ Ūä-72(ń) € Ąäņ Äį2 € Ąį64 € Ó___stb Äņ,#70 ĄŲ,#31 I005C: ĶŲö jl I0059 ĄäŲ Äį32 Ąčė ĄåŲ ÄåĘ Źal,-72(ń_ļ) ŗ óŲ ĢI005C I0059: Ūä-13Ī € ” Ąį_key € ĮŠ Ó_f Äņ,#8 ĄŲ,#31 I00510: ĶŲö jl I0053 ĄčŲ ĄéŲ Źal,-72(ń_š) Ž Źbl,-136(ń_ļ) Õbh,bh Ėåė Äč#32 ÄčĘ Ź(ļ),bl óŲ ĢI00510 I0053: óĻ ĢI0055 I0052: Ąį64 € Ąį_swap € ” Ó_tranņose ¤ Ąį64 € Ąį_FinalTr € ” Ó_tranņose ¤ … „  É_crypt _crypt: ƒ ‚ ×ņ,#148 ³ _1: .zerow 16/2 † Ūå-6Ī Ą-6Ō,ģ I0063: ’ cmpb Ēö je I006A Ūbx,Ę Ķ-6Ō,ģ jae I006A Ą-13Ī,#7 I0067: Į-13Ī ó-13Ī  ™ je I0066 ’ Œ Ž ‹ Ąę-13Ī sar äcl  ž – Öį1  ž – Ąå-6Ō ŗ Ä-6Ō,#1 ĢI0067 I0066: ˜ Ąå-6Ō ŹĒö Ä-6Ō,#1 ĢI0063 I006A: ŪåĘ Ķ-6Ō,ģ jae I0069 Ąå-6Ō ŹĒö Ä-6Ō,#1 ĢI006A I0069: Ūå-6Ī Ą-6Ō,ģ Į-6Ō Ó_setkey Š I006D: Ūå0(ń) Ķ-6Ō,ģ jae I006C Ąå-6Ō ŹĒö Ä-6Ō,#1 ĢI006D I006C: Ąį_etr € Äņ,#-62 Ąäņ » € Į62Ē Ąį64 € Ó___stb ¤ Ūä-132(ń) € Ąäņ Äį2 € Ąį64 € Ó___stb Äņ,#70 Ūå-132(ń) Ą_EP,ģ Ą-13Åö I00612: Ķ-13Å,#2 jge I006F “ ÄĪ,#1 ‰ Œ Ź-135(ń),al Ąå-13Å Źal,-135(ń) Ź_1Ē,al Źal,-135(ń) Ž ‹ Ķį90 jle I00614 Źal,-135(ń) Ž ‹ ×į59 Ź-135(ń),al ĢI00615 I00614: Źal,-135(ń) Ž ‹ Ķį57 jle I00617 Źal,-135(ń) Ž ‹ ×į53 Ź-135(ń),al ĢI00615 I00617: Źal,-135(ń) Ž ‹ ×į46 Ź-135(ń),al I00615: Ą-13Ōö I0061C: Ķ-13Ō,#6 jge I00610 Źal,-135(ń) Ž ‹ Ąę-13Ō sar äcl  ž – testb al,#1 je I0061A Ąį6 mul -13Å Ää-13Ō Ą-14Ī,ė Ąč-14Ī  ž Źal,-132(ń_ļ) Ž – Ą-14Ō,ė Ąä-14Ī Äį24 Ąčė Ąé-14Ī Źal,-132(ń_ļ) Ź-132(ń_š),al  ž Ąä-14Ō – Ąå-14Ī Äā24 Ąčģ Ź-132(ń_ļ),al I0061A: Ü-13Ō ĢI0061C I00610: Ü-13Å ĢI00612 I006F: cmpb _1+1ö ŁI00621 Źcl,_1 Ź_1+1,cl I00621: Ą-13Åö I00626: Ķ-13Å,#25 jge I00623 ‡ € Ūä-6Ī € Ó_encrypt Š Š Ü-13Å ĢI00626 I00623: Ą_EP,#_etr Ūå-6Ī Ą-6Ō,ģ ĄÅ,#_1+2 I00628: Ūå0(ń) Ķ-6Ō,ģ jae I00627 Ą-13Īö Ą-13Ō,#6 I0062B: Į-13Ō ó-13Ō  ™ je I0062A Ąä-13Ī sal į1 Ą-13Ī,ė Į-13Ī Į-6Ō Ä-6Ō,#1 ‰ Œ Ž ‹ ‰ or äģ Ą-13Ī,ė ĢI0062B I0062A: Ä-13Ī,#46 Ķ-13Ī,#57 jle I0062E Ä-13Ī,#7 I0062E: Ķ-13Ī,#90 jle I00631 Ä-13Ī,#6 I00631: ’ Ąä-13Ī ŗ ˜ ĢI00628 I00627: ’ ŹĒö Ąį_1 … „  ³ _key: .zerow 64/2 † stb.s #Ųx¤cČ___stb É___stb † ___stb: ƒ ‚ ĶÅö jle I0013 I0017: “ ÄĪ,#1 ‰ ĄčŌ Œ Ź(ļ),al ÄŌ,#1 óÅ ŁI0017 • … „  Čp0@˜$%Ī—‹Ü‹ƒĆ‹Į@ŃąĆ£PSQčćƒÄPč&8+Ąč5>‹vƒž~¾‹ŽŃć’·8čćƒÄ‹ų‹FˆE‹ĒéI>+Ąč >‹¾ŠE˜*䋹ƒž~¾ƒžu ’uč6ƒÄ‹ŽŃć’·8Wč ƒÄé>+ĄčŃ=‹^Ńć’·Jč‰ƒÄ‹ų‹F‰E‹Ēéļ=+Ąč°=‹¾…’t6‹5‹E-=wŃą“’§Z’učƒÄ‹]Ńć’·JWčĀƒÄ‹žėĖ’uėįé©=+Ąčj=‹¾ė‹5øPWčžƒÄ‹ž…’uķéˆ=+ĄčI=øPčƒÄév=+Ąč7=øP’včqƒÄéa=+Ąč"=ø Pč߃ÄéO=+Ąč=ø P’včJƒÄé:=+Ąčū<ø PčøƒÄé(=+Ąčé<‹F Pč£ƒÄé=+ĄčŌ<øPč‘ƒÄé=øčĮ<+’ĒFųėQ‰<‹žė;‹^ųŃ拉‡˜$‹Fų‰D…’tå;÷rį‰~śė ‹^ś;7v ‹‰Fś‹^śƒ?uģ‹^ś‹‰‰7‹^ųŃć‹·˜$…öuø’Fųƒ~ų|źėn‹‹GE‹‹‰‹EŃąĒ9tēėø:P‹EŃąĒ-:PčvƒÄƒmƒ} sįƒ}|øP‹EŃąĒ-PčQƒÄƒm‹‰Fś‹EŃąPWč;ƒÄ‹~ś…’uœé$<+Ąčå;¾:ė0‹Ę+ҹ÷ń‹ŲŃ㋿˜$…’tėQ‹F+ҹ÷ń‹ŲŃ拉‡˜$ėfƒī;vĖčįž‹F+ҹ÷ń‹ŲŃ㋿˜$…’uɾ:ėH‹Ę+ҹ÷ń‹ŲŃ㋿˜$…’t0‹Ę+ҹ÷ń‹ŲŃ拉‡˜$‹Ę+FP‹F+Ņ÷ńŃąĒP蔃Ä‹Ēé‚;ƒī;v³+Ąėń+Ąč7;ƒ~<}@‹F+ҹ÷ń‹ŲŃ㋿˜$…’t‹F+Ņ÷ń‹ŲŃ拉‡˜$ė"’v苃Ä‹ų…’u’vč ’ė’včtƒÄ‹ų…’u ødPč+ƒÄ‹÷ė ‹ŽƒĘĒƒnƒ~ķ‹Ēéö:+Ąč·:‹F+ҹ÷ń‹ŲŃ拇˜$‹^‰‹F+Ņ÷ń‹ŲŃć‹F‰‡˜$éÅ:+Ąč†:‹F£Ō$‹F£Ö$é±:+Ąčr:ėCƒ>b~R”bŃąPč<7ƒÄ‹ųƒ’’uŃ>bė;>Ö$t‰>Ö$‰>Ō$ƒ’’uƒ>bĶ”bŃąÖ$‹F+ҹ÷ńŃąŌ$;Ö$s§ƒ>bu+ĄéE:‹>Ō$‹F+ҹ÷ńŃąŌ$£Ō$‹Ēėāøčź9ĒFöĒFųĘŲ$‹>ī$…’u郋‰FśŠE˜-=wŃą“’§¬‹]‹G©u‹]OŠE˜*ä=–uéK~éü=Itx~éĻ=)tn=6ti=?td=At_‹Fų‰‰~ųé ‹]‹G©u¹ėƋ]‹G©u¬ė¢‹uė=t#‹4…ötš‹D=uķ‹\‹G©uē‹\OėŻ‹\‹G©tėėŠŠE˜=wŃą“’§“’u’uč‘)ƒÄėƒ‹E™RPėšŠE˜*ä™-lƒŚėķ‹E‰Fņ‹Ų‹G©ugż’€>Ų$uV€>Ś$tOčŗū‹^ņ‰GĒFōė6‹^ō¹Ó拗Ž$‹‡Ü$‰Fī‰Vš‹^ņ‹G‹Vō¹Óā‹؋Vš‹FW’Fō‹Fō;č$|Į‹^ņ”Ŗ‰G‹Fö‰‰~ö‹~śé€žĘŲ$’ŖėēĘŲ$ėó€>Ų$tŁĘŲ$ėå€>Ų$t ĘŲ$’Ŗ‹uĒč$ė.‹č$¹Óć‹T‹D‰‡Ü$‰—Ž$’č$‹4ėƒ>č$} ƒ|tŌ+ö…öuķƒ>č$|øė+Ą¢Ś$éq’‹]‹G©u‹]gż’Wč°łƒÄé\’=eu霾=hu锾=qu錾=…u鄾é"ž=œué7’=—ué?’=™t¼=št·=›t²éžż=t—=žt’=Ÿuéūž=”ué!’=¢uépžéŁżƒ>$t‹š$‹G©ugż’‹Fų£@%‹Fö£B%Ēī$éZ7øč7¾D%ė ‹‰Fų…ĄugƒĘžB&rī€>$u鉒6B&čŅ(ƒÄ‹ų”X$£B&øųPø$Pč()ƒÄ‰Fś…Ąu øśPč'ƒÄø­PčÆ$ƒÄøŸPč$ƒÄøPč\$ƒÄ¾D%ė\‹^ų‹G©uSč#ƒÄ‹^ų‹éx’‹ė4’vśča(ƒÄ‹ųø$Pč55ƒÄ‹ųé§6‹^ų‹G%=uSčģ$ƒÄ‹^ų‹‰Fų…Ąu߃ʁžB&rø’6B&ø’Pč6/ƒÄ’vśčŪ)ƒÄ‹ų=’’tž’6B&Wėć+Ąč6ččĆéJ6+Ąč 6’6@%čJƒÄæö$ė9‹5ė.÷Dt%‹\O‹\’G÷DuL‹\ ’7čƒÄ‹4…öu΃ǁ’@%rĮéō5+Ąčµ5‹¾ėX€}u;‹uŠE˜*ä=†t‹tL÷DuL‹\ ’7čÅ’ƒÄŠE˜*ä=†t’DŠE˜*ä‹ŲЇ˜%0=0t‹=…’u¤éŠ5øčJ5æ@%ĒFśĘFłéŊD˜*ä‰Fö=†un‹\‹G©t>ĘFłƒ~śt4‹^ś‹97u+‹^ś‹‹_‹G;Du‹^ś’7ččöƒÄ‹~ś‰5ĒFś‹\’O‹\‹G;Du‹\‹G©u‹\ƒuĘFųėĘFų€~łt€~ųt‹4’5č™öƒÄ‰5ė+~ö…"‹^öЇ˜%0=0uĘFłŠD˜*ä=u‰~ś‹ž‹5…öté2’é¤4+Ąče4’6V$č (ƒÄ‹ų’6V$čž'ƒÄ‹šž€|ī‹Ę¹Óą Ēéq4øč14’6V$čÖ'ƒÄ™‰Fų‰Vś’6V$čÅ'ƒÄ¹Óą+Ņ Fų Vś’6V$č®'ƒÄ™¹ŃąŃŅāś¹ŃąŃŅāś Fų Vś’6V$č‹'ƒÄ‹ų’€|ļ‹Ē™¹ŃąŃŅāś¹ŃąŃŅāś¹ŃąŃŅāś Fų Vśéć3+Ąč¤3’6V$čI'ƒÄ=’’uńéĢ3+Ąč3čŠ=t øbPč@$ƒÄ”béÆ3+Ąčp3č³=łt"=t øoPč$ƒÄ+ĄP’vøhPčÓƒÄé€3øėź+Ąč<3č=t=tøPčź#ƒÄ”b™éX3‹f”dėō+Ąč3’vøPøhPčJ'ƒÄé63øčö2¾hč^’‹ųė’6V$č‘&ƒÄ‰FśžĢs‹ŽFˆ‹ĒO…Ąuį‹ŽFĘéž2+Ąčæ2‹F-š= wBŃą“’§Ī’6V$čR&ƒÄ£bøéŌ2č-žėņ’6V$č:&ƒÄPčr’ƒÄøėāčžėļč{’ėńčv’‹FėŠčž£bøėÅč(ž£d‰føė¶č–=t ø“Pč#ƒÄč„=t=tø£Pčļ"ƒÄø눸ėƒ+Ąč2’6V$čĄ%ƒÄ‹ųƒ’’u5øė-ƒ’|1‰>bøė’–|(‰>bøė’“|…L’£bøé2’…~ʁ’”~ҁ’š|ŪWčūžƒÄėā+Ąčµ1’6V$čZ%ƒÄ‹ų’š}…’| Eˆ£bøéĶ1WčĖžƒÄėō+Ąč…1’$č^’-=wŃą“’§āø³Pč*"ƒÄƒ>$t øĢPč"ƒÄčYėøPčóƒÄ‹ųĘE¢+ĄPøPøhPčøƒÄ‰E”ī$‰‰>ī$ė›čYøPčÜņƒÄ‹ųĘE†’6bčdƒÄ‰E‹]ƒ t’6bøźPč®!ƒÄ‹]‰ ė¶’6bč;ƒÄ…ĄuéK’é1č‹6bŠ„˜©tč’ž-ł=wŃą“’§ōøPče!ƒÄ+ĄPč`ņƒÄ‹ųė6>b”}”blė劄˜%= t@ƒ>bœ}ÜøPč.ņƒÄ‹ų”b‰E‹Ę˜ˆEé)’øPčņƒÄ‹ų‹f”d‰E‰UėÜčrøPčõńƒÄ‹ų’6bčƒÄė¾øPčŻńƒÄ‹ų+ĄP+ĄPøhPčŒƒÄė øPčæńƒÄ‹ųøėßøPč®ńƒÄ‹ų+ĄPPøhPč_ƒÄ‰E”b‰Eél’øPčˆńƒÄ‹ų+ĄPPøhPč9ƒÄ‰E‹f”d‰E‰Ué?’+Ąč—/‹¾ė$ƒ}učÆņ‰‹ų’6V$č)#ƒÄUU‹Śˆ’E‹F‹Vƒnƒ^…Ņu…ĄuĘéŽ/øčN/øPč ńƒÄ‰Fś‹šĘFłč{ż-ł=wŃą“’§øPčįƒÄ”b™£d‰f+ĄPč5ńƒÄ‹ų‰‹f”d‰E‰U‹÷ƒ~t ƒnuĘFł€~łu§‹Fśé/čøPčłšƒÄ‹ų‰’6bčƒÄ‰E‹]OėŗøPčŌšƒÄ‹ų‰+ĄP+ĄPøhPčƒÄ‰Eė—øP豚ƒÄ‹ų‰øėŚ”b™£d‰føP蓹ƒÄ‹ų‰+ĄPPøhPčŽƒÄ‰E‹f”d‰E‰UéJ’øPčdšƒÄ‹ų‰čļś‰Fō‰VöEP’vö’vō聞ƒÄé ’øėøėøPč0šƒÄ‹ų‰čjś™‰Fō‰Vö‰EEPčŖśRPėĒĘFłéėž+ĄčŪ-‹¾ė …’t‹=’Nƒ~ń…’u ø0Pč}ƒÄƒ}t øCPčmƒÄ‹U‹EéŁ-ø^č™-”0’0=Č|ƒ>$u č‹Ē0‹F-–= wŃą“’§JøSPč&ƒÄøPčžƒÄ‹ų‹FˆE”ī$‰‰>ī$+Ąé{-+ĄėßøPčüīƒÄ‹ųøP赳ƒÄ‰EėĶ荳‰Fų至‰Föƒ~ųt9…Ąt5”ī$‰Fśƒnöu‹šė ‹^ś‹ėģ‹4‹Fų’Nų…Ąuō‹^ś‹?‹‰”ī$‰‰>ī$+ĄPč—īét’+ĄPčtżƒÄ‹ų+ĄP’u茞ƒÄ= véZ’Ńą“’§2čüųø’’PčŠ&ƒÄĘ$é>’øP’u詞ƒÄ£0$‰2$øP’u蕾ƒÄ£4$‰6$é’Ęō$čœ‹]’7čØƒÄWčBīƒÄ+ĄPčīƒÄ‹ųĒFšéꞃ>$~F VW¾ź$‹ų¹+ėó„_^ėč$øPč ųƒÄ£š$čRś=’t&=t/=t5øbPčøƒÄė7‹^žŃćLJö$’FžėKĒź$’’Ēģ$’’ė”b™£d‰f‹f”d£ź$‰ģ$’$Ęō$ƒ>$éažĒī$Ēņ$ĒFžƒ~ž%|ŸčśF VW‹šæź$¹+ėó„_^’$é-žƒ>$u øxPč'ƒÄ脳=’t=t2=t8ėqĒ$Ē0éłż>ģ$’’uZ>ź$’’uRø†PčźƒÄėF”b™£d‰f>ģ$’’u>ź$’’t‹ģ$”ź$;fu;dt ø„Pč°ƒÄ‹f”d£ź$‰ģ$čāĒš$ƒ>$ué|’ø逿+Ąčæ*ƒ>$u øŃPčsƒÄéå*øč¤*+ö‰vś‹~ė‹ßGŠ˜‹Öā‹ŹÓą1FśƒĘ€=uå‹Fśé³*øčs*’včĆ’ƒÄ+ҹ÷ń‹ĀŃąD%‹ųėWødP’v‹ Pčr(ƒÄ…Ąu>‹5‹D3F©t ’vø2PčģƒÄƒ~u÷Dt ’vøPPčŅƒÄL‹Ęé=*‹=ƒ=u¤’vč(ƒÄ@‰Fś©t’Fśƒ~śd~ĒFśd’vśččģƒÄ‹š‰’vś’vD Pč6(ƒÄ‹F‰Dƒ~uL”0‰D’0ėš+Ąč)‹F+ҹ%÷ń‹ĀŃąö$‹ųė‹‹G;Fu‹é³)‹=ƒ=uźčHģ‹š‰‹F‰D‰t‹Ęėā+ĄčY)‹^‹£D?ėƒF‹^‹€?-u‹^’7č{ƒÄ‹F’N=܃~~’6D?ø˜P’6Z$čzƒÄø’’Pčų"ƒÄƒ~t&’6V$ø°P‹^’7č­ƒÄ…Ąu‹^’7ø²Pč¢ƒÄčKøD?PøD&PčDīƒÄč?÷č¦ńčż+Ąéų(+Ąč¹(‹¾ė€=tŠ˜=LuĘ$Gėė=nuųĘ$ėńéÉ(+ĄčŠ(čō=­t øĮPč=ƒÄ€>$t,øŅPø$PčÄ%ƒÄPč«ƒÄ£B&…Ąu ø$PøŌPč ƒÄė”X$£B&ø­Pč&ƒÄél(+Ąč-(‹¾Š˜*ä=‡|Š˜*ä-‡ŗ÷ź¾!¼!‹ŲŠˆé<(ø čü'‹6$”4$;2$u;0$uǼ!ė‹2$”0$ŃąŃŅ96$u 94$uǼ!”"‰Fśéx‹FśD‹ųE‹š‹ŽFŠ˜*ä‰Fų=’u‹ŽFŠ˜*ä‰Fų‹ŽFŠ˜*ä¹Óą Fų‰vō‹Fų‰Fņė ‹ĘFPč?’ƒÄ‹Fų’Nų…Ąuģ‹ŽFŠ˜*ä=’uƒĘ‹ŽFŠ˜*ä‰Fų=’u7‹ŽFŠ˜*ä‰Fų‹ŽFŠ˜*ä¹Óą Fųė‹ĘFPčīžƒÄ‹ŽFŠ˜*ä=’uƒĘ‹Fų’Nų…ĄuÜĒFö‹vō‹Fņ=t;=t‹Fö¹Óą‹ŽFйÓāÓś*ö3‰Fö‹Fö¹Óą‹ŽFйÓāÓś*ö3‰Fö‹Fö¹Óą‹ŽFйÓāÓś*ö3‰Fö‹Fś‰FųŠE˜*äŠU¹ÓāÓś¹Óā ‰Fś‹Fö¹Óčˆfö’‹^öŃ拇Ž?*äˆE‹^öŃ拇Ž?¹ÓųˆE‹^öŃć‹Fų‰‡Ž?ƒ~śtéžéq&+Ąč2&€>Ź!uč&žĘŹ!čéW&øč&ø@%Pčä ƒÄæö$ėC‹5ė8‹\ ƒ?t.‹\ ‹ŠG˜*ä‰Fś=†t=u ‹\ ‹‹G‰Dė ’t č„ ƒÄ‹4…öuăǁ’@%r·éö%+Ąč·%ƒ~| ‹V‹Féā%‹V‹F÷Ś÷؃Śėīøč“%‹F=tq=ué¾ĒFś‹F H¹ÓąF?‹šžF?s駋;FuA‹\‹W ‹G+FVRP萒ƒÄ‰Fņ‰Vōƒ~śt ;Vų|;Fös‹D‰Fś‹Vō‹Fņ‰Fö‰VųƒīėŖ‹V‹F™;Vu,=œ’|=”}lPčĆęƒÄ‹ųė,øPčµęƒÄ‹ų‹F‰EėøPč”ęƒÄ‹ų‹V‹F‰E‰U‹Ēé’$øė̓~ųuƒ~öuøPčsęƒÄ‹ųėS‹^ś‹W ‹G‰Fī‰Vš‹V‹F+FīVš‰Fö‰Vų™;VųuøPč>ęƒÄ‹ų‹Fö‰EėøPč*ęƒÄ‹ų‹Vų‹Fö‰E‰U‹Fśéf’ø čG$ŗ’’‹Ā‹N…ÉtŃąŃŅāś‰Fų‰Vś÷Š÷҉Fō‰Vöƒ>2$uƒ>0$tƒ>2$u ƒ>0$uø’’ėø’™!Fų!Vś‹2$”0$¹ŃąŃŅāś+FV ‹v‹^‹Č…ÉtŃžŃŪāś#^ō#vö‰^š‰vņ‹V‹F‹N…ÉtŃąŃŅāś#Fų#Vś Fš VņéŽ#øčž#‹¾‹Їä˜=ué­=t`=‹Eŗ÷ź$P芒ƒÄVšVW‹š‹ś¹ėó„_^ƒ~št‹€ætƒ~št‹€æ$tƒ~štøĢ!‹šæØI¹ėó„øØIé`#‹Eŗ÷ź$Pčs’ƒÄVöVW‹š‹ś¹ėó„_^ƒ~ötĮ‹€ætƒ~öt²‹€æ$tƒ~öu£ĒFźĒFģĒFī‹=wŃą“’§Ņ!‹E™‰Fģ‰Vīė‹Fų;Fņu ĒFģĒFīFźée’‹EH¹ÓąF?éV’‹Fö;FštéH’=tɋVś‹Fų;VōuŠ;FņuĖėæ‹Fö;Fšu·=u ‹Fų;Fņt“먋Vś‹Fų;Vōu;Fņt¢ė–‹Fö;Fštéżž‹Vś‹Fų;Vō|,;Fņv%øéb’ų;Fņsóė‹Fö;FštéŃž‹Vś‹Fų;Vō}į+Ąé>’‹Fö;Fšté¶ž‹Vś‹Fų;Vōå|¾;FņsŽė·‹Fö;Fšt闾‹Vś‹Fų;VōĘ|Ÿ;Fņwæė˜ƒ~śuƒ~ųtFöétž‹Eŗ÷ź$PčłżƒÄVšVW‹š‹ś¹ėó„_^ƒ~štéDžFšéAžƒ~śuƒ~ųt»‹Eŗ÷ź$PčŗżƒÄVšVW‹š‹ś¹ėó„_^ƒ~štÄéž‹Vś‹Fų Fņ Vōétž‹Vś‹Fų3Fņ3Vōéež‹Vś‹Fų#Fņ#VōéVž’vō’vņ’vś’vųčh!éDž’vō’vņ’vś’vųčv!é2ž’vō’vņ’vś’vųč¤!é ž‹Vś‹Fų‹Nņ…ÉuéžŃąŃŅāśéž‹Vś‹Fų‹Nņ…Éué÷żŃśŃŲāśéīż‹Vś‹Fų÷Ś÷؃ŚéŽżƒ~śuƒ~ųt鋾écž‹Vś‹Fų÷Š÷Ņéæżƒ~ö|ƒ~š|é2ż‹Föė‹Fš‰Fź‹Vś‹FųFņVō閿ƒ~ö|&ƒ~šu‹Fö‰Fź‹Vś‹Fų+FņVōéuż‹Fš;Fötééģüƒ~š|ąéćü‹6$”4$éWż‹2$”0$éMż’vś’vųč㹥téöżéĪż‹Eŗ÷ź$PčAüƒÄVöVW‹š‹ś¹ėó„_^ƒ~öuéʿ鞿‹Vś‹Fų3Fņ3Vō}é²żéŠż‹EH‹Ų¹Ó拇L?‰F腡ué\ü‹ŲƒuéQü‹Eŗ÷ź$PčŁūƒÄVšVW‹š‹ś¹ėó„_^ƒ~šté$üƒ~ō}éüƒ~ō|~éüƒ~ņréü‹^č‹G‹Vņ¹Óā‹؋W‹éküĒFäĒFę‹Vō‹Fņ-ƒŚ‹šė!ø‹ĪÓą™‰Fą‰Vā‹Vę‹Fä Fą Vā‰Fä‰VęFƒž |Ś‹Vś‹Fų#Fä#Vęu…Ąué­ü‹Vś‹Fų#Fä#Vę;Vęté¾ü;Fäté¶üéŽüĒFäĒFę‹vņė!ø‹ĪÓą™‰Fą‰Vā‹Vę‹Fä Fą Vā‰Fä     ‰VęFƒž |Ś‹Vś‹Fų#Fä#Vętémü…Ątéfüé>ü’vō’vņ’vś’vųčśƒÄé’ūø čI‹¾‹ßGŠ˜*ä‰Fś=’u‹ßGŠ˜*ä‰Fś‹ßGŠ˜*ä¹Óą FśĒFōFō‰Fņ鉋ßGŠ˜*ä‰Fų‹ßGŠ˜*ä‰Fö=’u‹ßGŠ˜*ä‰Fö‹ßGŠ˜*ä¹Óą Föƒ~öt'’v‹Föŗ÷ź$PčśƒÄ‹Ų’w’w’7čųƒÄė +ĄPči߃Ä‹š~ų†u‹\‰w ‹^ņ‰7‰vņ‹FųˆD‹Fś’Nś…Ątéj’‹^‹7ė’N‰vš‹4ƒ~ņ‹^šĒ‹^ņ‰7‹^‹7‹Fō‰ė‹‰FšVč1߃Ä‹vš…öuķøéjøč*‹¾‹ßGŠ˜*ä‰Fų=’u‹ßGŠ˜*ä‰Fų‹ßGŠ˜*ä¹Óą Fųƒ~u ƒ~ų}鬋Fų;Fté”ĒFś‹^‹‰Fö‹Fś;Fų|‹Fś;FųtéĒFś‹^‹‰Fö¾F?éüƒ~öt܋^öŠG˜‹ßGйÓāÓś;ĀtéN’Fś‹^öė­Ńą“’§"Ēéø‹^öŠG˜=vęĒŠG˜*ä-l™é•Ē‹^ö‹GėšĒ‹^ö‹W‹GėzĒ‹^ö‹G‰Dėq‹^ö‹_‹G‰‹^ö‹G‰D‹_‹W ‹GėL‹^ö‹_‹G‰‹^ö‹G‰D‹G™ė‹^ö‹_‹G‰‹^ö‹G‰D‹W‹G‰Fģ‰Vī‹^ö‹_‹W ‹GFģVī‰D‰T’FśƒĘ‹^ö‹‰Fö‹Fś;Fų}é/’‹ßGŠ˜*ä‰Fś=’u‹ßGŠ˜*ä‰Fś‹ßGŠ˜*ä¹Óą Fśƒ~śt;‹Fśŗ÷ź$PčĆ÷ƒÄVšVW‹š‹ś¹ėó„_^ƒ~šu ƒ~ōu ƒ~ņu+Ąéu’vųW’včāüƒÄėīøč&ĒFź‹~ĘFū鋊G˜*ä=†uéų‹5‰vņŠD˜*ä‰Fō‹4…öt4¹ÓąŠT¹ÓāÓś*ö3‰Fö‹4…öt¹ÓąŠT¹ÓāÓś*ö3‰Fųė ĒFö’’ĒFų’’ĒFīƒ~ī}鍍Fō‹VīŃā‹؋*ä‹ŲŃ拇Ž?‰Fģ…ĄtMD‰FšFō‹VīŃā‹؋¹Óč‹^šŠ¹ÓāÓś*ö;Šu'‹Fī@P‹ĆPWčżƒÄ…ĄtĘFū‰~ņĒFī’Nī놋^šŠG˜*äŠW¹ÓāÓś¹Óā Āė‹‹~ņƒ=téųž€~ūt ’Fź~źˆ}éŪžé3+Ąčóƒ>2$uƒ>0$tƒ>6$uƒ>4$u ø‚"Pč’ ƒÄčŚßčՀ>$učƒƒ>$t€>$u ččróč@č…ćč—č‹ ’6B%č²ƒÄƒ>$t’6@%č”ƒÄčŖčÆėƒ>@%t ø™"Pč. ƒÄé øč`æö$ė`‹5ėU‰vśė‹^śO‹G‰Fś‹^ś‹G© tē‹G‰Fų‰vśė‹^ś‹G‰Fö‹Fų‰Gg÷’O‹Fö‰Fś‹^ś‹G©u֋4…öu§ƒĒ’@%ršé,+ĄčķæD%ė‹5ėL‹4…öuõƒĒ’B&rčéøčĒæö$ė‹5닉FśVč ŪƒÄ‹vś…öuķĒƒĒ’@%rÜéÕ+Ąč–æö$ė ‹5ėƒ| u ’tøø"Pč? ƒÄ‹4…öuēƒĒ’@%rŚé¢+Ąčc‹V‹FFV -ƒŚ‹v ‹^ƒėƒŽ÷Ó÷Ö#Ć#Öétøč4ĒFö‹>B%…’ué=ŠE˜*ä-–= wŃą“’§h"‹u‹D;FötĒFņĒFō‹D‰Fö’62$’60$’vō’vņč{’ƒÄ‰Fņ‰Vō‰D‰T ‹=ė„‹E‰Fś…Ątņ‹Ų‹G=wŃą“’§X"’62$’60$’vō’vņč<’ƒÄ0$2$‰Fņ‰Vō‹^ś‹ėæ’62$’60$’vō’vņč’ƒÄ4$6$ėՋ^ś‹G™;2$|;0$s ‹^ś‹G™RPė’62$’60$’vō’vņčÕžƒÄ‰Fņ‰Vō‹^ś‹G™‰Fī‰Vš‹Vō‹FņFīVšė€‹Fś‰Fų…Ąuév’‹Ų‹G™‰Fī‰Vš‹Vō‹FņFīVš‰Fņ‰Vō‹ėŌéøčŽ‹¾ĒFöž’…’uéLŠE˜*ä‰FųŠE˜-=wŃą“’§ #ŠE˜*ä=¢uS’uč'ƒÄ‹Fų=Ctx=Dth=†uéž=¢t‹ŲЇ˜%0= uĒFöž’’vųčµƒÄŠE˜=véŃą“’§"#’uč ė«‹uė=t‹4…ötž‹D=uķ’tčéƒÄėēƒ~öžt³’Fö뮊E˜=w^Ńą“’§#‹Eė[€>$ueĒFųD’vųčBƒÄ‹‰FśWčÜ׃Ä+ĄPčØ×ƒÄ‹ų‹Fś‰‹FųˆEė<€>$u#‹‰FśWč±×ƒÄ‹~śéāžŠE˜*ä-l‰Fō;Föt֋Fö@9Fōt”’vųčāƒÄ‹Fō‰Föé$’ĒFöž’é’‹^ųЇ˜©t’6B&°’˜PčiƒÄ‹‰FśWčP׃Ä‹~ś‹B&‹G©uéužøB#PčƒÄéhžŠE˜*ä-lPė ‹]‹_’wčŌė ‹]’wč5ƒÄė­’uėč’u’uči뚁~ų†tہ~ų–|ʋ]’wč6ėŅ’učwėŹ’6B&°ų˜Pč× ƒÄ’učaƒÄ’uė ’6B&°ų˜Pč» ƒÄ’učEƒÄ’u’u럒uč$ƒÄ‹Fų=—ué’=Ÿué’=”té’é ’é¹+Ąčz‹¾…’u闋E=wŃą“’§2#’u’uč¹ƒÄ‹=ėŚ‹]’wčƒÄėī’učĶėó’6B&°ų˜Pč- ƒÄ’uč·ƒÄ’u’uėĮ’6B&°ś˜Pč ƒÄEPč1ė½’6B&°ūė’6B&°üė’6B&°ż˜Pčē ƒÄ’učƒÄEėĪéøčĻ‹¾ĒFś‹÷ė‹DFś‹4…öuō’vśč_ƒÄė*ĒFśė’6B&EFś‹ŲŠ˜Pč ƒÄ’Fś‹Fś;E|ߋ=…’uŅé“+Ąču‹¾M÷Et÷Etø›ėø™P蝃ÄWč܃Äé+Ąč@‹¾÷Eu)M÷Eu÷EtøžėøPčaƒÄWč ƒÄéC+Ąč’6š$胒ƒÄø Pč>ƒÄ’6š$čzƒÄ’6ģ$’6ź$č=ƒÄé+ĄčŠø˜PčƒÄ’6ģ$’6ź$čƒÄéļ+Ąč°’6B&‹F˜Pč¢ ƒÄéŲ+Ąč™‹V‹F™;VuPč8ė0’6B&°ö˜Pčz ƒÄ‹V‹F+ŅPč[ƒÄ‹V‹F¹ŃśŃŲāśPčEƒÄé‹+ĄčLƒ~ˆ|ƒ~x}’6B&‹Fx˜Pč/ ƒÄė’6B&°õ˜Pč ƒÄ’včƒÄéL+Ąč ’6B&‹F*ä˜Pčż ƒÄ’6B&‹F¹Óų˜Pčé ƒÄé+Ąčą‹¾ƒ}ņ$ė‹U‹E;Vu ;FuøéV‹=…’uä+Ąėóøč ‹>ņ$ėb‹5ƒ}uƒ}tKøŸPč<żƒÄ+ŅøRPčFżƒÄĒFśėE‹Vś¹Óā‹ؒw’7č%żƒÄ’Fśƒ~ś|Żø’PčūüƒÄWčm҃Ä‹ž…’ušøŸPčäüƒÄ€>ō$tø ėø™RPčćüƒÄø’PčĀüƒÄĒņ$é„+Ąčf‹>ņ$…’t‹U‹E;Vu;Fu ƒEƒUé}‹=ėŻ+Ąč9’6$’6D?ø¼#P’6Z$芃ă>$t”š$ PødPøŃ#P’6Z$čjƒÄøŲ#P’6Z$č\ƒÄ’v’v’6Z$čLƒÄøŪ#P’6Z$č>ƒÄčŚø’’Pč¹ƒÄé+ĄčĮ+’‹ßŃヿV$t‹ßŃć’·V$č÷ƒÄGƒ’|įé×+Ąč—FP’v’včƒÄ‹^‹G©@tSčĘƒÄé¬+ĄčmFP’v’6X$čēƒÄ‹X$‹G©@tSčšƒÄé€+ĄčA’včƒÄ…Ąt+Ąéi’v’včrƒÄėļ+Ąč+’ėø’’éKGƒ’}‹ßŃć‹F;‡V$uķ‹ßŃćLJV$ƒ’}Ų’vč7ƒÄ‹^’7čXƒÄ‹^‹G© tƒt ’wč/ ƒÄ’vč& ƒÄ+Ąė øč® ĒFö+’ė(ƒ’|"ėP=wuKNöø¤P’včZƒÄ‰Fų…Ą|2ėgG‹ßŃヿV$uĶ‹^Š˜=auNöøP’vč" ƒÄ‰Fų…Ą}$+Ąé“=ru¦Nö+ĄP’vč ƒÄ‰Fų…Ą}ėÜøP+Ņ+ĄRP’vųč“ƒÄø PčCƒÄ‰Fś…Ątø‹ŲĒG‹Ų‹Fų‰‹Fö‰GøPčƒÄ‹^ś‰GƒuOė‹^śO ‹^ś‹G‰G‹ßŃć‹Fś‰‡V$‹Fśéķ øč¬ ‹^‹G©u‹G©u+Ąė0‹^ƒ~ó’w’w’7č] ƒÄ‰Fś‹^;GuĒG‹G‰G‹Fśéœ ‹^Oø’’ėšøčN ‹^‹G©tø’’ė`‹^‹G©tšƒo[‹G©t øPFśPė øP‹^’w‹^’7čļ ƒÄ‹^‰GƒƒuOėŖ‹^Oė ‹Fś*äé ‹^‹G‰G‹^‹G©uä’G‹GH‹ŲŠ˜ėŁø č² ĒFņ’’ĒFö‚‹F‰Fų‹F‰FśFP’vFņPčƒÄFņP+ĄPčƒÄ‹Fé² ø čr ‹¾‹véŒ=Dué =Oué$=Xué'=cué*’vø%Pč<ƒÄ’v‹ßGŠ˜Pč,ƒÄéL€=9~邊˜-0÷nō‰F܋Fųŗ ÷źF܉Fųé\G€=0}éd€=9~é\‹Föŗ ÷źŠ¹ÓāÓśƒź0‰FöėԃĘ‹Dž™‰Fš‰VņĒFś FßP’vś’vņ’vščUƒÄ’vFßPč¶ƒÄPŠFė˜P’vö’vųFßP鯃Ę‹Dž™‰Fš‰Vņ+Ņ뱃Ę‹Dž™‰Fš‰Vņ…Ņ}+҉Fš‰VņĒFś뜃Ę‹Dž™‰Fš‰Vņ…Ņ}+҉Fš‰VņĒFśé{’ƒĘ‹Tž‹Düéd’ƒĘ‹Tž‹Dü뻃Ę‹Tž‹DüėŠƒĘ‹DžˆFļ’vŠFļ˜PčƒÄė(ƒĘ‹Dž‰Fģ’vPčƒÄPŠFė˜P’vö’vų’vģč3ƒÄ G€=tt€=%t锾ĒFųĒFöĒFōĘFė G€=-uĒFō’’G€=0uĘFė0G€=0|évž€=.u链Š˜=du铞éž=ouéżž=suéq’=uuéÜž=xué’éžéš øčZ ĒFģƒ~uƒ~u ‹^ Ę0ĘG錃~ uƒ~}‹V‹F÷Ś÷ŲƒŚ‰F‰V’Fģ+’FšĒ‹ŲĘGƒ’ |š+’ƒ~ uN+Ņø RP’v’vč“ ‰FźFšNj؋FźˆFšĒ‹ŲŠ˜™‰Fč‰Vź+Ņø RP‹V‹F+FčVźRPč< ‰F‰Vƒ~u-‹V‹F%+ŅVš×‹Śˆ‹V‹F¹ŃśŃŲāśā’‰F‰Vƒ~u-‹V‹F%+ŅVš×‹Śˆ‹V‹F¹ŃśŃŲāśā’‰F‰VGƒ~té<’ƒ~té3’ĒFīE’‹šėDFšƋ؀?uƒ~īu FšʋŲĘ ė%FšƋ؀? } FšƋ؀0ė FšƋ؀7’FīN…ö}øƒ~ģt FšĒ‹ŲĘ-GE’‹šėFšĘ‹ŲŠ˜‹^ ˆ’F N…ö}é‹^ Ęéēøč§‹F ‰Fśƒ~~‹F ;F~‹F‰Fś‹Fś‰Fųƒ~ė8’N’vŠF ˜PčoƒÄ‹F;Fśēė‹Fś’Nś…Ąt’v‹^’FŠ˜PčHƒÄ‹^€?uۃ~})€~ 0u#’vø.Pč'ƒÄ’Fė’F’vŠF ˜PčƒÄ‹Fų÷Ų9F|åé=øčüĒFų‹^‹G©t馋G©u雋G©t øPFP‹^’7č¢ƒÄ‰Fś‹^ĒGėA‹^’G‹GH‹ŲŠFˆ‹^’G‹G=|%‹G©€u’w’w’7č`ƒÄ‰Fś‹^‹G‰G’Fųƒ~ųt7ƒ~ś~ ‹^‹G;Fśtƒ~ś} ‹^Oė‹^Oø’’éw‹^ĒG+Ąėń+Ąč+’v’vøPøPčYƒÄéN+Ąč+ĄPPPPP’vøP+ĄPčūƒÄé/øč+öĒFųėGŠ˜£~$= tō= tļ= tź= tå= tą€=-uGĒFųė ‹Ęŗ ÷ź‹švś‹ßGŠ˜-0‰Fś= rćƒ~ųt‹Ę÷ŲéÄ‹Ęėł+Ąč+ĄPPPPP’vøPøPčlƒÄé øč`‹F£’I‹V‹F£˜I‰šI‹F £”IøPøPčŠƒÄ‰Fś…Ąt™éh‹šI”˜Iėō+Ąč”‚$F%š’-‹ų;>‚$r Wč©ƒÄ…Ą}+Ąé/‰>‚$‹>€$ė‹%ž’‹ųƒ=uō”‚$‰‹‚$ĒøėÕøčĒ‹F%ž’‰Fų‹>€$…’uqøPč…ƒÄ‹ų£€$£‚$‹ŲĒėW‹Ę©t‹Ę%ž’‹ųėG‹Fś©u ‹š‹‰Fś…Ąuķ‹Ę+Ē;Fųr)‹ĒFų‰Fś;Ęs‹Ų‰7‹Fś ‰Eė ’včz’ƒÄé{‹ž‹5…öu£’vųč’ƒÄ…Ąuß+Ąėäøč"‹F-‹ų‹F%ž’‰Fų‹%ž’‹š‹Ę+F‰Föė ‹Fś©u ‹š‹‰Fś…Ąuķ‹Ę+Ē;Fųr#‹ĒFų‰Fś;Ęs‹Ų‰7ė‹Ę ‰‹Fė+Ąéõ’vč螃ĉFś…Ątė’vöP’včƒÄ%ž’‹Fśė×+Ąč‹^gžž’éæė"‹¾‹¶‹F’N…Ąt ‹ßGŠ˜‹ŽFˆėééšøčZėÖøčR+ĄPP’vPPPøP+ĄPč>ƒÄ‰Fś…Ąu ” I£„$+Ąécø’’ėųøč”„$‰Fų‹F„$‰FśPč²’ƒÄ…Ąu‹Fųé7ø’’ėųøčņč"‰Fś+ĄP’vų’vśPPPøBP+ĄPčÖƒÄé ŒŲĆø®IĆśWø +’ŽĄ&Ǥ„3Ū&‹ū¤„u= uę_ūĆøčœčE‰Fś‹F‰Fö‹^ö’Fö€?uõ’Nöė‹Fś™¹ ÷łƒĀ0‹^öˆ‹Fś™÷ł‰Fś’Nö‹^ö€?XtŪ‹Fé+ĄčO+ĄPPPPPPøP+ĄPč=ƒÄéq+Ąč1’v’vøPøPč_ƒÄéTøč+ĄPP’vP’v’vøPøPčūƒÄ‰Fśé,+Ąč틾+öėF‹ßG€?u÷‹Ęé+ĄčŃ‹¾‹¶ƒn|Š˜‹ŽFйÓāÓś;Āu ‹ßG€?uß+Ąėƒ~|öŠ˜NйÓāÓś+ĀéƸ膋¾‹¶‰~ųĒFśė‹ŽFŠ˜‹ßGˆ…Ąt’Fś‹Fś;F}ėä‹ßGĘ’Fś‹Fś;F|ļ‹Fųé{+Ąč;’v+ĄPø PøPčiƒÄé^+Ąč+ĄPP’vP’v’vøPøPčƒÄé:ė5‹F£’I‹F £”I‹F £–I‹F£˜I‹F£šI‹F£œI’v’včeƒÄėéøčĆėĆėK’v 蔃Ä‹ų‰>’I‹F£”I‹F £–I¾˜Iƒ’‹ĒO…Ąt‹^ Š˜‹ŽFˆ’F ėé’v’včƒÄė鮸čnė­ė=‹F£IøŽIP’v訃ĉFśƒ~śt‹Fśėƒ>I} ”I÷Ų£¦Iø’’딐Iėégøč'ė»ė‹¾¾‹ßG€?tFėõDėéCøčėŽ[U‹ģWV+ą;&†$r’ćǐIĒ’IĒ”IĒ˜Iˆ$øŽIPøPčÄéż’fü^_]ùé ¹é¹éU‹ģ‹†‹žĶ ]ĆU‹ģ‹F÷f‹Č‹F÷f ȋF÷fŃ]ĀU‹ģW+’‹V‹F‹^ ‹N…Ņy ÷Ś÷؃Ś÷ׅŪy ÷Ū÷كŪ÷×če…’t÷Ś÷؃Ś_]ĀU‹ģW+’‹V‹F‹^ ‹N…Ņy ÷Ś÷؃Ś÷ׅŪy÷Ū÷كŪč'‹Ó‹Į…’t÷Ś÷؃Ś_]Ā+ĄčõžøcPčŚųƒÄé"’…Ūu‹Ų‹Ā+Ņ÷ń“÷ń‹Ź‹Ó+ŪĆUWV+’„’u&GWŠūŠŻŠé*ɋéŠč*ɊĊāŠÖ*öRPQ‹Ķ;Ór ø’’ė WWRP‹Ā+Ņ÷ó‹č÷į_+ųƒŅ‹ņ‹Ć÷åʃŅ^+šƒŅX+Āy Młóėō‹Ļ‹Ž_…’tŠĶŠėŠßŠų‹Å+Ņ^_]Ć$Header: alloc.c,v 2.2 84/05/18 13:03:50 sater Exp $  Äįįįout of memory$Header: backward.c,v 2.1 84/05/17 13:51:54 sater Exp $ ļü äaSäääää$Header: cleanup.c,v 2.1 84/05/17 15:51:42 em Exp $rtemp file disappeared < +776   90   aaradfadiadpadsaduandaspassbeqbgebgtbleblmblsbltbnebracaicalcffcficfucifciiciucmfcmicmpcmscmucomcsacsbcufcuicuudchdecdeedeldupdusdvfdvidvuexgfeffiffilgtoincineinlinniorlaelallarldcldeldfldllfrlillimlinlnilocloelofloilollorloslpblpilxalxlmlfmlimlumonngfnginoprckretrmirmurolrorrttsarsbfsbisbssbusdesdfsdlsetsigsilsimslislusrisrustestfstistlstrststeqtgetgttletlttnetrpxorzeqzerzgezgtzlezltznezrezrfzrlbssconendexaexcexpholinainpmesprorom`````|`€``` $Header: flow.c,v 2.2 84/06/28 10:40:09 sater Exp $$Header: getline.c,v 2.2 86/06/17 09:13:11 sater Exp $« ¾ Ć Ł Ž ė ö ę  ć ‹ w 8 é é é é ó X® ® ® ® ® ø ® ® :Õ iŹAFK2q22§<GŻč°½Åõš÷å6÷Šint expectedsymbol expectedoffset expected.%usymbol expectedoffset expectedunknown instruction byteprocedure unterminated at eoflabel %u multiple definedunknown offset byteunknown byte in arglisttoo few parametersoffset expectedunknown pseudobad second arg of PROEND misplacedbytes for locals still unknowninconsistency in number of bytes for localsThis is not allowed outside a procedure$Header: lookup.c,v 2.2 84/05/18 13:04:27 sater Exp $’%s is both proc and datalabelredefined symbol %s$Header: main.c,v 2.1 84/05/17 13:54:48 sater Exp $Usage: %s [-Ln] [name] rCannot open %swrong input filewcan't create %sEE`E 4'4E E 4E` E `$'E E 1'E` E `><<`< KEEEY<<<gEEQEQEuEEjEjE‡™ GGŖ>>“HG¾H>ČooŅddÜpoępdšś |  ~    (€  2 <‚ F|  P‚ Z-U!U-d99p9Hnz9Hc†9>=’9GFœ9HF¦9H=°99Fn&99'ŗ99=c&99(Ė9999&99*Ü9:9:,9:*ī:9:9.:9*::::/::*::a1E2$9dc/9on99pnC9pcM:3:W:Hqa:Hem:>3?y:G3Iƒ:HI:H?—:d3e”:o3q«:pqµ:peæ=c!É=c=c899:Ń?e!įNHNp=éNGNo=óN>Nd=żNoNG@*NoNdN>@*NdOGOo='O>Od=1OoOG@*Oo;OdO>@*OdKNpNHC*Np[EF'kE'IE uE E~E E‰E-FU“<-JUEFKF'§EIKI'“EQFUĮ EE“EG EE`•E2R EEQ˜E–] EE-šE›h EE Eœs EE8 E~ EE8Ÿ‰ EE{ E ’ EE{Ÿ EE[ E”¦ EE\ E£± EU¦E¤¼ E E§Ę E7ÕGÖEŃ7°E7ŁEæIEqŪEIqĖIFqŪFIqŻIIqÜIIqļFEnŪEFnFFnÜFFnFInŪIFn%IE8qŪEI8q7IF8qŪFI8qIII8qÜII8q[FE8nŪEF8nmFF8nÜFF8nFI8nŪIF8n‘IEqŪEIq£IFqŪFIqµIIqÜIIqĒFEnŪEFnŁFFnÜFFnėFInŪIFnżH!:HEEEE8č IźE8I4E8IėE#8IE)8E*qE*qīEqEq)EE>‡‡‰pó‡p#‡‰VˆˆŠpōˆp#ˆŠk*q qI€*n nFŒ*h hA˜*ˆpõˆpˆH¤*‡o ‡o‡Gµ*ˆo ˆoˆGĘ*eöe?×*cöc=ć*‡p÷‡p‡Hļ*ˆp÷ˆpˆH*‡dö‡d‡>*ˆdöˆdˆ>"I*II3F*FF?A*AAKˆH*łˆHˆHW?*??h=*==t‰‡ż*‰€Šˆż*АhA’’*h ‡p‡H’*‡p²ˆpˆH’*ˆpČ           #$ "%   )# &+ &- .+ 0 4 6 579 ;< >; ?<A @B D EG H E E  H   O O O  T9 VG X[ \ ^ _@b c€f gj km o !S ! # =s’ uvu Rw y O{ | #u }~) €# }‚#f ƒ„ …€# }ˆ ‰€‹u ŠŒ Ž H ’2H ”–H — ™   o žS H¢¤H „Ø © Ø«¬ Ŗ­Øư: <»2½¾ ¼æ;Į½þ ¼Ä ² ĘS S ;ÉGĖ ŹĢHĪH Š SÉ[Ó ŅŌ ĻG×µŲ Ś Ū¶:‡: ŻŽ ąį# āć) äåę ßēZ é # ģķļ#šń <ņ <ń  öS ų ś ūü żž ) < # $Header: patterns,v 2.12 86/09/23 09:41:47 ceriel Exp $$Header: peephole.c,v 2.2 86/09/09 13:10:15 em Exp $‡I?ˆF=‰qeŠnc—»ŹģA\{šß'6ÜEWi{”­½ĻØN:Dd”0¤ōŁ!ż! ""'"F"`"$Header: process.c,v 2.1 84/05/17 13:55:26 sater Exp $£&Ģ&Ģ&Ģ&?'ź&ź&ź&„&ˆ&I&I&I&I&„&I&I&„&I&ˆ&I&No MES EMX encounteredinstructions outside procedurelocal label %u undefined$Header: putline.c,v 2.2 84/07/12 09:29:49 sater Exp $¦'(( (č'J(č'č'č'č'č'č'Õ(C)H)S)l)t))Æ)ų)***=*T*\*d*write error$Header: reg.c,v 2.2 84/09/14 10:25:07 em Exp $ü-ü-ü-..$Header: util.c,v 2.1 84/05/17 13:56:52 sater Exp $%s: error on line %u(%.*s): $Header: var.c,v 2.1 84/05/17 13:57:07 sater Exp $/usr/tmp/emoptXXXXXXŽAŽABŽEŽE8$B$L$®IStack overflow ööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööE2’